web-dev-qa-db-fra.com

Ajouter une droite de régression sur un ggplot

Je fais de mon mieux pour ajouter une droite de régression sur un ggplot. J'ai d'abord essayé avec Abline mais je n'ai pas réussi à le faire fonctionner. Puis j'ai essayé ça ...

data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
   geom_smooth(method='lm',formula=data$y.plot~data$x.plot)

Mais cela ne fonctionne pas non plus.

92
Remi.b

En général, pour fournir votre propre formule, vous devez utiliser les arguments x et y qui correspondent aux valeurs que vous avez fournies dans ggplot() - dans ce cas, x sera interprété comme x.plot et y comme y.plot. Vous trouverez plus d’informations sur les méthodes de lissage et la formule dans la page d’aide de la fonction stat_smooth() car c’est la statistique par défaut utilisée par geom_smooth().

ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm',formula=y~x)

Si vous utilisez les mêmes valeurs x et y que vous avez fournies dans l'appel ggplot() et que vous avez besoin de tracer une ligne de régression linéaire, vous n'avez pas besoin d'utiliser la formule à l'intérieur de geom_smooth(), fournissez simplement le method="lm".

ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm')
129
Didzis Elferts

Comme je viens de le comprendre, si vous avez un modèle adapté à la régression linéaire multiple , la solution susmentionnée ne fonctionnera pas.

Vous devez créer votre ligne manuellement en tant que cadre de données contenant les valeurs prédites pour votre cadre de données d'origine (dans votre cas, data).

Cela ressemblerait à ceci:

# read dataset
df = mtcars

# create multiple linear model
lm_fit <- lm(mpg ~ cyl + hp, data=df)
summary(lm_fit)

# save predictions of the model in the new data frame 
# together with variable you want to plot against
predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)

# this is the predicted line of multiple linear regression
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))

Multiple LR

# this is predicted line comparing only chosen variables
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_smooth(method = "lm", se = FALSE)

Single LR

34
StefanK

La solution évidente en utilisant geom_abline:

geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])

data.lm est un objet lm et data.lm$coefficients ressemble à ceci:

data.lm$coefficients
(Intercept)    DepDelay 
  -2.006045    1.025109 

Identique en pratique, on utilise stat_function pour tracer la droite de régression en fonction de x, en utilisant predict:

stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))

Ceci est un peu moins efficace car par défaut, n=101 points sont calculés, mais beaucoup plus souples, car ils traceront une courbe de prédiction pour tout modèle prenant en charge predict, tel que non linéaire npreg du paquet np.

Remarque: Si vous utilisez scale_x_continuous ou scale_y_continuous, certaines valeurs peuvent être coupées et ainsi geom_smooth risque de ne pas fonctionner correctement. tilisez coord_cartesian pour zoomer à la place .

5
qwr

Si vous souhaitez adapter d'autres types de modèles, tels qu'une courbe dose-réponse utilisant des modèles logistiques, vous devez également créer davantage de points de données avec la fonction predict si vous souhaitez une courbe de régression plus douce:

fit: votre ajustement d'une courbe de régression logistique

#Create a range of doses:
mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out = 100))
#Create a new data frame for ggplot using predict and your range of new 
#doses:
fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)

ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))
2
user3436882

J'ai trouvé cette fonction sur un blog

 ggplotRegression <- function (fit) {

    `require(ggplot2)

    ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
      geom_point() +
      stat_smooth(method = "lm", col = "red") +
      labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
                         "Intercept =",signif(fit$coef[[1]],5 ),
                         " Slope =",signif(fit$coef[[2]], 5),
                         " P =",signif(summary(fit)$coef[2,4], 5)))
    }`

une fois que vous avez chargé la fonction, vous pouvez simplement

ggplotRegression(fit)

vous pouvez aussi aller pour ggplotregression( y ~ x + z + Q, data)

J'espère que cela t'aides.

2
YellowEagle