【问题标题】:Add P values to comparisons within groups boxplot将 P 值添加到组箱线图中的比较
【发布时间】:2020-02-12 23:58:38
【问题描述】:

我正在尝试创建一个箱线图,该箱线图仅显示重要的 p 值,在箱线图中每个条的组内。例如这里它将比较 I1 和 SI2 的“一般”、“好”、“非常好”等

我已经尝试使用下面的代码来实现上面的情节

library(ggplot2)
library(dplyr)
data("diamonds")

labeldat <- diamonds %>%
  group_by(cut, clarity) %>%
  dplyr::summarise(labels = paste(n(), n_distinct(color), sep = "\n"))


Comparisons = list(c("I1","SI2"),c("I1","SI1"),c("I1","VS2"),c("I1","VS1"),c("I1","VVS2"),c("I1","VVS1"),c("I1","IF"),
                   c("SI2","SI1"),c("SI2","VS2"),c("SI2","VS1"),c("SI2","VVS2"),c("SI2","VVS1"),c("SI2","IF"),
                   c("SI1","VS2"),c("SI1","VS1"),c("SI1","VVS2"),c("SI1","VVS1"),c("SI1","IF"),
                   c("VS2","VS1"),c("VS2","VVS2"),c("VS2","VVS1"),c("VS2","IF"),
                   c("VS1","VVS2"),c("VS1","VVS1"),c("VS1","IF"),
                   c("VVS2","VVS1"),c("VVS2","IF"),
                   c("VVS1","IF"))



ggplot(diamonds, aes(x=cut, y=price)) +
  geom_boxplot(aes(fill=clarity), position = position_dodge2(width=0.75)) + 
  theme_bw() + 
  geom_text(data = labeldat, aes(x = cut, y = -250, label = labels), hjust = 0.5, position = position_dodge2(width = .75))+
  stat_compare_means(aes(group=clarity), label = "p.signif", method="t.test", comparisons = Comparisons)

不幸的是,使用比较参数似乎是通过计算错误,我无法解决如何解决: 警告信息: stat_signif() 中的计算失败: 需要 TRUE/FALSE 的缺失值

我尝试在不进行比较的情况下运行它,但它似乎只是给了我一个总分

【问题讨论】:

  • hmmm 那么还有其他功能可以实现吗?

标签: r ggplot2 boxplot ggpubr


【解决方案1】:

我首先要说的是,在这个例子中进行了太多的比较,所以结果很混乱,为了适应额外的信息,y 轴被大大扩展了,箱线图被压扁了。但是为了提供答案并想象您可能有一个比较较少的数据集,问题是stat_compare_means() 比较 x 轴上的组。要通过clarity 进行比较,您需要将其放在x 轴上,然后通过cut 进行分面。

library(ggplot2)
library(ggpubr)
library(dplyr)

labeldat <- diamonds %>%
  group_by(cut, clarity) %>%
  dplyr::summarise(labels = paste(n(), n_distinct(color), sep = "\n"))

ggplot(diamonds, aes(x=clarity, y=price)) +
  geom_boxplot(aes(fill=clarity), position = position_dodge2(width=0.75)) + 
  stat_compare_means(aes(group=clarity), label = "p.signif", method="t.test", comparisons = combn(1:8, 2, FUN = list)) +
  facet_grid(cols = vars(cut)) +
  theme_bw() + 
  geom_text(data = labeldat, aes(x = clarity, y = -2000, label = labels), hjust = 0.5, position = position_dodge2(width = .75)) +
  theme(axis.text.x = element_blank())

【讨论】:

    【解决方案2】:

    您可以为此使用 ggsignif。它允许手动注释,因此您可以单独计算 p 值,并创建一个带有过滤比较的注释 data.frame。示例:

    library(ggplot2)
    library(ggsignif)
    library(dplyr)
    library(data.table)
    
    dm <- split(diamonds, diamonds$cut)
    getp <- function(y, pval=.05){
        a <- stats::pairwise.wilcox.test(x=y$price, g=y$clarity,
            p.adjust.method="none", paired=FALSE)
        return(as.data.table(as.table(a$p.value))[!is.na(N) & N < pval])
    }
    dmp <- data.table::rbindlist(lapply(dm, getp), idcol = "cut")
    data.table::setnames(dmp, c("cut", "start", "end", "label"))
    dmp$label <- formatC(
        signif(dmp$label, digits = 3),
        digits = 3,
        format = "g",
        flag = "#"
    )
    dmp[, y := (0:(.N-1)) * (2E4/.N)+2e4, by=cut]
    data.table::setDF(dmp)
    
    ggplot(diamonds, aes(x=clarity, y=price)) +
        geom_boxplot(aes(fill=clarity), position = position_dodge2(width=0.75)) + 
        facet_wrap(~ cut)+
        ggsignif::geom_signif(data=dmp,
            aes(xmin=start, xmax=end, annotations=label, y_position=y),
            textsize = 2, vjust = -0.2,
            manual=TRUE) + 
        ylim(NA, 4E4) +
        theme_bw() +
        theme(axis.text.x = element_blank())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-23
      • 2021-11-20
      • 2021-02-03
      • 2020-09-09
      • 2019-04-21
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多