2017-10-03 7 views
1

複数のファセットにボックスプロットがあり、各ファセット上でKruskal-Wallisテストを実行し、それぞれのファセットの左上に結果を配置したいと考えています。R:ggplot2 - ファセットごとのKruskal-Wallisテスト

これを例示するために、私は虹彩データセットを使用しています。ここに「治療」という追加の変数を追加しました。

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

以上が私の最高の試みである、それは以下を生成します。

test

それは明らかに間違っています。

各ファセットの左上に、メジャー(Petal.Length、Petal.Width、Sepal.Length、Sepal.Width)を渡ってKruskal-Wallisテストの結果を表示したいと思います。

試験は、データのサブセットごとに6回行う必要があります(処理および種に応じて)ので、p.valueを調整する必要があります(Benjamini-Hochberg氏が推奨)。

可能であれば、結果として得られる各p.valueを2小数点以下の桁数に丸めることができれば嬉しいです。可能であれば、ggpubrの使用を避け、問題があり、geom_text()に固執してください。ありがとう!

答えて

2

溶液は、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

これは、それは感謝です!この場合、複数のテストのためにp値を調整する必要がありますか? – DaniCee

+0

@DaniCee p値を調整する前にこのペーパーを読むことをお勧めします。 http://www.jclinepi.com/article/S0895-4356(00)00314-0/fulltext –

関連する問題