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.
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')
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))
# 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)
La solution évidente en utilisant geom_abline
:
geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])
Où 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 .
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)))
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.