解释 emmeans::contrast 的输出
Interpreting output from emmeans::contrast
我有来自纵向研究的数据,并使用 lme4::lmer 函数计算了回归。之后我计算了这些数据的对比,但我很难解释我的结果,因为它们出乎意料。我想我可能在代码中犯了错误。不幸的是,我无法用示例复制我的结果,但我将 post 下面的失败示例和我的实际结果。
我的结果:
library(lme4)
library(lmerTest)
library(emmeans)
#regression
regmemory <- lmer(memory ~ as.factor(QuartileConsumption)*Age+
(1 + Age | ID) + sex + education +
HealthScore, CognitionData)
#results
summary(regmemory)
#Fixed effects:
# Estimate Std. Error df t value Pr(>|t|)
#(Intercept) -7.981e-01 9.803e-02 1.785e+04 -8.142 4.15e-16 ***
#as.factor(QuartileConsumption)2 -8.723e-02 1.045e-01 2.217e+04 -0.835 0.40376
#as.factor(QuartileConsumption)3 5.069e-03 1.036e-01 2.226e+04 0.049 0.96097
#as.factor(QuartileConsumption)4 -2.431e-02 1.030e-01 2.213e+04 -0.236 0.81337
#Age -1.709e-02 1.343e-03 1.989e+04 -12.721 < 2e-16 ***
#sex 3.247e-01 1.520e-02 1.023e+04 21.355 < 2e-16 ***
#education 2.979e-01 1.093e-02 1.061e+04 27.266 < 2e-16 ***
#HealthScore -1.098e-06 5.687e-07 1.021e+04 -1.931 0.05352 .
#as.factor(QuartileConsumption)2:Age 1.101e-03 1.842e-03 1.951e+04 0.598 0.55006
#as.factor(QuartileConsumption)3:Age 4.113e-05 1.845e-03 1.935e+04 0.022 0.98221
#as.factor(QuartileConsumption)4:Age 1.519e-03 1.851e-03 1.989e+04 0.821 0.41174
#contrasts
emmeans(regmemory, poly ~ QuartileConsumption * Age)$contrast
#$contrasts
# contrast estimate SE df z.ratio p.value
# linear 0.2165 0.0660 Inf 3.280 0.0010
# quadratic 0.0791 0.0289 Inf 2.733 0.0063
# cubic -0.0364 0.0642 Inf -0.567 0.5709
回归结果中交互项不显着,线性对比显着。对比度的 p 值不应该不显着吗?
下面是我为尝试重新创建这些结果而编写的代码,但失败了:
library(dplyr)
library(lme4)
library(lmerTest)
library(emmeans)
data("sleepstudy")
#create quartile column
sleepstudy$Quartile <- sample(1:4, size = nrow(sleepstudy), replace = T)
#regression
model1 <- lmer(Reaction ~ Days * as.factor(Quartile) + (1 + Days | Subject), data = sleepstudy)
#results
summary(model1)
#Fixed effects:
# Estimate Std. Error df t value Pr(>|t|)
#(Intercept) 258.1519 9.6513 54.5194 26.748 < 2e-16 ***
#Days 9.8606 2.0019 43.8516 4.926 1.24e-05 ***
#as.factor(Quartile)2 -11.5897 11.3420 154.1400 -1.022 0.308
#as.factor(Quartile)3 -5.0381 11.2064 155.3822 -0.450 0.654
#as.factor(Quartile)4 -10.7821 10.8798 154.0820 -0.991 0.323
#Days:as.factor(Quartile)2 0.5676 2.1010 152.1491 0.270 0.787
#Days:as.factor(Quartile)3 0.2833 2.0660 155.5669 0.137 0.891
#Days:as.factor(Quartile)4 1.8639 2.1293 153.1315 0.875 0.383
#contrast
emmeans(model1, poly ~ Quartile*Days)$contrast
#contrast estimate SE df t.ratio p.value
# linear -1.91 18.78 149 -0.102 0.9191
# quadratic 10.40 8.48 152 1.227 0.2215
# cubic -18.21 18.94 150 -0.961 0.3379
在此示例中,线性对比的 p 值与回归的交互作用一样不显着。是我做错了什么,还是这些结果是意料之中的?
查看原始模型的emmeans()
调用:
emmeans(regmemory, poly ~ QuartileConsumption * Age)
这要求我们获得 QuartileConsumption
和 Age
组合的边际均值,并从这些结果中获得多项式对比。看起来 Age
是一个数量变量,所以在计算边际均值时,我们只使用 Age
的平均值(参见 ref_grid()
和 vignette("basics", "emmeans")
的文档)。因此,OP 中未显示的边际均值显示将采用这种一般形式:
QuartileConsumption Age emmean
------------------------------------
1 <mean> <est1>
2 <mean> <est2>
3 <mean> <est3>
4 <mean> <est4>
...显示的对比将是这四个估计值的线性、二次和三次趋势,按显示的顺序排列。
请注意,这些边际均值与交互作用无关;如果我正确理解数据结构,它们只是模型对 QuartileConsumption
四个级别的平均 Age
(以及平均教育、平均健康评分)的两个性别的平均预测。因此,本质上,多项式对比估计了平均年龄的 4 级因子的多项式趋势。并特别注意 age
保持不变,因此我们当然不会考虑 Age
.
的任何影响
我猜您想检查交互作用的目的是评估年龄 趋势 在该因素的四个水平上的变化情况。如果是这样的话,一件有用的事情就是
slopes <- emtrends(regmemory, ~ QuartileConsumption, var = "age")
slopes # display the estimated slope at each level
pairs(slopes) # pairwise comparisons of these slopes
请参阅 vignette("interactions", "emmeans")
以及关于与协变量交互的部分。
我有来自纵向研究的数据,并使用 lme4::lmer 函数计算了回归。之后我计算了这些数据的对比,但我很难解释我的结果,因为它们出乎意料。我想我可能在代码中犯了错误。不幸的是,我无法用示例复制我的结果,但我将 post 下面的失败示例和我的实际结果。
我的结果:
library(lme4)
library(lmerTest)
library(emmeans)
#regression
regmemory <- lmer(memory ~ as.factor(QuartileConsumption)*Age+
(1 + Age | ID) + sex + education +
HealthScore, CognitionData)
#results
summary(regmemory)
#Fixed effects:
# Estimate Std. Error df t value Pr(>|t|)
#(Intercept) -7.981e-01 9.803e-02 1.785e+04 -8.142 4.15e-16 ***
#as.factor(QuartileConsumption)2 -8.723e-02 1.045e-01 2.217e+04 -0.835 0.40376
#as.factor(QuartileConsumption)3 5.069e-03 1.036e-01 2.226e+04 0.049 0.96097
#as.factor(QuartileConsumption)4 -2.431e-02 1.030e-01 2.213e+04 -0.236 0.81337
#Age -1.709e-02 1.343e-03 1.989e+04 -12.721 < 2e-16 ***
#sex 3.247e-01 1.520e-02 1.023e+04 21.355 < 2e-16 ***
#education 2.979e-01 1.093e-02 1.061e+04 27.266 < 2e-16 ***
#HealthScore -1.098e-06 5.687e-07 1.021e+04 -1.931 0.05352 .
#as.factor(QuartileConsumption)2:Age 1.101e-03 1.842e-03 1.951e+04 0.598 0.55006
#as.factor(QuartileConsumption)3:Age 4.113e-05 1.845e-03 1.935e+04 0.022 0.98221
#as.factor(QuartileConsumption)4:Age 1.519e-03 1.851e-03 1.989e+04 0.821 0.41174
#contrasts
emmeans(regmemory, poly ~ QuartileConsumption * Age)$contrast
#$contrasts
# contrast estimate SE df z.ratio p.value
# linear 0.2165 0.0660 Inf 3.280 0.0010
# quadratic 0.0791 0.0289 Inf 2.733 0.0063
# cubic -0.0364 0.0642 Inf -0.567 0.5709
回归结果中交互项不显着,线性对比显着。对比度的 p 值不应该不显着吗?
下面是我为尝试重新创建这些结果而编写的代码,但失败了:
library(dplyr)
library(lme4)
library(lmerTest)
library(emmeans)
data("sleepstudy")
#create quartile column
sleepstudy$Quartile <- sample(1:4, size = nrow(sleepstudy), replace = T)
#regression
model1 <- lmer(Reaction ~ Days * as.factor(Quartile) + (1 + Days | Subject), data = sleepstudy)
#results
summary(model1)
#Fixed effects:
# Estimate Std. Error df t value Pr(>|t|)
#(Intercept) 258.1519 9.6513 54.5194 26.748 < 2e-16 ***
#Days 9.8606 2.0019 43.8516 4.926 1.24e-05 ***
#as.factor(Quartile)2 -11.5897 11.3420 154.1400 -1.022 0.308
#as.factor(Quartile)3 -5.0381 11.2064 155.3822 -0.450 0.654
#as.factor(Quartile)4 -10.7821 10.8798 154.0820 -0.991 0.323
#Days:as.factor(Quartile)2 0.5676 2.1010 152.1491 0.270 0.787
#Days:as.factor(Quartile)3 0.2833 2.0660 155.5669 0.137 0.891
#Days:as.factor(Quartile)4 1.8639 2.1293 153.1315 0.875 0.383
#contrast
emmeans(model1, poly ~ Quartile*Days)$contrast
#contrast estimate SE df t.ratio p.value
# linear -1.91 18.78 149 -0.102 0.9191
# quadratic 10.40 8.48 152 1.227 0.2215
# cubic -18.21 18.94 150 -0.961 0.3379
在此示例中,线性对比的 p 值与回归的交互作用一样不显着。是我做错了什么,还是这些结果是意料之中的?
查看原始模型的emmeans()
调用:
emmeans(regmemory, poly ~ QuartileConsumption * Age)
这要求我们获得 QuartileConsumption
和 Age
组合的边际均值,并从这些结果中获得多项式对比。看起来 Age
是一个数量变量,所以在计算边际均值时,我们只使用 Age
的平均值(参见 ref_grid()
和 vignette("basics", "emmeans")
的文档)。因此,OP 中未显示的边际均值显示将采用这种一般形式:
QuartileConsumption Age emmean
------------------------------------
1 <mean> <est1>
2 <mean> <est2>
3 <mean> <est3>
4 <mean> <est4>
...显示的对比将是这四个估计值的线性、二次和三次趋势,按显示的顺序排列。
请注意,这些边际均值与交互作用无关;如果我正确理解数据结构,它们只是模型对 QuartileConsumption
四个级别的平均 Age
(以及平均教育、平均健康评分)的两个性别的平均预测。因此,本质上,多项式对比估计了平均年龄的 4 级因子的多项式趋势。并特别注意 age
保持不变,因此我们当然不会考虑 Age
.
我猜您想检查交互作用的目的是评估年龄 趋势 在该因素的四个水平上的变化情况。如果是这样的话,一件有用的事情就是
slopes <- emtrends(regmemory, ~ QuartileConsumption, var = "age")
slopes # display the estimated slope at each level
pairs(slopes) # pairwise comparisons of these slopes
请参阅 vignette("interactions", "emmeans")
以及关于与协变量交互的部分。