Визуализируйте различия между уровнями факторов, используя ggplot - PullRequest
2 голосов
/ 25 апреля 2019

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

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

contrasts <- data.frame(Level1 = c("setosa", "setosa", "versicolor"),
                        Level2 = c("versicolor", "virginica", "virginica"),
                        Diff = c(0.65, 0.46, -0.20),
                        CI_low = c(0.53, 0.35, -0.32),
                        CI_high = c(0.75, 0.56, -0.09))

means <- data.frame(Species = c("setosa", "versicolor", "virginica"),
                    Mean = c(3.42, .77, 2.97))

Моя цель - использовать средство в качестве отправной точки для треугольника, который «проецируется» на уровень соответствующего контраста, высота которого будет равна CI (CI_low и CI_high). Чтобы это выглядело примерно так (простите мою краску):

enter image description here

Используя следующее, я легко добавил начальные точки:

library(tidyverse)

means %>%
  ggplot() + 
  geom_point(aes(x = Species, y= Mean)) + 
  geom_ribbon(data=contrasts, aes(x=Level1, ymin=CI_low, ymax=CI_high))

Но у меня проблемы с добавлением треугольников. Есть идеи? Большое спасибо!

Редактировать

Спасибо Юрию Барвинченко, который предоставил код для получения этого:

contrasts %>% 
  bind_cols(id=1:3) %>% 
  inner_join(means, by=c('Level1' = 'Species')) %>% 
  select(id, x=Level1, y=Mean) %>% 
  bind_rows( (contrasts %>% 
                bind_cols(id=1:3) %>% 
                select(id, x=Level2, y=CI_low)),
             (contrasts %>% 
                bind_cols(id=1:3) %>% 
                select(id, x=Level2, y=CI_high))) %>% 
  ggplot(aes(x = x, y= y, group=id)) + 
  geom_polygon()

Однако, основываясь на средствах, я ожидал, что средний уровень (лишний раз) будет «самым низким», тогда как в этом сюжете это virginica, который является самым низким значением.

1 Ответ

3 голосов
/ 25 апреля 2019

если я правильно понимаю ваш вопрос, вам нужен код, подобный этому:

contrasts <- tibble(Level1 = c("setosa", "setosa", "versicolor"),
                        Level2 = c("versicolor", "virginica", "virginica"),
                        Diff = c(0.65, 0.46, -0.20),
                        CI_low = c(0.53, 0.35, -0.32),
                        CI_high = c(0.75, 0.56, -0.09))

means <- tibble(Species = c("setosa", "versicolor", "virginica"),
                                            Mean = c(3.42, .77, 2.97))

library(tidyverse)

contrasts %>% 
  bind_cols(id=1:3) %>% 
  inner_join(means, by=c('Level1' = 'Species')) %>% 
  select(id, x=Level1, y=Mean) %>% 
  bind_rows( (contrasts %>% 
                bind_cols(id=1:3) %>% 
                select(id, x=Level2, y=CI_low)),
             (contrasts %>% 
                bind_cols(id=1:3) %>% 
                select(id, x=Level2, y=CI_high))) %>% 
  ggplot(aes(x = x, y= y, group=id)) + 
  geom_polygon()

Обратите внимание, я использую tibble() вместо data.frame(), чтобы избежать факторов и облегчить объединение этих таблиц.

...