我最近发现对比编码与虚拟编码相比似乎是处理混合模型的更有效方法。这是我遵循的(简化的)逻辑,它将使问题更加明显:
> contrasts(TASK1_Reaction_Times$TYPE_OF_LEARNING)<-c(-0.5,0.5)
> contrasts(TASK1_Reaction_Times$MOMENT_OF_TEST)<-c(-0.5,0.5)
> contrasts(TASK1_Reaction_Times$TYPE_OF_LEARNING)
[,1]
ORTHOGRAPHIC_LEARNING -0.5
PHONOLOGICAL_LEARNING 0.5
> contrasts(TASK1_Reaction_Times$MOMENT_OF_TEST)
[,1]
IMMEDIATELY -0.5
AFTER_ONE_WEEK 0.5
> TASK1 <- lmer(RT ~ TYPE_OF_LEARNING * MOMENT_OF_TEST
+ (1 + MOMENT_OF_TEST) + (1 + TYPE_OF_LEARNING),
data = TASK1_Reaction_Times)
> summary(TASK1)
(...)
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 1000 25 50 40 0.0005 ***
TYPE_OF_LEARNING1 100 25 100 10 0.0005 ***
MOMENT_OF_TEST1 -100 25 50 -10 0.0005 ***
(values are grossly simplified)
据我了解,这表明通过拼字法学习单词的参与者的反应时间比通过语音学习单词的参与者快约 100 毫秒; 初次测试一周后,反应时间平均慢了 100 毫秒。
这是我的问题:如果我的变量有三个级别而不是只有两个级别,我该怎么办?
(例如三种类型的学习,三个测试时刻)
那还可以使用这种方法吗?
在这种情况下如何对变量进行对比编码(-0.5,0,0.5?)?
这个问题并不特定于混合模型(它适用于任何具有线性固定效应组件的模型,例如
lm()
或 glm()
),因此我将使用内置数据集进行说明。
library(emmeans)
mtcars$cyl <- factor(mtcars$cyl)
m1 <- lm(mpg ~ cyl, data = mtcars)
m2 <- lm(mpg ~ cyl, data = mtcars, contrasts = list(cyl = "contr.sum"))
默认 treatment 对比显示
cyl==6
和 cyl==8
的估计平均值与基线(默认情况下按第一个字母顺序)水平 cyl==4
之间的差异
options(show.signif.stars = FALSE)
printCoefmat(coef(summary(m1)), digits = 2)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 26.66 0.97 27.4 <2e-16
cyl6 -6.92 1.56 -4.4 1e-04
cyl8 -11.56 1.30 -8.9 9e-10
归零对比显示第一个
n-1
级别与(未加权)总体平均值之间的差异(对于两个级别,这相当于对比度编码,尽管可能(?)具有不同的缩放比例)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 20.50 0.59 34.5 <2e-16
cyl1 6.16 0.82 7.5 3e-08
cyl2 -0.76 0.92 -0.8 0.4
如果您想查看每个级别与平均值之间的比较,您需要这样的东西(无论原始模型中使用的对比如何,它都有效):
library(emmeans)
contrast(emmeans(m1, ~cyl), "eff")
contrast estimate SE df t.ratio p.value
cyl4 effect 6.161 0.817 29 7.544 <.0001
cyl6 effect -0.759 0.920 29 -0.825 0.4161
cyl8 effect -5.402 0.774 29 -6.976 <.0001
P value adjustment: fdr method for 3 tests
请注意,前两个对比(cyl-4 与平均值、cyl-6 与平均值)与上一个示例中的相同。
如果您不想进行任何多重比较修正,可以添加
adjust = "none"
。
请参阅
?emmeans::eff.emmc
了解更多详情。