在箱线图上突出显示非参数多重比较的重要结果

机器算法验证 r 统计学意义 箱形图
2022-03-27 20:03:44

我在一个图中显示了 13 个组的箱形图。这些组具有不平衡的人口并且不是正态分布的。我想通过将 a、b、c 等放在匹配的框顶部来显示哪些对在统计上相似(即 kruskal.test p 值 < 0.05)。这是一个伪代码来显示我所拥有的:

A = c(1, 5, 8, 17, 16, 3, 24, 19, 6) 
B = c(2, 16, 5, 7, 4, 7, 3) 
C = c(1, 1, 3, 7, 9, 6, 10, 13) 
D = c(2, 15, 2, 9, 7) 
junk = list(g1=A, g2=B, g3=C, g4=D) 
boxplot(junk) 

这是我发现的一个情节,可以满足我的要求(除了我在一行中有 13 个组):

1个回答

我想到的最简单的代码如下所示。我很确定在 CRAN 上已经有一些功能可以做到这一点,但我懒得去搜索它们,即使在R-seek上也是如此。

dd <- data.frame(y=as.vector(unlist(junk)), 
                 g=rep(paste("g", 1:4, sep=""), unlist(lapply(junk, length))))

aov.res <- kruskal.test(y ~ g, data=dd)
alpha.level <- .05/nlevels(dd$g)  # Bonferroni correction, but use 
                                  # whatever you want using p.adjust()

# generate all pairwise comparisons
idx <- combn(nlevels(dd$g), 2)

# compute p-values from Wilcoxon test for all comparisons
pval.res <- numeric(ncol(idx))
for (i in 1:ncol(idx))
  # test all group, pairwise
  pval.res[i] <- with(dd, wilcox.test(y[as.numeric(g)==idx[1,i]], 
                                      y[as.numeric(g)==idx[2,i]]))$p.value

# which groups are significantly different (arranged by column)
signif.pairs <- idx[,which(pval.res<alpha.level)]

boxplot(y ~ g, data=dd, ylim=c(min(dd$y)-1, max(dd$y)+1))
# use offset= to increment space between labels, thanks to vectorization
for (i in 1:ncol(signif.pairs))
    text(signif.pairs[,i], max(dd$y)+1, letters[i], pos=4, offset=i*.8-1)

这是上述代码将产生的示例(四组之间存在显着差异):

在此处输入图像描述

可以依赖pgirmess包中的kruskalmc()函数实现的过程,而不是 Wilcoxon 测试(请参阅此处使用的过程的描述)。

此外,请务必查看 Rudolf Cardinal 关于R 的 R 提示:基本图 2(特别参见另一个条形图,带有注释)。