logistic

Werbung
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
Herunterladen