Einfache und Multiple Regression in R

Stell Dir vor, Du möchtest auf Basis einer einzigen Zahl, z. B. Lernzeit in Stunden, deine Prüfungsnote abschätzen. Oder Du hast gleich mehrere Merkmale eines Autos (PS, Gewicht, Zylinder) und willst dessen Kraftstoffverbrauch prognostizieren. In beiden Fällen suchst Du ein Rechen-Modell, das einen messbaren Zusammenhang quantitativ beschreibt und für Vorhersagen taugt. Willkommen bei der linearen Regression!

Einfache Regression

Die einfache lineare Regression modelliert die Beziehung zwischen einer metrischen Zielgröße ($Y$) und genau einem Prädiktor (X) durch die Gleichung:

wobei (b0 der Achsenabschnitt und b1 die Steigung (Änderung in Y je Einheit X ist. Beide Parameter werden so geschätzt, dass die Summe der quadrierten Abstände („Residuen“) zwischen beobachtetem und vorhergesagtem Y minimal wird (die sogenannte Methode der kleinsten Quadrate).

Annahmen der Regression sind:

  1. Linearität – Mittelwert von Y ändert sich proportional zu X.
  2. Unabhängigkeit der Beobachtungen.
  3. Homoskedastizität – Varianz der Residuen ist über alle X-Werte konstant.
  4. Normalverteilung der Residuen.

Hier ein Beispiel in R:

set.seed(42)
n <- 100
hours <- runif(n, 0, 10)
grade <- 1 + 0.4*hours + rnorm(n, sd = 0.8) # 1 = beste Note
exam <- data.frame(hours, grade)
model <- lm(grade ~ hours, data = exam)
summary(model)

summary() liefert u. a.

  • Intercept b0​ – erwartete Note bei 0 h Lernzeit.
  • Slope b1​ – Note-Verbesserung pro Lernstunde. Ein negativer Wert zeigt, dass mehr Lernen die Note reduziert (bei Noten-Skala 1 = beste).
  • R-Quadrat – Anteil der Streuung der Noten, den die Lernzeit erklärt.

Zusätzlich macht es Sinn, mit Visualisierungen zu arbeiten in ggplot2:

library(ggplot2)

ggplot(exam, aes(hours, grade)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(x = "Lernzeit (h)", y = "Note") +
theme_minimal()

Multiple lineare Regression

Jetzt haben wir mehrere Prädiktoren gleichzeitig:

Die multiple Regression erweitert das einfache Modell um zusätzliche Prädiktoren. Jeder Koeffizient bj schätzt den Effekt von Xj, sofern alle anderen Variablen konstant gehalten werden (ceteris paribus).

Angenommen, Du willst den monatlichen Mietpreis Y einer Wohnung anhand von

  • Wohnfläche in m2 (X1),
  • Baujahr (X2),
  • Distanz zum Stadtzentrum in km (X3​)

vorhersagen.

set.seed(1)
n <- 120
sqm <- runif(n, 30, 120)
year <- sample(1950:2020, n, replace = TRUE)
dist <- runif(n, 0.5, 15)
rent <- 5*sqm + (2025 - year) * (-1.2) + (-80)*dist + rnorm(n, sd = 150)
flats <- data.frame(rent, sqm, year, dist)

multi <- lm(rent ~ sqm + year + dist, data = flats)
summary(multi)

Interpretation der Auszüge aus summary(multi):

KennzahlBedeutung (locker)
Estimategeschätzter Einfluss (Steigung)
Std. ErrorUnsicherheit des Schätzers
t value, `Pr(>t
Multiple R-squaredAnteil erklärter Varianz
Adjusted R-squaredkorrigiert für Zahl der Prädiktoren

Interaktionen (Moderation)

Vielleicht wirkt Wohnfläche anders in Randlagen als im Zentrum. Dann füge eine Interaktion hinzu:

multi_int <- lm(rent ~ sqm * dist + year, data = flats)  # * = Haupt- und Interaktion
anova(multi, multi_int) # F-Test: verbessert Interaktion das Modell?

Interaktion X1 x X2 erlaubt, dass der Effekt von X1 vom Wert von X2 abhängt.

Multikollinearität

Multikollinearität liegt vor, wenn zwei oder mehr Prädiktoren stark korreliert sind. Dann werden die Schätzer instabil: kleine Daten-Änderungen → große Sprünge in bj.

Prüfung via Variance Inflation Factor (VIF):

library(car)
vif(multi) # Werte > 5 (oder 10) sollte man sich ansehen

Häufige Stolperfallen

StolperfalleKurz erklärtGegenmittel
ExtrapolationVorhersage außerhalb BeobachtungsbereichWarnhinweis, besser nicht tun
AusreißerVerzerren SteigungenDiagnose mit Cook’s Distance; ggf. robustes Modell
OverfittingZu viele PrädiktorenAdjusted R2R^2R2, Cross-Validation
HeteroskedastizitätVarianz ungleichWhite-Test, robuste SE (sandwich)

Die R-Befehle in der Übersicht

rKopierenBearbeitenlm(y ~ x1 + x2, data = df)        # Modell schätzen
summary(mod)                      # Details
confint(mod)                      # 95-%-CIs
plot(mod)                         # Basis-Diagnostik
predict(mod, newdata, interval="prediction")
library(car); vif(mod)            # Multikollinearität
library(ggfortify); autoplot(mod) # ggplot2-Diagnostik

Mini-Projekt: mtcars-Daten

data(mtcars)
car_mod <- lm(mpg ~ wt + hp + qsec, data = mtcars)
library(ggfortify)
autoplot(car_mod) # Residuen & QQ-Plot
  • Fragestellung: Wie beeinflussen Gewicht (wt), Leistung (hp) und Beschleunigung (qsec) den Verbrauch (mpg)?
  • Ergebnis: Höheres Gewicht & PS reduzieren mpg, höhere qsec (langsame Beschl.) erhöhen mpg.

Fazit

Mit wenigen Zeilen R-Code und dem lm()-Befehl baust Du leistungsfähige Vorhersagemodelle. Die Kunst liegt darin, Datenqualität, Annahmenprüfung und klar verständliche Kommunikation nicht zu vernachlässigen. Halte Dein Modell so einfach wie möglich, aber so komplex wie nötig.