La regressione logistica in R ha provocato una separazione perfetta (fenomeno di Hauck-Donner). E adesso?


56

Sto cercando di prevedere un risultato binario usando 50 variabili esplicative continue (l'intervallo della maggior parte delle variabili va da a ). Il mio set di dati ha quasi 24.000 righe. Quando corro in R, ottengo:glm

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

Ho letto le altre risposte che suggeriscono che potrebbe verificarsi una separazione perfetta, ma sono fiducioso che non sia il caso nei miei dati (anche se potrebbe esistere una separazione quasi completa; come posso testare per vedere se è così?) . Se rimuovo alcune variabili, l'errore "non converge" potrebbe scomparire. Ma non è sempre quello che succede.

Ho provato a usare le stesse variabili in una bayesglmfunzione e ho ottenuto gli stessi errori.

Quali passi faresti per capire esattamente cosa sta succedendo qui? Come capisci quali variabili stanno causando i problemi?


5
Perché sei sicuro che la separazione non si verifichi? Nella bayesglmcarta , sostengono che la separazione è "un problema comune, anche quando la dimensione del campione è grande e il numero di predittori è piccolo"
David J. Harris

2
Un altro pensiero: bayesglmcerca di evitare la separazione aggiungendo un precedente, ma con 24.000 righe, il precedente viene probabilmente sommerso dalla probabilità. Prova a restringere prior.scale, possibilmente di una grande quantità. Considera anche di aumentare i gradi di libertà del priore, che aiuteranno a escludere grandi valori associati alla separazione.
David J. Harris,

Grazie per i suggerimenti David. Non credo che si stia verificando la separazione perché quando ordino ciascuna delle variabili esplicative, la variabile dipendente non è sempre vera o falsa per valori alti o bassi delle variabili esplicative. A meno che ciò non sia considerato separazione: la variabile dipendente è vera per tutti x7> 32 ma x7 è solo> 32 in 10 casi. C'è un modo per verificare la separazione al di fuori di una regressione logistica? O vedi quale variabile sta causando la separazione? Ho provato i tuoi suggerimenti bayesglm (ho impostato prior.scale su 1 e prior.df su Inf) e ho ancora ricevuto gli errori Hauck Donner.
Dcook,


"Come capisci quali variabili stanno causando i problemi?" La ricerca binaria è sempre un buon fallback. Hai solo 50 variabili, quindi se è perfettamente separato da una singola variabile, 6 iterazioni troveranno il colpevole. Se sono due variabili, al massimo 49 + 6 = 55 iterazioni lo troveranno, nel peggiore dei casi.
smci,

Risposte:


55

R50

Puoi facilmente verificare se le tue classi sono perfettamente separate nel tuo spazio di progettazione. Questo si riduce alla risoluzione di un problema di programmazione lineare. Un'implementazione R di questo "test" (non un test nel senso statistico del termine) è implementata nel pacchetto safeBinaryRegression .

Se si scopre che la separazione è davvero il problema, e se sei interessato solo a un semplice uso vanilla di glm (ad esempio glm non è chiamato da una funzione di livello superiore ma da te), allora c'è un'implementazione R di un algoritmo che modifica leggermente quello classico per renderlo "robusto" contro la separazione. È implementato nel pacchetto hlr


4
Risposta molto interessante e utile! Dovrò esaminare quei pacchetti. (+1)
Peter Flom - Ripristina Monica

1
FWIW ecco una descrizione di un altro algoritmo robusto: win-vector.com/blog/2012/10/rudie-cant-fail-if-majorized
Alex

2
@Alex: grazie per il link. Se glm non sta convergendo a causa di avviamenti errati, posso vedere come questo metodo aiuterà in questo. D'altra parte, se il problema è causato da una separazione perfetta, non mi è chiaro come l'idea di MM possa affrontarlo. Mi chiedevo se potessi commentare questo (alla fine posso pubblicare questo come una domanda separata).
user603

Eccellente (+1)! Anch'io dovrò esaminare quei pacchetti.
jbowman,

1
Grazie per la risposta @ user603! Ho usato safeBinaryRegression e la separazione si stava effettivamente verificando con diverse variabili. Quindi ho provato a usare MEL nel pacchetto hlr per creare un modello robusto per questa separazione. Tuttavia, i coefficienti sono enormi (come lo sarebbero quando la separazione avviene in glm normale) e qui ci sono i numeri df e devianza: Gradi di libertà: 19112 Totale (cioè Null); 19063 Devianza residua nulla: 24990 Devianza residua: 626000 AIC: 626000 Pensi che abbia fatto qualcosa di sbagliato?
Dcook,
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.