Come gestire r avviso: glm.fit: l'algoritmo non converge
Un avviso comune che potresti incontrare in R è:
glm.fit: algorithm did not converge
Questo avviso si verifica spesso quando si tenta di adattare un modello di regressione logistica in R e si vede la separazione perfetta , ovvero una variabile predittrice è in grado di separare perfettamente la variabile di risposta in 0 e in 1.
L’esempio seguente mostra come gestire questo avviso nella pratica.
Come riprodurre l’avviso
Supponiamo di voler adattare il seguente modello di regressione logistica in R:
#create data frame
df <- data. frame (x=c(.1, .2, .3, .4, .5, .6, .7, .8, .9, 1, 1, 1.1, 1.3, 1.5, 1.7),
y=c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1))
#attempt to fit logistic regression model
glm(y~x, data=df, family=" binomial ")
Call: glm(formula = y ~ x, family = "binomial", data = df)
Coefficients:
(Intercept)x
-409.1 431.1
Degrees of Freedom: 14 Total (ie Null); 13 Residual
Null Deviance: 20.19
Residual Deviance: 2.468e-09 AIC: 4
Warning messages:
1: glm.fit: algorithm did not converge
2: glm.fit: fitted probabilities numerically 0 or 1 occurred
Tieni presente che riceviamo il messaggio di avviso: glm.fit: algoritmo non converge .
Riceviamo questo messaggio perché la variabile predittrice x è in grado di separare perfettamente la variabile di risposta y in 0 e 1.
Nota che per ogni valore x inferiore a 1, y è uguale a 0. E per ogni valore x uguale o maggiore di 1, y è uguale a 1.
Il codice seguente mostra uno scenario in cui la variabile predittore non è in grado di separare perfettamente la variabile di risposta in 0 e 1:
#create data frame
df <- data. frame (x=c(.1, .2, .3, .4, .5, .6, .7, .8, .9, 1, 1, 1.1, 1.3, 1.5, 1.7),
y=c(0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1))
#fit logistic regression model
glm(y~x, data=df, family=" binomial ")
Call: glm(formula = y ~ x, family = "binomial", data = df)
Coefficients:
(Intercept) x
-2.112 2.886
Degrees of Freedom: 14 Total (ie Null); 13 Residual
Null Deviance: 20.73
Residual Deviance: 16.31 AIC: 20.31
Non riceviamo alcun messaggio di avviso perché la variabile predittore non è in grado di separare perfettamente la variabile di risposta in 0 e 1.
Come gestire l’avviso
Se incontriamo uno scenario di separazione perfetta, ci sono due modi per gestirlo:
Metodo 1: utilizzare la regressione penalizzata.
Un’opzione è quella di utilizzare una forma di regressione logistica penalizzata come la regressione logistica lazo o la regolarizzazione della rete elastica.
Fare riferimento al pacchetto glmnet per le opzioni su come implementare la regressione logistica penalizzata in R.
Metodo 2: utilizzare la variabile predittore per prevedere perfettamente la variabile di risposta.
Se sospetti che questa separazione perfetta possa esistere nella popolazione, puoi semplicemente utilizzare questa variabile predittrice per prevedere perfettamente il valore della variabile di risposta.
Ad esempio, nello scenario precedente, abbiamo visto che la variabile di risposta y era sempre uguale a 0 quando la variabile predittrice x era inferiore a 1.
Se sospettiamo che questa relazione valga nella popolazione complessiva, possiamo sempre prevedere che il valore di y sarà 0 quando x è inferiore a 1 e non preoccuparci di adattare un modello di regressione logistica penalizzato.
Risorse addizionali
I seguenti tutorial forniscono informazioni aggiuntive sull’utilizzo della funzione glm() in R:
La differenza tra glm e lm in R
Come utilizzare la funzione di previsione con glm in R
Come gestire: glm.fit: si sono verificate probabilità corrette numericamente 0 o 1