Lineare Regression in R, Teil 1 Christian Kleiber Abt. Quantitative Methoden, WWZ, Universität Basel October 6, 2009 1 Vorbereitungen Zur Illustration betrachten wir wieder den Datensatz CASchools aus der Vorlesung. Laden der Daten: R> data("caschools", package = "AER") Die benötigten Variablen müssen zunächst erzeugt werden: R> CASchools$stratio <- with(caschools, students/teachers) R> CASchools$score <- with(caschools, (math + read)/2) (Es gibt weitere Möglichkeiten, diese Variablen zu erzeugen, obige Lösung ist aber sehr kompakt.) 2 Schätzung der Regressionskoeffizienten Zur Schätzung des Modells benutzt man score i = β 1 + β 2 stratio i + Fehler i R> fm <- lm(score ~ stratio, data = CASchools) Die Funktion lm() schätzt ein lineares Regressionsmodell mit der Methode der kleinsten Quadrate (OLS). Die Ergebnisse des Funktionsaufrufs werden hier zunächst in einem Objekt fm (der Klasse "lm") gespeichert, deshalb gibt es auch keine Ausgabe auf dem Schirm. Dies ist die typische Arbeitsweise in R: weitere Ergebnisse erhält man durch Anwendung diverser Extraktorfunktionen auf dieses Objekt. Ruft man das Objekt selbst auf, R> fm Call: lm(formula = score ~ stratio, data = CASchools) Coefficients: 698.93-2.28 so ist dies gleichbedeutend mit der Eingabe print(fm)) und es werden nur der vorherige Funktionsaufruf sowie die geschätzten Regressionskoeffizienten angezeigt. (Wir erhalten die gleichen Ergebnisse wie Stock und Watson, S. 120, Gleichung (4.11).) Das Objekt fm enthält aber viel mehr: die Extraktorfunktion summary() liefert bspw.
Lineare Regression in R, Teil 1 2 R> summary(fm) Call: lm(formula = score ~ stratio, data = CASchools) Residuals: Min 1Q Median 3Q Max -47.727-14.251 0.483 12.822 48.540 Coefficients: (Intercept) 698.93 9.47 73.82 < 2e-16 stratio -2.28 0.48-4.75 0.0000028 Residual standard error: 18.6 on 418 degrees of freedom Multiple R-squared: 0.0512, Adjusted R-squared: 0.049 F-statistic: 22.6 on 1 and 418 DF, p-value: 0.00000278 Hierbei erhält man neben einer Kurzanalyse der Residuen die üblichen Regressionsergebnisse: eine Tabelle mit Regressionskoeffizienten, deren Standardfehlern, t-statistiken und zugehörigen p-werten. Mit dem Objekt fm kann man auch über die Funktion abline() die Regressionsgerade zu einem Streudiagramm hinzufügen: R> plot(score ~ stratio, data = CASchools, pch = 20) R> abline(fm) score 620 660 700 14 16 18 20 22 24 26 stratio abline() ist eigentlich eine Funktion, die über einen Aufruf abline(a, b) eine Gerade mit Achsenabschnitt a und Steigung b zu einer bestehenden Graphik hinzufügt. Wendet man die Funktion wie hier auf ein Objekt der Klasse "lm" an, so weiss die Funktion, dass sie die Regressionskoeffizienten extrahieren soll.
Lineare Regression in R, Teil 1 3 3 Tests und Konfidenzintervalle Tests zur Überprüfung der Hypothesen H 0 : β j = 0, d.h. der Hypothese, dass der Regressor Nr. j weggelassen werden kann, sind Bestandteil des Regressionsoutputs: t test of coefficients: (Intercept) 698.93 9.47 73.82 < 2e-16 stratio -2.28 0.48-4.75 0.0000028 Eine ANOVA-Tafel (Varianzanalysetafel) nebst F -Test liefert der Befehl R> anova(fm) Analysis of Variance Table Response: score Df Sum Sq Mean Sq F value Pr(>F) stratio 1 7794 7794 22.6 0.0000028 Residuals 418 144315 345 und Konfidenzintervalle für die Regressionskoeffizienten erhält man über R> confint(fm, level = 0.95) 2.5 % 97.5 % (Intercept) 680.323 717.543 stratio -3.223-1.337 Die Voreinstellung ist 95%, d.h. man hätte hier das Argument level nicht angeben müssen. Bem.: Weitere Extraktor-Funktionen sind resid() oder gleichbedeutend residuals(), die die Residuen liefern, fitted() für den Vektor ŷ, coef() oder coefficients() für die Regressionskoeffizienten. Diese Liste ist keineswegs vollständig der Aufruf methods(class="lm") liefert eine Liste aller generischen Funktionen, die Methoden für Objekte der Klasse "lm" haben. [Die Bedeutung der Begriffe generische Funktion, Klasse bzw. Methode in R wird später noch erklärt.] 4 Prognosen Prognosen erhält man über die (generische) Funktion predict(), die man direkt auf das Objekt fm anwenden kann. R erwartet die neuen Daten wieder in der Form eines data.frame, den man ggf. erst erzeugen muss: R> new <- data.frame(stratio = 20) R> predict(fm, newdata = new) 1 653.3 Natürlich kann man auch für einen ganzen Satz von neuen x-werten Prognosen bekommen: R> new <- data.frame(stratio = c(10, 20, 30)) R> predict(fm, newdata = new)
Lineare Regression in R, Teil 1 4 1 2 3 676.1 653.3 630.5 Will man nicht nur Punkt-, sondern Intervallprognosen (Prognoseintervalle), muss man das Argument interval spezifizieren: R> predict(fm, newdata = new, interval = "prediction") fit lwr upr 1 676.1 638.5 713.8 2 653.3 616.8 689.9 3 630.5 592.7 668.4 Hier ist fit die (Punkt-)Prognose und lwr bzw. upr ist die untere bzw. obere Intervallgrenze. Das per Voreinstellung verwendete Konfidenzniveau ist dabei 0.95, will man ein anderes, muss man auch noch das Argument level benutzen. 5 Heteroskedastie-robuste Standardfehler Die per Voreinstellung in R erhältlichen Standardfehler sind wie in den meisten Programmpaketen Standardfehler unter der Annahme (bedingter) Homoskedastizität, d.h. Var(y i x i ) = σ 2. In ökonometrischen Querschnittsregressionen ist es oft sinnvoll, heteroskedastiekonsistente (oder -robuste) Standardfehler zu verwenden. Das Buch von Stock und Watson arbeitet von Anfang an mit diesen Fehlern. Dabei ersetzt man in der einfachsten Version den Standardschätzer für die OLS-Kovarianzmatrix (es ist durchsichtiger, alles gleich für Matrizen aufzuschreiben!) durch ( Var( ˆβ) n = ˆσ 2 (X X) 1 = ˆσ 2 x i x i ) 1 ( n ) 1 ( Var( ˆβ) n ) ( n = x i x i û 2 i x i x i x i x i Dieser Schätzer heisst Eicker-White-Schätzer der OLS-Kovarianzmatrix. In R sind solche allgemeineren Schätzer über das Paket sandwich erhältlich. Man kann neben den korrigierten Standardfehlern selbst auch t-statistiken und p-werte basierend auf diesen Fehlern bekommen. Dazu benötigt man die Funktion coeftest() aus dem Paket lmtest, in der man eine Kovarianzmatrixschätzung über das Argument vcov wählen kann. Modifizierten Regressionsoutput unter Verwendung von Eicker-White-Standardfehlern erhält man nun über R> library("sandwich") R> library("lmtest") R> coeftest(fm, vcov = sandwich) t test of coefficients: (Intercept) 698.933 10.340 67.6 < 2e-16 stratio -2.280 0.518-4.4 0.000014 Etwas technischer: Wir können die Schätzungen der Standardfehler (klassisch und heteroskedastierobust) vergleichen über ) 1
Lineare Regression in R, Teil 1 5 R> sqrt(diag(vcov(fm))) 9.4675 0.4798 R> sqrt(diag(sandwich(fm))) 10.3397 0.5183 also über das Extrahieren der Wurzeln der Diagonalelemente (= Varianzen) der jeweiligen Kovarianzmatrizen. Die Eicker-White-Fehler sind damit hier etwas grösser als die unter der Annahme von Homoskedastie berechneten. Bem.: Da der Eicker-White-Schätzer immer noch gewisse Nachteile hat, gibt es Modifikationen (üblicherweise bezeichnet mit HC1-HC4) dieser Grundversion HC0. Alle Varianten sind im R-Paket sandwich erhältlich.