Lineare Regression in R, Teil 2 - WWZ

Transcrição

Lineare Regression in R, Teil 2 - WWZ
Lineare Regression in R, Teil 2
Christian Kleiber
Abt. Quantitative Methoden, WWZ, Universität Basel
28. Oktober 2009
1
Vorbereitungen
Zur Illustration betrachten wir wieder den Datensatz CASchools.
Laden des Paketes und der Daten:
R> library("AER")
R> data("CASchools")
Wie schon diskutiert müssen die benötigten Variablen zunächst erzeugt werden:
R> CASchools$stratio <- with(CASchools, students/teachers)
R> CASchools$score <- with(CASchools, (read + math)/2)
2
Testen allgemeiner linearer Hypothesen
Tests zur Überprüfung von Hypothesen des Typs H0 : βj = 0 wurden bereits besprochen. Manchmal will man Hypothesen von allgemeinerer Form testen.
Angenommen, wir wollen im Modell
score = β0 + β1 stratio + β2 english + ui
geschätzt mit
R> fm2 <- lm(score ~ stratio + english, data = CASchools)
die Hypothese H0 : β1 = β2 testen, oder äquivalent H0 : β1 − β2 = 0, d.h. die Koeffizienten
zu stratio und english sind gleich (keine inhaltlich sinnvolle Hypothese, nur eine Illustration).
Solche Hypothesen können mit der Funktion linear.hypothesis() aus dem Paket car getestet
werden. (Dieses Paket muss i.a. erst installiert werden. Wenn Sie aber schon AER installiert haben,
wurde car bereits automatisch mitinstalliert; es wird beim Laden von AER auch automatisch
mitgeladen).
Die einfachste Möglichkeit besteht nun in der Nutzung einer Formelschreibweise:
R> linear.hypothesis(fm2, "str = english", vcov = sandwich)
oder alternativ
R> linear.hypothesis(fm2, "str - english", vcov = sandwich)
Im zweiten Fall wird also von der Funktion verstanden, dass die “rechte Seite” der Hypothese Null
ist.
Lineare Regression in R, Teil 2
2
Unser Problem lässt sich aber noch etwas allgemeiner (und damit transparenter!) formulieren: In
Matrixform ist eine allgemeine lineare Hypothese von der Form
Rβ = r
(1)
wobei β der (k + 1) × 1 Vektor der Regressionskoeffizienten, R eine q × (k + 1) Matrix und r ein
q × 1 Vektor sind.
Die Funktion linear.hypothesis() kann auch mit dieser Formulierung umgehen, sie benötigt
dafür eine hypothesis.matrix (die Matrix R aus (1)), und rhs (der Vektor r auf der rechten
Seite von (1)). In unserem Fall reduziert sich die Matrix R zu einem (Zeilen-)Vektor, da wir nur
eine einzelne lineare Hypothese testen, und die rechte Seite ist ein Skalar.
Eine weitere Möglichkeit des Tests ist deshalb gegeben durch den Funktionsaufruf
R> linear.hypothesis(fm2, hypothesis.matrix = c(0, 1, -1), rhs = 0)
Linear hypothesis test
Hypothesis:
stratio - english = 0
Model 1: score ~ stratio + english
Model 2: restricted model
1
2
Res.Df
RSS
417 87245
418 87526
Df Sum of Sq
-1
F Pr(>F)
-281 1.34
0.25
Das Ergebnis von linear.hypothesis() ähnelt dem von anova(): man erhält die zu vergleichenden Modelle mit Freiheitsgraden, Fehlerquadratsummen und zugehöriger F -Statistik. Demnach
kann die Hypothese zu den üblichen Signifikanzniveaus nicht verworfen werden.
Bei Verdacht auf Heteroskedastie kann man solche lineare Hypothesen wie oben auch gleich mit
einer Eicker-White-Kovarianzmatrix testen:
R> linear.hypothesis(fm2, hypothesis.matrix = c(0, 1, -1), rhs = 0, vcov = sandwich)
Linear hypothesis test
Hypothesis:
stratio - english = 0
Model 1: score ~ stratio + english
Model 2: restricted model
Note: Coefficient covariance matrix supplied.
1
2
Res.Df
417
418
Df
F Pr(>F)
-1 1.09
0.3
Die heteroskedastie-robuste Version führt also bei den üblichen Signifikanzniveaus zur gleichen
Testentscheidung.
3
Formeln
R bietet eine flexible Formelmethode an, um Regressionsmodelle zu spezifizieren. Dabei haben
allerdings die Grundrechenarten eine neue Bedeutung, bspw. bedeutet wie schon gesehen y ~x + z
Regression von y auf x und z (aber eben nicht auf x + z):
c
Christian Kleiber
U Basel, HS 2009
Lineare Regression in R, Teil 2
3
R> fm2 <- lm(score ~ stratio + english, data = CASchools)
Analog bedeutet "-" Weglassen von Regressoren. Ein Modell mit nur dem Regressor stratio
ergibt sich bspw. aus fm2 unter Verwendung der Funktion update() über
R> fm1 <- update(fm2, . ~ . - english, data = CASchools)
Die Grundrechenarten werden insb. gebraucht, um Interaktionsterme kompakt zu spezifizieren.
Ein Modell mit Interaktionen zwischen den metrischen Regressoren stratio und english wird
spezifiziert durch:
R> fmint1a <- lm(score ~ stratio + english + stratio:english, data = CASchools)
oder kompakter durch
R> fmint1b <- lm(score ~ stratio * english, data = CASchools)
Dabei ist stratio:english der Interaktionsterm selbst, und stratio * english steht für eine
Regression auf die angegebenen Regressoren und sämtliche Interaktionsterme.
Besonders elegant (aber anfangs etwas gewöhnungsbedürftig) ist die Formelschreibweise im Zusammenhang mit Faktoren (qualitativen Variablen):
Sei dazu a eine kategoriale Variable (Faktor) mit k Stufen. Im Ökonometrie-Jargon würde man
dazu k − 1 Dummies einführen, der Vorteil der R-Version ist, dass man nur eine einzige Variable
verwalten muss und diese Dummies im Hintergrund automatisch erzeugt werden. Damit kann
man insb. sehr schnell die Referenzkategorie wechseln. Tabelle 1 zeigt einige Möglichkeiten, mit
Faktoren und einer metrischen Variablen x sehr kompakt Interaktionen zu spezifizieren.
Tabelle 1: Formeln in Regressionsmodellen.
Formel
y ~ a + x
y ~ a * x
y ~ a + x + a:x
y ~ a / x
y ~ a + x %in% a
Beschreibung
Modell ohne Interaktion: identische Steigungen bzgl.
x, aber unterschiedliche Achsenabschnitte bzgl. a.
Modell mit Interaktion: der Term a:x erzeugt
die Differenz der Steigungen bzgl. der Referenzkategorie.
Modell mit Interaktion: gleiche ŷi wie oben,
aber Koeffizienten hierarchisch kodiert. Explizite
Steigung für jede Kategorie von a.
Ein Beispiel zu Interaktionen zwischen einem Faktor und einem metrischen Regressor (um die
Möglichkeiten der Formelsprache deutlicher zu machen, wird der Faktor noch etwas aufbereitet):
R>
R>
R>
R>
henglish <- I(CASchools$english >= 10)
henglish <- factor(henglish, labels = c("no", "yes"))
fmint2 <- lm(score ~ stratio * henglish, data = CASchools)
coeftest(fmint2, vcov = sandwich)
t test of coefficients:
(Intercept)
stratio
henglishyes
stratio:henglishyes
c
Christian Kleiber
Estimate Std. Error t value Pr(>|t|)
682.246
11.811
57.76
<2e-16
-0.968
0.586
-1.65
0.10
5.639
19.421
0.29
0.77
-1.277
0.962
-1.33
0.19
U Basel, HS 2009
Lineare Regression in R, Teil 2
4
Hier wird henglish durch einen logischen Vergleich erzeugt: die Aussage english >= 10 ist für
einen gegebenen Schulbezirk entweder wahr oder falsch, somit entsteht ein Vektor mit diesen Einträgen. Er wird nun in einen Faktor verwandelt, dessen Ausprägungen "no" bzw. "yes" sind. Die
Referenzkategorie des Faktors enspricht dabei "no". Will man die Regression mit der Referenzkategorie "yes" durchführen, definiert man die Kategorien um. Am einfachsten geht dies mit der
Funktion relevel():
R> henglish <- relevel(henglish, ref = "yes")
R> fmint3 <- lm(score ~ stratio * henglish, data = CASchools)
R> coeftest(fmint3, vcov = sandwich)
t test of coefficients:
(Intercept)
stratio
henglishno
stratio:henglishno
4
Estimate Std. Error t value Pr(>|t|)
687.885
15.417
44.62
<2e-16
-2.245
0.763
-2.94
0.0034
-5.639
19.421
-0.29
0.7717
1.277
0.962
1.33
0.1854
Regression mit transformierten Variablen
Wie oben beschrieben haben die Grundrechenarten in Formeln eine spezielle Bedeutung. Will man
sie verwenden, um Regressoren zu transformieren, muss man deshalb einen Operator benutzen,
nämlich I(). Ein quadratischer Term im Regressor income wird bspw. spezifiziert über
R> fmquad <- lm(score ~ income + I(income^2), data = CASchools)
Transformationen, die keine Grundrechenarten enthalten, brauchen das I() nicht, deshalb genügt
z.B. für Logarithmen einfach
R> fmlinlog <- lm(score ~ log(income), data = CASchools)
Wird nun der transformierte Regressor selbst wieder mit einer Grundrechenart transformiert, muss
I() wieder verwendet werden:
R> fmlinlogquad <- lm(score ~ log(income) + I(log(income)^2), data = CASchools)
5
Visualisierung von Regressionsergebnissen
Zur Beurteilung der Anpassung ist es hilfreich, Graphiken zu erzeugen. Hier ein Beispiel für die
Regression fmlinlog:
R> plot(score ~ income, data = CASchools, pch = 20,
+ xlim = c(0, 60), ylim = c(600, 730))
R> grid <- seq(5, 55, by = 0.1)
R> lines(grid, coef(fmlinlog)[1] + coef(fmlinlog)[2] * log(grid),
+ col = "slategrey", lwd = 2)
R> legend("topleft", "linlog", col = "slategrey", lwd = 2, bty = "n")
c
Christian Kleiber
U Basel, HS 2009
720
Lineare Regression in R, Teil 2
5
linlog
●
●
680
●
●
●
●●
●● ● ●● ●● ●● ●
●●
● ● ●●
●
●● ●● ● ●●
● ●●
● ●●
●● ●●
● ●
●
●●
●●● ●●
●
●
●●●
● ●
●● ●●
●●
●
●●● ● ●
●●
●● ●
●
●
●●
●
●
●●●
● ●
●● ●
●
●
●
●●●
●
●
●●
●●
●
●
●●
●●
●●
●
●●
●
●
●
●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●●● ● ● ●
● ●●●
●
●●●●●
●
●
●●●
●
●
●●
●●
●
●
●●●
● ● ●●
●
●
●●
●
●●
●●
●
●
●
●
●
●
●
●●●●
●●●
●
●●
●
●
●●
●
●●●
●●●
●
●
●●●
●
●
● ●
● ●●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●●●
●
● ●●●
●●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
● ●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
● ●●
●
●
●●
●
●
●
●
●
●
●
●●●
●●
●
●
●
●
●
●●
●
●●
●
●
●●●
●
●
●
●
●
●
●
●
●●
●
●●● ●
●
●● ●● ●
●
●
●● ●
●●
●●●
●● ●
● ●
● ●●●
●
●●●●
● ●
●
●
● ● ●
600
640
score
●
0
10
20
●
●
●
●●
●
●
●
● ●
●
30
●
●
●
●
●
●
●
●
●
40
50
60
income
Dabei wird zunächst ein Vektor von Stützstellen (grid, hier eine Folge von Werten beginnend mit 5 und endend mit 55, bei einer Schrittweite von 0.1) erzeugt, in denen die Funktion
dann mit den geschätzten Regressionskoeffizienten ausgewertet wird (coef(fmlinlog)[1] + coef(fmlinlog)[2]*log(grid)), diese beiden Vektoren werden schliesslich in der Form plot(x,
y) gegeneinander abgetragen. Da die Punkte als Kurve zu einer bestehenden Graphik hinzugefügt
werden sollen, wird dabei aber nicht die Funktion plot(), sondern lines() verwendet.
c
Christian Kleiber
U Basel, HS 2009

Documentos relacionados