Добавьте значения P к сравнениям в группах boxplot - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь создать блок-график, который показывает только значимые значения p в группах для каждого столбца на блок-графике. Например, здесь сравниваются I1 и SI2 для «удовлетворительного», «хорошего», «очень хорошего» и т. Д. c

enter image description here

I ' мы пытались использовать следующий код для достижения вышеуказанного графика

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() : пропущенное значение, где требуется ИСТИНА / ЛОЖЬ

Я попытался запустить это без сравнений, но, похоже, просто дает мне общий балл

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Вы можете использовать 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())

0 голосов
/ 13 февраля 2020

Я предвосхищу это, сказав, что в этом примере слишком много сравнений, поэтому результат разбит и для размещения дополнительной информации ось 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())

enter image description here

...