如何对三水平变量进行对比编码?(混合模型场景)
对比编码在混合模型中的应用与多水平变量编码疑问
我最近发现**对比编码(contrast-coding)**在混合模型(mixed models)里比虚拟编码(dummy-coding)更高效。下面是我用的简化逻辑,方便说明问题:
指定对比编码
> contrasts(TASK1_Reaction_Times$TYPE_OF_LEARNING) <- c(-0.5, 0.5) > contrasts(TASK1_Reaction_Times$MOMENT_OF_TEST) <- c(-0.5, 0.5)
变量围绕0中心化后的结果
> 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)
我对结果的理解:正字法学习的被试反应时比语音法学习的快约100ms;测试一周后的反应时比即时测试平均慢100ms。
我的问题
当变量有三个水平时(比如三种学习类型、三个测试时间点),该怎么操作?
- 还能沿用这个方法吗?
- 该怎么给这类变量做对比编码?比如用
-0.5,0,0.5这种方式?
解答
完全可以沿用对比编码的思路,针对三水平变量,核心是设置正交对比编码,既保证每个对比项独立解释变异,适配混合模型需求,又能让结果解读更直观。
三水平变量的对比编码方法
假设你的变量是LEARNING_TYPE,三个水平为A、B、C,常见的两种正交设置方式如下:
1. Helmert均值对比
这种对比将每个水平与之前所有水平的均值做比较,R内置函数可直接生成:
# 设置Helmert对比并缩放,保证权重围绕0中心化 contrasts(your_data$LEARNING_TYPE) <- contr.helmert(3) / 2
生成的编码矩阵为:
[,1] [,2] A -0.5 -0.5 B 0.5 -0.5 C 0 1.0
- 第一列:对比
B与A的均值差异 - 第二列:对比
C与A+B的均值差异
2. 自定义正交对比
如果需要指定特定的两两对比(比如A vs C,以及B vs 均值(A,C)),可以手动构建满足正交性的矩阵:
# 自定义对比:第一列对比A和C,第二列对比B与A/C的均值 contrasts(your_data$LEARNING_TYPE) <- matrix( c(-0.5, 0, 0.5, -0.25, 0.5, -0.25), nrow = 3 )
这个矩阵满足两个核心要求:
- 正交性:任意两列的点积为0,避免效应解释互相干扰
- 权重和为0:保证变量围绕0中心化,此时截距代表所有水平的总均值
关键注意事项
- 对比矩阵必须满足正交性,这是混合模型中对比编码高效性的核心,能提升模型收敛性,同时让每个固定效应的解释更独立。
- 每列权重和必须为0,确保截距项的解读是所有水平的总均值,而非某一个参照组的均值。
- 模型构建和结果解读逻辑和两水平时完全一致,每个对比项的系数直接对应分组间的差异大小。
内容的提问来源于stack exchange,提问作者asderad
相关产品推荐
相关产品推荐

