如何在R中实现Kruskal-Wallis Dunn事后检验的字母标记法?
基于Dunn检验生成Kruskal-Wallis事后检验的字母标记法解决方案
要实现基于Dunn检验的紧凑字母标记(CLD),可以用FSA包执行Dunn事后检验,再借助multcompView包生成字母标记,具体步骤如下:
1. 安装并加载所需包
# 首次运行时安装依赖包 install.packages(c("FSA", "multcompView", "ggplot2")) # 加载包 library(FSA) library(multcompView) library(ggplot2)
2. 执行Dunn事后检验并整理p值
# 针对你的数据执行Dunn检验,指定校正方法(这里用bonferroni,可按需更换) dunn_result <- dunnTest(hauteur ~ distance, data = MR, method = "bonferroni") # 提取两两比较的校正后p值 dunn_pvals <- dunn_result$res # 将p值整理成multcompView所需的矩阵格式 groups <- unique(MR$distance) p_matrix <- matrix(NA, nrow = length(groups), ncol = length(groups), dimnames = list(groups, groups)) # 填充矩阵 for (i in 1:nrow(dunn_pvals)) { grp1 <- as.character(dunn_pvals$Group1[i]) grp2 <- as.character(dunn_pvals$Group2[i]) p_matrix[grp1, grp2] <- dunn_pvals$P.adj[i] p_matrix[grp2, grp1] <- dunn_pvals$P.adj[i] } diag(p_matrix) <- 1 # 对角线设为1(同一组比较无意义)
3. 生成字母标记并整理数据
# 生成紧凑字母标记 cld_labels <- multcompLetters(p_matrix, compare = "<", threshold = 0.05)$Letters # 转换成数据框,适配后续绘图 cld_df <- data.frame( distance = names(cld_labels), groups = unname(cld_labels), stringsAsFactors = FALSE ) # 按照你原来的需求调整分组顺序 cld_df$ordre <- c(6,3,1,2,4,5) cld_df <- cld_df[order(cld_df$ordre), ]
4. 绘制带字母标记的图
ggplot(data = MR, aes(x = distance, y = hauteur, col = distance)) + scale_color_brewer(palette = "Dark2") + scale_alpha(0.5) + geom_jitter(position = position_jitterdodge(jitter.width = 1), size = 0.5) + # 若mean_sd函数未定义,可替换为以下两行实现均值+标准差误差线 stat_summary(fun.data = function(x) data.frame(y = mean(x), ymin = mean(x)-sd(x), ymax = mean(x)+sd(x)), geom = "errorbar", width = 0.2, size = 0.4, col = "black") + stat_summary(fun = mean, geom = "point", size = 1, col = "black") + geom_text(data = cld_df, aes(label = groups, y = 50, x = ordre), vjust = -0.5, inherit.aes = FALSE)
注意事项
dunnTest的method参数支持多种校正方法,比如holm、hochberg等,可根据研究需求调整;- 若你的
distance是因子类型,提前确认其水平顺序,避免绘图时分组混乱; - 可以根据数据分布调整
geom_jitter的jitter.width参数,优化散点显示效果。
内容的提问来源于stack exchange,提问作者Pauline Lefranc
相关产品推荐
相关产品推荐

