Hinzufügen einer Regressionslinie zu einem ggplot


120

Ich bemühe mich sehr, eine Regressionslinie zu einem ggplot hinzuzufügen. Ich habe es zuerst mit abline versucht, aber ich habe es nicht geschafft, dass es funktioniert. Dann habe ich das versucht ...

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)

Aber es funktioniert auch nicht.

Antworten:


170

In der Regel Ihre eigene Formel zur Verfügung zu stellen , sollten Sie Argumente verwenden xund ydass Werte , die Sie in bereitgestellt entsprechen wird ggplot()- in diesem Fall xinterpretiert werden , wie x.plotund ywie y.plot. Weitere Informationen zu Glättungsmethoden und -formeln finden Sie auf der Hilfeseite der Funktion, stat_smooth()da dies der Standardstatus ist, der von verwendet wird geom_smooth().

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

Wenn Sie dieselben x- und y-Werte verwenden, die Sie im ggplot()Aufruf angegeben haben, und eine lineare Regressionslinie zeichnen müssen, müssen Sie die darin enthaltene Formel nicht verwenden, sondern geom_smooth()nur die method="lm".

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

46

Wie ich gerade herausgefunden habe, funktioniert die oben genannte Lösung nicht , wenn Sie ein Modell haben, das an eine multiple lineare Regression angepasst ist .

Sie müssen Ihre Zeile manuell als Datenrahmen erstellen, der vorhergesagte Werte für Ihren ursprünglichen Datenrahmen enthält (in Ihrem Fall data).

Es würde so aussehen:

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

Mehrere 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


1
Eine Sache, auf die Sie achten sollten, ist die Konvention lm (y ~ x). Ich habe mich für eine zweite Lesung ein wenig umgedreht, da die Variable, die Sie 'vorhersagen', auf der x-Achse liegt. Tolle Antwort.
Colorlace

14

Die offensichtliche Lösung mit geom_abline:

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

Wo data.lmist ein lmObjekt und data.lm$coefficientssieht ungefähr so ​​aus:

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

In der Praxis ist es identisch stat_function, die Regressionslinie als Funktion von x zu zeichnen, wobei Folgendes verwendet wird predict:

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

Dies ist etwas weniger effizient, da standardmäßig n=101Punkte berechnet werden, aber viel flexibler, da eine Vorhersagekurve für jedes unterstützte Modell erstellt wird predict, z. B. nichtlinear npregaus Paket np.

Hinweis: Wenn Sie verwenden scale_x_continuousoder scale_y_continuouseinige Werte möglicherweise abgeschnitten sind und daher geom_smoothmöglicherweise nicht richtig funktionieren. Verwenden Sie coord_cartesianstattdessen zum Zoomen .


2
Sie müssen sich also keine Gedanken über die Reihenfolge Ihrer Formeln oder das Hinzufügen von +0Namen machen. Sie können Namen verwenden. data.lm$coefficients[['(Intercept)']]und data.lm$coefficients[['DepDelay']].
Ufos

(Fast) wird immer (Intercept)zuerst aufgeführt. Die Namen machen den Code klarer.
qwr

Ich denke, das ist die beste Antwort - es ist die vielseitigste.
Arranjdavis

4

Ich habe diese Funktion in einem Blog gefunden

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

Sobald Sie die Funktion geladen haben, können Sie einfach

ggplotRegression(fit)

Sie können auch für gehen ggplotregression( y ~ x + z + Q, data)

Hoffe das hilft.


2

Wenn Sie andere Modelltypen anpassen möchten, z. B. eine Dosis-Wirkungs-Kurve mit logistischen Modellen, müssen Sie auch mehr Datenpunkte mit der Funktion "Vorhersage" erstellen, wenn Sie eine glattere Regressionslinie wünschen:

fit: Ihre Anpassung einer logistischen Regressionskurve

#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)))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.