2017-10-03 9 views
1

J'ai des boxplots dans plusieurs facettes et je voudrais effectuer un test de Kruskal-Wallis sur chaque facette, et placer le résultat en haut à gauche de chaque facette respective. Pour illustrer cela, j'utilise le jeu de données iris, auquel j'ai ajouté une variable supplémentaire appelée "traitement".R: ggplot2 - Test de Kruskal-Wallis par facette

MWE:

library(reshape2) 
library(ggplot2) 
data(iris) 
iris$treatment <- rep(c("A","B"), length(iris$Species)/2) 
mydf <- melt(iris, measure.vars=names(iris)[1:4]) 
mydf$treatment <- as.factor(mydf$treatment) 
mydf$variable <- factor(mydf$variable, levels=sort(levels(mydf$variable))) 

ggplot(mydf,aes(x=variable, y=value)) + 
    geom_boxplot(aes(fill=Species)) + 
    facet_grid(treatment~Species, scales="free", space="free_x") + 
    geom_text(label=paste("Kruskal-Wallis, p=", with(mydf, kruskal.test(value ~ variable)$p.value))) 

Ce qui précède est ma meilleure tentative, elle produit ce qui suit.

test

Il est évidemment faux. Je voudrais que le résultat d'un test de Kruskal-Wallis à travers les mesures (Petal.Length, Petal.Width, Sepal.Length, Sepal.Width), apparaître dans le coin supérieur gauche de chaque facette.

Le test devrait être effectué 6 fois pour chaque sous-ensemble de données (selon le traitement et l'espèce), donc je suppose que la valeur p devrait être ajustée (par Benjamini-Hochberg de préférence).

Si possible, ce serait génial si chaque valeur p résultant pouvait être arrondi à 2 positions décimales. Et si possible, je préfère éviter l'utilisation de ggpubr, car j'ai des problèmes avec ça, et je m'en tiens à geom_text(). Merci!

Répondre

2

La solution est donnée here.

library(reshape2) 
library(ggplot2) 
data(iris) 
iris$treatment <- rep(c("A","B"), length(iris$Species)/2) 
mydf <- melt(iris, measure.vars=names(iris)[1:4]) 
mydf$treatment <- as.factor(mydf$treatment) 
mydf$variable <- factor(mydf$variable, levels=sort(levels(mydf$variable))) 

library(dplyr) 
pv <- mydf %>% group_by(treatment, Species) %>% 
    summarize(p.value = kruskal.test(value ~ variable)$p.value) 

ggplot(mydf,aes(x=variable, y=value)) + 
    geom_boxplot(aes(fill=Species)) + 
    facet_grid(treatment~Species, scales="free", space="free_x") + 
    geom_text(data=pv, aes(x=2, y=7, label=paste0("Kruskal-Wallis\n p=",p.value))) 

enter image description here

+0

C'est-ce grâce! Les valeurs de p devraient-elles être ajustées pour des tests multiples dans ce cas? – DaniCee

+0

@DaniCee Je suggère de lire ce papier avant d'ajuster ou de ne pas ajuster vos p-values. http://www.jclinepi.com/article/S0895-4356(00)00314-0/fulltext –