17 votes

ggplot2 geom_smooth, modèle étendu pour method=lm

Je voudrais utiliser geom_smooth pour obtenir une ligne ajustée à partir d'un certain modèle de régression linéaire.

Il me semble que la formule ne peut que prendre x y y et non un paramètre supplémentaire.

Pour montrer plus clairement ce que je veux :

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

Avec

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

Je produis des lignes ajustées qui, en raison de la color=factor sont essentiellement les résultats du modèle linéaire. lm(outcome ~ pred*factor, df)

enter image description here

Dans certains cas, cependant, je préfère que les lignes soient le résultat d'un ajustement de modèle différent, comme par exemple lm(outcome ~ pred + factor, df) pour lequel je peux utiliser quelque chose comme :

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

ce qui entraîne :

enter image description here

Ma question : existe-t-il un moyen de produire ce dernier graphique en exploitant le système de gestion de l'information de l'entreprise ? geom_smooth à la place ? Je sais qu'il y a un formula = - option dans geom_smooth mais je ne peux pas faire quelque chose comme formula = y ~ x + factor ou formula = y ~ x + color (comme je l'ai défini color = factor ) travaillent.

6voto

Marcus Campbell Points 2159

C'est une question très intéressante. Probablement la principale raison pour laquelle geom_smooth est si "résistant" à l'idée de permettre des modèles personnalisés de variables multiples est qu'il est limité à la production de courbes bidimensionnelles ; par conséquent, ses arguments sont conçus pour traiter des données bidimensionnelles (c'est-à-dire formule = variable de réponse ~ variable indépendante).

L'astuce pour obtenir ce que vous avez demandé est d'utiliser la fonction mapping argument au sein de geom_smooth au lieu de formula . Comme vous l'avez probablement vu en regardant les documentation , formula vous permet uniquement de spécifier la structure mathématique du modèle (par exemple, linéaire, quadratique, etc.). À l'inverse, le modèle mapping vous permet de spécifier directement de nouvelles valeurs y - comme la sortie d'un modèle linéaire personnalisé que vous pouvez appeler en utilisant predict() .

Notez que, par défaut, inherit.aes est réglé sur TRUE Ainsi, vos régressions tracées seront colorées de manière appropriée par votre variable catégorielle. Voici le code :

# 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X