如何基于P值表为最小二乘均值添加显著性字母标记
给最小二乘均值添加显著性字母标记的实现方案
嗨,你已经完成了混合模型拟合、LS均值和配对P值的计算工作,要给LS均值加上区分显著性处理组的字母标记,emmeans包的cld()函数是最便捷的工具——它会自动基于配对比较结果生成紧凑字母标记(Compact Letter Display),不用手动去匹配P值,非常高效。
步骤1:简化模型拟合(避免重复冗余)
你之前重复拟合了多次相同的模型,我们可以先一次性拟合所有需要的模型,减少代码冗余:
# 加载所需包 library(lmerTest) library(emmeans) library(dplyr) library(purrr) # 一次性拟合所有指标的混合模型 mod_list <- list( yield = lmer(yield ~ treatment + (1|block), data = df.urbana), B.glucosidase = lmer(B.glucosidase ~ treatment + (1|block), data = df.urbana), Protein = lmer(Protein ~ treatment + (1|block), data = df.urbana), POX.C = lmer(POX.C ~ treatment + (1|block), data = df.urbana) )
步骤2:为每个指标生成带字母标记的LS均值表
我们可以写一个小函数,批量处理每个模型:计算LS均值,然后用cld()添加显著性字母。注意这里可以指定多重比较的调整方法(你之前用了adjust = "none",如果需要保持一致,替换掉示例中的"tukey"即可):
# 定义函数:生成带字母标记的LS均值结果 get_cld_table <- function(model, response_name) { # 计算LS均值 emm <- emmeans(model, ~ treatment, adjust = "tukey") # 如需无调整,改为adjust="none" # 添加紧凑字母标记 cld_result <- cld(emm, Letters = letters, adjust = "tukey") # Letters指定用小写字母,可用LETTERS改大写 # 整理结果格式 cld_result %>% as.data.frame() %>% select(treatment, emmean, .group) %>% rename( !!paste0(response_name, "_Urbana") := emmean, !!paste0(response_name, "_letters") := .group ) } # 批量处理所有模型,生成带字母的表列表 cld_tables <- imap(mod_list, get_cld_table)
步骤3:合并所有指标的最终结果
用你熟悉的Reduce()方法把所有表合并到一起,得到完整的带字母标记的LS均值表:
# 合并所有带字母的LS均值表 final_LSMEAN_with_letters <- Reduce( function(x, y) merge(x, y, by = "treatment", all = TRUE), cld_tables ) # 查看最终结果 print(final_LSMEAN_with_letters)
关键说明
- 生成的字母标记列(比如
yield_letters)中,相同字母的处理组之间没有显著性差异,不同字母则表示存在显著差异; - 如果需要用大写字母,把
Letters = letters改成Letters = LETTERS即可; - 多重比较调整方法可以根据你的需求修改,保持和之前计算P值的逻辑一致就好。
内容的提问来源于stack exchange,提问作者Achal Neupane
相关产品推荐
相关产品推荐

