Упорядочить geom_boxplot по значению p - PullRequest
1 голос
/ 05 июля 2019

Я использую следующий код.

 library(ggplot2)
 library(ggpubr)
 mtcars$carb <- as.factor(mtcars$carb)
 mtcars$am <- as.factor(mtcars$am)
 ggplot(mtcars) + 
     geom_boxplot(aes(x = carb, y = mpg, fill = am), 
         position = position_dodge(0.9)) + 
     stat_compare_means(aes(x = carb, y = mpg, group = am), label = "p.format")

Это приводит к этому участку: enter image description here

Как можно упорядочить пары от низкого до высокого значения p, чтобы порядок на оси х стал карб = 2, 1, 4, 3, 6, 8, пожалуйста?

Обратите внимание, что мне нужно применить это к большему набору данных, поэтому мне нужно отсортировать, используя значения p, а не что-то вроде c(2,1,4,3,6,8). Спасибо.

1 Ответ

2 голосов
/ 05 июля 2019

Кажется, что должен быть более простой и элегантный способ, чем это решение, но здесь все идет.

Подход:

  • создать столбец списка, где am и mpg вложены в carb
  • фильтр для строк только с 2 уникальными уровнями для am (l == 2)
  • run t.test и добавьте столбец с p-значением
  • объедините carb и pval назад к исходным данным
  • упорядочите по pval и сделайте carb фактором с уровнями в желаемом порядке (по pval)
  • теперь мы можем ggplot

Код.Обратите внимание, что я использую t.test для сравнения средних значений в обоих случаях, поэтому значения p отличаются от ваших, которые, я думаю, использовали тест Уилкокса по умолчанию.

library(tidyverse)
library(ggpubr)

mtcars %>% 
  select(carb, am, mpg) %>% 
  mutate(am = factor(am)) %>% 
  nest(am, mpg)  %>% 
  mutate(l = map_int(data, ~unique(.$am) %>% length)) %>% 
  filter(l == 2) %>% 
  mutate(pval = map_dbl(data, ~t.test(mpg ~ am, .)$p.value)) %>% 
  select(carb, pval) %>% 
  right_join(mtcars) %>% 
  arrange(pval) %>% 
  mutate(carb = factor(carb, levels = unique(.$carb)), 
         am = factor(am)) %>% 
  ggplot(aes(carb, mpg)) + 
  geom_boxplot(aes(fill = am)) + 
  stat_compare_means(aes(carb, mpg, group = am), 
                     label = "p.format", 
                     method = "t.test")

Результат:

enter image description here

...