Как аннотировать boxplot со значениями p, используя комбинацию ggpubr и ggsignif? - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь создать коробку, которая показывает несколько сравнений. Я сделал игрушечный набор данных, который, похоже, выдает мне ту же ошибку, что и мой более крупный.

library(tidyverse)
library(ggsignif)
library(ggpubr)


dat <- data.frame(measurement = c("750","850","900", "300","200","400", "20", "30", "50"),
                   diagnosis = c("Healthy", "Healthy", "Healthy","Moderate","Moderate","Moderate",  "Sick", "Sick", "Sick"))

dat$measurement <- as.numeric(dat$measurement)

#List of comparisons
dat.compare <- list(c("Healthy", "Moderate"), 
                    c("Healthy", "Sick"), 
                    c("Moderate", "Sick"))

#Running Anova
dat.lm <- lm(measurement ~ diagnosis, data = dat)
TukeyHSD(aov(dat.lm))
Yields: 
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = dat.lm)

$diagnosis
                       diff       lwr        upr     p adj
Moderate-Healthy -4.3333333 -8.830369  0.1637022 0.0574078
Sick-Healthy     -4.6666667 -9.163702 -0.1696312 0.0433911
Sick-Moderate    -0.3333333 -4.830369  4.1637022 0.9720206

dat.p <- list("0.05","0.04", "0.97")

p adj - это то, что я пытаюсь аннотировать на своем блокпосте с помощью следующего кода:

ggboxplot(dat, x ="diagnosis" , y = "measurement" ,
               color = "diagnosis", palette = "jco",
               add = "jitter") +
  ggsignif::geom_signif(data=dat, 
                        comparisons = dat.compare, annotations=dat.p, 
                        map_signif_level = TRUE)

При запуске кода для блокпоста выдает следующую ошибку :

Warning message:
Computation failed in `stat_signif()`:
names do not match previous names 

Конечный результат должен выглядеть примерно так

Boxplot

Насколько я знаю, имена в списке сравнения совпадают с именами в dataframe. Я застрял на этом в течение нескольких часов, есть идеи, что я делаю не так? Спасибо!

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Я обнаружил, что если я изменю оба формата списка на векторы, пакет примет его без ошибки.

Я ценю помощь @ dc37.

1 голос
/ 10 апреля 2020

Возможное решение состоит в том, чтобы использовать geom_signif для ручного добавления ваших значений на ваш блок-график.

Но сначала вам нужно сгенерировать кадр данных, который будет содержать значения для p, сравниваемые значения x и положение y, чтобы установить ваши значения p.

Вот пример того, как вы можете сделать это, начиная с теста Тьюки:

Tukey_data <- TukeyHSD(aov(dat.lm))$diagnosis

library(dplyr)
maxvalues <- dat %>% group_by(diagnosis) %>% summarise(MAX = max(measurement))

pval <- as.data.frame(Tukey_data) %>% rownames_to_column("Group") %>%
  rowwise() %>%
  mutate(Start = unlist(strsplit(Group,"-"))[1],
         End = unlist(strsplit(Group,"-"))[2]) %>%
  left_join(.,maxvalues, by = c("Start" = "diagnosis")) %>%
  left_join(.,maxvalues, by = c("End" = "diagnosis")) %>% ungroup() %>%
  mutate(ypos = c(12,10,8))
  mutate(End = factor(End, levels = c("Healthy","Moderate","Sick"))) %>% rowwise() %>%
  mutate(ypos = max(MAX.x, MAX.y)*(1+0.25*as.numeric(End)))

# A tibble: 3 x 10
  Group              diff   lwr    upr `p adj` Start    End      MAX.x MAX.y  ypos
  <chr>             <dbl> <dbl>  <dbl>   <dbl> <chr>    <chr>    <dbl> <dbl> <dbl>
1 Moderate-Healthy -4.33  -8.83  0.164  0.0574 Moderate Healthy      5     9    12
2 Sick-Healthy     -4.67  -9.16 -0.170  0.0434 Sick     Healthy      6     9    10
3 Sick-Moderate    -0.333 -4.83  4.16   0.972  Sick     Moderate     6     5     8

Затем вы можете пройти geom_signif следующим образом:

library(ggpubr)
library(ggsignif)

ggboxplot(dat, x ="diagnosis" , y = "measurement" ,
          color = "diagnosis", palette = "jco",
          add = "jitter") +
  geom_signif(data = pval, manual = TRUE,
              aes(xmax = End, xmin = Start, y_position= ypos, annotations = round(`p adj`,3)))

enter image description here

Это отвечает на ваш вопрос?

...