Como lidar com o aviso r: glm.fit: algoritmo não convergiu


Um aviso comum que você pode encontrar em R é:

 glm.fit: algorithm did not converge

Este aviso ocorre frequentemente quando você tenta ajustar um modelo de regressão logística em R e vê uma separação perfeita , ou seja, uma variável preditora é capaz de separar perfeitamente a variável resposta em 0 e em 1.

O exemplo a seguir mostra como lidar com esse aviso na prática.

Como reproduzir o aviso

Suponha que estejamos tentando ajustar o seguinte modelo de regressão logística em 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 

Observe que recebemos a mensagem de aviso: glm.fit: algoritmo não convergiu .

Recebemos esta mensagem porque a variável preditora x é capaz de separar perfeitamente a variável de resposta y em 0 e 1.

Observe que para cada valor de x menor que 1, y é igual a 0. E para cada valor de x igual ou maior que 1, y é igual a 1.

O código a seguir mostra um cenário em que a variável preditora não é capaz de separar perfeitamente a variável de resposta em 0s e 1s:

 #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

Não recebemos nenhuma mensagem de aviso porque a variável preditora não é capaz de separar perfeitamente a variável de resposta em 0 e 1.

Como lidar com o aviso

Se encontrarmos um cenário de separação perfeito, existem duas maneiras de lidar com isso:

Método 1: Use regressão penalizada.

Uma opção é usar uma forma de regressão logística penalizada, como regressão logística laço ou regularização líquida elástica.

Consulte o pacote glmnet para opções sobre como implementar a regressão logística penalizada em R.

Método 2: Use a variável preditora para prever perfeitamente a variável de resposta.

Se você suspeitar que essa separação perfeita pode existir na população, você pode simplesmente usar essa variável preditora para prever perfeitamente o valor da variável resposta.

Por exemplo, no cenário acima, vimos que a variável resposta y era sempre igual a 0 quando a variável preditora x era menor que 1.

Se suspeitarmos que esta relação se mantém na população em geral, podemos sempre prever que o valor de y será 0 quando x for inferior a 1 e não nos preocuparemos em ajustar um modelo de regressão logística penalizado.

Recursos adicionais

Os tutoriais a seguir fornecem informações adicionais sobre o uso da função glm() em R:

A diferença entre glm e lm em R
Como usar a função de previsão com glm em R
Como lidar com: glm.fit: probabilidades ajustadas numericamente 0 ou 1 ocorreram

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *