O código mais simples que me vem à cabeça é mostrado abaixo. Tenho certeza de que existem funções já existentes para fazer isso no CRAN, mas estou com preguiça de procurá-las, mesmo no 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)
Aqui está um exemplo do que o código acima produziria (com diferenças significativas entre os quatro grupos):
Em vez do teste de Wilcoxon, pode-se confiar no procedimento implementado na kruskalmc()
função do pacote pgirmess (veja uma descrição do procedimento usado aqui ).
Além disso, verifique as dicas R de Rudolf Cardinal sobre R: gráficos básicos 2 (consulte, em particular, Outro gráfico de barras, com anotações ).