R:ggplot2 - 每个方面的Kruskal-Wallis测试

时间:2017-10-03 01:52:57

标签: r testing ggplot2 facet

我有多个方面的箱形图,我想在每个方面进行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

这显然是错误的。

我希望Kruskal-Wallis测试的结果(Petal.Length,Petal.Width,Sepal.Length,Sepal.Width)出现在每个方面的左上角。

每个数据子集应该进行6次测试(根据治疗和种类),所以我猜p.value应该调整(最好是Benjamini-Hochberg)。

如果可能的话,如果每个得到的p.value可以舍入到2个小数位,那就太棒了。如果可能的话,我宁愿避免使用ggpubr,因为我遇到问题,并坚持使用geom_text()。谢谢!

1 个答案:

答案 0 :(得分: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