La régression logistique en R a conduit à une séparation parfaite (phénomène de Hauck-Donner). Maintenant quoi?

56

Je suis en train de prédire un résultat binaire en utilisant 50 variables continues explicatives (la gamme de la plupart des variables est à ). Mon ensemble de données contient près de 24 000 lignes. Quand je cours en R, je reçois:glm

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

J'ai lu les autres réponses qui suggèrent une séparation parfaite, mais je suis convaincu que ce n'est pas le cas dans mes données (bien qu'une séparation quasi complète puisse exister, comment puis-je vérifier si c'est le cas?) . Si je supprime certaines variables, l'erreur "ne converge pas" risque de disparaître. Mais ce n'est pas toujours ce qui se passe.

J'ai essayé d'utiliser les mêmes variables dans une bayesglmfonction et j'ai eu les mêmes erreurs.

Quelles mesures prendriez-vous pour savoir exactement ce qui se passe ici? Comment déterminez-vous les variables à l'origine des problèmes?

Dcook
la source
5
Pourquoi êtes-vous convaincu que la séparation ne se produit pas? Dans l' bayesglmarticle , ils soutiennent que la séparation est "un problème commun, même lorsque la taille de l'échantillon est grande et que le nombre de prédicteurs est faible"
David J. Harris
2
Une autre pensée: bayesglmessaie d'éviter la séparation en ajoutant un avant, mais avec 24 000 lignes, le précédent est probablement submergé par la probabilité. Essayez de rétrécir prior.scale, peut-être beaucoup. Pensez également à augmenter les degrés de liberté des précédents, ce qui aidera à éliminer les grandes valeurs associées à la séparation.
David J. Harris
Merci pour les suggestions David. Je ne pense pas que la séparation se produise, car lorsque je trie chacune des variables explicatives, la variable dépendante n'est pas toujours vraie ou fausse pour les valeurs hautes ou basses des variables explicatives. À moins que cela ne soit considéré comme une séparation: la variable dépendante est vraie pour tous les x7> 32 mais x7 n'est que> 32 dans 10 cas. Existe-t-il un moyen de vérifier la séparation en dehors d'une régression logistique? Ou voir quelle variable est à l'origine de la séparation? J'ai essayé vos suggestions bayesglm (je mettais prior.scale à 1 et prior.df à Inf) et j'ai quand même eu les erreurs Hauck Donner.
Dcook
1
Questions
user603
"Comment déterminez-vous les variables qui causent les problèmes?" La recherche binaire est toujours une bonne solution de secours. Vous n'avez que 50 variables, donc si elle est parfaitement séparée par une variable individuelle, 6 itérations trouveront le coupable. S'il s'agit de deux variables, au plus 49 + 6 = 55 itérations le trouveront, dans le pire des cas.
smci

Réponses:

55

R50

Vous pouvez facilement tester si vos classes sont parfaitement séparées dans votre espace de conception. Cela revient à résoudre un problème de programmation linéaire. Une implémentation R de ce "test" (et non un test au sens statistique du terme) est implémentée dans le paquetage safeBinaryRegression .

S'il s'avère que la séparation est bien le problème, et si vous êtes uniquement intéressé par une utilisation simple et uniforme de glm (par exemple, glm n'est pas appelé par une fonction de niveau supérieur mais par vous), il existe alors une implémentation R d'un algorithme qui modifie légèrement le classique pour le rendre «robuste» contre la séparation. Il est implémenté dans le package hlr

utilisateur603
la source
4
Réponse très cool et utile! Je vais devoir regarder dans ces paquets. (+1)
Peter Flom - Rétablir Monica
1
FWIW voici une description d'un autre algorithme robuste: win-vector.com/blog/2012/10/rudie-cant-fail-if-majorized
Alex
2
@ Alex: merci pour le lien. Si glm ne converge pas à cause de mauvais départs, je peux voir en quoi cette méthode peut vous aider. Par contre, si le problème est dû à une séparation parfaite, je ne vois pas comment l’idée du MM pourrait y remédier. Je me demandais si vous pouviez faire un commentaire à ce sujet (je peux éventuellement poster ceci en tant que question distincte).
user603
Excellent (+1)! Moi aussi, je devrai examiner ces paquets.
jbowman
1
Merci pour la réponse @ user603! J'ai utilisé safeBinaryRegression et la séparation se produisait effectivement avec plusieurs variables. Ensuite, j'ai essayé d'utiliser MEL dans le paquetage hlr pour créer un modèle résistant à cette séparation. Cependant, les coefficients sont énormes (comme ils le seraient quand la séparation se produit dans la normale) et voici les nombres de df et de déviance: Degrés de liberté: 19112 Total (c.-à-d. Nul); 19063 Déviance résiduelle nulle: 24990 Déviance résiduelle: 626000 AIC: 626000 Pensez-vous que j'ai fait quelque chose de mal?
Dcook