Il modello di regressione logistica non converge


40

Ho alcuni dati sui voli delle compagnie aeree (in un frame di dati chiamato flights) e vorrei vedere se il tempo di volo ha qualche effetto sulla probabilità di un arrivo significativamente ritardato (ovvero 10 o più minuti). Ho pensato che avrei usato la regressione logistica, con il tempo di volo come predittore e se ogni volo fosse significativamente ritardato (un gruppo di Bernoullis) come risposta. Ho usato il seguente codice ...

flights$BigDelay <- flights$ArrDelay >= 10
delay.model <- glm(BigDelay ~ ArrDelay, data=flights, family=binomial(link="logit"))
summary(delay.model)

... ma ha ottenuto il seguente output.

> flights$BigDelay <- flights$ArrDelay >= 10
> delay.model <- glm(BigDelay ~ ArrDelay, data=flights, family=binomial(link="logit"))
Warning messages:
1: In glm.fit(x = X, y = Y, weights = weights, start = start, etastart = etastart,  :
  algorithm did not converge
2: In glm.fit(x = X, y = Y, weights = weights, start = start, etastart = etastart,  :
  fitted probabilities numerically 0 or 1 occurred
> summary(delay.model)

Call:
glm(formula = BigDelay ~ ArrDelay, family = binomial(link = "logit"),
    data = flights)

Deviance Residuals:
       Min          1Q      Median          3Q         Max
-3.843e-04  -2.107e-08  -2.107e-08   2.107e-08   3.814e-04

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)  -312.14     170.26  -1.833   0.0668 .
ArrDelay       32.86      17.92   1.833   0.0668 .
---
Signif. codes:  0 â***â 0.001 â**â 0.01 â*â 0.05 â.â 0.1 â â 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2.8375e+06  on 2291292  degrees of freedom
Residual deviance: 9.1675e-03  on 2291291  degrees of freedom
AIC: 4.0092

Number of Fisher Scoring iterations: 25

Cosa significa che l'algoritmo non è converto? Ho pensato che fosse perché i BigDelayvalori erano TRUEe FALSEinvece di 0e 1, ma ho ottenuto lo stesso errore dopo aver convertito tutto. Qualche idea?


Primo pensiero: separazione perfetta , il che significa che il predittore è "troppo buono", i logit vanno su +/- infinito e tutto cade. Secondo pensiero: il codice fa quello che pensi che faccia? I nomi delle tue variabili non sembrano corrispondere perfettamente alla tua descrizione. Potresti elaborare quali sono i dati in modo più preciso, poiché sembra che tu stia cercando di prevedere qualcosa con se stesso.
conjugateprior il

1
non sono sicuro di meritare il "accetta". La risposta di @Conjugate Prior ha spiegato cosa non andava nel tuo modello. Ho pensato che valesse la pena spiegare l'avvertimento che hai citato in termini di algoritmo.
Ripristina Monica - G. Simpson il

3
Se si hanno i tempi di ritardo effettivi, è probabile che si ottengano informazioni migliori modellandole, anziché ridurle a una variabile binaria.
whuber


puoi provare la funzione glm1 (). Ha superato la convergenza del problema

Risposte:


33

glm()utilizza un algoritmo iterativo ripensato per minimi quadrati. L'algoritmo ha raggiunto il numero massimo di iterazioni consentite prima di segnalare la convergenza. Il valore predefinito, documentato in ?glm.controlè 25. Passi i parametri di controllo come un elenco nella glmchiamata:

delay.model <- glm(BigDelay ~ ArrDelay, data=flights, family=binomial,
                   control = list(maxit = 50))

Come dice @Conjugate Prior, sembra che tu stia predicendo la risposta con i dati utilizzati per generarlo. Hai una separazione completa come qualsiasi ArrDelay < 10predirà FALSEe qualunque ArrDelay >= 10predirà TRUE. L'altro messaggio di avviso ti dice che le probabilità adattate per alcune osservazioni erano effettivamente 0 o 1 e questo è un buon indicatore che hai qualcosa di sbagliato nel modello.

β^io


Potresti spiegare cosa intendi esattamente per convergenza del modello qui?
Bach,

1
Per convergenza intendo che i parametri stimati nel modello non cambiano (o cambiano solo meno di una piccola tolleranza) tra le iterazioni. Qui i parametri diventano sempre più grandi e gli arresti di adattamento a causa del limite delle iterazioni, ma le stime dei parametri sono cambiate molto tra la penultima e le ultime iterazioni e come tali non sono convergenti.
Ripristina Monica - G. Simpson,

6

Potresti provare a verificare se la riduzione del bias di Firth funziona con il tuo set di dati. È un approccio di probabilità penalizzato che può essere utile per set di dati che producono divergenze utilizzando il glmpacchetto standard . A volte può essere usato invece di eliminare quella variabile che produce una separazione completa / quasi completa.

O(n-1)

La riduzione del bias di Firth è implementata nel pacchetto R logistf: http://cran.r-project.org/web/packages/logistf/logistf.pdf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.