oreado
您好,感谢您的帮助。但是这个解法是否可能存在一点问题,就是虽然它解决了本例中的问题,但是普遍来讲,它是否会产生所有组无差别的情况?具体来说,比如我们把数据改成这个样子:
# 构造数据
mydata <- data.frame("X" = rep(c("trt1","trt2","trt3"), each=50),
"Y" = c(seq(from=1, to=200, length.out = 50),
seq(from=10, to=220, length.out = 50),
seq(from=20, to=260, length.out = 50)))
# 作两两比较分析
library(dunn.test)
dunn.test(mydata$Y, g=mydata$X, method = "bh")
得到结果:
Kruskal-Wallis rank sum test
data: x and group
Kruskal-Wallis chi-squared = 7.8899, df = 2, p-value = 0.02
Comparison of x by group
(Benjamini-Hochberg)
Col Mean-|
Row Mean | trt1 trt2
---------+----------------------
trt2 | -1.093327
| 0.1371
|
trt3 | -2.787408 -1.694081
| 0.0080* 0.0677
alpha = 0.05
Reject Ho if p <= alpha/2
可见trt1-trt2和trt2-trt3这两个配对都是差异不显著的,在分组时可以归为同一组,而trt1-trt3却不可以归为同一组。但是如果按照您的算法,就会变成大家都被归类到同一组,因为在这个算法中,分组性质是可传递的。
# 以下是您的算法
# 存储Dun输出的两两比较结果(是包含样本两两比较结果的List)
dun <- dunn.test(mydata$Y, g=mydata$X, method = "bh")
# 筛选差异不显著的样本对
pairs <- dun$comparisons[dun$P.adjusted > 0.05]
# 为了登记分组结果建立空List
groups <- list()
# 遍历差异不显著的样本对,每对样本属于相同分组
for (pair in pairs) {
# Dun输出的样本对格式为“XX - XX”,从中拆出样本对的样本
pair_members<- strsplit(pair, split = " - ")[[1]]
# 看看样本对样本跟已登记分组是否有交集
members_in_groups <- lapply(groups, function(group){length(intersect(pair_members, group))})
if(all(unlist(members_in_groups) == 0)){
# 如果没交集说明不属于已有分组,建立新分组
new_group_name <- LETTERS[length(groups)+1]
groups[[new_group_name]] <- pair_members
}else{
# 如果有交集说明属于有交集的组,将样本并入那组
belong_group <- which(members_in_groups > 0)
groups[[belong_group]] <- union(groups[[belong_group]], pair_members)
}
}
# 展开样本-分组对应表,并按样本名排序
label <- lapply(names(groups),
function(name){data.frame(member = groups[[name]],
group = name,
stringsAsFactors = FALSE)})
label <- Reduce(rbind, label)
label <- label[order(label$member), ]
# 传入label参数
ggplot(mydata, aes(mydata$X, mydata$Y))+
geom_boxplot()+
stat_summary(geom = 'text', label=label$group, fun.y = max, vjust=-1)
出图如下:
可见所有处理都被归为了同一组。