r - ggplot - geom_smooth methods
ggplot2 geom_smooth, modelo extendido para method=lm (1)
Me gustaría usar geom_smooth
para obtener una línea ajustada de un determinado modelo de regresión lineal.
Me parece que la fórmula solo puede tomar x
e y
no ningún parámetro adicional.
Para mostrar más claramente lo que quiero:
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))
Con
ggplot(df, aes(x=pred, y=outcome, color=factor)) +
geom_point(aes(color=factor)) +
geom_smooth(method = "lm") +
theme_bw()
Produzco líneas ajustadas que, debido a la opción color=factor
, son básicamente la salida del modelo lineal lm(outcome ~ pred*factor, df)
En algunos casos, sin embargo, prefiero que las líneas sean la salida de un ajuste de modelo diferente, como lm(outcome ~ pred + factor, df)
, para el cual puedo usar algo como:
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()
lo que resulta en :
Mi pregunta: ¿hay una manera de producir este último gráfico explotando geom_smooth
en geom_smooth
lugar? Sé que hay una opción formula =
- en geom_smooth
pero no puedo hacer que geom_smooth
algo como formula = y ~ x + factor
o formula = y ~ x + color
(como definí color = factor
).
Esta es una pregunta muy interesante. Probablemente la razón principal por la que geom_smooth
es tan "resistente" a permitir modelos personalizados de múltiples variables es que se limita a producir curvas 2-D; en consecuencia, sus argumentos están diseñados para manejar datos bidimensionales (es decir, fórmula = variable de respuesta ~ variable independiente).
El truco para obtener lo que solicitó es usar el argumento de mapping
dentro de geom_smooth
, en lugar de la formula
. Como probablemente haya visto en la documentation , la formula
solo le permite especificar la estructura matemática del modelo (por ejemplo, lineal, cuadrática, etc.). A la inversa, el argumento de mapping
permite especificar directamente nuevos valores de y, como la salida de un modelo lineal personalizado al que puede llamar usando predict()
.
Tenga en cuenta que, de forma predeterminada, inherit.aes
se establece en TRUE
, por lo que sus regresiones trazadas se colorearán de manera apropiada según su variable categórica. Aquí está el código:
# 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()