Mise en évidence des résultats significatifs des comparaisons multiples non paramétriques sur les boîtes à moustaches


9

J'ai des parcelles de 13 groupes que je montre dans une parcelle. Les groupes ont des populations déséquilibrées et ne sont pas normalement distribués. Je veux montrer quelles paires sont statistiquement similaires (c'est-à-dire, ont une valeur de p kruskal.test <0,05) en mettant a, b, c, etc. au-dessus des cases qui correspondent. Voici un pseudo code pour montrer ce que j'ai:

A = c(1, 5, 8, 17, 16, 3, 24, 19, 6) 
B = c(2, 16, 5, 7, 4, 7, 3) 
C = c(1, 1, 3, 7, 9, 6, 10, 13) 
D = c(2, 15, 2, 9, 7) 
junk = list(g1=A, g2=B, g3=C, g4=D) 
boxplot(junk) 

Voici une intrigue que j'ai trouvée qui fait ce que je veux (sauf que j'ai 13 groupes dans une rangée):

Réponses:


7

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):

entrez la description de l'image ici

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 ).


Merci chl. Je ne suis pas statisticien, je vais donc avoir besoin d'en savoir plus sur votre réponse, mais il semblerait qu'elle fasse ce dont j'ai besoin.
Ilik

Si quelque chose n'est pas clair, n'hésitez pas à demander. Il n'y a pas grand chose de statistique ici: j'ai utilisé des tests de Wilcoxon pour des comparaisons de groupes par paires et des valeurs de p individuelles corrigées pour limiter le risque global de faux positifs à 5%. Le package npmc comprend des fonctionnalités supplémentaires pour gérer les comparaisons multiples non paramétriques, mais il existe également le cadre de la pièce . Le reste est purement du code R utilisant des graphiques R de base; cela peut aussi être fait avec treillis ou ggplot2.
chl

Je m'excuse pour mon ignorance dans les statistiques. J'ai donc essayé votre code et j'ai d'abord remarqué que vous calculez le kruskal.test mais que vous n'utilisez pas le résultat (aov.res). Je comprends maintenant que le wilcox.test est un cas spécial pour kruskal pour deux échantillons. Mais j'ai ensuite essayé de changer les valeurs de mes groupes pour les rendre (intuitivement) différentes et voir ce qui se passe. A = c (10, 50, 18, 17, 16, 31, 24, 19, 6) B = c (10, 50, 18, 17, 16, 30, 25, 18, 7) C = c (1, 1, 3, 7, 9, 6, 10, 13) D = c (200, 158, 206, 119, 77). g1 et g2 sont maintenant significativement différents ?? et g3 et g4 ne le sont pas? pas sûr de comprendre pourquoi.
Ilik

@Ilik Quelque chose s'est mal passé dans mon code (l' with(dd,instruction était au mauvais endroit, ce qui a donné lieu à un test étrange!). Merci d'avoir attrapé ça! Oui, je n'utilise pas les résultats du test KW, mais c'est toujours une bonne idée de le vérifier d'abord, sinon plusieurs tests post-hoc seraient dénués de sens (ou du moins, suggérant l'espionnage des données). Remarque : J'ai corrigé le code et rien ne s'est avéré significatif, mais j'ai laissé l'image d'origine par souci de clarté avec des résultats significatifs.
chl

Pour toute personne intéressée, j'ai un peu changé le code pour écrire les résultats dans le boxplot: MyText = rep ('', nlevels (ddg))for(iin1:ncol(signif.pairs))MyText[signif.pairs[,i]]=paste(MyText[signif.pairs[,i]],letters[i],sep=)text(c(1:nlevels(ddg)), rep (max (dd g)), MyText)y)+1,nlevels(dd
Ilik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.