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 ).
with(dd,
instrução estava no lugar errado, resultando em um teste estranho!). Obrigado por capturar isso! Sim, eu não uso os resultados do teste KW, mas é sempre uma boa ideia verificá-lo primeiro, caso contrário, vários testes post-hoc não teriam sentido (ou pelo menos sugeririam uma espionagem de dados). Observe que corrigi o código e nada se mostrou significativo, mas deixei a imagem original por uma questão de clareza, com resultados significativos.