Einfache Lineare Regression in R

Wie rechne ich eine einfache lineare Regression in R? Diese Frage soll der heute Post, der erste der Kategorie ‚Statistik‘, beantworten. Da die Programmiersprache R ursprünglich für statistische Analysen geschaffen wurde, haben wir Glück: Viele der statistischen Funktionen sind sehr einfach zu benutzen und zu merken.

Lineare Regression in R

Sowohl einfache als auch multiple lineare Regressionen lassen sich in R ganz einfach mit der lm-Funktion berechnen. Anschließend haben wir ein statistisches Modell und können uns allmögliche Informationen dazu anschauen, z.B. Koeffizienten, Residuen, vorhergesagte Werte, und weitere. Fangen wir kurz nochmal mit den Grundlagen der linearen Regression an und schauen uns danach an, wie wir eine Regression in R rechnen.

Grundlagen lineare Regression

Die lineare Regression ist eine statistische Methode, bei der eine Zielvariable (auch: abhängige Variable, erklärte Variable, Regressand) durch eine oder mehrere Prädiktoren (auch: unabhängige Variablen, erklärende Variablen, Regressoren) erklärt wird. Die Variablen sind im linearen Regressionsmodell metrisch; kategorische Variablen können durch Dummy-Coding passend gemacht werden. Man spricht von einer linearen Regression, da der Zusammenhang zwischen abhängiger Variable und Prädiktoren durch eine lineare Funktion abgebildet wird (Linearkombination der Koeffizienten). Dabei werden alle Prädiktoren durch die Regressionskoeffizienten so gewichtet, dass der Fehler (Unterschied vorhergesagter Wert und realer Wert der abhängigen Variable) möglichst gering wird; genauer gesagt: die Summe der quadrierten Abweichungen wird minimiert. Zum Glück müssen wir uns nicht um die Details kümmern, da die jeweiligen Funktionen in R das alles automatisch machen. Wenden wir uns der Praxis zu…

Regression in R berechnen

Für eine einfache lineare Regression reichen zwei Variablen: unser Prädiktor und die abhängige Variable. Bauen wir uns ein Data Frame mit entsprechenden Vektoren:

df <- data.frame(y=c(5.3, 1.8, 11.8, 9.6, 4.0, 8.9, 9.2, 5.5, 6.1, 7.8),
                 x=c(14.2, 6.7, 15.0, 16.4, 10.8, 17.5, 12.5, 9.9, 9.0, 15.2))

Wir haben zwei numerische Variablen, von denen wir mit x die abhängige y vorhersagen wollen.

Lineares Modell erstellen

Im ersten Schritt erstellen wir ein lineares Modell: mdl <- lm(y ~ x, data=df). Die Schreibweise y ~ x ist die Formel-Schreibweise in R; in diesem Fall besagt sie, dass y abhängig von x ist. Führen wir den Code aus, ist mdl nun unser Regressionsobjekt mit allen wichtigen Informationen.

Modellinformationen anschauen

Wir können uns nun eine Zusammenfassung der Regression anzeigen lassen: summary(mdl). Oben sehen wir nochmal die Zeile mit der angegebenen Formel. Als nächstes bekommen wir eine kurze ‚5 number summary‘ der Residuen (min, max, median, erstes und drittes quartil). Darunter stehen die Koeffizienten: unsere Prädiktoren inklusive Konstante, Intercept, deren Bs, Standardfehler, t-Wert, und p-Wert. Sind Sternchen am Ende einer Zeile, ist der entsprechende Prädiktor signifikant für ein bestimmtes Alpha-Level. Ganz unten der Summary stehen noch Gesamtstatistiken für das Modell wie z.B. R², F und p-Wert.

Modellinformationen extrahieren

Gerade wenn der Anspruch besteht, ein System zu automatisieren, kann es hilfreich sein, Modellinformationen aus dem lm-Objekt zu extrahieren. Hier liefere ich nur ein kleines Beispiel: Wir möchten Informationen über den Koeffizienten von x bekommen – das B und der zugehörige p-Wert. Die Koeffizientenmatrix lässt sich über summary(mdl)$coefficients abrufen. Anschließend können wir bestimmte Felder in dieser Matrix extrahieren:

matCoef <- summary(mdl)$coefficients
bval <- round(matCoef["x", 1], 2)
pval <- round(matCoef["x", 4], 2)
print(paste0("The effect of x on y is statistically significant (B = ",
             bval, ", p = ", pval, ")."))

Wir extrahieren also B und p und bauen uns damit eine kleine Aussage zusammen, die wir mit print wiedergeben.

Regressionsanalyse in R plotten

Wir können die gewonnenen Informationen in R gut veranschaulichen. Dazu haben wir verschiedene Plots im Repertoire, welche uns gleichzeitig die Modellannahmen überprüfen lassen.

Scatterplot zwischen zwei numerischen Variablen

Zuerst erstellen wir einen typischen Scatterplot, um einen ersten Eindruck der Daten zu bekommen (idealerweise gehört dieser Schritt als Teil der explorativen Analyse vor das Durchführen der Regression). plot(df$x, df$y, xlab="Predictor", ylab="Outcome", col="darkblue", pch=16, main="Simple Linear Regression"). Offensichtlich plotten wir hier x auf die x-Achse und y auf die y-Achse, beschriften die Achsen, geben einen Titel an, und benutzen dunkelblau als Farbe für die Punkte. Mit dem Parameter pch wählen wir den Typ des Punktes aus: die Standardeinstellung ist ein Kreis, ich habe hier einen Punkt gewählt, da sich diese dann einfacher erkennen lassen. Mit einem weiteren Befehl können wir dann unsere Regressionslinie anzeigen lassen: abline(mdl, col="darkred"). R macht es uns hier besonders einfach: Wir müssen nur das lm-Objekt in die Funktion abline geben und es wird automatisch die entsprechende Regressionslinie geplottet.

Ein verzierter Regressionsplot

Als kleines Extra können wir unseren Regressionsplot noch ein wenig verzieren, sodass uns der Unterschied zwischen Modellvorhersage und realer Wert etwas bewusster wird. Dazu schreiben wir eine Schleife, die eine Iteration je Punkt hat und für jeden Punkt die entsprechende Linie in den Plot zeichnet:

for (i in 1:length(mdl$fitted.values))
  lines(c(df$x[i], df$x[i]), c(df$y[i], mdl$fitted.values[i]), col="blue")

Die Funktion lines zeichnet eine Linie und hat als erstes Argument einen Vektor mit den x-Koordinaten der Punkte und als zweites Argument einen der y-Koordinaten. So entsteht je Punkt eine Linie zwischen y-Wert und den ‚fitted values‘.

Plot der Residuen gegen unabhängige Variable

Wenn wir eine Regressionsanalyse durchführen, ist es immer ratsam, sich die Residuen anzuschauen. So können wir Ausreißer feststellen und generell überprüfen, ob die Annahmen für eine Regression getroffen werden können. Eine Möglichkeit ist ein Plot der Residuen gegen die Werte von x. Die Residuen eines Regressionsmodells können wir ganz leicht mit residuals(mdl) bekommen. Der Plot sieht also wie folgt aus:

#Residuals against independent variable
plot(df$x, residuals(mdl), xlab="Predictor", ylab="Residuals", 
     pch=20, col="red", main="Residuals Plot")
abline(h=0, col="darkgrey")

Wenn sich die Residuen „wie eine gleichbreite Wolke“ unsystematisch um 0 verteilen, dann sind die Annahmen der Linearität und Homoskedastizität gegeben (d.h., Residuen sind nicht breiter gestreut z.B. für höhere x-Werte im Vergleich zu den Residuen tiefer auf der x-Achse).

Verteilung der Residuen

Wir überprüfen nun, ob die Residuen normalverteilt sind. Das können wir einfach mit einem Histogram der Residuen machen: hist(mdl$residuals, main="Distribution of Residuals", xlab="Residuals", col="darkorange"). Die Annahme einer Normalverteilung zu bestätigen ist hier offensichtlich schwierig – eine Stichprobengröße von N=10 sollte sowieso mit Vorsicht betrachtet werden. Dennoch: Ein Blick auf die Verteilung der Residuen mit Hilfe eines Histogramms ist immer sinnvoll.

QQ-Plot der Residuen

Alternativ (bzw. zusätzlich) kann man sich auch einen QQ-Plot in R ausgeben lassen. Ein Blick hierauf zeigt einem, ob die Residuen normalverteilt (bzw. ungefähr normalverteilt) sind:

qqnorm(mdl$residuals, pch=16, col="darkorange")
qqline(mdl$residuals, col="darkgrey")

Liegen die Punkte auf der Linie, ist die Annahme einer Normalverteilung der Residuen auf jeden Fall gegeben.

Zusammenfassung

Mit diesem Wissen sollte es dir gelingen, eine einfache lineare Regression in R zu rechnen. Dazu gehören im Kern die lm-Funktion, summary(mdl), der Plot für die Regressionsanalyse und das Analysieren der Residuen. In einem zukünftigen Post werde ich auf multiple Regression eingehen und auf weitere Statistiken, z.B. solche, die einflussstarke Punkte identifizieren. Bis dahin, viel Erfolg!

Soviel zu den Grundlagen einer Regression in R. Hast du noch weitere Fragen oder bereits Fragen zu anderen Regressionstypen? Schreib mir einfach eine Mail: mail@r-coding.de.
Bleib außerdem auf dem Laufenden mit dem r-coding Newsletter. Du erhältst Infos zu neuen Blogeinträgen, sowie kleine Tipps und Tricks zu R. Melde dich jetzt an: http://r-coding.de/newsletter.

Add a comment

*Please complete all fields correctly

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.