Logistic Regression Jonathan Harrington Befehle: logistic.txt 1. Logistic Regression: allgemeine Einführung Literatur Baayen, R.H. Analyzing Linguistic Data: A practical introduction to Statistics. S. 213-234 D. Cook, P. Dixon, W. M. Duckworth, M.S. Kaiser, K. Koehler, W. Q. Meeker and W. R. Stephenson. Binary Response and Logistic Regression Analysis. http://www.faculty.sbc.edu/bkirk/Biostatistics/course%20documents%20for%20200 6/Logistic%20Regression%20Analysis.doc Dalgaard, P. (2002) Introductory Statistics with R. Insbesondere Kap. 11 Johnson, Keith (in press). Quantitative Methods in Linguistics. Blackwell. Kapitel 5. Verzani, J. (2005). Using R for Introductory Statistics (Ebook ueber die LMU UB). Kapitel 12 1. Logistic Regression: allgemeine Einführung Mit logistic Regression wird eine Regressionslinie an Proportionen angepasst. Aus verschiedenen Gründen kann jedoch die lineare (least-squares) Regression nicht auf Proportionen angewandt werden. Vor allem liegen Proportionen zwischen 0 und 1 während lineare Regression keine solchen Grenzen kennt (und daher könnte ein lineares Regressionsmodell Proportionen unter 0 oder über 1 vorhersagen). Außerdem wird in der linearen Regression eine konstante Varianz angenommen; jedoch kann bewiesen werden, dass je höher der Proportionsdurchschnitt, umso größer die Varianz. 1. Logistic Regression: allgemeine Einführung Diese (und andere) Probleme können überwunden werden: 1. wenn log-odds statt Proportionen modelliert werden Logistic Regression logodds(y) = mx + b Least-squares Regression y = mx + b 2. Durch Einsetzung von 'maximum likelihood' anstatt 'least squares'. Ein Vorteil von logistic Regression: Es wird nicht angenommen, dass die Werte Stichproben aus einer Normalverteilung sind. Einige Daten lost 1950 1960 1971 1980 1993 2005 high 30 18 15 13 4 2 low 5 21 26 20 32 34 In 1950 produzierten 30 Sprecher /lo:st/ und 5 /lɔst/. jahr = as.numeric(rownames(lost)) jahr = jahr - 1950 Log-odds p: Proportion 'Erfolg'. lo:st lɔst n p 32 8 40 0.8 (prop. lo:st) (prop. lOst) p q=1-p Odds = p/q Log-Odds = log(p/q) 0.8 0.2 4 log(4) = 1.39 bedeutet 4:1 (wie im Pferderennen). Die Wahrscheinlichkeit vom Erfolg (p) ist 4 Mal so groß wie Scheitern (q) 0.5 0.5 1 0 Log-odds Log-odds haben Werte zwischen ±∞ Log-odds also log (p/q) als Funktion von p 2. Anwendung der logistic Regression in R: glm() Das Ziel: nach der Anwendung von logistic Regression geben wir einen beliebigen Jahrgang ein, und das Modell soll uns die Proportion von /lo:st/ vorhersagen. zB Eingabe 1962, Proportion (lo:st) = ? Jahr ist daher in diesem Fall die unabhängige Variable, Proportion von /lo:st/ die abhängige Variable. Mit logistic Regression ist die abhängige Variable immer ein kategorialer Wert von 2 Möglichkeiten: ja oder nein, rot oder grün, 0 oder 1, weiblich oder männlich, wach oder eingeschlafen, /lo:st/ oder /lɔst/, Erfolg oder Scheitern, usw. Ergebnis: ein LogOdd pro Jahr unabhängige Variable (der Jahrgang) g = glm(lost ~ jahr, binomial) wird modelliert durch Abhängige Variable Eine 2-spaltige Matrix: Anzahl von 'ja' und 'nein' (hier /lo:st/ und /lOst/) lost 1950 1960 1971 1980 1993 2005 high low 30 5 18 21 15 26 13 20 4 32 2 34 bedeutet: logistic Regression ('binomial' weil wie in der binomialen Verteilung wir mit 2 Werten (ja/nein, Erfolg/Scheitern zu tun haben). 3. Abbildung der Regressionslinie Da die Ausgabe der Regression in log-odds ist, müssen wir die Proportionen ebenfalls umwandeln, wenn wir die Regressionslinie sehen wollen. Eine Abbildung der Daten in diesem Raum: # Proportion von /lo:st/ berechnen p = lost[,1]/apply(lost, 1, sum) # log-odds lodd = log(p/(1-p)) plot(jahr, lodd, type="b") # Regressionslinie überlagern abline(g, col=2) Die vorhergesagten Werte überlagern text(jahr, predict(g), "x", col=3) Vorhersage: Wert für 1962 neuerwert = data.frame(jahr = 12) ergebnis = predict(g, neuerwert, se.fit=T) ergebnis$fit abline(h=ergebnis$fit, lty=2, col="blue") Abbildung der Regression Wir können durch die Transformation (2) die Regressionslinie auch in einem Raum von Jahr x Proportionen abbilden. Von Proportionen in log-odds (1) p L log( ) 1 p p = 0.8 L = log(p/(1-p)) [1] 1.386294 Von log-odds zurück in Proportionen (2) eL p 1 eL p = exp(L)/(1+exp(L)) [1] 0.8 Abbildung: Jahr x Proportionen # Proportionen von /lo:st/ berechnen p = lost[,1]/apply(lost, 1, sum) # Abbildung Jahr x Proportionen plot(jahr,p) Die Regression ( mx k ) e y ( mx k ) 1 e coef(g) (Intercept) jahr 1.10432397 -0.07026313 m = coef(g)[2] k = coef(g)[1] # Regression überlagern curve(exp(m*x + k)/(1+ exp(m*x+k)), xlim=c(0, 60), add=T, col=2) Abbildung Jahr x Proportionen und die vorhergesagten Werte liegen wieder auf der Linie: vorher = predict(g) text(jahr, exp(vorher)/(1+exp(vorher)), "x", col=3) Signifikanz-Test Was ist die Wahrscheinlichkeit, dass die Proportion von /lo:stlɔst/ durch den Jahrgang vorhergesagt werden kann? Lineare Regression: R2 oder adjusted R2 und ein F-test Logistic Regression: G2 und ein c2-test. G2 = Null deviance – residual deviance wenn dieser Wert 0 wäre, dann wären alle Proportionen in allen Jahren gleich (und die Regressionslinie wäre horizontal) je höher dieser Wert, umso unwahrscheinlicher ist es, dass die Werte überhaupt durch die Regression modelliert werden können. Für ein signifikantes Ergebnis wollen wir daher, dass Null deviance hoch und Residual deviance klein ist. G2 = Null deviance - residual deviance g = glm(lost ~ jahr, binomial) summary(g) Null deviance: 69.3634 on 5 degrees of freedom … Residual deviance: 8.2422 on 4 degrees of freedom 69.3634 - 8.2422 [1] 61.1212 Der Test mit anova() ist ob G2 signifikant von 0 abweicht: anova(g, test="Chisq") NULL jahr Df Deviance Resid. Df Resid. Dev P(>|Chi|) 5 69.363 1 61.121 4 8.242 5.367e-15 Die Proportionen folgen einem Trend (c2(1)=61.2, p < 0.001) Zwei unabhängige Variablen. pfad = "das Verzeichnis wo ich lost2.txt gespeichert habe" lost2 = as.matrix(read.table(paste(pfad, "lost2.txt", sep="/"))) (dieselben Daten wie in lost.txt aber zusätzlich nach männlich-weiblich aufgeteilt) pfad = "das Verzeichnis wo ich lost2.txt gespeichert habe" lost = as.matrix(read.table(paste(pfad, "lost.txt", sep="/"))) Zwei unabhängige Variablen. 00.0 10.0 21.0 30.0 43.0 55.0 00.1 10.1 21.1 30.1 43.1 55.1 high 16 9 8 8 4 1 14 9 7 5 0 1 low 0 6 10 7 10 15 5 15 16 13 22 19 1950 1960 1971 1980 1993 2005 1950 1960 1971 1980 1993 2005 } } Haupteffekt: Jahr M W Interaktion: Jahr x Geschlecht Ist der Trend derselbe für M und F? (a) Gibt es einen Trend? Also weniger [lo:st] in späteren Jahren? Haupteffekt: Geschlecht (b) Ist die Proportion [lost]/[lo:st] in M und W unterschiedlich verteilt? 0.0 10.0 21.0 30.0 43.0 55.0 0.1 10.1 21.1 30.1 43.1 55.1 high 16 9 8 8 4 1 14 9 7 5 0 1 low 0 6 10 7 10 15 5 15 16 13 22 19 1950 1960 1971 1980 1993 2005 1950 1960 1971 1980 1993 2005 r = rownames(lost2) J = as.numeric(substring(r, 1, 2)) G = factor(substring(r, 4, 4)) } } M W Zuerst eine Abbildung… p = lost2[,1]/apply(lost2, 1, sum) interaction.plot(J, G, p) Nimmt die Proportion von /lo:st/ in späteren Jahren ab? (Die Unterschiede zwischen m und f ignorieren). Ja Nein Vielleicht Unterscheiden sich m und f in der Proportion von /lo:st/? (Die Unterschiede in den Jahrgängen ignorieren). Ja Nein Vielleicht Modell berechnen… mehrg = glm(lost2 ~ J + G, binomial) Wenn wir übrigens G weglassen, dann müssten wir trotz der anderen Aufteilung der Daten das gleiche Ergebnis wir vorhin bekommen: g2 = glm(lost2 ~ J, binomial) anova(g2, test="Chisq") Analysis of Deviance Table Df Deviance Resid. Df Resid. Dev P(>|Chi|) NULL 11 89.557 year 1 61.121 10 28.436 5.367e-15 mehrg = glm(lost2 ~ J + G, binomial) mehrg Coefficients: (Intercept) J Gm 1.87754 -0.07524 1.20282 Degrees of Freedom: 11 Total (i.e. Null); 9 Residual Null Deviance: 89.56 Residual Deviance: 15.61 AIC: 51.51 logodds(lo:st) = 1.87754 - 0.07524J+ 1.20282G anova(mehrg, test="Chisq") NULL J G Df Deviance Resid.Df Resid. Dev P(>|Chi|) 11 89.557 1 61.121 10 28.436 5.367e-15 1 12.822 9 15.613 3.425e-04 Die Proportion von 'lo:st' nimmt in späteren Jahren ab, c2(1) = 61.12, p < 0.001. M und F unterscheiden sich in der Proportion von lo:st/lOst, c2(1) = 12.82, p < 0.001 Die Interaktion zwischen 2 Variablen Mit 2 oder mehr Variablen soll auch geprüft werden, ob sie miteinander interagieren. Eine Interaktion zwischen den unabhängigen Variablen – in diesem Fall Geschlecht und Jahrgang – liegt vor, wenn sie eine unterschiedliche Wirkung auf die abhängige Variable ausüben wie in 1 und 2, aber nicht in 3 und 4 prop(lo:st) prop(lo:st) prop(lo:st) prop(lo:st) f m 2000 1950 2000 1 1950 2000 2 1950 2000 3 1950 4 Die Interaktion zwischen 2 Variablen Wenn eine Interaktion vorliegt, dann können signifikante Ergebnisse in einer der unabhängigen Variablen nicht uneingeschränkt akzeptiert werden. zB wenn eine Interaktion vorkommt, gibt es vielleicht eine Wirkung von Jahrgang auf die Proportion von /lo:st/ nur in Männern aber nicht in Frauen usw. dies scheint aber hier nicht der Fall zu sein. Die Interaktion zwischen 2 Variablen Die Interaktion zwischen 2 unabhängigen Variablen, A und B, kann in R mit A:B geprüft werden. Daher in diesem Fall g = glm(lost2 ~ J + G + J:G, binomial) Eine Abkürzung dafür (und mit genau demselben Ergebnis) g = glm(lost2 ~ J * G, binomial) anova(g, test="Chisq") NULL J G J:G 1 1 1 Df Deviance Resid. Df Resid. Dev P(>|Chi|) 11 89.557 61.121 10 28.436 5.367e-15 12.822 9 15.613 3.425e-04 0.017 8 15.596 0.896 d.h. die Interaktion ist nicht signifikant und J:G kann aus dem Regressionsmodell weggelassen werden. Dies wird auch durch stepAIC() bestätigt: library(MASS) stepAIC(g) Start: AIC= 53.49 lost2 ~ J * G Df Deviance AIC - J:G 1 15.613 51.506 <none> 15.596 53.489 AIC wird kleiner wenn wir J:G weglassen Df Deviance AIC <none> 15.613 51.506 - G 1 28.436 62.328 - J 1 80.018 113.910 Wir bleiben also bei Call: glm(formula = lost2 ~ J + G, family = binomial) Residual Deviance: 15.61 AIC: 51.51