在R中为含两个虚拟变量的随机效应模型执行事后检验
问题解决:线性混合模型的事后检验报错及分组比较方案
错误原因
你用glht指定col1做Tukey检验时报错,是因为**col1是模型中的随机效应变量**,而multcomp的mcp函数只能针对模型里的固定效应变量做多重比较,程序找不到对应变量才抛出错误。你的真实需求是比较固定效应col2的A/B/C三组,得调整模型和检验代码。
解决方案步骤
1. 重构模型(更简洁且适配事后检验)
不需要手动创建A、B哑变量,直接把col2转为因子作为固定效应纳入模型,模型会自动处理分组对比,也方便后续多重检验:
library(lme4) library(lmerTest) library(multcomp) # 重新处理数据:将col2转为因子 df$col2 <- as.factor(df$col2) # 构建模型,col2作为固定效应,col1作为随机效应 model <- lmer(col3 ~ col2 + (1 | col1), data = df) summary(model)
这个模型的固定效应结果默认以C组为参照,输出A vs C、B vs C的对比,和你原来的模型结果一致,但结构更适合做全组两两比较。
2. 执行正确的事后检验
针对固定效应col2做Tukey多重比较,指定holm调整p值:
# 对col2的所有分组做Tukey事后检验 post_hoc <- glht(model, linfct = mcp(col2 = "Tukey")) # 输出调整后的检验结果 summary(post_hoc, test = adjusted("holm"))
这样就能得到A vs C、B vs C、A vs B三组的两两对比结果,同时保留随机效应col1的影响。
3. (可选)基于原哑变量模型的手动对比
如果不想重构模型,也可以手动定义线性对比来完成A vs B的比较:
# 手动指定对比:A组 - B组 = 0 contrast <- glht(model, linfct = c("A - B = 0")) summary(contrast, test = adjusted("holm"))
这种方法只能逐个指定对比,不如直接用因子变量的Tukey检验高效。
额外提示
你的模型输出里提示boundary (singular) fit,说明随机效应col1的方差估计为0,意味着col1作为随机效应没有解释额外的变异,你可以考虑简化模型为普通线性模型(lm),或者检查数据结构是否合理。
内容的提问来源于stack exchange,提问作者Yuval Neumann
相关产品推荐
相关产品推荐

