64 votos

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

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

Mensajes de advertencia:  
1: glm.fit: el algoritmo no convergió  
2: glm.fit: se produjeron probabilidades ajustadas numéricamente 0 o 1 

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 cuasi completa; ¿cómo puedo verificar si ese es el caso?). Si elimino algunas variables, es posible que desaparezca el error de "no convergió". Pero eso no siempre sucede.

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

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

7 votos

¿Por qué estás seguro de que no está ocurriendo separación? En el artículo bayesglm, 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"

2 votos

Otra idea: bayesglm intenta evitar la separación agregando un anterior, pero con 24,000 filas, es probable que el anterior esté siendo aplastado por la verosimilitud. Intente reducir prior.scale , posiblemente en gran medida. También considere aumentar los grados de libertad del anterior, lo que ayudará a descartar los valores grandes asociados con la separación.

0 votos

Gracias por las sugerencias David. No creo que haya separación porque cuando ordeno cada una de las variables explicativas, la variable dependiente no siempre es verdadera o falsa para valores altos o bajos de las variables explicativas. A menos que esto se considere separación: la variable dependiente es verdadera para todos los 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? Intenté tus sugerencias bayesglm (establecí prior.scale a 1 y prior.df a Inf) y aún así obtuve errores de Hauck Donner.

60voto

Patrick Puntos 183

Con un espacio de diseño tan grande ($\mathbb{R}^{50}$!), es posible lograr una separación perfecta sin tener separación en ninguna de las variables tomadas individualmente. Incluso respaldaría el comentario de David J. Harris al decir que esto es probable.

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

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

5 votos

¡Respuesta muy genial y útil! Tendré que investigar esos paquetes. (+1)

1 votos

Para lo que vale, aquí hay una descripción de otro algoritmo robusto: win-vector.com/blog/2012/10/rudie-cant-fail-if-majorized

2 votos

@Alex: gracias por el enlace. Si glm no está convergiendo 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 está claro para mí cómo la idea de MM abordaría eso. Me preguntaba si podrías comentar al respecto (eventualmente puedo publicar esto como una pregunta separada).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X