Le code le plus simple qui me vient à l'esprit est illustré ci-dessous. Je suis à peu près certain qu'il existe des fonctions déjà existantes pour le faire sur CRAN, mais je suis trop paresseux pour les rechercher, même sur 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)
Voici un exemple de ce que le code ci-dessus produirait (avec des différences significatives entre les quatre groupes):
Au lieu du test de Wilcoxon, on pourrait s'appuyer sur la procédure implémentée dans la kruskalmc()
fonction du package pgirmess (voir une description de la procédure utilisée ici ).
Assurez-vous également de vérifier les conseils R de Rudolf Cardinal sur R: graphiques de base 2 (voir en particulier, Un autre graphique à barres, avec des annotations ).