R语言emmeans:如何排除简单对比中的damaged-healthy组及相关问题解析
解决lme4+emmeans中筛选对比并保留Bonferroni校正的问题
一、筛选目标对比并保留Bonferroni校正
步骤1:生成响应尺度的emmeans对象
先构建模型的边际均值,并转换到原始响应尺度(原模型用了log变换,regrid()会将结果转换回dv的原始尺度):
library(lme4) library(emmeans) # 基于已拟合的lmm_1生成边际均值 emm <- emmeans(lmm_1, ~ intervention*region*timepoint) emm_regrid <- regrid(emm) # 转换到响应尺度
步骤2:生成所有简单对比并筛选
先生成全部simple='each'的对比,再通过对比标签筛选掉不需要的damaged-healthy组:
# 生成所有简单对比组合 all_pairs <- pairs(emm_regrid, simple = "each", combine = TRUE) # 打印所有对比标签,确认要排除的组 print(all_pairs, which = "contrasts") # 筛选掉包含"damaged - healthy"的对比 keep_pairs <- all_pairs[!grepl("damaged - healthy", attr(all_pairs, "contrasts")), ]
步骤3:对保留的对比进行Bonferroni校正
用test()函数对筛选后的对比做检验,指定adjust="bonferroni",此时校正会基于保留的8组对比数量计算调整后的p值:
test(keep_pairs, adjust = "bonferroni")
二、解决提取单个对比的报错问题
常见错误原因与修正方法
直接用all_pairs[1]这类索引会报错,因为pairs()返回的emmGrid对象是二维结构,需要用矩阵索引方式访问:
# 正确提取单个对比的方式 single_pair <- all_pairs[1, ] # 必须添加逗号,表示提取第一行对比 # 更灵活的自定义对比方式 # 先查看边际均值的水平顺序,方便构建权重向量 levels(emm@grid$intervention) levels(emm@grid$region) levels(emm@grid$timepoint) # 构建单个对比的权重向量(示例:对比第1个和第2个边际均值) single_contrast <- contrast(emm_regrid, list(target_contrast = c(1, -1, rep(0, length(emm)-2)))) test(single_contrast)
常见提示语解释
Error in all_pairs[1] : incorrect number of dimensions:未使用矩阵索引(缺少逗号),all_pairs是二维对象,需用[行, 列]形式访问。Contrast coefficients are not orthogonal:手动构建对比时权重和不为0,或不符合对比规则,需检查权重向量是否满足对比要求。
内容的提问来源于stack exchange,提问作者myfatson
相关产品推荐
相关产品推荐

