混合模型构建合理性咨询:滑雪训练实验假设验证
问题背景
25名高山滑雪者参与实验,流程为:预测试(3次滑行)→两次训练(各5次滑行)→后测试(3次滑行),被试分为两组采用不同训练方法。
研究假设:
- 学习效应:一组在后测试(POSTTEST)中表现优于另一组;
- 训练表现:一组在两次训练环节中表现优于另一组。
数据集结构(示例)
structure(list(BIB. = structure(c(10L, 25L, 22L, 7L, 8L), levels = c("1", "2", "3", "4", "5", "6", "8", "9", "10", "11", "12", "13", "14", "15", "16", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29"), class = "factor"), Gruppe = structure(c(1L, 1L, 2L, 2L, 2L), levels = c("EF", "IF"), class = "factor"), Run = c(1, 1, 1, 1, 1), `Performance Time` = c(3.265, 2.665, 2.295, 2.87, 1.245 ), Session = structure(c(1L, 1L, 1L, 1L, 1L), levels = c("Pretest", "Trening 1", "Trening 2", "Posttest"), class = "factor")), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))
已生成虚拟变量:D_gruppe、Session_Pretest、Session_Trening 1、Session_Trening 2、Session_Posttest
构建的三个模型
Learning模型
Learning <- lmer(Performance_Time ~ D_gruppe*Session_Pretest*Session_Posttest + (1|BIB.) + (1|Performance_Time), data)
固定效应结果:
| 变量 | Estimate | Std. Error | df | t value | Pr(> | t | ) |
|---|---|---|---|---|---|---|---|
| (Intercept) | 1.73745 | 0.17672 | 23.20492 | 9.832 | 9.622882e-10 *** | ||
| D_gruppe | -0.28826 | 0.25404 | 22.74112 | -1.135 | 0.26833 | ||
| Session_Pretest | 0.54241 | 0.06464 | 333.00002 | 8.392 | 1.39e-15 *** | ||
| Session_Posttest | -0.02623 | 0.06556 | 331.96347 | -0.400 | 0.68934 | ||
| D_gruppe:Session_Pretest | 0.29673 | 0.09086 | 315.22625 | 3.266 | 0.00121 ** | ||
| D_gruppe:Session_Posttest | 0.24381 | 0.09508 | 311.20751 | 2.564 | 0.01081 * |
NB: Fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
Performance模型
Performance <- lmer(Performance_Time ~ D_gruppe*`Session_Trening 1`*`Session_Trening 2` + (1|BIB.)+ (1|Performance_Time), data)
固定效应结果:
| 变量 | Estimate | Std. Error | df | t value | Pr(> | t | ) |
|---|---|---|---|---|---|---|---|
| (Intercept) | 2.01527 | 0.17963 | 23.91889 | 11.219 | 5.18e-11 *** | ||
| D_gruppe1 | -0.01327 | 0.25922 | 23.83809 | -0.051 | 0.959600 | ||
Session_Trening 11 | -0.25319 | 0.06520 | 331.15639 | -3.883 | 1.24e-04 *** | ||
Session_Trening 21 | -0.30096 | 0.06997 | 308.15178 | -4.301 | 2.28e-05 *** | ||
D_gruppe1:Session_Trening 11 | -0.15125 | 0.09436 | 288.25119 | -1.603 | 0.110045 | ||
D_gruppe1:Session_Trening 21 | -0.40798 | 0.09864 | 284.29362 | -4.136 | 4.65e-05 *** |
NB: Fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
Combi模型
Combi <- lmer(Performance_Time ~ D_gruppe*Session_Pretest*`Session_Trening 1`*`Session_Trening 2`*Session_Posttest + (1|BIB.) + (1|Performance_Time), data)
固定效应结果:
| 变量 | Estimate | Std. Error | df | t value | Pr(> | t | ) |
|---|---|---|---|---|---|---|---|
| (Intercept) | 1.71698 | 0.18437 | 26.29124 | 9.313 | 8.23e-10 *** | ||
| D_gruppe1 | -0.05889 | 0.26648 | 26.37089 | -0.221 | 0.826791 | ||
| Session_Pretest1 | 0.57474 | 0.07644 | 329.70574 | 7.518 | 5.29e-13 *** | ||
Session_Trening 11 | 0.03276 | 0.06853 | 331.09471 | 0.478 | 0.632962 | ||
Session_Trening 21 | -0.01135 | 0.07201 | 324.09671 | -0.158 | 0.874802 | ||
| D_gruppe1:Session_Pretest1 | 0.05871 | 0.11083 | 324.39636 | 0.530 | 0.596656 | ||
D_gruppe1:Session_Trening 11 | -0.09119 | 0.10106 | 318.79226 | -0.902 | 0.367565 | ||
D_gruppe1:Session_Trening 21 | -0.37456 | 0.10321 | 311.02413 | -3.629 | 3.32e-04 *** |
NB: fixed-effect model matrix is rank deficient so dropping 24 columns / coefficients
咨询问题:以上模型的公式构建是否正确?能否通过该方法验证上述两个研究假设?
解答
一、现有模型的核心问题
1. 随机效应错误
所有模型都加入了(1|Performance_Time)作为随机效应,这完全不合理:Performance_Time是因变量,每个观测值的因变量都是唯一值,将其作为分组变量会导致每个组只有一个观测,无法估计随机效应的方差,属于概念错误。正确的随机效应应该只保留(1|BIB.),用来捕捉滑雪者个体间的差异(每个滑雪者有多次滑行记录,符合嵌套结构)。
2. 虚拟变量使用不当与模型冗余
手动生成Session的各个虚拟变量是多余的,lmer中直接使用原始分类变量Session(包含Pretest/Trening 1/Trening 2/Posttest四个水平)会更高效,且能避免矩阵秩亏问题(你看到的rank deficient提示就是因为手动生成的虚拟变量存在完全共线性,比如一个观测不可能同时属于Pretest和Posttest,导致模型被迫删除冗余列)。
3. 高阶交互项冗余
- Learning模型使用的
D_gruppe*Session_Pretest*Session_Posttest三阶交互无实际意义:一个观测只能属于一个Session,不可能同时处于Pretest和Posttest,直接导致秩亏,模型无法估计完整的交互项。 - Combi模型的五阶交互完全冗余,不仅带来严重秩亏,也无法解释任何实际实验效应,属于过度建模。
二、针对研究假设的改进模型
假设1:验证后测试的组间差异(学习效应)
要验证“一组在后测试表现优于另一组”,核心是看组(Gruppe)和后测试的交互效应,同时控制预测试的基线差异。推荐模型:
# 直接使用原始分类变量,无需手动生成虚拟变量 model_learning <- lmer(Performance_Time ~ Gruppe * Session + (1|BIB.), data = data)
之后可通过emmeans包做事后检验,对比两组在Posttest水平上的Performance_Time差异;也可查看Gruppe:SessionPosttest的交互项显著性(需将Session的参考水平设为Pretest)。
假设2:验证训练环节的组间差异
要验证“一组在两次训练环节表现优于另一组”,核心是看组(Gruppe)和训练Session(Trening 1、Trening 2)的交互效应。可以复用上述model_learning(包含所有Session和组的交互),通过事后检验对比两组在两个训练环节的表现差异;也可单独针对训练Session建模:
# 筛选出训练环节的数据 train_data <- subset(data, Session %in% c("Trening 1", "Trening 2")) model_performance <- lmer(Performance_Time ~ Gruppe * Session + (1|BIB.), data = train_data)
通过这个模型可直接查看组和训练Session的交互效应,判断两组在训练中的表现差异。
三、额外注意事项
- 因变量
Performance Time的数值越小代表表现越好,解读系数时要注意方向:负系数代表时间更短,表现更优。 - 可考虑加入
Run作为固定效应,控制同一场次内不同滑行顺序的影响(比如第一次滑行可能比后续滑行慢)。 - 模型拟合后需检查残差,确保无方差不齐、非正态性问题,保证模型可靠性。
内容的提问来源于stack exchange,提问作者Simen Leithe Tajet

