III. Univariate Statistik II: Das Verallgemeinerte Lineare Modell (Generalised
8.2. Log-lineare Modelle: Poisson Regression
Log-lineare Modelle sind in GLMs f¨ur Poisson-verteilte Daten zust¨andig. Wir erinnern uns, dass vor allem Z¨ahldaten zu einer Poisson-Verteilung f¨uhren. Wenn wir also Daten erheben, in denen bspws. die Anzahl Kaffee-trinkender Kollegen in Abh¨angigkeit vom Alter analysiert
werden sollen, so geschieht dies mittels log-linearer Modelle. Der Name “log-linear” r¨uhrt aus der link -Funktion, die f¨ur Poisson-Daten standardm¨aßig der log link ist.
Im Grunde ist die Analyse Poisson-verteilter Daten vollst¨andig analog zu den gerade be-sprochenen binomialverteilten Daten. Auch hier spezifizieren wir im GLM die Fehlerverteilung (und damit den link ), achten bei den Ergebnissen auf die dispersion, und selektieren unser Modell bei Modellvereinfachung mittels eines deviance-Tests.
Untersuchen wir im folgenden die Frage, ob Halsbandschn¨apperweibchen durch ihre Wahl eines attraktiveren M¨annchens auch die Bef¨utterung ihrer gemeinsamen Brut verbessern.
Daf¨ur betrachten wir die Anzahl Futterst¨ucke, die ein Halsbandschn¨apperm¨annchen seinen Jungen pro Stunde ans Nest liefert, in Abh¨angigkeit von der Attraktivit¨at des M¨annchens.
(Die Auswertung, die f¨ur die Erstellung der Linien n¨otig ist wird gleich behandelt.)
> schnaepper <- read.table("schnaepper.txt", header = T)
> attach(schnaepper)
> names(schnaepper) [1] "stuecke" "attrakt"
> par(mfrow = c(1, 2), mar = c(5, 5, 1, 1))
> plot(log(stuecke) ~ attrakt, cex = 2, cex.lab = 1.7, pch = 16)
> points(seq(1, 5, by = 0.1), predict(glm(stuecke ~ attrakt, poisson), + list(attrakt = seq(1, 5, by = 0.1))), type = "l", lwd = 3)
> plot(stuecke ~ attrakt, cex = 2, cex.lab = 1.7, pch = 16)
> points(seq(1, 5, by = 0.1), predict(glm(stuecke ~ attrakt, poisson), + list(attrakt = seq(1, 5, by = 0.1)), type = "response"), type = "l", + lwd = 3)
Hat entsprechend dieser Daten nun die Attraktivit¨at einen Einfluss auf die Versorgungs-rate? Offensichtlich handelt es sich um Poisson-verteilte Daten, und entsprechend sind nur ganzzahlige Werte auf der y-Achse aufgetragen. Dadurch wirkt die Streuung sehr groß. Die Frage nach einer Signifikanz des Attraktivit¨atseffekts gehen wir wie folgt nach:
An diesem Beispiel wollen wir einmal den maximum likelihood -Ansatz zu Fuß durchrechnen.
F¨ur die Poisson-Verteilung hat die likelihood -Funktion folgende Form:
L(xi|λ) = λx1
x1!eλ · λx2
x2!eλ · · · λxn
xn!eλ = λPxn x1! · · · xn!enλ Wir logarithmieren und erhalten die log-likelihood :
lnL =X(−λ + (lnλ) · xi) − ln(Yxi!)
Der erste Schritt ist die Formulierung der Regressionsgleichung: y = β0+ β1x. Wir sehen, dass wir zwei Parameter gleichzeitig berechnen m¨ussen (die beiden βs). Nehmen wir der einfachheitshalber zun¨achst an, wir w¨ussten, dass der y-Achsenabschnitt den Wert 4.4 h¨atte.
Dann w¨are unsere Regressionsgleichung: y = 4.4 + β1x. Mit dieser k¨onnen wir jetzt f¨ur jeden beobachteten y-Wert (d.i. stuecke) eine Wert aus der Attraktivit¨at vorhersagen, wenn wir f¨ur β1 einen Wert vorgeben. So sind f¨ur β1 = 1 die beobachtete und vorhergesagten x-Werte:
> stuecke
[1] 3 6 8 4 2 7 6 8 10 3 5 7 6 7 5 6 7 11 8 11 13 11 7 7 6
> 4.4 + attrakt * 1
[1] 5.4 5.4 5.4 5.4 5.4 6.4 6.4 6.4 6.4 6.4 7.4 7.4 7.4 7.4 7.4 8.4 8.4 8.4 8.4 [20] 8.4 9.4 9.4 9.4 9.4 9.4
1 2 3 4 5
1.01.52.02.5
attrakt
log(stuecke)
1 2 3 4 5
24681012
attrakt
stuecke
Abbildung 8.4.: Vom Halsbandschn¨apperm¨annchen an die Brut gelieferte Anzahl Futter-st¨ucke pro Stunde in Abh¨angigkeit der Attraktivit¨at des M¨annchens, links mit logarithmisch dargestellten Anzahlen, recht normal. Die durchgezogenen Linien stellt das Ergebnis einer Poisson-Regression dar, links auf der link-scale, rechts r¨ucktransformiert. Beachte, dass aus dem Regressionsgeraden mit log-link eine e-Funktion auf der normalen (=response) Skala wird. Dies mag manchmal ungewohnt erscheinen, und so werden die meisten Daten, die mittels Poisson-Regression analysiert wurden, auch als logarithmiert darge-stellt. Nichtsdestotrotz ist die rechte Abbildung genauso korrekt.
> points(seq(1, 5, by = 0.1), 4.4 + seq(1, 5, by = 0.1), type = "l")
Bei der klassichen Regression normalverteilter Daten w¨urden wir jetzt die Residuen be-rechnen, quadrieren und aufsummieren. F¨ur Poisson-Daten berechnen wir aber nicht die sum of squares, sondern gem¨aß obiger Formel die log-likelihood der Daten, wobei wir λ durch 4.4+attrakt·1ersetzen.
F¨ur jeden Datenpunkt xi k¨onnen wir jetzt die Wahrscheinlichkeit berechnen, dass er einer Poisson-Verteilung mit einem bestimmten Mittelwert λientstammt. Diese wird inRberechnet als dpois(xi,λi). Diese logarithmieren wir und summieren sie auf. Damit erhalten wir unsere log-likelihood. Beachte, dass wir ja die beobachteten Werte mit dem log-link an das Modell koppeln!
> sum(log(dpois(stuecke, exp(1.5 + attrakt * 0.2)))) [1] -59.86768
Das Ergebnis ist stets eine negative Zahl, da ja die Wahrscheinlichkeiten zwischen 0 und 1 liegen, der log davon also negativ ist (und somit auch die Summe der logs).
Wiederholen wir dies f¨ur eine Reihe an Werte f¨ur β1, etwa von 0.01 bis 0.5, und bilden die log-likelihood -Summen ab, so erhalten wir Abb. 8.5.
> loglik <- 1:50
> beta1 <- seq(0.01, 0.5, len = 50)
> for (i in 1:50) loglik[i] <- sum(log(dpois(stuecke, exp(1.5 + + attrakt * beta1[i]))))
> plot(beta1, loglik, type = "l", xlab = expression(beta[1]), cex.lab = 1.5)
0.0 0.1 0.2 0.3 0.4 0.5
−300−250−200−150−100−50
β1
loglik
Abbildung 8.5.: Log-likelihood der verschiedenen Werte von β1 bei gegebenem β0= 4.4.
Offensichtlich gibt es einen Wert f¨ur β1, f¨ur den loglik maximal ist. Dies ist der gesuchte Wert f¨ur β1 (in diesem Fall etwa 0.15), denn er produziert die maximale Wahrscheinlichkeit.
Entsprechend k¨onnen wir vorgehen, wenn wir den y-Achsenabschnitt berechnen wollen.
Interessant wird es, wenn wir beide Parameter gleichzeitig sch¨atzen m¨ussen. Das Ergebnis ist dann eine dreidimensionale Fl¨ache, die einem Berg ¨ahneln sollte. Beginnen wir, indem wir f¨ur Steigung und y-Achsenabschnitt 100 Werte von 0.01 bis 0.5 bzw. 0.1 bis 2 w¨ahlen, und die Poisson-likelihood f¨ur jede Kombination dieser Werte berechnen7. Anschließend plotten wir das Ergebnis (Abb. 8.6), einmal dreidimensional mittels persp, dann besser erkennbar zweidimensional mittels contour8.
> beta0 <- seq(0.1, 2, length = 100)
> beta1 <- seq(0.01, 0.5, length = 100)
> llfun <- function(x, y) {
+ sum(log(dpois(stuecke, exp(x + attrakt * y)))) + }
> loglik.m <- matrix(ncol = 100, nrow = 100)
> for (i in 1:100) { + for (j in 1:100) {
+ loglik.m[i, j] <- llfun(beta0[i], beta1[j])
+ }
+ }
> par(mfrow = c(1, 2))
> persp(beta0, beta1, loglik.m, phi = 30, theta = 90, xlab = "beta0", + ylab = "beta1", zlab = "loglik")
> contour(beta0, beta1, loglik.m, nlevels = 30, xlab = expression(beta[0]), + ylab = expression(beta[1]), cex.lab = 1.5)
7Hier ginge es mit der Funktion outer mit weniger Code, aber die for-Schleifen sind didaktisch klarer.
8Hiervon gibt es eine Variante filled.contour, die bunte Farbverl¨aufe statt Konturen benutzt.
beta0
beta1 loglik
β0
β1
0.5 1.0 1.5 2.0
0.00.10.20.30.40.5
Abbildung 8.6.: 3D- und Konturenabbildung der log-likelihood -Berechnung f¨ur die Schn¨ap-perdaten. Wir sehen deutlich, dass die Koeffizienten nicht unabh¨angig von-einander sind: je h¨oher der Wert des einen, desto niedriger der des anderen.
F¨ur die Korrelation zwischen Achsenabschnitt und Steigung ist dies prak-tisch immer der Fall. Sorgen sollten wir uns machen, wenn zwei Faktoren, also zwei Steigungen, diese Bild aufweisen. Dann k¨onnen wir den Effekt der einen Variablen nicht von dem der anderen trennen (collinearity).
Jetzt wollen wir nat¨urlich noch die Werte f¨ur β0 und β1 haben. Um diese zu extrahieren benutzen wir die Funktion which.max:
> loglik.m[which(loglik.m == max(loglik.m))]
[1] -55.71565
> llmax <- which(loglik.m == max(loglik.m), arr.ind = T)
> round(beta0[llmax[1]], 2) [1] 1.48
> round(beta1[llmax[2]], 2) [1] 0.14
Die gesuchten Werte sind also β0 = 1.48 und β0 = 0.14.
Wenn wir diese Werte mit glm errechnen wollen, so m¨ussen wir nur die Fehlerverteilung als Poisson defi-nieren:
> summary(glm(stuecke ~ attrakt, poisson)) Call:
glm(formula = stuecke ~ attrakt, family = poisson) Deviance Residuals:
Min 1Q Median 3Q Max
-1.55377 -0.72834 0.03699 0.59093 1.54584 Coefficients:
Estimate Std. Error z value Pr(>|z|) (Intercept) 1.47459 0.19443 7.584 3.34e-14 ***
attrakt 0.14794 0.05437 2.721 0.00651 **
---Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1 (Dispersion parameter for poisson family taken to be 1)
Null deviance: 25.829 on 24 degrees of freedom Residual deviance: 18.320 on 23 degrees of freedom AIC: 115.42
Number of Fisher Scoring iterations: 4
Das ist doch ¨uberzeugend. Und nat¨urlich hat der Optimierungsalgorithmus im GLM eine viel h¨ohere Genauigkeit als unser handgestrickter grid-search.
Dieses Beispiel hat uns gezeigt, wie zwei Parameter gleichzeitig gesch¨atzt werden k¨onnen.
Wir haben dabei auch gesehen, dass die Fehler auf diesen Parametern sehr unterschiedlich sein k¨onnen. Je flacher die Spitze des likelihood-Berges, desto gr¨oßer ist der Fehler auf dem gesch¨atzten Koeffizienten. In unserem Fall hatten wir eine Bergschulter; die Steigung war gut, der Achsenabschnitt schlechter zu sch¨atzen. Wenn wir uns Abb. 8.4 anschauen, dann sehen wir, dass eine Zunahme der y-Werte mit ansteigenden x-Werten in der Tat sehr offensichtlich ist. Den genauen Schnittpunkt der Regressionsgraden mit der y-Achse hingegen k¨onnen wir nicht wirklich absch¨atzen.