El código más simple que viene a mi mente se muestra a continuación. Estoy bastante seguro de que hay algunas funciones ya existentes para hacer eso en CRAN, pero soy demasiado vago para buscarlas, incluso en 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)
Aquí hay un ejemplo de lo que produciría el código anterior (con diferencias significativas entre los cuatro grupos):
En lugar de la prueba de Wilcoxon, uno podría confiar en el procedimiento implementado en la kruskalmc()
función del paquete pgirmess (vea una descripción del procedimiento utilizado aquí ).
Además, asegúrese de consultar los consejos R de Rudolf Cardinal sobre R: gráficos básicos 2 (ver en particular, Otro gráfico de barras, con anotaciones ).