Warum wird die logistische Regression instabil, wenn die Klassen gut voneinander getrennt sind?

34

Warum wird die logistische Regression instabil, wenn die Klassen gut voneinander getrennt sind? Was bedeuten gut getrennte Klassen? Ich würde mich sehr freuen, wenn sich jemand mit einem Beispiel erklären kann.

Jane Dow
quelle
4
Ich erkläre im Detail mit einem Beweis hier: stats.stackexchange.com/questions/224863/…
Matthew Drury
2
Und ich hatte auch eine Demo, um die Frage zu erklären: stats.stackexchange.com/questions/239928/…
Haitao Du

Antworten:

31

Es ist nicht richtig, dass die logistische Regression an sich instabil wird, wenn es zu einer Trennung kommt. Trennung bedeutet, dass es einige Variablen gibt, die sehr gute Prädiktoren sind, was gut ist, oder Trennung kann ein Artefakt von zu wenigen Beobachtungen / zu vielen Variablen sein. In diesem Fall besteht die Lösung möglicherweise darin, mehr Daten abzurufen. Die Trennung selbst ist also nur ein Symptom und an sich kein Problem.

Es gibt also wirklich verschiedene Fälle, die behandelt werden müssen. Was ist das Ziel der Analyse? Wenn das Endergebnis der Analyse eine Klassifizierung von Fällen ist, ist die Trennung überhaupt kein Problem, was wirklich bedeutet, dass es sehr gute Variablen gibt, die eine sehr gute Klassifizierung ergeben. Wenn das Ziel jedoch die Risikoabschätzung ist, benötigen wir die Parameterschätzungen, und bei Trennung existieren die üblichen mle-Schätzungen (maximale Wahrscheinlichkeit) nicht. Also müssen wir vielleicht die Schätzmethode ändern. Es gibt mehrere Vorschläge in der Literatur, ich werde darauf zurückkommen.

Dann gibt es (wie oben gesagt) zwei verschiedene mögliche Ursachen für die Trennung. In der Gesamtbevölkerung kann es zu einer Trennung kommen, oder die Trennung kann durch zu wenige beobachtete Fälle / zu viele Variablen verursacht werden.

Was bei der Trennung zusammenbricht, ist das Verfahren zur Abschätzung der maximalen Wahrscheinlichkeit. Die mle-Parameterschätzungen (oder zumindest einige von ihnen) werden unendlich. Ich sagte in der ersten Version dieser Antwort, dass dies leicht gelöst werden kann, vielleicht durch Bootstrapping, aber das funktioniert nicht, da in jedem Bootstrap-Resample eine Trennung erfolgt, zumindest in den üblichen Fällen durch Bootstrapping. Aber die logistische Regression ist immer noch ein gültiges Modell, aber wir brauchen ein anderes Schätzverfahren. Einige Vorschläge waren:

  1. Regularisierung, wie Ridge oder Lasso, kann mit Bootstrap kombiniert werden.
  2. exakte bedingte logistische Regression
  3. Permutationstests finden Sie unter https://www.ncbi.nlm.nih.gov/pubmed/15515134
  4. Firths Bias-reduziertes Schätzverfahren, siehe Logistisches Regressionsmodell konvergiert nicht
  5. sicherlich andere ...

Wenn Sie R verwenden, gibt es auf CRAN ein Paket SafeBinaryRegression, das bei der Diagnose von Trennungsproblemen hilft und mithilfe mathematischer Optimierungsmethoden sicherstellt, ob eine Trennung oder eine Quasentrennung vorliegt! Im Folgenden werde ich ein simuliertes Beispiel mit diesem Paket und dem elrmPaket für die ungefähre bedingte logistische Regression geben.

Zunächst ein einfaches Beispiel mit dem safeBinaryRegressionPaket. Dieses Paket definiert die glmFunktion lediglich neu und überlastet sie mit einem Separationstest unter Verwendung linearer Programmiermethoden. Wenn es eine Trennung erkennt, wird es mit einer Fehlerbedingung beendet, die angibt, dass das mle nicht existiert. Ansonsten läuft einfach die gewöhnliche glmFunktion ab stats. Das Beispiel stammt von den Hilfeseiten:

library(safeBinaryRegression)   # Some testing of that package,
                                # based on its examples
# complete separation:
x  <-  c(-2, -1, 1, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)
# Quasicomplete separation:
x  <-  c(-2, 0, 0, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)

Die Ausgabe vom Ausführen:

> # complete separation:
> x  <-  c(-2, -1, 1, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: (Intercept), x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
 -9.031e-08    2.314e+01  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 3.567e-10    AIC: 4
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 
> # Quasicomplete separation:
> x  <-  c(-2, 0, 0, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
  5.009e-17    9.783e+00  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 2.773    AIC: 6.773

Wir simulieren nun ein Modell, das durch ein logistisches Modell genau angenähert werden kann, mit der Ausnahme, dass die Ereigniswahrscheinlichkeit über einem bestimmten Grenzwert genau 1,0 beträgt. Denken Sie an ein Bioassay-Problem, aber über dem Grenzwert tötet das Gift immer:

pl  <-  function(a, b, x) 1/(1+exp(-a-b*x))
a  <-  0
b  <-  1.5
x_cutoff  <-  uniroot(function(x) pl(0,1.5,x)-0.98,lower=1,upper=3.5)$root
### circa 2.6
pltrue  <-  function(a, b, x) ifelse(x < x_cutoff, pl(a, b, x), 1.0)

x <- -3:3

### Let us simulate many times from this model,  and try to estimate it
### with safeBinaryRegression::glm  That way we can estimate the probability
### of separation from this model

set.seed(31415926)  ### May I have a large container of coffee 
replications  <-  1000
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else good <- good+1
}
P_separation  <-  err/replications
P_separation

Wenn wir diesen Code ausführen, schätzen wir die Wahrscheinlichkeit der Trennung auf 0,759. Führen Sie den Code selbst aus, es ist schnell!

Dann erweitern wir diesen Code, um verschiedene Schätzungsverfahren, eine mle und eine ungefähre bedingte logistische Regression von elrm auszuprobieren. Das Ausführen dieser Simulation dauert auf meinem Computer ungefähr 40 Minuten.

library(elrm)  # from CRAN
set.seed(31415926)  ### May I have a large container of coffee
replications  <-  1000
GOOD  <-  numeric(length=replications) ### will be set to one when MLE exists!
COEFS <- matrix(as.numeric(NA), replications, 2)
COEFS.elrm <- matrix(as.numeric(NA), replications, 2) # But we'll only use second col for x
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else{ good <- good+1
                                                     GOOD[i] <- 1 }
    # Using stats::glm
    mod  <-  stats::glm(y~x, family=binomial)
    COEFS[i, ]  <-  coef(mod)
    # Using elrm:
    DATASET  <-  data.frame(x=x, y=y, n=1)
    mod.elrm  <-  elrm(y/n ~ x,  interest= ~ x -1, r=4, iter=10000, burnIn=1000,
                       dataset=DATASET)
    COEFS.elrm[i, 2 ]  <-  mod.erlm$coeffs       
}
### Now we can compare coefficient estimates of x,
###  when there are separation,  and when not:

non  <-  which(GOOD==1)
cof.mle.non  <-  COEFS[non, 2, drop=TRUE]
cof.mle.sep  <-  COEFS[-non, 2, drop=TRUE]
cof.elrm.non  <-  COEFS.elrm[non, 2, drop=TRUE]
cof.elrm.sep  <-  COEFS.elrm[-non, 2, drop=TRUE]

Jetzt wollen wir die Ergebnisse grafisch darstellen. Beachten Sie jedoch, dass ALLE bedingten Schätzungen gleich sind! Das ist wirklich seltsam und sollte einer Erklärung bedürfen ... Der gemeinsame Wert ist 0.9523975. Zumindest erhielten wir jedoch endliche Schätzungen mit Konfidenzintervallen, die den wahren Wert enthalten (hier nicht gezeigt). Daher werde ich nur in den Fällen ohne Trennung ein Histogramm der einzelnen Schätzungen anzeigen:

hist(cof.mle.non, prob=TRUE)

[Histogramm simulierter Parameterschätzungen [1]

Bemerkenswert ist, dass alle Schätzungen unter dem wahren Wert von 1,5 liegen. Das kann damit zu tun haben, dass wir nach einem modifizierten Modell simulieren, Nachforschungen anstellen müssen.

kjetil b halvorsen
quelle
1
(+1) Es ist jedoch ziemlich stark anzumerken, dass wir ein anderes Schätzverfahren als die maximale Wahrscheinlichkeit benötigen . Unendliche Quoten und Quotenverhältnisse können sinnvolle Punktschätzungen sein. Oft genug besteht das Problem, das durch die Trennung verursacht wird, darin, nur gute Intervallschätzungen zu erhalten.
Scortchi
@kjetilbhalvorsen Entschuldigung, einen alten Thread wiederzubeleben, aber ich habe mich gefragt, ob Ihnen ein ähnliches Paket in Python bekannt ist?
Meep
Entschuldigung, aber ich weiß nicht über Python. Es sollte jedoch möglich sein, R aus Python heraus auszuführen.
kjetil b halvorsen
25

Hier gibt es gute Antworten von @ sean501 und @ kjetilbhalvorsen. Sie haben nach einem Beispiel gefragt. Betrachten Sie die folgende Abbildung. Möglicherweise stoßen Sie auf eine Situation, in der der Datenerzeugungsprozess dem in Fenster A dargestellten entspricht . In diesem Fall ist es durchaus möglich, dass die von Ihnen tatsächlich erfassten Daten denen in Panel B entsprechen . Wenn Sie nun Daten verwenden, um ein statistisches Modell zu erstellen, besteht die Idee darin, den tatsächlichen Datenerzeugungsprozess wiederherzustellen oder zumindest eine Annäherung zu finden, die ziemlich genau ist. Die Frage ist also, ob die Anpassung einer logistischen Regression an die Daten in B ein Modell ergibt, das sich der blauen Linie in A annähert. Wenn Sie sich Panel C ansehenWenn Sie sehen, dass die graue Linie die Daten besser approximiert als die wahre Funktion, zieht es die logistische Regression bei der Suche nach der besten Anpassung vor, die graue Linie anstelle der blauen Linie zurückzugeben. Hier hört es jedoch nicht auf. Blick auf Tafel DDie schwarze Linie approximiert die Daten besser als die graue - in der Tat ist es die beste Anpassung, die möglicherweise auftreten könnte. Das ist also die Linie, die das logistische Regressionsmodell verfolgt. Es entspricht einem Schnittpunkt von negativer Unendlichkeit und einer Steigung von Unendlichkeit. Das ist natürlich sehr weit von der Wahrheit entfernt, die Sie sich erholen wollen. Eine vollständige Trennung kann auch Probleme bei der Berechnung der p-Werte für Ihre Variablen verursachen, die standardmäßig mit der logistischen Regressionsausgabe geliefert werden (die Erklärung dort ist etwas anders und komplizierter). Wenn Sie versuchen, die Anpassung hier mit anderen Versuchen zu kombinieren, beispielsweise mit einer Metaanalyse, werden die anderen Ergebnisse nur ungenauer.

Bildbeschreibung hier eingeben

gung - Wiedereinsetzung von Monica
quelle
1
(+1) Dies ist eine sehr hilfreiche Illustration des Problems.
mkt - Wiedereinsetzung von Monica
Ein interessanter Aspekt, den Ihr Diagramm zeigt, ist, dass Sie die Stichprobe idealerweise aus dem "x-Raum" erhalten möchten, der zu 50-50 Wahrscheinlichkeiten führt (z. B. Punkte im Bereich 12 <x <15). Tatsächlich denke ich, dass Sie wahrscheinlich mehr Daten aus dieser mittleren Region (10 <x <17) in einem realen Szenario sammeln möchten, das dieses Ergebnis liefert.
Wahrscheinlichkeitslogik
@ probabilityislogic, das stimmt. Die meisten Informationen über die Beziehung sind in den Daten aus der mittleren Region enthalten.
gung - Wiedereinsetzung von Monica
10

Dies bedeutet, dass es eine Hyperebene gibt, bei der auf der einen Seite alle positiven Punkte und auf der anderen Seite alle negativen Punkte vorhanden sind. Die Maximum-Likelihood-Lösung ist dann auf der einen Seite flach 1 und auf der anderen Seite flach 0, was mit der logistischen Funktion erreicht wird, indem die Koeffizienten auf unendlich gesetzt werden.

seanv507
quelle
6

Was Sie "Trennung" nennen (nicht "Trennung"), deckt zwei verschiedene Situationen ab, die dasselbe Problem verursachen - das ich jedoch nicht als "Instabilität" bezeichnen würde, wie Sie es tun.

Ein Beispiel: Überleben auf der Titanic

  • DV(0,1)SV

    SVDV01

  • SVDV

    Dies wäre der Fall, wenn alle Passagiere der ersten Klasse auf der Titanic das Wrack überlebt hätten und keiner der Passagiere der zweiten Klasse überlebt hätte.

  • SVDV=0DV=1

    SVDV=1DV=0

    SVDV=0DV=1

DVSVSV

Warum ist die logistische Regression in diesen Fällen "instabil"?

Dies wird in Rainey 2016 und Zorn 2005 gut erklärt .

  • DV1SV=1DV0SV=0

    SV=1

    01SVDV

  • 01DVSV=0SV=1

In beiden Fällen kann die Wahrscheinlichkeitsfunktion Ihres Modells keine maximale Wahrscheinlichkeitsschätzung finden: Sie kann nur eine Annäherung an diesen Wert finden, wenn Sie sich ihm asymptotisch nähern.

Was Sie als "Instabilität" bezeichnen, ist die Tatsache, dass es bei vollständiger oder quasi vollständiger Trennung keine endliche Wahrscheinlichkeit gibt, dass das logistische Modell diese erreicht. Ich würde diesen Begriff jedoch nicht verwenden: Die Wahrscheinlichkeitsfunktion ist tatsächlich ziemlich "stabil" (monoton) in ihrer Zuordnung von Koeffizientenwerten zu Unendlich.


Hinweis: Mein Beispiel ist fiktiv. Das Überleben auf der Titanic beschränkte sich nicht nur auf die Mitgliedschaft in der Passagierklasse. Siehe Hall (1986) .

Fr.
quelle