Por que a regressão logística se torna instável quando as classes são bem separadas?

34

Por que a regressão logística se torna instável quando as classes são bem separadas? O que significam classes bem separadas? Eu realmente aprecio se alguém puder explicar com um exemplo.

Jane Dow
fonte
4
Eu explico em detalhes, com uma prova, aqui: stats.stackexchange.com/questions/224863/...
Matthew Drury
2
E também tive uma demonstração para explicar a pergunta: stats.stackexchange.com/questions/239928/…
Haitao Du

Respostas:

31

Não é correto que a regressão logística em si se torne instável quando houver separação. Separação significa que existem algumas variáveis ​​que são preditores muito bons, o que é bom ou que a separação pode ser um artefato com poucas observações / muitas variáveis. Se for esse o caso, a solução pode ser obter mais dados. Mas a própria separação, então, é apenas um sintoma, e não um problema em si mesma.

Portanto, existem casos realmente diferentes a serem tratados. Primeiro, qual é o objetivo da análise? Se o resultado final da análise for uma classificação de casos, a separação não é um problema, significa realmente que existem variáveis ​​muito boas que dão uma classificação muito boa. Mas se o objetivo é a estimativa de risco, precisamos das estimativas de parâmetros e, com a separação, as estimativas usuais de mle (probabilidade máxima) não existem. Então, devemos mudar o método de estimativa, talvez. Existem várias propostas na literatura, voltarei a isso.

Depois, existem (como dito acima) duas causas possíveis diferentes para a separação. Pode haver separação em toda a população ou a separação pode ser causada por poucos casos observados / muitas variáveis.

O que quebra com a separação é o procedimento de estimativa de probabilidade máxima. As estimativas do parâmetro mle (ou pelo menos algumas delas) tornam-se infinitas. Eu disse na primeira versão desta resposta que isso pode ser resolvido facilmente, talvez com o bootstrapping, mas isso não funciona, pois haverá separação em cada nova amostra do bootstrap, pelo menos com o procedimento usual de bootstrap. Mas a regressão logística ainda é um modelo válido, mas precisamos de algum outro procedimento de estimativa. Algumas propostas foram:

  1. regularização, como cordilheira ou laço, talvez combinada com inicialização.
  2. regressão logística condicional exata
  3. testes de permutação, consulte https://www.ncbi.nlm.nih.gov/pubmed/15515134
  4. Procedimento de estimativa reduzida ao viés de Firths, consulte Modelo de regressão logística não converge
  5. certamente outros ...

Se você usa R, existe um pacote no CRAN, SafeBinaryRegressionque ajuda no diagnóstico de problemas com a separação, usando métodos de otimização matemática para verificar se há separação ou quase-separação! A seguir, darei um exemplo simulado usando este pacote e o elrmpacote para regressão logística condicional aproximada.

Primeiro, um exemplo simples com o safeBinaryRegressionpacote. Este pacote apenas redefine a glmfunção, sobrecarregando-a com um teste de separação, usando métodos de programação linear. Se ele detecta a separação, sai com uma condição de erro, declarando que o mle não existe. Caso contrário, ele apenas executa a glmfunção comum de stats. O exemplo é de suas páginas de ajuda:

library(safeBinaryRegression)   # Some testing of that package,
                                # based on its examples
# complete separation:
x  <-  c(-2, -1, 1, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)
# Quasicomplete separation:
x  <-  c(-2, 0, 0, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)

A saída da execução:

> # complete separation:
> x  <-  c(-2, -1, 1, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: (Intercept), x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
 -9.031e-08    2.314e+01  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 3.567e-10    AIC: 4
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 
> # Quasicomplete separation:
> x  <-  c(-2, 0, 0, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
  5.009e-17    9.783e+00  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 2.773    AIC: 6.773

Agora simulamos a partir de um modelo que pode ser aproximado de perto por um modelo logístico, exceto que, acima de um determinado ponto de corte, a probabilidade de evento é exatamente 1,0. Pense em um problema de bioensaio, mas acima do ponto de corte o veneno sempre mata:

pl  <-  function(a, b, x) 1/(1+exp(-a-b*x))
a  <-  0
b  <-  1.5
x_cutoff  <-  uniroot(function(x) pl(0,1.5,x)-0.98,lower=1,upper=3.5)$root
### circa 2.6
pltrue  <-  function(a, b, x) ifelse(x < x_cutoff, pl(a, b, x), 1.0)

x <- -3:3

### Let us simulate many times from this model,  and try to estimate it
### with safeBinaryRegression::glm  That way we can estimate the probability
### of separation from this model

set.seed(31415926)  ### May I have a large container of coffee 
replications  <-  1000
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else good <- good+1
}
P_separation  <-  err/replications
P_separation

Ao executar esse código, estimamos a probabilidade de separação como 0,759. Execute o código você mesmo, é rápido!

Em seguida, estendemos esse código para tentar diferentes procedimentos de estimativa, mle e aproximar a regressão logística condicional da elrm. A execução desta simulação leva cerca de 40 minutos no meu computador.

library(elrm)  # from CRAN
set.seed(31415926)  ### May I have a large container of coffee
replications  <-  1000
GOOD  <-  numeric(length=replications) ### will be set to one when MLE exists!
COEFS <- matrix(as.numeric(NA), replications, 2)
COEFS.elrm <- matrix(as.numeric(NA), replications, 2) # But we'll only use second col for x
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else{ good <- good+1
                                                     GOOD[i] <- 1 }
    # Using stats::glm
    mod  <-  stats::glm(y~x, family=binomial)
    COEFS[i, ]  <-  coef(mod)
    # Using elrm:
    DATASET  <-  data.frame(x=x, y=y, n=1)
    mod.elrm  <-  elrm(y/n ~ x,  interest= ~ x -1, r=4, iter=10000, burnIn=1000,
                       dataset=DATASET)
    COEFS.elrm[i, 2 ]  <-  mod.erlm$coeffs       
}
### Now we can compare coefficient estimates of x,
###  when there are separation,  and when not:

non  <-  which(GOOD==1)
cof.mle.non  <-  COEFS[non, 2, drop=TRUE]
cof.mle.sep  <-  COEFS[-non, 2, drop=TRUE]
cof.elrm.non  <-  COEFS.elrm[non, 2, drop=TRUE]
cof.elrm.sep  <-  COEFS.elrm[-non, 2, drop=TRUE]

Agora queremos plotar os resultados, mas antes disso, observe que TODAS as estimativas condicionais são iguais! Isso é realmente estranho e deve precisar de uma explicação ... O valor comum é 0,9523975. Mas pelo menos obtivemos estimativas finitas, com intervalos de confiança que contêm o valor verdadeiro (não mostrado aqui). Então, mostrarei apenas um histograma das estimativas de mle nos casos sem separação:

hist(cof.mle.non, prob=TRUE)

[histograma de estimativas simuladas de parâmetros [1]

O que é notável é que todas as estimativas são menores que o valor verdadeiro 1,5. Isso pode ter a ver com o fato de termos simulado a partir de um modelo modificado, que precisa de investigação.

kjetil b halvorsen
fonte
11
(+1) Mas é bastante forte dizer que precisamos de um procedimento de estimativa que não seja a probabilidade máxima. Odds infinitos e odds ratio podem ser estimativas pontuais sensatas; Com frequência, o problema causado pela separação está apenas obtendo boas estimativas de intervalo.
Scortchi - Restabelecer Monica
@kjetilbhalvorsen Desculpas para reviver um thread antigo, mas eu queria saber se você está ciente de um pacote semelhante em python?
Meep
Desculpe, mas eu não sei sobre python. Mas deve ser possível executar o R ​​de dentro do python.
kjetil b halvorsen 24/07
25

Aqui existem boas respostas de @ sean501 e @kjetilbhalvorsen. Você pediu um exemplo. Considere a figura abaixo. Você pode se deparar com uma situação em que o processo de geração de dados é semelhante ao descrito no painel A . Se assim for, é bem possível que os dados que você realmente se reúnem olhar como aqueles no painel B . Agora, quando você usa dados para criar um modelo estatístico, a idéia é recuperar o verdadeiro processo de geração de dados ou, pelo menos, apresentar uma aproximação razoavelmente próxima. Assim, a questão é: o ajuste de uma regressão logística aos dados em B produzirá um modelo que se aproxima da linha azul em A ? Se você olhar para o painel C, você pode ver que a linha cinza se aproxima melhor dos dados do que a função verdadeira; portanto, ao buscar o melhor ajuste, a regressão logística 'preferirá' retornar a linha cinza em vez da azul. Não pára por aí, no entanto. Olhando para o painel D, a linha preta aproxima os dados melhor do que a cinza - na verdade, é o melhor ajuste que pode ocorrer. Portanto, essa é a linha que o modelo de regressão logística está seguindo. Corresponde a um intercepto do infinito negativo e uma inclinação do infinito. É claro que isso está muito longe da verdade que você espera recuperar. A separação completa também pode causar problemas com o cálculo dos valores de p para suas variáveis ​​que vêm de fábrica com a saída de regressão logística (a explicação é ligeiramente diferente e mais complicada). Além disso, tentar combinar o ajuste aqui com outras tentativas, por exemplo, com uma meta-análise, tornará as outras descobertas menos precisas.

insira a descrição da imagem aqui

- Reinstate Monica
fonte
11
(+1) Esta é uma ilustração muito útil do problema.
mkt - Reinstala Monica
Um aspecto interessante que o seu diagrama mostra é que você deseja que a amostra venha do "espaço x" que leva a 50-50 probabilidades (por exemplo, pontos no intervalo 12 <x <15). na verdade, acho que você provavelmente desejaria coletar mais dados dessa região intermediária (10 <x <17) em um cenário da vida real que forneceu esse resultado.
probabilityislogic
@probabilityislogic, isso mesmo. A maioria das informações sobre o relacionamento está nos dados da região intermediária.
gung - Restabelecer Monica
10

Isso significa que existe um hiperplano de tal modo que, por um lado, existem todos os pontos positivos e, por outro, todos os negativos. A solução de máxima verossimilhança é então plana 1 de um lado e plana 0 do outro lado, o que é 'alcançado' com a função logística, tendo os coeficientes no infinito.

seanv507
fonte
6

O que você está chamando de "separação" (não "separação") abrange duas situações diferentes que acabam causando o mesmo problema - que eu não chamaria, no entanto, de "instabilidade" como você.

Uma ilustração: Sobrevivência no Titanic

  • DV(0,1)SV

    SVDV01

  • SVDV

    Seria esse o caso se todos os passageiros de primeira classe no Titanic tivessem sobrevivido aos destroços e nenhum dos passageiros de segunda classe tivesse sobrevivido.

  • SVDV=0DV=1

    SVDV=1DV=0

    SVDV=0DV=1

DVSVSV

Por que a regressão logística é "instável" nesses casos?

Isso está bem explicado em Rainey 2016 e Zorn 2005 .

  • DV1SV=1DV0SV=0

    SV=1

    01SVDV

  • 01DVSV=0SV=1

Nos dois casos, a função de probabilidade do seu modelo não conseguirá encontrar uma estimativa de probabilidade máxima: ele encontrará apenas uma aproximação desse valor aproximando-o assintoticamente.

O que você está chamando de "instabilidade" é o fato de que, em casos de separação completa ou quase completa, não há probabilidade finita de o modelo logístico alcançar. No entanto, eu não usaria esse termo: a função de probabilidade é, de fato, bastante "estável" (monotônica) em sua atribuição de valores de coeficiente ao infinito.


Nota: meu exemplo é fictício. A sobrevivência no Titanic não se resumia apenas à participação na classe de passageiros. Veja Hall (1986) .

Pe.
fonte