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