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



(1)

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

Хитрость в получении того, что вы запрашивали, заключается в использовании аргумента mapping в geom_smooth вместо formula . Как вы, вероятно, видели из documentation , 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()

Я хотел бы использовать 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)

В некоторых случаях, однако, я предпочитаю, чтобы строки были выходом другой модели, например, 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()

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

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





ggplot2