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.
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.
Respostas:
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:
Se você usa R, existe um pacote no CRAN, SafeBinaryRegression
que 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 elrm
pacote para regressão logística condicional aproximada.
Primeiro, um exemplo simples com o safeBinaryRegression
pacote. Este pacote apenas redefine a glm
funçã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 glm
funçã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)
[
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.
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.
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.
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ê.
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.
Isso está bem explicado em Rainey 2016 e Zorn 2005 .
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) .