Multiple lineare Regression

Regression
Modelldiagnostik
Interpretation
R
Python
Mehrere Prädiktoren, adjustiertes R², Multikollinearität und wie man den Output liest.

Kurzsteckbrief

Fragestellung Wie hängt eine metrische Zielgrösse gleichzeitig von mehreren Einflussgrössen ab, und wie gross ist der Beitrag jeder einzelnen bei konstant gehaltenen anderen?
Zielvariable metrisch (intervall- oder verhältnisskaliert)
Prädiktoren zwei oder mehr, metrisch oder kategorial (kategoriale werden zu Indikatorvariablen)
Was die Methode liefert Koeffizienten mit Standardfehlern, Konfidenzintervallen und p-Werten, R² und adjustiertes R², F-Test des Gesamtmodells, Residuen für die Diagnostik
R-Funktion lm(y ~ x1 + x2, data = df), gelesen mit summary(), confint(), car::vif()
Python-Funktion smf.ols("y ~ x1 + x2", data=df).fit(), gelesen mit .summary(), .conf_int(), variance_inflation_factor()
Verwandte Methoden einfache lineare Regression, logistische Regression, Varianzanalyse

Wann diese Methode, wann nicht

Typische Fragestellungen: Miete aus Fläche und Alter einer Wohnung, Absatz aus Preis und Werbebudget, Laborwert aus Dosis und Körpergewicht. Gemeinsam ist ihnen, dass die Zielgrösse metrisch ist, dass mehrere Einflussgrössen zugleich wirken und dass der Beitrag einer einzelnen Grösse interessiert, gerade weil die anderen mit ihr zusammenhängen.

Die Methode passt, wenn der Zusammenhang in den Prädiktoren annähernd linear ist, die Beobachtungen unabhängig sind und die Streuung der Residuen über den Vorhersagebereich ungefähr gleich bleibt.

Sie passt nicht in diesen Fällen:

Situation Stattdessen
Zielvariable binär logistische Regression
Zielvariable ist eine Zeit bis zu einem Ereignis mit zensierten Fällen Kaplan-Meier und Cox-Modell
Nur ein Prädiktor einfache lineare Regression
Beobachtungen sind zeitlich geordnet und autokorreliert Zeitreihenmodelle
Erkennbar krummer Zusammenhang Transformation der Variablen oder Polynomterme im Modell
Deutlich ungleiche Residuenstreuung robuste Standardfehler oder Transformation der Zielvariable

Grundidee und Modell

Gesucht ist die Ebene beziehungsweise Hyperebene, die möglichst nah an allen beobachteten Punkten liegt. Nah bedeutet: die Summe der quadrierten senkrechten Abstände zwischen beobachteten und vorhergesagten Werten ist minimal. Das Quadrieren gewichtet grosse Abweichungen stärker und macht die Lösung eindeutig berechenbar.

\[y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \dots + \beta_k x_{ik} + \varepsilon_i\]

Bestandteil Bedeutung
\(y_i\) beobachteter Wert der Zielvariable bei Beobachtung \(i\)
\(\beta_0\) Achsenabschnitt, erwarteter Wert von \(y\), wenn alle Prädiktoren null sind
\(\beta_j\) erwartete Änderung von \(y\), wenn \(x_j\) um eine Einheit steigt und alle anderen Prädiktoren konstant bleiben
\(x_{ij}\) Wert des \(j\)-ten Prädiktors bei Beobachtung \(i\)
\(\varepsilon_i\) Residuum, der von keinem Prädiktor erfasste Rest, mit Erwartungswert null und konstanter Varianz

Geschätzt wird mit der Methode der kleinsten Quadrate. Sie hat eine geschlossene Lösung, es wird also nicht iteriert und es gibt keine Konvergenzprobleme. Entscheidend für die Interpretation ist die Wendung “bei konstant gehaltenen anderen Prädiktoren”: jeder Koeffizient beschreibt den Beitrag seiner Variable, nachdem der Einfluss der übrigen herausgerechnet ist. Deshalb kann sich ein Koeffizient beim Hinzufügen einer weiteren Variablen deutlich ändern, und deshalb ist er nicht dasselbe wie eine einfache Korrelation.

Voraussetzungen und ihre Prüfung

Voraussetzung Was sie bedeutet Prüfung Folge bei Verletzung Vorgehen
Linearität Der Zusammenhang jedes Prädiktors mit der Zielgrösse ist geradlinig Residuen gegen vorhergesagte Werte, gekrümmtes Muster ist verdächtig Koeffizienten sind systematisch verzerrt, Vorhersagen in den Randbereichen falsch Transformation, Polynomterm oder Aufteilung in Bereiche
Unabhängigkeit Beobachtungen beeinflussen sich nicht gegenseitig aus dem Erhebungsdesign, bei zeitlicher Ordnung Durbin-Watson Standardfehler zu klein, p-Werte zu optimistisch Mehrebenenmodell oder Zeitreihenmodell
Homoskedastizität Residuenstreuung ist über den Vorhersagebereich konstant Residuenplot, Breusch-Pagan-Test Schätzwerte bleiben brauchbar, Standardfehler und p-Werte nicht robuste Standardfehler oder Transformation
Normalverteilte Residuen Die Residuen streuen annähernd normal QQ-Plot der Residuen betrifft vor allem Tests und Intervalle bei kleinem n, bei grossem n unkritisch Transformation, Bootstrap
Keine starke Multikollinearität Prädiktoren sind nicht nahezu Linearkombinationen voneinander VIF, Werte über 5 sind auffällig, über 10 kritisch einzelne Koeffizienten instabil und nicht signifikant, obwohl das Modell gut passt eine Variable entfernen oder zusammenfassen
Keine einflussreichen Einzelfälle Kein einzelner Punkt bestimmt das Ergebnis Cook-Distanz, Hebelwerte Koeffizient hängt an einer Beobachtung Fall prüfen, Modell mit und ohne ihn berichten

Output lesen

R, summary(modell):

Grösse Was sie sagt Faustregel oder Falle
Call die geschätzte Modellformel prüfen, ob wirklich das gemeinte Modell gerechnet wurde
Residuals Minimum, Quartile, Median der Residuen Median deutlich neben null oder stark unsymmetrische Extreme deuten auf Schieflage
Estimate geschätzter Koeffizient Änderung von y je Einheit von x bei konstant gehaltenen anderen Prädiktoren, in den Einheiten der Variablen
Std. Error Standardfehler des Koeffizienten Unsicherheit der Schätzung, wächst mit der Streuung und mit Multikollinearität
t value Estimate geteilt durch Std. Error Werte über etwa 2 in Betrag sind bei üblichem n signifikant
Pr(>|t|) p-Wert des Tests, dass der Koeffizient null ist prüft nur den einzelnen Koeffizienten, sagt nichts über die Grösse des Effekts
(Intercept) erwartete Miete bei Fläche 0 und Alter 0 oft ohne inhaltliche Bedeutung, weil der Punkt ausserhalb der Daten liegt
Residual standard error typische Abweichung einer Vorhersage in der Einheit von y die direkt interpretierbare Gütezahl, hier vergleichbar mit dem simulierten Rauschen
Freiheitsgrade n minus Anzahl geschätzter Parameter sinken mit jedem zusätzlichen Prädiktor
Multiple R-squared Anteil der erklärten Streuung steigt mit jedem Prädiktor, auch mit einem sinnlosen
Adjusted R-squared um die Anzahl Prädiktoren korrigiert die Zahl, die man beim Modellvergleich liest
F-statistic mit p-Wert Test, ob das Modell insgesamt besser ist als der Mittelwert signifikant, ohne dass ein einzelner Koeffizient signifikant sein muss, typisch bei Multikollinearität
confint() 95-Prozent-Intervall je Koeffizient schliesst es null ein, ist der Koeffizient nicht signifikant

Python, modell.summary(), mit den Unterschieden zu R:

Grösse Was sie sagt Unterschied zu R
coef, std err, t, P>|t| wie Estimate, Std. Error, t value, Pr(> t
[0.025 0.975] Konfidenzintervall steht direkt in der Tabelle, in R braucht es confint()
R-squared, Adj. R-squared wie in R identisch berechnet
F-statistic, Prob (F-statistic) Gesamttest identisch
Df Residuals, Df Model Freiheitsgrade R nennt sie im Fliesstext, Python in eigenen Zeilen
AIC, BIC, Log-Likelihood Kennzahlen für den Modellvergleich R zeigt sie nicht in summary(), dort über AIC(modell)
Omnibus, Jarque-Bera, Skew, Kurtosis Tests und Masse zur Normalität der Residuen in R nicht enthalten, dort über den QQ-Plot
Durbin-Watson Hinweis auf Autokorrelation der Residuen Werte um 2 sind unauffällig, in R über dwtest()
Cond. No. Konditionszahl der Prädiktormatrix grosse Werte deuten auf Multikollinearität, ergänzend zum VIF
Kein Residual standard error die Grösse fehlt in der Tabelle über np.sqrt(modell.mse_resid)

Ausgelassen wird kein Wert: auch Freiheitsgrade, Residualstreuung und die Normalitätskennzahlen gehören zur Beurteilung, und Warnhinweise am Fuss der Python-Tabelle sind Teil des Ergebnisses.

Interpretationsfallen

  • Signifikanz ist keine Relevanz. Bei grossem n wird ein Koeffizient von 0.4 Einheiten pro Quadratmeter signifikant, ohne für eine Mietentscheidung eine Rolle zu spielen. Relevanz liest man am Schätzwert in seiner Einheit, an seinem Intervall und an der Residualstreuung.
  • Der p-Wert ist keine Wahrscheinlichkeit für die Nullhypothese. Er ist die Wahrscheinlichkeit dieser oder extremerer Daten, wenn der Koeffizient null wäre. Siehe Hypothesentests: Grundlagen.
  • R² ist keine Modellrichtigkeit. Ein Modell mit falscher Struktur kann ein hohes R² haben, und ein korrektes Modell für stark streuende Daten ein niedriges. R² steigt zudem mit jedem zusätzlichen Prädiktor; für Vergleiche gilt das adjustierte R².
  • Ein Koeffizient ist keine Kausalität. “Bei konstant gehaltenen anderen Prädiktoren” heisst konstant gehalten unter den aufgenommenen Variablen. Eine nicht erhobene gemeinsame Ursache bleibt im Modell unsichtbar und verzerrt den Koeffizienten.
  • Das Konfidenzintervall ist keine Wahrscheinlichkeitsaussage über den wahren Wert. Das Verfahren trifft in 95 Prozent aller Anwendungen den wahren Wert; das konkrete Intervall enthält ihn oder nicht.
  • Der Achsenabschnitt ist selten interpretierbar. Fläche null und Alter null kommt in den Daten nicht vor. Wer den Achsenabschnitt deuten will, zentriert die Prädiktoren.
  • Vorhersagen nur im beobachteten Bereich. Ausserhalb der Datenspanne ist die Linearität nicht geprüft und die Vorhersage eine Behauptung.

Ergebnis berichten

Vorlage für den Ergebnissatz:

Ein multiples lineares Modell mit [Prädiktoren] erklärt [Zielvariable] (F([Df Model], [Df Residuals]) = [F], p = [p], adjustiertes R² = [Wert], n = [n]). Bei konstant gehaltenen übrigen Prädiktoren steigt [Zielvariable] pro Einheit [Prädiktor] um [Schätzwert] [Einheit] (95-Prozent-Konfidenzintervall [unten] bis [oben], p = [p]).

Immer genannt werden: Schätzwert in seiner Einheit, Konfidenzintervall, Teststatistik mit Freiheitsgraden, p-Wert, adjustiertes R² und n, dazu die Residualstreuung, wenn es um Vorhersagegüte geht. Genannt wird ausserdem, welche Voraussetzungen geprüft wurden und mit welchem Ergebnis.

Beispiel für eine Ergebnistabelle:

Prädiktor Schätzwert Standardfehler 95-Prozent-Intervall p
Achsenabschnitt
Fläche (m²)
Alter (Jahre)

Abgrenzung zu verwandten Methoden

Methode Wann diese statt der multiplen linearen Regression
Einfache lineare Regression genau ein Prädiktor, keine Kontrolle weiterer Grössen nötig
Logistische Regression binäre Zielvariable
Regressionsdiagnostik Vertiefung zu Residuen, Hebelwerten, Ausreissern und VIF
Modellauswahl Vergleich mehrerer Modelle, AIC, Validierung
Varianzanalyse nur kategoriale Prädiktoren, Frage nach Gruppenunterschieden; rechnerisch ein Spezialfall dieses Modells
Cox-Modell Zielvariable ist eine Zeit bis zu einem Ereignis mit zensierten Fällen

Beispiele

Alle Beispiele rechnen mit demselben Datensatz aus dem Setup-Chunk: 120 Wohnungen mit Miete, Fläche, Alter, Stockwerk, Zimmerzahl und Lage. Die Daten sind deterministisch konstruiert, damit R und Python dieselben Zahlen sehen und jeder Wert im Text nachprüfbar ist.

Frage und Datenlage

Von 120 Wohnungen liegen Miete in Franken, Wohnfläche in Quadratmetern und Alter in Jahren vor. Die Frage lautet: Wie viel kostet ein zusätzlicher Quadratmeter, wenn das Alter konstant gehalten wird, und wie viel kostet ein zusätzliches Jahr Alter bei gleicher Fläche?

Genau dieses “bei konstant gehaltenen anderen” ist der Grund für die multiple Regression. Zwei getrennte einfache Regressionen könnten die Frage nicht beantworten, sobald Fläche und Alter zusammenhängen.

Voraussetzungen prüfen

modell <- lm(miete ~ flaeche + alter, data = wohnung)

par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
plot(modell, which = 1)
plot(modell, which = 2)
par(mfrow = c(1, 1))

bptest(modell)

    studentized Breusch-Pagan test

data:  modell
BP = 1.9986, df = 2, p-value = 0.3681
vif(modell)
 flaeche    alter 
1.000488 1.000488 
Abbildung 1: Beispiel 1: Residuen gegen Vorhersage und QQ-Plot der Residuen.
modell = smf.ols("miete ~ flaeche + alter", data=wohnung).fit()

fig, achsen = plt.subplots(1, 2, figsize=(7, 3.2))
achsen[0].scatter(modell.fittedvalues, modell.resid, s=14, color="0.3")
achsen[0].axhline(0, linestyle="--", color="black")
achsen[0].set_xlabel("Vorhersage")
achsen[0].set_ylabel("Residuum")
sm.qqplot(modell.resid, line="s", ax=achsen[1])
achsen[1].set_title("QQ-Plot der Residuen")
plt.tight_layout()
plt.show()
Abbildung 2: Beispiel 1: dieselbe Diagnostik in Python.
lm_wert, lm_p = sm.stats.diagnostic.het_breuschpagan(
    modell.resid, modell.model.exog)[:2]
print("Breusch-Pagan LM =", round(lm_wert, 4), " p =", round(lm_p, 4))
Breusch-Pagan LM = 1.9986  p = 0.3681
X = sm.add_constant(wohnung[["flaeche", "alter"]])
print({name: round(variance_inflation_factor(X.values, i), 3)
       for i, name in enumerate(X.columns)})
{'const': np.float64(1.0), 'flaeche': np.float64(1.0), 'alter': np.float64(1.0)}

Die Residuen streuen strukturlos um die Nulllinie, der QQ-Plot zeigt keine auffällige Abweichung, und der Breusch-Pagan-Test liefert p = 0.37, also keinen Hinweis auf ungleiche Streuung. Die VIF-Werte liegen bei 1.0: Fläche und Alter hängen in diesen Daten praktisch nicht zusammen (r = 0.02), jede der beiden Grössen trägt also eigene Information bei.

Rechnung

summary(modell)

Call:
lm(formula = miete ~ flaeche + alter, data = wohnung)

Residuals:
    Min      1Q  Median      3Q     Max 
-509.46 -172.09  -11.12  178.36  528.85 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  422.547    104.265   4.053 9.15e-05 ***
flaeche       12.097      1.170  10.340  < 2e-16 ***
alter         -3.231      1.429  -2.261   0.0256 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 229.4 on 117 degrees of freedom
Multiple R-squared:  0.4869,    Adjusted R-squared:  0.4782 
F-statistic: 55.52 on 2 and 117 DF,  p-value: < 2.2e-16
confint(modell)
                 2.5 %      97.5 %
(Intercept) 216.056164 629.0376043
flaeche       9.779666  14.4135906
alter        -6.059770  -0.4013821
print(modell.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  miete   R-squared:                       0.487
Model:                            OLS   Adj. R-squared:                  0.478
Method:                 Least Squares   F-statistic:                     55.52
Date:                Fri, 11 Sep 2026   Prob (F-statistic):           1.11e-17
Time:                        06:16:40   Log-Likelihood:                -820.98
No. Observations:                 120   AIC:                             1648.
Df Residuals:                     117   BIC:                             1656.
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    422.5469    104.265      4.053      0.000     216.056     629.038
flaeche       12.0966      1.170     10.340      0.000       9.780      14.414
alter         -3.2306      1.429     -2.261      0.026      -6.060      -0.401
==============================================================================
Omnibus:                        4.127   Durbin-Watson:                   2.562
Prob(Omnibus):                  0.127   Jarque-Bera (JB):                2.380
Skew:                           0.083   Prob(JB):                        0.304
Kurtosis:                       2.330   Cond. No.                         435.
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
print("Residualstreuung:", round(np.sqrt(modell.mse_resid), 4))
Residualstreuung: 229.3513

Output Zeile für Zeile

Ausgabe Wert hier Bedeutung Wie er zu lesen ist
(Intercept) 422.55 erwartete Miete bei Fläche null und Alter null Rechnerisch nötig, inhaltlich sinnlos: Eine Wohnung mit null Quadratmetern gibt es nicht. Wer eine deutbare Zahl braucht, zentriert die Prädiktoren.
flaeche Estimate 12.10 Franken je Quadratmeter, bei gleichem Alter Die zentrale Zahl. Der Zusatz “bei gleichem Alter” ist kein Beiwerk, sondern die eigentliche Leistung der multiplen Regression.
flaeche Std. Error 1.170 Unsicherheit dieser Schätzung Rund ein Zehntel des Schätzwerts.
flaeche t value 10.340 Schätzwert durch Standardfehler
flaeche Pr(>|t|) < 0.001 p-Wert für “der Koeffizient ist null”
alter Estimate -3.23 Franken je Jahr, bei gleicher Fläche Ältere Wohnungen sind bei gleicher Fläche günstiger.
alter Std. Error 1.429 Fast die Hälfte des Schätzwerts, die Schätzung ist also viel unsicherer als die der Fläche.
alter Pr(>|t|) 0.026 Signifikant, aber knapp.
Konfidenzintervall flaeche 9.78 bis 14.41 plausibler Bereich Rund fünf Franken breit.
Konfidenzintervall alter -6.06 bis -0.40 plausibler Bereich Die aufschlussreichste Zeile der ganzen Ausgabe: Der Alterseffekt liegt irgendwo zwischen 40 Rappen und gut sechs Franken je Jahr. Das ist ein Faktor von 15. Der p-Wert von 0.026 verdeckt diese Unsicherheit vollständig.
Residual standard error 229.4 auf 117 Freiheitsgraden typischer Vorhersagefehler in Franken Die praktisch nützlichste Gütezahl. Wer eine Miete aus Fläche und Alter vorhersagt, liegt typischerweise um 229 Franken daneben.
Freiheitsgrade 117 n minus Anzahl Parameter 120 minus 3, also Achsenabschnitt plus zwei Koeffizienten.
Multiple R-squared 0.4869 Anteil erklärter Streuung Knapp die Hälfte.
Adjusted R-squared 0.4782 um die Parameterzahl korrigiert Der Abstand zu R² wächst mit jedem zusätzlichen Prädiktor, siehe Beispiel 2.
F-statistic 55.5 auf 2 und 117 df Gesamttest Prüft, ob alle Koeffizienten zugleich null sind. Bei mehreren Prädiktoren ist er nicht mehr redundant zu den t-Tests.

Interpretation und Ergebnissatz

Die beiden Koeffizienten sind sehr unterschiedlich gut bestimmt, obwohl beide signifikant sind. Bei der Fläche ist der Effekt auf rund fünf Franken genau eingegrenzt; beim Alter reicht das Intervall über einen Faktor 15. Wer nur die p-Werte liest, sieht diesen Unterschied nicht.

Und die Residualstreuung von 229 Franken setzt den Rahmen: Für die Bewertung einer einzelnen Wohnung ist das Modell zu ungenau. Für die Aussage “ein Quadratmeter kostet rund zwölf Franken” reicht es.

Fläche und Alter erklären zusammen 49 Prozent der Mietunterschiede (F(2, 117) = 55.5, p < 0.001, n = 120). Je Quadratmeter steigt die Miete um 12.10 Franken (95-Prozent-Konfidenzintervall 9.78 bis 14.41, p < 0.001), je Jahr Alter sinkt sie um 3.23 Franken (-6.06 bis -0.40, p = 0.026), jeweils bei konstant gehaltener anderer Grösse. Die typische Abweichung einer Vorhersage beträgt 229 Franken.

Frage und Datenlage

Dem Modell wird das Stockwerk hinzugefügt. Die Frage lautet: Trägt es etwas bei?

Rechnung

modell_stock <- lm(miete ~ flaeche + alter + stockwerk, data = wohnung)
summary(modell_stock)

Call:
lm(formula = miete ~ flaeche + alter + stockwerk, data = wohnung)

Residuals:
    Min      1Q  Median      3Q     Max 
-509.46 -172.41  -11.01  178.23  528.75 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 422.8675   111.9744   3.776 0.000252 ***
flaeche      12.0966     1.1750  10.295  < 2e-16 ***
alter        -3.2300     1.4364  -2.249 0.026423 *  
stockwerk    -0.1122    13.8812  -0.008 0.993564    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 230.3 on 116 degrees of freedom
Multiple R-squared:  0.4869,    Adjusted R-squared:  0.4737 
F-statistic:  36.7 on 3 and 116 DF,  p-value: < 2.2e-16
anova(modell, modell_stock)
Analysis of Variance Table

Model 1: miete ~ flaeche + alter
Model 2: miete ~ flaeche + alter + stockwerk
  Res.Df     RSS Df Sum of Sq     F Pr(>F)
1    117 6154434                          
2    116 6154430  1    3.4668 1e-04 0.9936
modell_stock = smf.ols("miete ~ flaeche + alter + stockwerk",
                       data=wohnung).fit()
print(modell_stock.summary().tables[1])
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    422.8675    111.974      3.776      0.000     201.088     644.647
flaeche       12.0966      1.175     10.295      0.000       9.769      14.424
alter         -3.2300      1.436     -2.249      0.026      -6.075      -0.385
stockwerk     -0.1122     13.881     -0.008      0.994     -27.606      27.381
==============================================================================
print("R^2:", round(modell_stock.rsquared, 4),
      " adj. R^2:", round(modell_stock.rsquared_adj, 4))
R^2: 0.4869  adj. R^2: 0.4737
print(sm.stats.anova_lm(modell, modell_stock).round(4))
   df_resid           ssr  df_diff  ss_diff       F  Pr(>F)
0     117.0  6.154434e+06      0.0      NaN     NaN     NaN
1     116.0  6.154430e+06      1.0   3.4668  0.0001  0.9936

Output Zeile für Zeile

Ausgabe Ohne Stockwerk Mit Stockwerk Wie das zu lesen ist
stockwerk Estimate -0.11 Elf Rappen je Stockwerk. Praktisch null.
stockwerk Std. Error 13.881 Der Standardfehler ist mehr als hundertmal so gross wie der Schätzwert.
stockwerk p-Wert 0.994 So gross, wie ein p-Wert kaum werden kann.
Konfidenzintervall -27.6 bis 27.4 Symmetrisch um null und knapp 55 Franken breit. Das Stockwerk könnte durchaus 25 Franken wert sein, in beide Richtungen; ausgeschlossen ist nur ein sehr grosser Effekt.
Multiple R-squared 0.4869 0.4869 Unverändert in der vierten Stelle.
Adjusted R-squared 0.4782 0.4737 Gesunken. Das ist der Unterschied zwischen den beiden Massen.
Residual standard error 229.4 230.3 Ebenfalls leicht schlechter geworden.
Modellvergleich anova() F = 0.0001, p = 0.994 Derselbe Test wie der t-Test des Koeffizienten; bei einem einzelnen zusätzlichen Prädiktor sind sie gleichwertig, und F ist exakt t².

Warum R² nicht sinken kann und adjustiertes R² schon. R² misst, wie viel Streuung das Modell erklärt, und ein zusätzlicher Prädiktor kann diesen Anteil nie verringern: Im schlechtesten Fall bekommt er den Koeffizienten null. Deshalb ist R² für den Vergleich von Modellen mit verschieden vielen Prädiktoren unbrauchbar.

Das adjustierte R² zieht für jeden Parameter einen Betrag ab. Trägt ein Prädiktor weniger bei, als dieser Abzug ausmacht, sinkt es. Genau das ist hier passiert, und deshalb ist es die Zahl, die man beim Modellvergleich ansieht, siehe Modellauswahl.

Interpretation und Ergebnissatz

Der Prädiktor wird entfernt, aber nicht wegen des p-Werts allein. Die Entscheidung stützt sich auf drei Dinge: kein erkennbarer Beitrag zur erklärten Streuung, ein gesunkenes adjustiertes R², und ein Konfidenzintervall, das keinen praktisch bedeutsamen Effekt nahelegt.

Wäre das Intervall stattdessen von -5 bis +120 Franken gegangen, wäre “kein Effekt nachweisbar” die falsche Zusammenfassung gewesen: Dann wäre ein grosser Effekt weiterhin vereinbar, und das Modell hätte schlicht zu wenig Daten.

Das Stockwerk trägt nichts zur Erklärung der Miete bei (Koeffizient -0.11 Franken, 95-Prozent-Konfidenzintervall -27.6 bis 27.4, p = 0.99); das adjustierte R² sinkt von 0.478 auf 0.474. Der Prädiktor wurde nicht ins Modell aufgenommen.

Frage und Datenlage

Statt des Stockwerks kommt die Zimmerzahl ins Modell. Sie hängt naturgemäss eng mit der Fläche zusammen: grössere Wohnungen haben mehr Zimmer. In diesen Daten beträgt die Korrelation 0.96.

Rechnung

round(cor(wohnung$flaeche, wohnung$zimmer), 4)
[1] 0.9577
modell_zimmer <- lm(miete ~ flaeche + alter + zimmer, data = wohnung)
summary(modell_zimmer)

Call:
lm(formula = miete ~ flaeche + alter + zimmer, data = wohnung)

Residuals:
    Min      1Q  Median      3Q     Max 
-515.78 -179.67   -8.32  184.51  521.90 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  424.057    104.730   4.049 9.32e-05 ***
flaeche       10.643      4.082   2.607   0.0103 *  
alter         -3.219      1.434  -2.245   0.0267 *  
zimmer        31.488     84.706   0.372   0.7108    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 230.2 on 116 degrees of freedom
Multiple R-squared:  0.4876,    Adjusted R-squared:  0.4743 
F-statistic: 36.79 on 3 and 116 DF,  p-value: < 2.2e-16
vif(modell_zimmer)
  flaeche     alter    zimmer 
12.089927  1.000945 12.086751 
# Zimmerzahl allein, ohne die Flaeche daneben
coef(lm(miete ~ zimmer, data = wohnung))
(Intercept)      zimmer 
   412.9103    242.2233 
print("Korrelation Fläche/Zimmer:",
      round(np.corrcoef(wohnung["flaeche"], wohnung["zimmer"])[0, 1], 4))
Korrelation Fläche/Zimmer: 0.9577
modell_zimmer = smf.ols("miete ~ flaeche + alter + zimmer",
                        data=wohnung).fit()
print(modell_zimmer.summary().tables[1])
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept    424.0567    104.730      4.049      0.000     216.627     631.487
flaeche       10.6434      4.082      2.607      0.010       2.559      18.728
alter         -3.2192      1.434     -2.245      0.027      -6.060      -0.379
zimmer        31.4877     84.706      0.372      0.711    -136.284     199.260
==============================================================================
X = sm.add_constant(wohnung[["flaeche", "alter", "zimmer"]])
print({name: round(variance_inflation_factor(X.values, i), 3)
       for i, name in enumerate(X.columns)})
{'const': np.float64(1.0), 'flaeche': np.float64(12.09), 'alter': np.float64(1.001), 'zimmer': np.float64(12.087)}
print(smf.ols("miete ~ zimmer", data=wohnung).fit().params.round(3).to_dict())
{'Intercept': 412.91, 'zimmer': 242.223}

Output Zeile für Zeile

Ausgabe Ohne Zimmer Mit Zimmer Wie das zu lesen ist
flaeche Estimate 12.10 10.64 Der Schätzwert verschiebt sich merklich.
flaeche Std. Error 1.170 4.082 Dreieinhalbmal so gross. Das ist die eigentliche Wirkung von Multikollinearität: nicht falsche Schätzwerte, sondern unsichere.
Konfidenzintervall flaeche 9.78 bis 14.41 2.56 bis 18.73 Aus einer Spanne von fünf Franken wird eine von sechzehn.
zimmer Estimate 31.49
zimmer Std. Error 84.706 Fast dreimal so gross wie der Schätzwert.
zimmer p-Wert 0.711 Nicht signifikant, obwohl die Zimmerzahl offensichtlich mit der Miete zusammenhängt.
Multiple R-squared 0.4869 0.4876 Praktisch unverändert. Das Modell als Ganzes ist genauso gut wie vorher.
VIF 1.0 12.09 für Fläche und Zimmer Der Varianzinflationsfaktor sagt, um welchen Faktor die Varianz des Koeffizienten gegenüber unkorrelierten Prädiktoren wächst. 12.09 heisst: Der Standardfehler ist um Wurzel 12.09, also rund 3.5, grösser. Genau der beobachtete Faktor.
Zimmerzahl allein 242.22 Franken je Zimmer Ohne die Fläche daneben ist der Effekt gross und deutlich. Er beschreibt dann aber die Fläche gleich mit.

Faustregeln zum VIF und was sie bedeuten. Werte unter 5 gelten als unbedenklich, über 10 als kritisch. Wichtiger als die Schwelle ist die Übersetzung: VIF ist der Faktor, um den die Varianz wächst; für den Standardfehler zieht man die Wurzel. Ein VIF von 4 bedeutet einen doppelt so grossen Standardfehler, ein VIF von 100 einen zehnfachen.

Interpretation und Ergebnissatz

Multikollinearität macht das Modell nicht falsch. Die Vorhersagen bleiben genau so gut wie vorher, R² ändert sich nicht, und die Schätzwerte sind erwartungstreu. Was leidet, ist die Aussage über einzelne Koeffizienten: Wenn zwei Prädiktoren fast dasselbe messen, kann kein Verfahren entscheiden, welchem von beiden der gemeinsame Effekt zuzurechnen ist.

Daraus folgt, was zu tun ist:

Ziel Vorgehen
Vorhersage Nichts. Multikollinearität stört die Vorhersage nicht.
Aussage über einzelne Effekte Einen der beiden Prädiktoren weglassen, inhaltlich begründet
Beide Informationen behalten Zu einer Grösse zusammenfassen, etwa Fläche je Zimmer, oder eine Hauptkomponente bilden

Nicht zulässig ist, nacheinander beide einzeln zu testen und den signifikanten zu berichten.

Fläche und Zimmerzahl sind stark korreliert (r = 0.96, VIF = 12.1). Bei gemeinsamer Aufnahme steigt der Standardfehler der Fläche von 1.17 auf 4.08, und die Zimmerzahl wird nicht signifikant (p = 0.71), obwohl sie allein betrachtet 242 Franken je Zimmer erklärt. Ins Modell aufgenommen wurde die Fläche, weil sie feiner abgestuft ist; die Vorhersagegüte ist von dieser Entscheidung nicht betroffen (R² = 0.487 in beiden Modellen).

Frage und Datenlage

Zu Fläche und Alter kommt die Lage mit drei Stufen: Zentrum, Mittel, Rand. Ein kategorialer Prädiktor mit drei Stufen wird zu zwei Indikatorvariablen; eine Stufe dient als Referenz.

Rechnung

levels(wohnung$lage)          # die erste Stufe ist die Referenz
[1] "Mittel"  "Rand"    "Zentrum"
modell_lage <- lm(miete ~ flaeche + alter + lage, data = wohnung)
summary(modell_lage)

Call:
lm(formula = miete ~ flaeche + alter + lage, data = wohnung)

Residuals:
    Min      1Q  Median      3Q     Max 
-367.84  -99.00   -1.92   98.76  391.02 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  364.0042    72.1425   5.046 1.71e-06 ***
flaeche       12.4590     0.7762  16.051  < 2e-16 ***
alter         -3.0235     0.9477  -3.191  0.00183 ** 
lageRand    -173.2605    34.0133  -5.094 1.39e-06 ***
lageZentrum  243.2169    34.0264   7.148 8.68e-11 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 152.1 on 115 degrees of freedom
Multiple R-squared:  0.7783,    Adjusted R-squared:  0.7706 
F-statistic:   101 on 4 and 115 DF,  p-value: < 2.2e-16
anova(modell_lage)            # gemeinsamer Test aller Lage-Stufen
Analysis of Variance Table

Response: miete
           Df  Sum Sq Mean Sq F value    Pr(>F)    
flaeche     1 5572205 5572205 240.994 < 2.2e-16 ***
alter       1  269007  269007  11.634  0.000894 ***
lage        2 3495435 1747717  75.588 < 2.2e-16 ***
Residuals 115 2658999   23122                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
modell_lage = smf.ols("miete ~ flaeche + alter + C(lage)",
                      data=wohnung).fit()
print(modell_lage.summary().tables[1])
======================================================================================
                         coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------
Intercept            364.0042     72.143      5.046      0.000     221.104     506.905
C(lage)[T.Rand]     -173.2605     34.013     -5.094      0.000    -240.634    -105.887
C(lage)[T.Zentrum]   243.2169     34.026      7.148      0.000     175.817     310.617
flaeche               12.4590      0.776     16.051      0.000      10.921      13.997
alter                 -3.0235      0.948     -3.191      0.002      -4.901      -1.146
======================================================================================
print("R^2:", round(modell_lage.rsquared, 4),
      " Residualstreuung:", round(np.sqrt(modell_lage.mse_resid), 3))
R^2: 0.7783  Residualstreuung: 152.058
print(sm.stats.anova_lm(modell_lage, typ=2).round(4))
                sum_sq     df         F  PR(>F)
C(lage)   3.495435e+06    2.0   75.5877  0.0000
flaeche   5.956922e+06    1.0  257.6331  0.0000
alter     2.353701e+05    1.0   10.1796  0.0018
Residual  2.658999e+06  115.0       NaN     NaN

Output Zeile für Zeile

Ausgabe Wert hier Bedeutung Wie er zu lesen ist
Referenzstufe Mittel die weggelassene Stufe Sie erscheint nicht in der Ausgabe. R und statsmodels sortieren die Stufen alphabetisch, und Mittel steht vor Rand und Zentrum. Das ist eine reine Zufälligkeit des Alphabets, keine inhaltliche Wahl.
lageRand -173.26 Differenz Rand gegenüber Mittel Eine Wohnung am Rand kostet bei gleicher Fläche und gleichem Alter 173 Franken weniger als eine in mittlerer Lage.
lageZentrum +243.22 Differenz Zentrum gegenüber Mittel Entsprechend 243 Franken mehr.
Differenz Zentrum zu Rand 416.48 nicht in der Ausgabe Sie ergibt sich als Differenz der beiden Koeffizienten. Ihr p-Wert steht dort nicht; dafür braucht es einen eigenen Kontrast oder eine andere Referenzstufe.
flaeche Estimate 12.46 Franken je Quadratmeter Kaum verändert gegenüber Beispiel 1 (12.10), weil die Lage nicht mit der Fläche zusammenhängt.
flaeche Std. Error 0.776 Kleiner als in Beispiel 1 (1.170). Ein zusätzlicher Prädiktor, der Streuung erklärt, macht die übrigen Schätzungen genauer.
Multiple R-squared 0.7783 Sprung von 0.487 auf 0.778.
Residual standard error 152.06 Von 229 auf 152 Franken gefallen.
anova() gemeinsamer F-Test für lage Die Frage “spielt die Lage überhaupt eine Rolle” wird mit einem Test über beide Indikatorvariablen beantwortet, nicht mit zwei einzelnen t-Tests.

Zwei p-Werte für eine Frage. Die summary()-Ausgabe liefert je einen t-Test pro Indikatorvariable, also den Vergleich jeder Stufe mit der Referenz. Die Frage “hat die Lage insgesamt einen Einfluss” beantwortet keiner dieser Tests. Dafür ist der F-Test aus anova() da, der beide Indikatorvariablen gemeinsam prüft.

Der Unterschied wird wichtig, wenn eine Stufe wenige Beobachtungen hat: Die einzelnen t-Tests können dann alle unauffällig sein, während der gemeinsame Test anschlägt.

Interpretation und Ergebnissatz

Die Lage ist in diesen Daten der stärkste Einflussfaktor. Bemerkenswert ist der Nebeneffekt: Weil sie viel Streuung erklärt, sinkt die Residualstreuung, und dadurch werden alle Koeffizienten genauer geschätzt. Der Standardfehler der Fläche fällt von 1.17 auf 0.78, ohne dass sich am Schätzwert viel ändert.

Das ist das Gegenstück zu Beispiel 3: Ein Prädiktor, der eigene Information beiträgt, verbessert die Schätzung der anderen; einer, der dieselbe Information noch einmal bringt, verschlechtert sie.

Zur Referenzstufe: Dass hier “Mittel” als Bezugspunkt dient, ist alphabetischer Zufall und passt hier ausnahmsweise gut. Wenn eine andere Stufe inhaltlich der natürliche Bezugspunkt ist, wird sie mit relevel() beziehungsweise Treatment(reference=...) gesetzt, und der Bericht nennt sie ausdrücklich.

Fläche, Alter und Lage erklären zusammen 78 Prozent der Mietunterschiede (n = 120, Residualstreuung 152 Franken). Gegenüber mittlerer Lage kostet eine Wohnung im Zentrum 243 Franken mehr (p < 0.001) und am Rand 173 Franken weniger (p < 0.001), bei gleicher Fläche und gleichem Alter. Je Quadratmeter steigt die Miete um 12.46 Franken (p < 0.001), je Jahr Alter sinkt sie um 3.02 Franken (p = 0.002). Referenzstufe der Lage ist “Mittel”.

Verständnisfragen

Im Output steht für einen Prädiktor Estimate = 11.8, Std. Error = 1.2. Was folgt für das 95-Prozent-Konfidenzintervall?

Es reicht ungefähr von 9.4 bis 14.2 und schliesst die Null nicht ein
Richtig, rund Schätzwert plus minus zwei Standardfehler. Der Koeffizient ist deutlich von null verschieden.
Es reicht von 10.6 bis 13.0
Das ist plus minus ein Standardfehler und entspricht etwa 68 Prozent, nicht 95.
Ohne den p-Wert lässt sich das nicht sagen
Schätzwert und Standardfehler genügen, der p-Wert enthält keine zusätzliche Information darüber.

Der F-Test des Gesamtmodells ist mit p < 0.001 signifikant, R² beträgt 0.71, aber kein einzelner Koeffizient hat einen p-Wert unter 0.05. Was ist die naheliegendste Erklärung?

Ein Rechenfehler, das kann nicht gleichzeitig auftreten
Es kann, und es ist ein bekanntes Muster.
Starke Multikollinearität zwischen den Prädiktoren
Richtig. Gemeinsam erklären sie viel, aber der Beitrag der einzelnen Variable ist nicht trennbar, die Standardfehler werden gross. Prüfen mit VIF.
Das Modell hat zu wenige Prädiktoren
Zusätzliche Variablen würden die Standardfehler eher weiter aufblähen.

Nach Aufnahme eines zweiten Prädiktors fällt der Koeffizient des ersten von 15 auf 4. Was bedeutet das?

Der erste Prädiktor ist unwichtig geworden
Wichtigkeit ist keine Eigenschaft, die sich durch Hinzufügen einer Variablen ändert. Geändert hat sich die Frage, die der Koeffizient beantwortet.
Ein Teil des Zusammenhangs lief über den zweiten Prädiktor
Richtig. Der Koeffizient misst jetzt den Beitrag bei konstant gehaltenem zweitem Prädiktor. Die beiden Grössen hängen zusammen, ein Teil des vorher zugeschriebenen Effekts gehört zum neuen Prädiktor.
Das Modell ist jetzt falsch spezifiziert
Aus der Änderung allein folgt das nicht. Welche Fassung passt, entscheidet die inhaltliche Frage.

Das adjustierte R² sinkt, wenn ein weiterer Prädiktor aufgenommen wird, während das gewöhnliche R² leicht steigt. Was heisst das?

Der Prädiktor erklärt weniger, als seine Kosten an Freiheitsgraden wert sind
Richtig. Das gewöhnliche R² kann durch Hinzufügen nie sinken, das adjustierte schon. Genau deshalb wird für Vergleiche das adjustierte gelesen.
Die Berechnung ist unstimmig
Beide Grössen verhalten sich genau so, wie sie definiert sind.
Der Prädiktor ist mit der Zielvariable negativ korreliert
Die Richtung des Zusammenhangs spielt für R² keine Rolle.

Verlinkte Ressourcen