3 Logistische Regression
3.1 Theorie in Kürze
- Logistische Regression: Binäre Zielgrösse (\(Y\)) wird durch erklärende Variablen (\(X\), diese können kontinuierlich oder diskret, also Faktoren, sein) modelliert
Modell: \[\begin{array}{c} Y_i \sim Bin(n, p_i), \\ \log(\frac{p_i}{1-p_i}) = \beta_0 + \sum_{j=1}^{p-1} \beta_j x_{i,j},\\ \end{array}\]
- Zweistufiges Modell: Stochastischer Teil (\(Y\) folgt Binomialverteilung mit Parametern) und deterministischer Teil (diese Parameter hängen über lineare Funktionen und Link Funktion von erklärenden Variablen ab). Die üblicherweise verwendete “Link-Funktion” sind die log-odds, also \(\log(\frac{p}{1-p})\); andere Link-Funktionen sind möglich, aber sehr selten. Der lineare Prädiktor sieht gleich aus wie in der Linearen Regression (aber Achtung: OHNE “\(+ E_i\)”)
- Zur Wiederholung: log-odds \(lo = \log(\frac{p}{1-p})\), \(odds = \frac{p}{1-p} = \exp(lo)\); aus den log-odds kann man so z.B. die Wahrscheinlichkeit berechnen: \(p = \frac{\exp(lo)}{1 + \exp(lo)}\)
- Logistische und Lineare Regression sind Beispiele von Generalized Linear Models (GLMs)
- Problematik bzgl. unterschiedlicher Parameter bei einfacher und multipler logistischer Regression ist genau gleich wie bei der Linearen Regression
- Interpretation von Wechselwirkungen ist analog zu Linearer Regression
- Für die Inuition zu den geschätzten Parametern \(\beta\) ist es am einfachsten, wenn man zunächst so tut, als wäre die Logistische Regression eine Lineare Regression, bei der die log-odds die Zielgrösse sind. Dann ist die Interpretation bzgl. log-odds sehr einfach (z.B. “wenn x um eine Einheit zunimmt, nehmen die log-odds um plus \(\beta\) zu” oder ähnlich), allerdings muss man etwas mehr nachdenken, wenn man das Ergebnis auf der Skala der odds (“odds-Ratio”) oder der Wahrscheinlichkeit wissen will.
- Tests: Für jeden Parameter \(\beta_j\) gibt es im summary output einen \(Z\)-Test mit \(H_0: \beta_j = 0\)
- Vorhersage mit der Funktion
predict
sind möglich für den Parameter (Wahrscheinlichkeit \(p\); Argumenttype = "response"
) und für den Wert der Link-Funktion (log-odds; Argumenttype = "link"
), nicht aber für die odds direkt. Für R-Hilfe siehe?predict.glm
Wichtige R Funktionen:
glm(..., family = binomial)
,summary
,predict
,plot
,confint
3.2 Bsp: Einfache logistische Regression
Wir zeigen in diesem Beispiel eine einfache (also nur eine erklärende Variable) logistische Regression und konzentrieren und dabei auf die Interpretation bzgl. Wahrscheinlichkeit, odds oder log-odds. Details bzgl. Faktoren, Wechselwirkung, etc. sind analog zur linearen Regression und wurden dort schon ausführlich illustriert.
Bei einem neuen Antibiotikum wird untersucht, ab welcher Dosis ein
Bakterienstamm von vorgegebener Grösse zuverlässig bekämpft werden
kann. Dazu testet man mehrere verschiedene Dosis-Einstellungen
(Variable x
). Bei jeder Dosiseinstellung werden 10 unabhängige
Schalen Bakterien mit dieser Dosis behandelt. Nach einer vorgegebenen
Zeit wird kontrolliert, ob die Behandlung erfolgreich war (dann ist
Variable y
gleich 1) oder nicht (dann ist y
gleich 0). Zunächst
simulieren wir einen Datensatz (diesen Code müssen Sie nicht
verstehen; allerdings kann er helfen genauer zu verstehen, welches
Modell die logistische Regression genau verwendet):
set.seed(123)
nmbDosis <- 20 ## Anzahl verschiedene Dosen
b0 <- -1 ## wahrer Intercept im Modell
b1 <- 1 ## wahre Steigung im Modell
n <- 10 ## Anzahl Schalen pro Dosis = Gruppengrösse
## verabreichte Dosis x
x <- runif(nmbDosis, min=-1, max = 3)
## log-odds für jede Gruppe mit einer fixen Dosis x
lo <- b0 + x*b1
## odds für jede Gruppe mit einer fixen Dosis x
odds <- exp(lo)
## Erfolgswa. für jede Gruppe mit einer fixen Dosis x
p <- odds/(1+odds)
yAll <- c()
xAll <- c()
for (i in 1:nmbDosis) {
## Anzahl Erfolge bei dieser Dosis; zwischen 0 und n
tmp <- rbinom(n=1, size = n, prob = p[i])
## für jede Schale eine 0 oder 1
yTmp <- c(rep(1, tmp), rep(0, n-tmp))
## für jede Schale den gleichen Eintrag bei der Dosis
xTmp <- rep(x[i], n)
## füge 0/1 aller Schalen in einen langen Vektor ein
yAll <- c(yAll, yTmp)
## füge Dosis aller Schalen in einen langen Vektor ein
xAll <- c(xAll, xTmp)
}
## eine Zeile entspricht einer Schale; zehn aufeinanderfolgende
## Schalen hatten immer die gleiche Dosis
## Die Zielgrösse muss ein binärer Faktor sein
yFaktor <- as.factor(yAll)
d <- data.frame(y=yAll, x=xAll)
Nun zur Auswertung mit einer einfachen logistischen Regression. Ab hier sollten Sie die Ausführungen wieder verstehen.
##
## Call:
## glm(formula = y ~ x, family = binomial, data = d)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.7766 -1.0065 0.6799 0.8933 1.8827
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.9280 0.2310 -4.016 5.91e-05 ***
## x 0.8047 0.1403 5.737 9.65e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 277.18 on 199 degrees of freedom
## Residual deviance: 237.29 on 198 degrees of freedom
## AIC: 241.29
##
## Number of Fisher Scoring iterations: 4
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) -1.3990912 -0.490046
## x 0.5396724 1.091546
Im summary-output sehen wir die geschätzten Koeffizienten. Die
modellierten log-odds gelten immer für die Gruppe der Zielgrösse, die
NICHT Referenzgruppe ist. In unserem Fall also für y=1
(also Erfolg
der Behandlung). Bei Dosis 0 sind die log-odds für Erfolg der
Behandlung ca. \(-0.93\) (siehe Intercept) mit einem
95%-Vertrauensintervall von \([-1.40; -0.49]\). Aus der Simulation
wissen wir, dass der wahre Wert \(\beta_0 = -1\) ist. D.h., unser
Schätzwert ist durchaus vernünftig. Wenn man x
um eine Einheit
erhöht, erhöhen sich die log-odds für Erfolg der Behandlung um etwa
plus \(0.80\) (95%-VI ist \([0.54; 1.09]\)). Aus der Simulation wissen
wir, dass der wahre Wert \(\beta_1 = 1\) ist. D.h., auch dieser
Schätzwert ist durchaus vernünftig. Beide Parameter sind signifikant
verschieden von null. Die Auswertung auf der Skala der log-odds ist
also sofort aus dem summary-output abzulesen und entspricht genau der
Interpretation bei einer linearen Regression.
Etwas schwieriger wird es, wenn wir die Ergebnisse auf der Skala der
odds oder der Wahrscheinlichkeit interpretieren wollen. Eine wichige
Grösse ist dabei das odds-ratio: Wenn x
um eine Einheit erhöht wird,
dann erhöhen sich die odds (für Erfolg) um den Faktor
\(\exp(\beta_1) = \exp(0.80) \approx 2.23\). Diese Zahl wird das
odds-ratio genannt. Ein Vertrauensintervall für das odds-ratio
erhalten wir, indem wir die Funktion \(\exp\) auf die Grenzen des
Vertrauensintervalls von \(\beta_1\) anwenden: \([\exp(0.54); \exp(1.09)] \approx [1.72; 2.97]\).
Auf der Skala der Wahrscheinlichkeit wird die Interpratation noch
schwieriger. Wenn man x
um eine Einheit erhöht, ändert sich die
Wahrscheinlichkeit um unterschiedliche Werte, je nachdem, bei welchem
Wert von x
man startet. Meistens wird daher die “Effektstärke” der
erklärenden Variable mit dem odds-ratio (inkl. Vertrauensintervall)
kommuniziert.
Die Veränderung der Erfolgswahrscheinlichkeit bzgl. der erklärenden Variable lässt sich also nicht einfach quantifizieren. Für einzelne vorgegebene Werte der erklärenden Variable lässt sich allerdings ohne Probleme die durch unser Modell vorhergesagte Wahrscheinlichkeit berechnen. Welche Erfolgswahrscheinlichkeit sagt unser Modell z.B. bei einer Dosis von genau \(x=1\) vorher ?
Zunächst berechnen wir das Ergebnis an Hand der Zahlen im summary output. Wir wissen, dass \(\widehat{\beta}_0 \approx -0.93\) und \(\widehat{\beta}_1 \approx 0.80\). Also sagt unser Modell für eine Dosis von \(x=1\) den Wert \(lo = -0.93 + 1 \cdot 0.8 = -0.13\) vorher. Entsprechend sind die odds \(\exp(-0.13) \approx 0.88\) und die Wahrscheinlichkeit \(\frac{\exp(-0.13)}{1+\exp(-0.13)} \approx 0.47\) gemäss dem geschätzten Modell.
Einfacher geht das mit der Funktion predict
. Vorhersagen mit
dieser Funktion sind möglich entweder auf der Ebene der Link Funktion
(hier log-odds; type = "link"
) oder auf der Ebene des Parameters
(hier Wahrscheinlichkeit; type = "response"
). Zudem kann man mit
dieser Funktion noch den Standard Error des vorhergesagten Wertes
berechnen lassen.
datNew <- data.frame(x=1)
## vorhergesagte log-odds
loPred <- predict(fm, newdata = datNew, type = "link", se.fit = TRUE)
## vorhergesagte Wa.
pPred <- predict(fm, newdata = datNew, type = "response", se.fit = TRUE)
oddsPred1 <- pPred$fit/(1-pPred$fit) ## Variante 1
oddsPred2 <- exp(loPred$fit) ## Variante 2
pPred
## $fit
## 1
## 0.4692142
##
## $se.fit
## 1
## 0.03976985
##
## $residual.scale
## [1] 1
Die vorhergesagte Wahrscheinlichkeit ist, wie bei der Berechnung von
Hand, ca. \(0.47\) (mit einem Standardfehler von ca. \(0.04\)). Daraus
können die odds und die log-odds berechnet werden (entweder manuell
mit pPred
oder direkt mit der Funktion predict
; beide Wege führen
zu demselben Ergebnis)
Residuenanalyse bei Logistischer Regression ist wesentlich umstrittener als bei der Linearen Regression und wird hier nicht behandelt.