method ggplot geom_smooth geom r ggplot2

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()