如何从lmer模型Tukey事后检验提取p值生成紧凑字母显示
从multcomp的glht结果生成紧凑字母显示(CLD)
我明白你遇到的麻烦了——从multcomp::glht的结果里提取p值确实不像pairwise.t.test那么直接,不过别担心,下面两种方法都能帮你顺利生成紧凑字母显示(CLD):
方法1:手动提取glht的p值并转换格式
如果你坚持要用multcomp+multcompView的组合,可以按照以下步骤操作:
步骤1:准备模型和glht结果
先确保你已经拟合好线性混合效应模型,并得到glht的事后检验结果(用你自己的模型替换示例中的model):
library(lme4) library(multcomp) # 拟合线性混合效应模型(示例) model <- lmer(fit ~ treatment + (1|subject), data = df) # 进行Tukey事后检验,使用holm校正 mult <- summary(glht(model, linfct = mcp(treatment = "Tukey")), test = adjusted("holm"))
步骤2:提取并整理p值矩阵
glht的p值存储在mult$test$pvalues中,但格式是一维的配对比较(比如A - B),我们需要把它转换成对称矩阵:
# 提取配对比较的标签和对应的p值 comp_pvals <- data.frame( comparison = rownames(mult$test$pvalues), p.value = mult$test$pvalues, stringsAsFactors = FALSE ) # 将比较标签拆分为两个组别 comp_pvals$group1 <- gsub(" - .*", "", comp_pvals$comparison) comp_pvals$group2 <- gsub(".* - ", "", comp_pvals$comparison) # 创建空的对称p值矩阵 groups <- unique(c(comp_pvals$group1, comp_pvals$group2)) p_matrix <- matrix(NA, nrow = length(groups), ncol = length(groups), dimnames = list(groups, groups)) # 填充矩阵(对称填充) for(i in 1:nrow(comp_pvals)){ g1 <- comp_pvals$group1[i] g2 <- comp_pvals$group2[i] p_matrix[g1, g2] <- comp_pvals$p.value[i] p_matrix[g2, g1] <- comp_pvals$p.value[i] } # 对角线填充为1(同一组比较无意义,p值设为1) diag(p_matrix) <- 1
步骤3:生成紧凑字母显示
现在就可以用你熟悉的rcompanion和multcompView包生成CLD了:
library(rcompanion) library(multcompView) # 生成完整的p值表格 pt_full <- fullPTable(p_matrix) # 生成紧凑字母显示 cld_result <- multcompLetters(pt_full, compare="<", threshold=0.05, Letters=letters, reversed=FALSE) print(cld_result)
方法2:用emmeans包直接生成CLD(更简洁)
其实有个更省心的方法——用emmeans包,它可以直接对混合效应模型的边际均值进行事后检验,并且一键生成CLD,完全不用手动处理p值:
library(emmeans) # 计算处理组的边际均值 emm <- emmeans(model, ~ treatment) # 进行Tukey检验并生成CLD(指定holm校正) cld(emm, adjust = "holm", Letters = letters)
这个方法不仅代码更短,结果也会直接显示每个处理组的均值和对应的字母标记,非常直观。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

