Perché la regressione logistica diventa instabile quando le classi sono ben separate? Cosa significano classi ben separate? Gradirei davvero se qualcuno potesse spiegare con un esempio.
Perché la regressione logistica diventa instabile quando le classi sono ben separate? Cosa significano classi ben separate? Gradirei davvero se qualcuno potesse spiegare con un esempio.
Risposte:
Non è corretto che la regressione logistica di per sé diventi instabile in presenza di separazione. Separazione significa che ci sono alcune variabili che sono predittori molto buoni, il che è buono, oppure la separazione può essere un artefatto di troppo poche osservazioni / troppe variabili. In tal caso, la soluzione potrebbe essere quella di ottenere più dati. Ma la separazione stessa, quindi, è solo un sintomo e non un problema in sé.
Quindi ci sono casi davvero diversi da trattare. Innanzitutto, qual è l'obiettivo dell'analisi? Se il risultato finale dell'analisi è una classificazione dei casi, la separazione non è affatto un problema, significa davvero che ci sono ottime variabili che danno un'ottima classificazione. Ma se l'obiettivo è la stima del rischio, abbiamo bisogno delle stime dei parametri e, con la separazione, non esistono le consuete stime mle (massima probabilità). Quindi dobbiamo cambiare il metodo di stima, forse. Ci sono diverse proposte in letteratura, tornerò su questo.
Quindi ci sono (come detto sopra) due diverse possibili cause di separazione. Potrebbe esserci separazione in tutta la popolazione, oppure la separazione potrebbe essere causata da pochi casi osservati / troppe variabili.
Ciò che rompe con la separazione è la procedura di stima della massima verosimiglianza. Le stime dei parametri mle (o almeno alcune di esse) diventano infinite. Nella prima versione di questa risposta ho detto che ciò può essere risolto facilmente, magari con il bootstrap, ma che non funziona, poiché ci sarà una separazione in ogni ricampionamento del bootstrap, almeno con la solita procedura di bootstrap del caso. Ma la regressione logistica è ancora un modello valido, ma abbiamo bisogno di qualche altra procedura di stima. Alcune proposte sono state:
Se usi R, c'è un pacchetto su CRAN, SafeBinaryRegression
che aiuta a diagnosticare i problemi con la separazione, usando metodi di ottimizzazione matematica per verificare con certezza se c'è separazione o quasiseparation! Di seguito fornirò un esempio simulato usando questo pacchetto e il elrm
pacchetto per la regressione logistica condizionale approssimativa.
Innanzitutto, un semplice esempio con il safeBinaryRegression
pacchetto. Questo pacchetto ridefinisce la glm
funzione, sovraccaricandola con un test di separazione, usando metodi di programmazione lineare. Se rileva la separazione, esce con una condizione di errore, dichiarando che il mle non esiste. Altrimenti esegue semplicemente la normale glm
funzione da stats
. L'esempio è dalle sue pagine di aiuto:
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)
L'output di eseguirlo:
> # 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
Ora simuliamo da un modello che può essere strettamente approssimato da un modello logistico, tranne che al di sopra di un certo limite la probabilità dell'evento è esattamente 1.0. Pensa a un problema di biotest, ma al di sopra del valore limite il veleno uccide sempre:
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
Quando si esegue questo codice, stimiamo la probabilità di separazione come 0,759. Esegui il codice da solo, è veloce!
Quindi estendiamo questo codice per provare diverse procedure di stima, mle e regressione logistica condizionale approssimativa da elrm. L'esecuzione di questa simulazione richiede circa 40 minuti sul mio computer.
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]
Ora vogliamo tracciare i risultati, ma prima di ciò, nota che TUTTE le stime condizionali sono uguali! È davvero strano e dovrebbe essere necessaria una spiegazione ... Il valore comune è 0.9523975. Ma almeno abbiamo ottenuto stime limitate, con intervalli di confidenza che contengono il valore reale (non mostrato qui). Quindi mostrerò solo un istogramma delle stime mle nei casi senza separazione:
hist(cof.mle.non, prob=TRUE)
[
Ciò che è notevole è che tutte le stime sono inferiori al valore reale 1.5. Ciò può avere a che fare con il fatto che abbiamo simulato da un modello modificato, ha bisogno di essere investigato.
Ci sono buone risposte qui da @ sean501 e @kjetilbhalvorsen. Hai chiesto un esempio. Considera la figura seguente. Si potrebbe incontrare qualche situazione in cui il processo di generazione di dati è simile a quella illustrata nella pannello A . Se è così, è del tutto possibile che i dati che in realtà raccolgono aspetto come quelli del pannello B . Ora, quando si utilizzano i dati per costruire un modello statistico, l'idea è quella di ripristinare il vero processo di generazione dei dati o almeno di elaborare un'approssimazione ragionevolmente vicina. Pertanto, la domanda è: adattando una regressione logistica ai dati in B si ottiene un modello che si avvicina alla linea blu in A ? Se guardi il pannello C, puoi vedere che la linea grigia si avvicina meglio ai dati rispetto alla funzione reale, quindi nel cercare la soluzione migliore, la regressione logistica "preferirà" per restituire la linea grigia piuttosto che quella blu. Non si ferma qui, tuttavia. Guardando il pannello D, la linea nera approssima i dati meglio di quella grigia: in effetti, è la soluzione migliore che potrebbe verificarsi. Questa è la linea che il modello di regressione logistica persegue. Corrisponde a un'intercetta di infinito negativo e una pendenza di infinito. Questo è, ovviamente, molto lontano dalla verità che speri di recuperare. La separazione completa può anche causare problemi con il calcolo dei valori di p per le variabili che sono standard con l'output di regressione logistica (la spiegazione è leggermente diversa e più complicata). Inoltre, il tentativo di combinare la misura qui con altri tentativi, ad esempio con una meta-analisi, renderà gli altri risultati meno accurati.
Significa che esiste un iperpiano tale che da un lato ci sono tutti i punti positivi e dall'altro tutti i negativi. La soluzione di massima verosimiglianza è quindi piatta 1 su un lato e piatta 0 sull'altro lato, che viene "raggiunta" con la funzione logistica avendo i coefficienti all'infinito.
Quello che tu chiami "separazione" (non "separazione") copre due diverse situazioni che finiscono per causare lo stesso problema - che non definirei, tuttavia, un problema di "instabilità" come fai tu.
Sarebbe così se tutti i passeggeri di prima classe sul Titanic fossero sopravvissuti al disastro e nessuno dei passeggeri di seconda classe fosse sopravvissuto.
Questo è ben spiegato in Rainey 2016 e Zorn 2005 .
In entrambi i casi, la funzione di probabilità del modello non sarà in grado di trovare una stima della massima verosimiglianza: troverà solo un'approssimazione di quel valore avvicinandosi asintoticamente.
Ciò che si chiama "instabilità" è il fatto che, in caso di separazione completa o quasi completa, non esiste una probabilità finita che il modello logistico possa raggiungere. Non userei questo termine, comunque: la funzione di verosimiglianza è, infatti, essere piuttosto "stabile" (monotona) nella sua assegnazione di valori di coefficiente all'infinito.
Nota: il mio esempio è di fantasia. La sopravvivenza sul Titanic non si riduceva solo all'appartenenza alla classe passeggeri. Vedi Hall (1986) .