Добавьте значения P к сравнениям в блочной диаграмме групп

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

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


person David    schedule 12.02.2020    source источник
comment
хм, есть ли другая функция, которая позволила бы это сделать?   -  person David    schedule 13.02.2020


Ответы (2)


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

введите здесь описание изображения

person 27 ϕ 9    schedule 13.02.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())

person user12728748    schedule 13.02.2020