Полосы ошибок и линии не совпадают в ggplot2

#r #ggplot2 #graph

Вопрос:

У меня проблема с барами ошибок в ggplot2.

Я хочу построить график взаимодействия между непрерывной [iv] и номинальной [условной] переменной. Я использую такой код

 iv = runif(n = 100, min = 1, max = 7)
condition <- rep(letters[1:2], length.out = 100)
y = runif(n = 100, min = 1, max = 100)

df <- data.frame(iv, condition, y)

lm20 <- lm(y ~ condition * iv, data = df)
summary(lm20) 

df$condition <- as.factor(df$condition)

ggeffect(lm20, terms = c("condition", "iv")) %>%  
  plot(show.title = FALSE)   
  stat_summary(fun.y = mean,
               geom = "point")  
  stat_summary(fun.y = mean,
               geom = "line")  
  stat_summary(fun.data = mean_cl_boot,
               geom = "errorbar")  
  scale_y_continuous("Voting intentions", limits = c(0, 100))   
  scale_colour_discrete(name = "Control", labels = c("Low", "Medium", "High"))  
  scale_x_discrete("Condition", labels = c("Low","High")
 

И вот что я получаю:

График

Я сталкиваюсь с двумя проблемами

  1. Полосы ошибок и линии не совпадают
  2. Я не могу изменить метки на оси X

Ответ №1:

Здесь происходит пара вещей. В основном:

  • вам нужно установить position_dodge значение, которое смещает ваши добавленные очки на ту же величину, ggeffects на которую уже смещены полосы ошибок
  • ggeffects на самом деле используется непрерывная шкала по оси x. Смотрите мое использование scale_x_continuous() ниже …
  • mean_cl_boot похоже, он ничего не делает, не совсем понял, почему
 library(ggeffects)
library(ggplot2)
library(magrittr)

pd <- position_dodge(width=0.25)  ## width set by trial amp; error to match ggeffects plot
ggeffect(lm20, terms = c("condition", "iv")) %>%  
    plot(show.title = FALSE)  
    ## set large size/alpha to distinguish mean points from the 
    ##   (identical) points that ggeffects is already using for the estimated values
    stat_summary(fun = mean, geom = "point", position = pd, size = 5,
                 alpha=0.5)  
    stat_summary(fun = mean, geom = "line", position = pd)  
    stat_summary(fun.data = mean_cl_boot, geom = "errorbar",
                 position = pd, size = 5, alpha=0.5)  
    scale_y_continuous("Voting intentions", limits = c(0, 100))   
    scale_colour_discrete(name = "Control", labels = c("Low", "Medium", "High"))  
    scale_x_continuous(name = "Condition",
                       breaks = 1:2,
                       labels = c("Low","High"))
 

Комментарии:

1. Фантастика, большое вам спасибо! Так полезно!

Ответ №2:

Ниже приведено решение, использующее исключительно ggplot2, поэтому оно не такое элегантное… Посмотрите, сработает ли это!

 # Create data frame with the effects    
df <- as.data.frame(ggeffect(lm20, terms = c("condition", "iv")))
# Add coordinates manually
df$x2 <- rep(1:2, 3)   rep(c(-.1,0,.1), each = 2)

# Plot
ggplot(df, aes(x2, predicted, col = group))   
  geom_errorbar(aes(x = x2, ymin = predicted-std.error, ymax = predicted std.error), width = .1)  
  geom_segment(df %>% pivot_wider(id_cols = group, names_from = x,  values_from = c(predicted:conf.high, x2)),
               mapping = aes(x = x2_a, xend = x2_b, y = predicted_a, yend = predicted_b))  
  geom_point(size = 2)  
  scale_color_discrete("Control",c("#9b2756", "#003054","#66b0a5"), labels=c("Low", "Medium", "High"))  
  scale_y_continuous("Voting intentions", limits = c(0, 100))   
  scale_x_continuous("Condition", breaks = 1:2, labels = c("Low","High"))
 

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

Комментарии:

1. Отлично, большое вам спасибо — приятно знать, что это возможно только с помощью ggplot2!