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 $\[ \hat Y \;=\; b_0 \;+\; b_1\,X, \]$ wobei $\(b_0\)$ der Achsenabschnitt und $\(b_1\)$ 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:
- Linearität – Mittelwert von YYY ändert sich proportional zu XXX.
- Unabhängigkeit der Beobachtungen.
- Homoskedastizität – Varianz der Residuen ist über alle XXX-Werte konstant.
- 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 $b_0$ – erwartete Note bei 0 h Lernzeit.
- Slope $b_1$ – Note-Verbesserung pro Lernstunde. Ein negativer Wert zeigt, dass mehr Lernen die Note reduziert (bei Noten-Skala 1 = beste).
- $R^2$ – 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: $\hat Y \;=\; b_0 + b_1 X_1 + b_2 X_2 + \dots + b_p X_p$ Die multiple Regression erweitert das einfache Modell um zusätzliche Prädiktoren. Jeder Koeffizient $\(b_j\)$ schätzt den Effekt von $\(X_j\)$, sofern alle anderen Variablen konstant gehalten werden (ceteris paribus).
Angenommen, Du willst den monatlichen Mietpreis ($Y$) einer Wohnung anhand von
- Wohnfläche in m2 ($X_1$),
- Baujahr ($X_2$),
- Distanz zum Stadtzentrum in km ($X_3$)
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)
:
Kennzahl | Bedeutung (locker) |
---|---|
Estimate | geschätzter Einfluss (Steigung) |
Std. Error | Unsicherheit des Schätzers |
t value , `Pr(> | t |
Multiple R-squared | Anteil erklärter Varianz |
Adjusted R-squared | korrigiert 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 $\((X_1 \times X_2)\)$ erlaubt, dass der Effekt von $\(X_1\)$ vom Wert von \(X_2\) 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 $\(b_j\)$.
Prüfung via Variance Inflation Factor (VIF):
library(car)
vif(multi) # Werte > 5 (oder 10) sollte man sich ansehen
Häufige Stolperfallen
Stolperfalle | Kurz erklärt | Gegenmittel |
---|---|---|
Extrapolation | Vorhersage außerhalb Beobachtungsbereich | Warnhinweis, besser nicht tun |
Ausreißer | Verzerren Steigungen | Diagnose mit Cook’s Distance; ggf. robustes Modell |
Overfitting | Zu viele Prädiktoren | Adjusted R2R^2R2, Cross-Validation |
Heteroskedastizität | Varianz ungleich | White-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.
Alles klar?
Ich hoffe, der Beitrag war für dich soweit verständlich. Wenn du weitere Fragen hast, nutze bitte hier die Möglichkeit, eine Frage an mich zu stellen!