wake-up-neo.net

Hinzufügen einer Regressionslinie in einem ggplot

Ich bemühe mich sehr, eine Regressionslinie in einen ggplot einzufügen. Ich habe es zuerst mit abline versucht, aber es ist mir nicht gelungen, es zum Laufen zu bringen. Dann habe ich es 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.

92
Remi.b

Im Allgemeinen sollten Sie zur Angabe Ihrer eigenen Formel die Argumente x und y verwenden, die den Werten entsprechen, die Sie in ggplot() angegeben haben - in diesem Fall x wird als x.plot und y als y.plot interpretiert. Weitere Informationen zu Glättungsmethoden und Formeln finden Sie auf der Hilfeseite der Funktion stat_smooth(), da es sich um den von geom_smooth() verwendeten Standardstatus handelt.

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 Aufruf ggplot() angegeben haben, und die lineare Regressionslinie zeichnen müssen, müssen Sie die Formel nicht in geom_smooth() verwenden Geben Sie den method="lm" ein.

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

Wie ich gerade herausgefunden habe, funktioniert die oben erwähnte Lösung nicht, falls Sie ein Modell haben, das auf mehrere lineare Regressionen angepasst ist.

Sie müssen Ihre Linie 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))

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

Die naheliegende Lösung mit geom_abline:

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

Wo data.lm ist ein lm Objekt und data.lm$coefficients sieht ungefähr so ​​aus:

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

Identisch in der Praxis ist die Verwendung von stat_function um die Regressionsgerade als Funktion von x zu zeichnen, benutze predict:

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

Dies ist etwas weniger effizient, da standardmäßig n=101 Punkte werden berechnet, sind jedoch wesentlich flexibler, da eine Vorhersagekurve für jedes Modell erstellt wird, das predict unterstützt, z. B. nichtlineare npreg aus Paket np.

Hinweis: Wenn Sie scale_x_continuous oder scale_y_continuous einige Werte können abgeschnitten sein und somit geom_smooth funktioniert möglicherweise nicht richtig. Verwenden coord_cartesian stattdessen zoomen .

5
qwr

Wenn Sie andere Modelltypen anpassen möchten, z. B. eine Dosis-Wirkungs-Kurve mithilfe logistischer Modelle, müssen Sie auch mehr Datenpunkte mit der Funktion "Vorhersagen" 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)))
2
user3436882

Ich fand diese Funktion auf einem 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)))
    }`

sobald du die funktion geladen hast könntest du einfach

ggplotRegression(fit)

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

Hoffe das hilft.

2
YellowEagle