Se você tiver uma variável que separa perfeitamente os zeros e os da variável de destino, R produzirá a seguinte mensagem de aviso "separação perfeita ou quase perfeita":
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred
Ainda temos o modelo, mas as estimativas do coeficiente são infladas.
Como você lida com isso na prática?
r
regression
logistic
separation
user333
fonte
fonte
Respostas:
Uma solução para isso é utilizar uma forma de regressão penalizada. De fato, esta é a razão original pela qual algumas das formas de regressão penalizadas foram desenvolvidas (embora tenham revelado outras propriedades interessantes).
Instale e carregue o pacote glmnet no R e você estará pronto para começar. Um dos aspectos menos amigáveis do glmnet é que você só pode alimentar matrizes, não fórmulas como estamos acostumados. No entanto, você pode olhar model.matrix e similares para construir essa matriz a partir de um data.frame e uma fórmula ...
Agora, quando você espera que essa separação perfeita não seja apenas um subproduto da sua amostra, mas possa ser verdadeira na população, você especificamente não deseja lidar com isso: use essa variável de separação simplesmente como o único preditor do seu resultado, não empregando um modelo de qualquer tipo.
fonte
Você tem várias opções:
Remova alguns dos preconceitos.
(a) Penalizando a probabilidade de acordo com a sugestão de @ Nick. O pacote logistf em R ou a
FIRTH
opção no SASPROC LOGISTIC
implementam o método proposto em Firth (1993), "Redução de viés das estimativas de máxima verossimilhança", Biometrika , 80 , 1 .; que remove o viés de primeira ordem das estimativas de probabilidade máxima. ( Aqui, o @Gavin recomenda obrglm
pacote, com o qual não estou familiarizado, mas deduzi que implementa uma abordagem semelhante para funções de link não canônicas, como probit.)(b) Usando estimativas isentas de mediana na regressão logística condicional exata. Pacote elrm ou Logistix em R, ou a
EXACT
declaração em SAS dePROC LOGISTIC
.Exclua os casos em que a categoria ou valor do preditor que está causando a separação ocorre. Isso pode estar fora do seu escopo; ou digno de uma investigação mais aprofundada. (O pacote safeBinaryRegression do R é útil para encontrá-los.)
Relance o modelo. Normalmente, isso é algo que você teria feito antes, se tivesse pensado nisso, porque é muito complexo para o tamanho da sua amostra.
(a) Remova o preditor do modelo. Arriscado, pelas razões apresentadas pelo @Simon: "Você está removendo o preditor que melhor explica a resposta".
(b) Ao recolher categorias de preditores / agrupar os valores dos preditores. Somente se isso fizer sentido.
(c) Re-expressar o preditor como dois (ou mais) fatores cruzados sem interação. Somente se isso fizer sentido.
Use uma análise bayesiana de acordo com a sugestão de Manoel . Embora pareça improvável que você queira apenas por causa da separação, vale a pena considerar por outros méritos. O artigo que ele recomenda é Gelman et al (2008), "Uma distribuição anterior padrão pouco informativa para modelos logísticos e outros modelos de regressão", Ann. Appl. Estado. , 2 , 4 : o padrão em questão é um Cauchy independente anterior para cada coeficiente, com média de zero e escala de ; a ser usado após padronizar todos os preditores contínuos para ter uma média de zero e um desvio padrão de . Se você pode elucidar priors fortemente informativos, tanto melhor. 152 12
Fazer nada. (Mas calcule os intervalos de confiança com base nas probabilidades do perfil, pois as estimativas de erro padrão de Wald estarão muito erradas.) Uma opção frequentemente negligenciada. Se o objetivo do modelo é apenas descrever o que você aprendeu sobre as relações entre preditores e resposta, não há vergonha em citar um intervalo de confiança para uma razão de chances de, digamos, 2,3 ou mais. (De fato, pode parecer suspeito citar intervalos de confiança com base em estimativas imparciais que excluem as razões de chances mais suportadas pelos dados.) Os problemas surgem quando você está tentando prever o uso de estimativas pontuais, e o preditor em que a separação ocorre envolve os outros.
Use um modelo de regressão logística oculto, conforme descrito em Rousseeuw e Christmann (2003), "Robustez contra separação e outliers na regressão logística", Computational Statistics & Data Analysis , 43 , 3 e implementado no pacote R hlr . (@ user603 sugere isso. ) Eu não li o artigo, mas eles dizem no resumo "um modelo um pouco mais geral é proposto sob o qual a resposta observada está fortemente relacionada, mas não é igual à resposta verdadeira inobservável", o que sugere Para mim, talvez não seja uma boa ideia usar o método, a menos que isso pareça plausível.
"Altere algumas observações selecionadas aleatoriamente de 1 para 0 ou 0 para 1 entre variáveis que exibem separação completa": comentário de RobertF . Essa sugestão parece surgir de considerar a separação como um problema em si, e não como um sintoma de escassez de informações nos dados, o que pode levar você a preferir outros métodos à estimativa de probabilidade máxima ou limitar as inferências àquelas que você pode fazer. precisão razoável - abordagens que têm seus próprios méritos e não são apenas "correções" para a separação. (Além de ser descaradamente ad hoc , é desagradável para a maioria os analistas que fazem a mesma pergunta dos mesmos dados, fazendo as mesmas suposições, devem dar respostas diferentes devido ao resultado de um sorteio ou algo assim.)
fonte
Essa é uma expansão das respostas de Scortchi e Manoel, mas como você parece usar o RI, pensei em fornecer algum código. :)
Acredito que a solução mais fácil e direta para o seu problema é usar uma análise bayesiana com premissas prévias não informativas, conforme proposto por Gelman et al (2008). Como Scortchi menciona, Gelman recomenda colocar um Cauchy anterior com mediana de 0,0 e escala de 2,5 em cada coeficiente (normalizado para ter média de 0,0 e DP de 0,5). Isso regularizará os coeficientes e os puxará levemente para zero. Nesse caso, é exatamente o que você deseja. Por possuir caudas muito largas, o Cauchy ainda permite grandes coeficientes (em oposição ao Normal de cauda curta), de Gelman:
Como executar esta análise? Use a
bayesglm
função no pacote arm que implementa essa análise!Não funciona tão bem ... Agora a versão bayesiana:
Super simples, não?
Referências
Gelman et al (2008), "Uma distribuição prévia padrão pouco informativa para modelos de regressão logística e outros", Ann. Appl. Stat., 2, 4 http://projecteuclid.org/euclid.aoas/1231424214
fonte
bayesglm
usa? Se a estimativa de ML é equivalente a Bayesiana com um plano simples, como os priores não informativos ajudam aqui?prior.df
padrões para1.0
e / ou diminuindo osprior.scale
padrões2.5
, talvez comece a tentar:m=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
Uma das explicações mais completas sobre questões de "separação quase completa" com a máxima probabilidade é o artigo de Paul Allison. Ele está escrevendo sobre o software SAS, mas os problemas que ele aborda são generalizáveis para qualquer software:
Allison discute muitas das soluções já mencionadas, incluindo exclusão de variáveis problemáticas, categorias em colapso, não fazendo nada, alavancando a regressão logística exata , estimativa bayesiana e estimativa de probabilidade máxima penalizada.
http://www2.sas.com/proceedings/forum2008/360-2008.pdf
fonte
warning
Com os dados gerados ao longo das linhas de
O aviso é feito:
o que reflete muito obviamente a dependência que é construída nesses dados.
Em R, o teste de Wald é encontrado com
summary.glm
ou comwaldtest
almtest
embalagem. O teste da razão de verossimilhança é realizado comanova
ou comlrtest
olmtest
pacote. Nos dois casos, a matriz de informações é infinitamente avaliada e nenhuma inferência está disponível. Em vez disso, R não produzir saída, mas você não pode confiar nele. A inferência que R normalmente produz nesses casos tem valores de p muito próximos de um. Isso ocorre porque a perda de precisão no OR é de ordens de magnitude menor que a perda de precisão na matriz de variância-covariância.Algumas soluções descritas aqui:
Use um estimador de uma etapa,
Há muita teoria apoiando o baixo viés, eficiência e generalização dos estimadores de uma etapa. É fácil especificar um estimador de uma etapa em R e os resultados geralmente são muito favoráveis para previsão e inferência. E esse modelo nunca diverge, porque o iterador (Newton-Raphson) simplesmente não tem a chance de fazê-lo!
Dá:
Assim, você pode ver as previsões refletindo a direção da tendência. E a inferência é altamente sugestiva das tendências que acreditamos serem verdadeiras.
faça um teste de pontuação,
A estatística Score (ou Rao) difere da razão de verossimilhança e estatística wald. Não requer uma avaliação da variância sob a hipótese alternativa. Nós ajustamos o modelo sob o nulo:
Nos dois casos, você tem inferência para um OR do infinito.
e use estimativas imparciais imparciais para um intervalo de confiança.
Você pode produzir um IC 95% não-singular mediano, não-singular para o índice de chances infinitas, usando estimativa não-verbal mediana. O pacote
epitools
em R pode fazer isso. E eu dou um exemplo de implementação deste estimador aqui: Intervalo de confiança para amostragem de Bernoullifonte
test="Rao"
para aanova
função. (Bem, as duas últimas são anotações, nãoTenha cuidado com esta mensagem de aviso da R. Dê uma olhada neste post de Andrew Gelman, e você verá que nem sempre é um problema de separação perfeita, mas às vezes é um erro
glm
. Parece que se os valores iniciais estiverem muito longe da estimativa de probabilidade máxima, ele explodirá. Portanto, verifique primeiro com outro software, como o Stata.Se você realmente tiver esse problema, tente usar a modelagem bayesiana, com prévios informativos.
Mas, na prática, acabo com os preditores que causam o problema, porque não sei como escolher um informativo prévio. Mas acho que há um artigo de Gelman sobre o uso de informações informativas antes, quando você tem esse problema do problema de separação perfeita. Basta pesquisar no Google. Talvez você deva tentar.
fonte
glm2
pacote implementa uma verificação de que a probabilidade está realmente aumentando a cada etapa da pontuação e reduz pela metade o tamanho da etapa, se não estiver.safeBinaryRegression
projetado para diagnosticar e corrigir esses problemas, usando métodos de otimização para verificar com certeza se há separação ou quase-separação. Tente!Não tenho certeza se concordo com as declarações da sua pergunta.
Acho que essa mensagem de aviso significa que, para alguns dos níveis observados de X em seus dados, a probabilidade ajustada é numericamente 0 ou 1. Em outras palavras, na resolução, ela aparece como 0 ou 1.
Você pode executar
predict(yourmodel,yourdata,type='response')
e encontrará zeros ou zeros como probabilidades previstas.Como resultado, acho que não há problema em usar apenas os resultados.
fonte
Entendo que este é um post antigo, no entanto, continuarei respondendo a isso, pois lutei dias com ele e ele pode ajudar outras pessoas.
A separação completa acontece quando as variáveis selecionadas para ajustar-se ao modelo podem diferenciar com muita precisão entre 0 e 1 ou sim e não. Toda a nossa abordagem da ciência de dados é baseada na estimativa de probabilidade, mas falha neste caso.
Etapas de retificação: -
Use bayesglm () em vez de glm (), caso a variação entre as variáveis seja baixa
Às vezes, usar (maxit = "algum valor numérico") junto com o bayesglm () pode ajudar
3. Terceira e mais importante verificação das variáveis selecionadas para o ajuste do modelo, deve haver uma variável cuja colinearidade com a variável Y (saída) seja muito alta, descarte essa variável do seu modelo.
Como no meu caso, eu tinha dados de rotatividade de telecomunicações para prever a rotatividade dos dados de validação. Eu tinha uma variável nos meus dados de treinamento que poderia diferenciar muito entre sim e não. Depois de soltá-lo, consegui o modelo correto. Além disso, você pode usar stepwise (fit) para tornar seu modelo mais preciso.
fonte