Анимированные графики скрипок и коробок с p-значениями для парных тестов Вилкоксона - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь добавить значения p для парного теста Вилкокса в R. Я использую следующий код.Приведенный ниже код создает скрипки (распределения плотности) результатов чтения (бицепс) для двух диет (лечение).Эти скрипки анимированы в течение времени 1, времени 2, времени 3. И верхняя часть графика печатает p-значения.Я хотел бы, чтобы эти p-значения были парными значениями так, чтобы

Для диеты 'a' чтение бицепса во время 2 сравнивалось со временем 1, а чтение бицепса во время 3 сравнивалось со временем 1.

И то же самое для диеты «б».Таким образом, должны быть два отдельных значения p, напечатанные поверх скрипок во время 2 и время 3. С указанием парных тестов (время 2 против времени 1 и время 3 против времени 1) для диеты «a» и диеты «b».

Каким должен быть правильный код для этого теста?Я попробовал кое-что здесь ниже на основе предложения, которое я получил вчера, но я столкнулся с ошибкой.Я также думаю, что приведенный ниже код просто выполняет парные тесты для времени 2 против времени 1 и времени 3 против времени 2. Это не то, что я хочу.

Спасибо за чтение.

 library(ggplot2)
 library(ggpubr)
 library(gganimate)
 library(tidyverse)

Пример данных

 structure(list(code = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L, 8L, 8L, 8L), diet = c("a", 
"a", "a", "b", "b", "b", "a", "a", "a", "b", "b", "b", "a", "a", 
"a", "b", "b", "b", "a", "a", "a", "b", "b", "b"), time = c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L), bicep = c(8L, 7L, 7L, 9L, 9L, 9L, 
11L, 10L, 9L, 11L, 11L, 12L, 12L, 11L, 10L, 9L, 9L, 9L, 12L, 
10L, 8L, 12L, 12L, 12L)), class = "data.frame", row.names = c(NA, 
-24L))

Пример кода

example3 %>%
  group_by(time) %>% 
  mutate(p=pairwise.wilcox.test(example3$bicep, interaction(example3$diet, example3$time), p.adjust.method = "none")$p.value,
         max=max(bicep, na.rm = T)) %>% 
  ggplot() + 
  geom_violin(aes(x=diet, y=bicep, fill=diet)) +
  geom_text(data = . %>% distinct(p, max, time), 
            aes(x=1.5, y = max+.5, label=as.character(round(p,2))),
            size=12) +
  transition_time(time) +
  ease_aes('linear')

Это ошибка, которую я получаю

 Error in mutate_impl(.data, dots) : 
  Column `p` must be length 8 (the group size) or one, not 25
In addition: There were 15 warnings (use warnings() to see them)

1 Ответ

0 голосов
/ 22 ноября 2018

Если я правильно понимаю вашу проблему, то есть очень простое решение.Вы получили эту ошибку из-за неправильного синтаксиса внутри mutate.Нет необходимости вызывать значения с $ при использовании mutate и каналов %>%:

Этот код дает желаемую анимацию с небольшими предупреждениями:

example3 %>%
  group_by(time) %>% 
  mutate(p=pairwise.wilcox.test(bicep, interaction(diet, time), p.adjust.method = "none")$p.value,
         max=max(bicep, na.rm = T)) %>% 
  ggplot() + 
  geom_violin(aes(x=diet, y=bicep, fill=diet)) +
  geom_text(data = . %>% distinct(p, max, time), 
            aes(x=1.5, y = max+.5, label=as.character(round(p,2))),
            size=12) +
  transition_time(time) +
  ease_aes('linear')

enter image description here

ОБНОВЛЕНИЕ

В случае независимых р-значений вам просто нужно добавить, например, facet_wrap().Это кажется самым простым:

example3 %>%
  group_by(time) %>% 
  mutate(p = pairwise.wilcox.test(bicep, interaction(diet, time), p.adjust.method = "none")$p.value,
         max = max(bicep, na.rm = T)) %>%
  ggplot() + 
  geom_violin(aes(x = diet, y = bicep, fill = diet)) +
  geom_text(data = . %>% distinct(p, max, time), 
            aes(x = 1, y = max+.5, label = as.character(round(p,2))),
            size = 12) +
  facet_wrap(~diet, scales = "free_x") + # add facets
  theme(legend.position = "none") +
  transition_time(time) +
  ease_aes('linear')

enter image description here

...