A regressão logística em R resultou em separação perfeita (fenômeno de Hauck-Donner). O que agora?

56

Estou tentando prever um resultado binário usando 50 variáveis ​​explicativas contínuas (o intervalo da maioria das variáveis ​​é a ). Meu conjunto de dados tem quase 24.000 linhas. Quando corro no R, recebo:glm

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

Li as outras respostas que sugerem que a separação perfeita pode estar ocorrendo, mas estou confiante de que não é o caso nos meus dados (embora possa existir uma separação quase completa; como posso testar para ver se é esse o caso?) . Se eu remover algumas variáveis, o erro "não converge" pode desaparecer. Mas isso nem sempre é o que acontece.

Tentei usar as mesmas variáveis ​​em uma bayesglmfunção e obtive os mesmos erros.

Que medidas você daria para descobrir exatamente o que está acontecendo aqui? Como você descobre quais variáveis ​​estão causando os problemas?

Dcook
fonte
5
Por que você está confiante de que a separação não está ocorrendo? No bayesglmpapel , eles argumentam que a separação é "um problema comum, mesmo quando o tamanho da amostra é grande eo número de preditores é pequena"
David J. Harris
2
Outro pensamento: bayesglmtenta evitar a separação adicionando um prior, mas com 24.000 linhas, o prior provavelmente está sendo inundado pela probabilidade. Tente encolher prior.scale, possivelmente em grande quantidade. Considere também aumentar os graus de liberdade do prior, o que ajudará a descartar grandes valores associados à separação.
David J. Harris
Obrigado pelas sugestões David. Eu não acho que a separação esteja ocorrendo porque quando eu classifico cada uma das variáveis ​​explicativas, a variável dependente nem sempre é verdadeira ou falsa para valores altos ou baixos das variáveis ​​explicativas. A menos que isso seja considerado separação: a variável dependente é verdadeira para todos x7> 32, mas x7 é apenas> 32 em 10 casos. Existe uma maneira de verificar a separação fora de uma regressão logística? Ou vê qual variável está causando a separação? Tentei suas sugestões do bayesglm (defina prior.scale como 1 e prior.df como Inf) e ainda tenho os erros do Hauck Donner.
Dcook
11
Perguntas
user603
"Como você descobre quais variáveis ​​estão causando os problemas?" A pesquisa binária é sempre uma boa alternativa. Você tem apenas 50 variáveis; portanto, se ele estiver perfeitamente separado por uma variável individual, 6 iterações encontrarão o culpado. Se houver duas variáveis, no máximo 49 + 6 = 55 iterações a encontrarão, na pior das hipóteses.
smci 02/02

Respostas:

55

Com um espaço de design tão grande ( !), É possível obter uma separação perfeita sem ter a separação em nenhuma variável tomada individualmente. Eu até diria o comentário de David J. Harris dizendo que isso é provável.R50

Você pode testar facilmente se suas classes estão perfeitamente separadas no seu espaço de design. Isso se resume a resolver um problema de programação linear. Uma implementação R deste 'teste' (não um teste no sentido estatístico do termo) é implementada no pacote safeBinaryRegression .

Se a separação é realmente o problema, e se você está interessado apenas no uso simples de glm (por exemplo, glm não é chamado por uma função de nível superior, mas por você), existe uma implementação R de um algoritmo que modifica levemente o clássico para torná-lo "robusto" contra a separação. É implementado no pacote hlr

user603
fonte
4
Resposta muito legal e útil! Vou ter que olhar para esses pacotes. (+1)
Peter Flom - Restabelece Monica
11
FWIW aqui é uma descrição de um outro algoritmo robusto: win-vector.com/blog/2012/10/rudie-cant-fail-if-majorized
Alex
2
@ Alex: obrigado pelo link. Se o glm não estiver convergindo devido a um mau início, posso ver como esse método ajudará nisso. Por outro lado, se o problema é causado por uma separação perfeita, não está claro para mim como a idéia do MM abordaria isso. Eu queria saber se você poderia comentar sobre isso (eu posso finalmente postar isso como uma pergunta separada).
user603
Excelente (+1)! Eu também terei que examinar esses pacotes.
jbowman
11
Obrigado pela resposta @ user603! Eu usei safeBinaryRegression e a separação estava realmente ocorrendo com várias das variáveis. Então tentei usar o MEL no pacote hlr para criar um modelo robusto para essa separação. No entanto, os coeficientes são enormes (como seriam quando a separação ocorre em glm normal) e aqui estão os números df e desvio: Graus de liberdade: 19112 Total (ou seja, Nulo); 19063 Desvio nulo residual: 24990 Desvio residual: 626000 AIC: 626000 Você acha que fiz algo errado?
Dcook