La regresión logística en R resultó en una separación perfecta (fenómeno de Hauck-Donner). ¿Ahora que?

56

Estoy tratando de predecir un resultado binario usando 50 variables explicativas continuas (el rango de la mayoría de las variables es a ). Mi conjunto de datos tiene casi 24,000 filas. Cuando corro en R, obtengo:glm

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

He leído las otras respuestas que sugieren que podría estar ocurriendo una separación perfecta, pero estoy seguro de que ese no es el caso en mis datos (aunque podría existir una separación casi completa; ¿cómo puedo probar para ver si ese es el caso?) . Si elimino algunas variables, el error "no convergió" podría desaparecer. Pero eso no siempre es lo que pasa.

Intenté usar las mismas variables en una bayesglmfunción y obtuve los mismos errores.

¿Qué pasos tomarías para descubrir exactamente qué está pasando aquí? ¿Cómo averiguar qué variables están causando los problemas?

Dcook
fuente
55
¿Por qué estás seguro de que no se produce la separación? En el bayesglmdocumento , argumentan que la separación es "un problema común, incluso cuando el tamaño de la muestra es grande y el número de predictores es pequeño"
David J. Harris
2
Otro pensamiento: bayesglmtrata de evitar la separación agregando un previo, pero con 24,000 filas, el anterior probablemente se ve inundado por la probabilidad. Intente reducir prior.scale, posiblemente en gran cantidad. También considere aumentar los grados de libertad del prior, lo que ayudará a descartar grandes valores asociados con la separación.
David J. Harris
Gracias por las sugerencias de David. No creo que se produzca la separación porque cuando clasifico cada una de las variables explicativas, la variable dependiente no siempre es verdadera o falsa para los valores altos o bajos de las variables explicativas. A menos que esto se considere separación: la variable dependiente es verdadera para todos x7> 32 pero x7 es solo> 32 en 10 casos. ¿Hay alguna manera de verificar la separación fuera de una regresión logística? ¿O ver qué variable está causando la separación? Probé sus sugerencias bayesglm (configuré prior.scale en 1 y prior.df en Inf) y aún obtuve los errores de Hauck Donner.
Dcook
1
preguntas
usuario603
"¿Cómo averiguar qué variables están causando los problemas?" La búsqueda binaria siempre es una buena alternativa. Solo tiene 50 variables, por lo que si está perfectamente separado por una variable individual, 6 iteraciones encontrarán al culpable. Si son dos variables, a lo sumo 49 + 6 = 55 iteraciones lo encontrarán, en el peor de los casos.
smci

Respuestas:

55

Con un espacio de diseño tan grande ( !) Es posible obtener una separación perfecta sin tener que separarlas en ninguna de las variables tomadas individualmente. Incluso apoyaría el comentario de David J. Harris al decir que esto es probable.R50

Puede probar fácilmente si sus clases están perfectamente separadas en su espacio de diseño. Esto se reduce a resolver un problema de programación lineal. Se implementa una implementación R de esta 'prueba' (no una prueba en el sentido estadístico del término) en el paquete safeBinaryRegression .

Si resulta que la separación es realmente el problema, y ​​si solo está interesado en un uso simple de glm (por ejemplo, glm no es llamado por una función de nivel superior sino por usted), entonces hay una implementación R de un algoritmo que modifica ligeramente el clásico para hacerlo 'robusto' contra la separación. Se implementa en el paquete hlr

usuario603
fuente
44
Muy buena y útil respuesta! Tendré que buscar en esos paquetes. (+1)
Peter Flom - Restablece a Monica
1
FWIW aquí es una descripción de otro algoritmo robusto: win-vector.com/blog/2012/10/rudie-cant-fail-if-majorized
Alex
2
@ Alex: gracias por el enlace. Si glm no converge debido a malos comienzos, entonces puedo ver cómo este método ayudará con eso. Por otro lado, si el problema es causado por una separación perfecta, no me queda claro cómo la idea de MM abordaría eso. Me preguntaba si podría comentar sobre esto (eventualmente puedo publicar esto como una pregunta separada).
user603
Excelente (+1)! Yo también tendré que buscar esos paquetes.
jbowman
1
Gracias por la respuesta @ user603! Usé safeBinaryRegression y la separación estaba ocurriendo con varias de las variables. Luego intenté usar MEL en el paquete hlr para construir un modelo robusto para esta separación. Sin embargo, los coeficientes son enormes (como lo serían cuando la separación ocurre en glm normal) y aquí están los números de df y desviación: Grados de libertad: 19112 Total (es decir, Nulo); 19063 Desviación nula residual: 24990 Desviación residual: 626000 AIC: 626000 ¿Crees que hice algo mal?
Dcook