ggplot2 geom_smooth, расширенная модель для метода = lm

Я хотел бы использовать geom_smooth для получения geom_smooth линии от определенной модели линейной регрессии.

Мне кажется, что формула может принимать только x и y а не какой-либо дополнительный параметр.

Чтобы более четко показать, чего я хочу:

library(dplyr)
library(ggplot2)
set.seed(35413)
df <- data.frame(pred = runif(100,10,100),
           factor = sample(c("A","B"), 100, replace = TRUE)) %>%
  mutate(
    outcome = 100 + 10*pred + 
    ifelse(factor=="B", 200, 0) + 
    ifelse(factor=="B", 4, 0)*pred +
    rnorm(100,0,60))

С

ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point(aes(color=factor)) +
  geom_smooth(method = "lm") +
  theme_bw()

Я создаю встроенные линии, которые из-за параметра color=factor являются в основном выходом линейной модели lm(outcome ~ pred*factor, df)

enter image description here

В некоторых случаях, однако, я предпочитаю, чтобы строки были выходными данными другой модели, например lm(outcome ~ pred + factor, df), для которой я могу использовать что-то вроде:

fit <- lm(outcome ~ pred+factor, df)
predval <- expand.grid(
  pred = seq(
    min(df$pred), max(df$pred), length.out = 1000),
  factor = unique(df$factor)) %>%
  mutate(outcome = predict(fit, newdata = .))

ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point() +
  geom_line(data = predval) +
  theme_bw()

что приводит к:

enter image description here

Мой вопрос: есть ли способ создать последний график, используя вместо этого geom_smooth? Я знаю, что в geom_smooth опция formula = -, но я не могу сделать что-то вроде formula = y ~ x + factor или formula = y ~ x + color (как я определил color = factor).

Ответ 1

Это очень интересный вопрос. Вероятно, главная причина, по которой geom_smooth настолько "устойчива", что позволяет настраивать модели нескольких переменных, заключается в том, что она ограничена производством двумерных кривых; следовательно, его аргументы предназначены для обработки двумерных данных (т.е. формула = переменная переменной = независимая переменная).

Трюк для получения того, что вы запросили, использует аргумент mapping в geom_smooth вместо formula. Как вы, наверное, видели, глядя на документацию, formula только позволяет указать математическую структуру модели (например, линейную, квадратичную и т.д.). И наоборот, аргумент mapping позволяет вам напрямую указывать новые y-значения, такие как вывод пользовательской линейной модели, которую вы можете вызвать с помощью функции predict().

Обратите внимание, что по умолчанию для inherit.aes установлено значение TRUE, поэтому ваши построенные регрессии будут соответствующим образом окрашены вашей категориальной переменной. Здесь код:

# original plot
plot1 <- ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point(aes(color=factor)) +
  geom_smooth(method = "lm") +
  ggtitle("outcome ~ pred") +
  theme_bw()

# declare new model here
plm <- lm(formula = outcome ~ pred + factor, data=df)

# plot with lm for outcome ~ pred + factor
plot2 <-ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point(aes(color=factor)) +
  geom_smooth(method = "lm", mapping=aes(y=predict(plm,df))) +
  ggtitle("outcome ~ pred + factor") +
  theme_bw()

enter image description here enter image description here