Множественные сравнения с функцией geom_signif, R

Пакет ggsignif очень удобен для быстрого и удобного отображения значимых сравнений на ggplot графиках. Однако вызов comparisons требует ручного ввода каждой пары сравниваемых значений.

Например

library(ggplot2)
library(ggsignif)

data(iris)

ggplot(iris, aes(x=Species, y=Sepal.Length)) + 
  geom_boxplot() +
  geom_signif(comparisons = list(c("versicolor", "virginica"),c('versicolor','setosa')), 
              map_signif_level=TRUE)

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

Мне интересно, как это можно было бы обойти, обратившись ко всем возможным комбинациям сразу? Например, expand.grid(x = levels(iris$Species), y = levels(iris$Species)) дает все комбинации

           x          y
1     setosa     setosa
2 versicolor     setosa
3  virginica     setosa
4     setosa versicolor
5 versicolor versicolor
6  virginica versicolor
7     setosa  virginica
8 versicolor  virginica
9  virginica  virginica

Но как сделать так, чтобы geom_signif(comparisons=... принял это?

Информация о пакете доступна здесь https://cran.r-project.org/web/packages/ggsignif/index.html


person J.Con    schedule 16.05.2017    source источник
comment
combn(levels(iris$Species), 2) даст вам все три попарные комбинации   -  person Adam Quek    schedule 16.05.2017
comment
@AdamQuek, использующий это без list(), дает ошибку Warning message: Computation failed in stat_signif(): not enough 'y' observations. Использование с list() добавляет к графику только первое сравнение.   -  person J.Con    schedule 16.05.2017
comment
Не отвечаю на ваш запрос geom_signif (никогда не пользовался и не собираюсь). Просто предположил, что combn - более разумный способ получить попарную комбинацию вместо expand.grid.   -  person Adam Quek    schedule 16.05.2017
comment
@AdamQuek О. Ну, что ж, спасибо.   -  person J.Con    schedule 16.05.2017


Ответы (1)


Основываясь на комментарии Адама Квека, вам просто нужно транспонировать созданную матрицу и превратить каждую строку в список:

split(t(combn(levels(iris$Species), 2)), seq(nrow(t(combn(levels(iris$Species), 2)))))

$`1`
[1] "setosa"     "versicolor"

$`2`
[1] "setosa"    "virginica"

$`3`
[1] "versicolor" "virginica" 

ggplot(iris, aes(x = Species, y = Sepal.Length)) + 
  geom_boxplot() +
  geom_signif(comparisons = split(t(combn(levels(iris$Species), 2)), seq(nrow(t(combn(levels(iris$Species), 2))))), 
              map_signif_level = TRUE)

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

person erc    schedule 16.05.2017
comment
Превосходно! Спасибо. Могу ли я побеспокоить вас, чтобы спросить, как вы могли уклоняться от этих линий? - person J.Con; 16.05.2017
comment
А, я вижу step_increase=. - person J.Con; 16.05.2017