Come affrontare la perfetta separazione nella regressione logistica?


163

Se hai una variabile che separa perfettamente gli zero e quelli nella variabile target, R produrrà il seguente messaggio di avviso di "separazione perfetta o quasi perfetta":

Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 

Otteniamo ancora il modello ma le stime dei coefficienti sono gonfiate.

Come gestisci questo in pratica?



1
domanda correlata e demo sulla regolarizzazione qui
Haitao Du,

Risposte:


100

Una soluzione a questo è utilizzare una forma di regressione penalizzata. In realtà, questo è il motivo originale per cui alcune delle forme di regressione penalizzate sono state sviluppate (anche se si sono rivelate avere altre proprietà interessanti.

Installa e carica il pacchetto glmnet in R e sei quasi sempre pronto. Uno degli aspetti meno intuitivi di glmnet è che puoi alimentare solo le matrici, non le formule a cui siamo abituati. Tuttavia, puoi guardare model.matrix e simili per costruire questa matrice da un data.frame e una formula ...

Ora, quando ti aspetti che questa separazione perfetta non sia solo un sottoprodotto del tuo campione, ma potrebbe essere vero nella popolazione, in particolare non vuoi gestirlo: usa questa variabile di separazione semplicemente come unico predittore per il tuo risultato, non impiegando un modello di qualsiasi tipo.


20
È inoltre possibile utilizzare un'interfaccia formula per glmnet tramite il pacchetto caret.
Zach,

"Ora, quando ti aspetti ..." Domanda al riguardo. Ho uno studio caso / controllo che esamina la relazione con il microbioma. Abbiamo anche un trattamento che si trova quasi solo tra i casi. Tuttavia, riteniamo che il trattamento potrebbe anche influenzare il microbioma. È un esempio del tuo avvertimento? Ipoteticamente potremmo trovare un sacco di più casi che non usano il trattamento se ci provassimo, ma abbiamo quello che abbiamo.
abalter

142

Hai diverse opzioni:

  1. Rimuovi parte del pregiudizio.

    (a) Penalizzando la probabilità secondo il suggerimento di @ Nick. Il pacchetto logistf in R o l' FIRTHopzione in SAS PROC LOGISTICimplementano il metodo proposto in Firth (1993), "Riduzione del bias delle stime di massima verosimiglianza", Biometrika , 80 , 1 .; che rimuove il bias del primo ordine dalle stime di massima verosimiglianza. ( Qui @Gavin consiglia ilbrglm pacchetto, che non ho familiarità, ma ho capito che implementa un approccio simile per le funzioni di collegamento non canoniche, ad esempio probit.)

    (b) Utilizzando stime mediane imparziali nella regressione logistica condizionale esatta. Pacchetto elrm o logistiX in R, o la EXACTdichiarazione in SAS PROC LOGISTIC.

  2. Escludere i casi in cui si verifica la categoria predittore o il valore che causa la separazione. Questi potrebbero essere al di fuori del tuo ambito di applicazione; o degno di ulteriori, approfondite indagini. (Il pacchetto R safeBinaryRegression è utile per trovarli.)

  3. Ri-cast il modello. In genere questo è qualcosa che avresti fatto prima se ci avessi pensato, perché è troppo complesso per la dimensione del campione.

    (a) Rimuovere il predittore dal modello. Dicey, per le ragioni fornite da @Simon: "Stai rimuovendo il predittore che spiega meglio la risposta".

    (b) Comprimendo le categorie di predittori / binning i valori del predittore. Solo se questo ha senso.

    (c) Ri-esprimere il predittore come due (o più) fattori incrociati senza interazione. Solo se questo ha senso.

  4. 5212

  5. Fare niente. (Ma calcola gli intervalli di confidenza in base alle probabilità del profilo, poiché le stime di Wald dell'errore standard saranno gravemente sbagliate.) Un'opzione spesso trascurata. Se lo scopo del modello è solo quello di descrivere ciò che hai appreso sulle relazioni tra predittori e risposta, non c'è da vergognarsi nel citare un intervallo di confidenza per un rapporto di probabilità, diciamo, 2.3. (In effetti potrebbe sembrare difficile citare intervalli di confidenza basati su stime imparziali che escludono i rapporti di probabilità meglio supportati dai dati.) I problemi sorgono quando si tenta di prevedere utilizzando le stime puntuali e il predittore su cui si verifica la separazione inonda gli altri.

  6. Utilizzare un modello di regressione logistica nascosto, come descritto in Rousseeuw & Christmann (2003), "Robustezza contro separazione e valori anomali nella regressione logistica", Statistiche computazionali e analisi dei dati , 43 , 3, e implementato nel pacchetto R hlr . (@ user603 suggerisce questo. ) Non ho letto il documento, ma dicono in astratto "viene proposto un modello leggermente più generale in base al quale la risposta osservata è fortemente correlata ma non uguale alla risposta vera non osservabile", che suggerisce di a me potrebbe non essere una buona idea usare il metodo a meno che non sembri plausibile.

  7. "Cambia alcune osservazioni selezionate casualmente da 1 a 0 o da 0 a 1 tra le variabili che mostrano una separazione completa": il commento di RobertF . Questo suggerimento sembra derivare dal considerare la separazione come un problema di per sé piuttosto che un sintomo di una scarsità di informazioni nei dati che potrebbe portarti a preferire altri metodi alla stima della massima verosimiglianza o a limitare le inferenze a quelle che puoi fare con ragionevole precisione - approcci che hanno i loro meriti e non sono solo "correzioni" per la separazione. (A parte il fatto che è spudoratamente ad hoc , è sgradevole per la maggior parte degli analisti che pongono la stessa domanda sugli stessi dati, facendo le stesse ipotesi, dovrebbero dare risposte diverse a causa del risultato di un lancio di monete o altro.)


1
@Scortchi C'è un'altra opzione (eretica). Che dire di cambiare alcune osservazioni selezionate casualmente da 1 a 0 o da 0 a 1 tra le variabili che mostrano una separazione completa?
RobertF,

@RobertF: grazie! Non ci avevo pensato - se hai qualche riferimento sulla sua performance te ne sarei grato. Hai incontrato persone che lo usano in pratica?
Scortchi

@Scortchi - No, ci sono riferimenti ai ricercatori che aggiungono dati artificiali per eliminare la separazione completa, ma non ho trovato articoli sulla modifica selettiva dei dati. Non ho idea di quanto sia efficace questo metodo.
RobertF,

1
@tatami: Non tutti (molti?) programmi avvertono della separazione in sé, che può essere difficile da individuare quando si trova su una combinazione lineare di più variabili, ma sul fallimento della convergenza e / o valori adattati vicini a nulla o uno - controlla sempre questi.
Scortchi

2
@Scortchi: riassunto molto bello nella tua risposta. Personalmente preferisco l'approccio bayesiano, ma vale la pena menzionare la bella analisi del fenomeno generale da un punto di vista frequentista in projecteuclid.org/euclid.ejs/1239716414 . L'autore offre alcuni intervalli di confidenza unilaterali che possono essere utilizzati anche in presenza di una completa separazione nella regressione logistica.
Ciano,

55

Questa è un'espansione delle risposte di Scortchi e Manoel, ma dal momento che sembra che tu abbia usato il RI pensavo che avrei fornito del codice. :)

Credo che la soluzione più semplice e diretta al tuo problema sia quella di utilizzare un'analisi bayesiana con presupposti non informativi come proposto da Gelman et al (2008). Come menziona Scortchi, Gelman consiglia di mettere un Cauchy prima con mediana 0,0 e scala 2,5 su ciascun coefficiente (normalizzato per avere media 0,0 e una DS di 0,5). Ciò regolarizzerà i coefficienti e li tirerà leggermente verso lo zero. In questo caso è esattamente quello che vuoi. A causa delle code molto larghe, il Cauchy consente ancora grandi coefficienti (al contrario del normale dalla coda corta), di Gelman:

inserisci qui la descrizione dell'immagine

Come eseguire questa analisi? Usa la bayesglmfunzione nel pacchetto arm che implementa questa analisi!

library(arm)

set.seed(123456)
# Faking some data where x1 is unrelated to y
# while x2 perfectly separates y.
d <- data.frame(y  =  c(0,0,0,0, 0, 1,1,1,1,1),
                x1 = rnorm(10),
                x2 = sort(rnorm(10)))

fit <- glm(y ~ x1 + x2, data=d, family="binomial")

## Warning message:
## glm.fit: fitted probabilities numerically 0 or 1 occurred 

summary(fit)
## Call:
## glm(formula = y ~ x1 + x2, family = "binomial", data = d)
##
## Deviance Residuals: 
##       Min          1Q      Median          3Q         Max  
## -1.114e-05  -2.110e-08   0.000e+00   2.110e-08   1.325e-05  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -18.528  75938.934       0        1
## x1              -4.837  76469.100       0        1
## x2              81.689 165617.221       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.3863e+01  on 9  degrees of freedom
## Residual deviance: 3.3646e-10  on 7  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 25

Non funziona così bene ... Ora la versione bayesiana:

fit <- bayesglm(y ~ x1 + x2, data=d, family="binomial")
display(fit)
## bayesglm(formula = y ~ x1 + x2, family = "binomial", data = d)
##             coef.est coef.se
## (Intercept) -1.10     1.37  
## x1          -0.05     0.79  
## x2           3.75     1.85  
## ---
## n = 10, k = 3
## residual deviance = 2.2, null deviance = 3.3 (difference = 1.1)

Super-semplice, no?

Riferimenti

Gelman et al (2008), "Una distribuzione precedente di default debolmente informativa per i modelli di regressione logistica e altri", Ann. Appl. Stat., 2, 4 http://projecteuclid.org/euclid.aoas/1231424214


6
No. Troppo semplice. Puoi spiegare cosa hai appena fatto? Qual è il priore che bayesglmusa? Se la stima ML è equivalente a Bayesian con un precedente piatto, in che modo i priori non informativi aiutano qui?
StasK,

5
Aggiunte alcune informazioni aggiuntive! Il priore è vago ma non piatto. Ha una certa influenza in quanto regolarizza le stime e le spinge leggermente verso 0,0, che è quello che credo tu voglia in questo caso.
Rasmus Bååth,

> m = bayesglm (match ~., family = binomial (link = 'logit'), data = df) Messaggio di avvertimento: probabilità adattate numericamente 0 o 1 verificatesi Non va bene!
Chris,

Per iniziare, prova una regolarizzazione leggermente più forte aumentando le prior.dfimpostazioni predefinite 1.0e / o diminuendo quelle prior.scalepredefinite 2.5, forse inizia a provare:m=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
Rasmus Bååth

1
Cosa facciamo esattamente quando aumentiamo prior.df nel modello. C'è un limite a quanto in alto vogliamo andare? La mia comprensione è che vincola il modello a consentire la convergenza con stime accurate di errore?
hamilthj,

7

Una delle spiegazioni più approfondite sulle questioni della "separazione quasi completa" nella massima probabilità è il documento di Paul Allison. Sta scrivendo sul software SAS, ma i problemi che affronta sono generalizzabili a qualsiasi software:

  • La separazione completa si verifica ogni volta che una funzione lineare di x può generare previsioni perfette di y

  • La separazione quasi completa si verifica quando (a) esiste un vettore coefficiente b tale che bxi ≥ 0 ogni volta che yi = 1 , e bxi ≤ 0 * ogni volta che ** yi = 0 e questa uguaglianza vale per almeno un caso in ciascuna categoria del variabile dipendente. In altre parole, nel caso più semplice, per qualsiasi variabile dicotomica indipendente in una regressione logistica, se nella tabella 2 × 2 è presente uno zero formato da quella variabile e dalla variabile dipendente, la stima ML per il coefficiente di regressione non esiste.

Allison discute molte delle soluzioni già menzionate tra cui la cancellazione di variabili problematiche, il collasso delle categorie, il non fare nulla, l'utilizzo della regressione logistica esatta , la stima bayesiana e la stima della massima probabilità penalizzata.

http://www2.sas.com/proceedings/forum2008/360-2008.pdf


3

Per i modelli logistici di inferenza, è importante sottolineare prima che non ci sono errori qui. In warningin ti sta informando correttamente che lo stimatore della massima verosimiglianza si trova al limite dello spazio dei parametri. Il rapporto di probabilità di

Con i dati generati lungo le linee di

x <- seq(-3, 3, by=0.1)
y <- x > 0
summary(glm(y ~ x, family=binomial))

Viene emesso un avviso:

Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

che ovviamente riflette la dipendenza che è integrata in questi dati.

In R il test Wald si trova con summary.glmo con waldtestnel lmtestpacchetto. Il test del rapporto di verosimiglianza viene eseguito con anovao con lrtestinlmtest confezione. In entrambi i casi, la matrice di informazioni è valutata all'infinito e non è disponibile alcuna inferenza. Piuttosto, R non produce in uscita, ma non ci si può fidare. L'inferenza che tipicamente R produce in questi casi ha valori di p molto vicini a uno. Questo perché la perdita di precisione in sala operatoria è minore rispetto alla perdita di precisione nella matrice varianza-covarianza.

Alcune soluzioni descritte qui:

Utilizzare uno stimatore in un passaggio,

Esistono molte teorie a supporto della bassa propensione, efficienza e generalizzabilità degli stimatori a un passo. È facile specificare uno stimatore one-step in R e i risultati sono in genere molto favorevoli per la previsione e l'inferenza. E questo modello non divergerà mai, perché l'iteratore (Newton-Raphson) semplicemente non ha la possibilità di farlo!

fit.1s <- glm(y ~ x, family=binomial, control=glm.control(maxit=1))
summary(fit.1s)

dà:

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.03987    0.29569  -0.135    0.893    
x            1.19604    0.16794   7.122 1.07e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Quindi puoi vedere che le previsioni riflettono la direzione del trend. E l'inferenza è altamente suggestiva delle tendenze che crediamo essere vere.

inserisci qui la descrizione dell'immagine

eseguire un test del punteggio,

La statistica del punteggio (o Rao) differisce dal rapporto di probabilità e dalle statistiche calve. Non richiede una valutazione della varianza secondo l'ipotesi alternativa. Adattiamo il modello al valore null:

mm <- model.matrix( ~ x)
fit0 <- glm(y ~ 1, family=binomial)
pred0 <- predict(fit0, type='response')
inf.null <- t(mm) %*% diag(binomial()$variance(mu=pred0)) %*% mm
sc.null <- t(mm) %*% c(y - pred0)
score.stat <- t(sc.null) %*% solve(inf.null) %*% sc.null ## compare to chisq
pchisq(score.stat, 1, lower.tail=F)

χ2

> pchisq(scstat, df=1, lower.tail=F)
             [,1]
[1,] 1.343494e-11

In entrambi i casi hai inferenza per un OR di infinito.

e utilizzare stime imparziali mediane per un intervallo di confidenza.

È possibile produrre un IC al 95% imparziale mediano e non singolare per il rapporto di probabilità infinito utilizzando la stima imparziale mediana. Il pacchetto epitoolsin R può fare questo. E faccio un esempio di implementazione di questo stimatore qui: intervallo di confidenza per il campionamento di Bernoulli


2
Questo è fantastico, ma ho alcuni cavilli, ovviamente: (1) Il test del rapporto di verosimiglianza non usa la matrice delle informazioni; è solo il test Wald che lo fa e che fallisce catastroficamente in presenza di separazione. (2) Non ho alcuna familiarità con gli stimatori a un passo, ma la stima della pendenza qui sembra assurdamente bassa. (3) Un intervallo di confidenza non è mediano-imparziale. Quello a cui ti colleghi in quella sezione è l'intervallo di confidenza mid-p. (4) È possibile ottenere intervalli di confidenza invertendo il test LR o il punteggio. ...
Scortchi

... (5) È possibile eseguire il test del punteggio in R dando l'argomento test="Rao"alla anovafunzione. (Bene, le ultime due sono note, non cavilli.)
Scortchi

@scortchi buono a sapersi anova ha test di punteggio predefiniti! Forse un'implementazione manuale è utile. Gli IC non sono imparziali mediani, ma gli IC per lo stimatore imparziale mediano forniscono un'inferenza coerente per i parametri limite. La metà p è un tale stimatore. La p può essere trasformata in un odds ratio b / c è invariante alle trasformazioni uno a uno. Il test LR è coerente per i parametri limite?
AdamO

Solo l'ipotesi nulla non deve contenere parametri a un limite per il teorema di Wilks da applicare, sebbene i punteggi e i test LR siano approssimativi in ​​campioni finiti.
Scortchi

2

Fai attenzione a questo messaggio di avviso di R. Dai un'occhiata a questo post di Andrew Gelman e vedrai che non è sempre un problema di perfetta separazione, ma a volte un bug conglm . Sembra che se i valori iniziali sono troppo lontani dalla stima della massima verosimiglianza, esplode. Quindi, controlla prima con altri software, come Stata.

Se hai davvero questo problema, puoi provare a usare la modellazione bayesiana, con priori informativi.

Ma in pratica mi libero dai predittori che causano il problema, perché non so come scegliere un precedente informativo. Ma immagino che ci sia un articolo di Gelman sull'uso di informazioni preliminari quando si ha questo problema di perfetto problema di separazione. Basta google. Forse dovresti provarlo.


8
Il problema con la rimozione dei predittori è che stai rimuovendo il predittore che spiega meglio la risposta, che di solito è ciò che stai cercando di fare! Direi che questo ha senso solo se hai adattato troppo il tuo modello, ad esempio adattando troppe interazioni complicate.
Simon Byrne,

4
Non un bug, ma un problema con le stime iniziali troppo lontane dall'MLE, che non sorgeranno se non si tenta di sceglierle da soli.
Scortchi

Lo capisco, ma penso che questo sia un bug nell'algoritmo.
Manoel Galdino,

5
Beh, non voglio cavillare sulla definizione di "bug". Ma il comportamento non è insondabile né risolvibile nella base R: non è necessario "verificare con altri software". Se vuoi affrontare automaticamente molti problemi di non convergenza, il glm2pacchetto implementa un controllo che la probabilità sta effettivamente aumentando ad ogni passo del punteggio e dimezza la dimensione del passo se non lo è.
Scortchi

3
Esiste (su CRAN) il pacchetto R safeBinaryRegression che è progettato per diagnosticare e risolvere tali problemi, usando metodi di ottimizzazione per verificare con certezza se c'è separazione o quasiseparation. Provalo!
kjetil b halvorsen,

2

Non sono sicuro di essere d'accordo con le affermazioni nella tua domanda.

Penso che quel messaggio di avviso significhi, per alcuni X osservati livelli nei dati, la probabilità adattata è numericamente 0 o 1. In altre parole, alla risoluzione, mostra come 0 o 1.

Puoi correre predict(yourmodel,yourdata,type='response') e troverai 0 o / e 1 lì come probabilità prevista.

Di conseguenza, penso che sia giusto usare solo i risultati.


-1

Capisco che questo è un vecchio post, tuttavia continuerò a rispondere a questo dato che ho lottato giorni con esso e può aiutare gli altri.

La separazione completa si verifica quando le variabili selezionate per adattarsi al modello possono differenziare in modo molto preciso tra 0 e 1 o sì e no. Il nostro intero approccio alla scienza dei dati si basa sulla stima della probabilità, ma in questo caso fallisce.

Passaggi di rettifica: -

  1. Usa bayesglm () invece di glm (), nel caso in cui la varianza tra le variabili sia bassa

  2. A volte usare (maxit = "qualche valore numerico") insieme a bayesglm () può aiutare

3.Il terzo e più importante controllo per le variabili selezionate per l'adattamento del modello, deve esserci una variabile per cui la multi collinearità con la variabile Y (ritaglio) è molto alta, scartare quella variabile dal modello.

Come nel mio caso, disponevo di dati di abbandono delle telecomunicazioni per prevedere lo sfasamento dei dati di convalida. Avevo una variabile nei miei dati di allenamento che poteva differenziare molto tra il sì e il no. Dopo averlo lasciato cadere ho potuto ottenere il modello corretto. Inoltre puoi usare stepwise (fit) per rendere il tuo modello più preciso.


2
Non vedo che questa risposta aggiunge molto alla discussione. L'approccio bayesiano è ampiamente trattato nelle risposte precedenti, anche la rimozione di predittori "problematici" è già menzionata (e scoraggiata). La selezione graduale delle variabili è raramente un'ottima idea per quanto ne so.
einar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.