El código más sencillo que viene a mi mente es la que se muestra a continuación. Estoy bastante seguro de que hay algunos ya existentes de la función(s) para hacer que en CRAN, pero soy demasiado perezoso para buscar para ellos, incluso en R-buscar.
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í es un ejemplo de lo que el código anterior podría producir (con diferencias significativas entre los cuatro grupos):
En lugar de la prueba de Wilcoxon, uno podría basarse en el procedimiento implementado en el kruskalmc()
función de la pgirmess paquete (véase una descripción del procedimiento utilizado aquí).
También, asegúrese de comprobar Rudolf del Cardenal R consejos acerca de R: gráficos básicos 2 (véase, en particular, Otro gráfico de barras, con anotaciones).