Cómo corregir en R: glm.fit: el algoritmo no convergió

En este artículo, discutiremos cómo corregir el error «glm.fit: el algoritmo no convergió» en el lenguaje de programación R.

glm.fit: el algoritmo no convergió es una advertencia en R que se encuentra en algunos casos al ajustar un modelo de regresión logística en R. Se encuentra cuando una variable predictora separa perfectamente la variable de respuesta. Para obtener una mejor comprensión, veamos el código en el que la variable x se considera la variable predictora y la y se considera la variable de respuesta. Para producir la advertencia, creemos los datos de tal manera que los datos sean perfectamente separables.

Código que produce una advertencia:

El siguiente código no produce ningún error ya que el código de salida del programa es 0, pero se encuentran algunas advertencias en las que una de las advertencias es glm.fit: el algoritmo no convergió. Esto se debió a la perfecta separación de los datos. A partir de los datos utilizados en el código anterior, para cada valor negativo de x, el valor de y es 0 y para cada valor positivo de x, el valor de y es 1.

R

# create random data which consists
# of 50 numbers
x < - rnorm(50)
 
# create data with fifty 1's
y < - rep(1, 50)
 
# if x value is less than 0 the at that
# index replace 1 with 0 in y
y[x < 0] < - 0
 
# create dataframe
data < - data.frame(x, y)
 
# first 6 rows
head(data)
 
# fitting logistic regression model
glm(y ~ x, data, family="binomial")

Producción

          xy

1 1.3295285 1

2 -0.9738028 0

3 0.6963700 1

4 -1.1586337 0

5 -1.1001865 0

6 -0.6252191 0

Llamada: glm(fórmula = y ~ x, familia = “binomial”, datos = datos)

Coeficientes:

(intersección) x  

     -13,42 273,54  

Grados de libertad: 49 en total (es decir, nulo); 48 residuos

Desviación nula: 68.03 

Desviación Residual: 1.436e-08 AIC: 4

Mensajes de advertencia:

1: glm.fit: el algoritmo no convergió 

2: glm.fit: probabilidades ajustadas numéricamente 0 o 1 ocurrió 

[Ejecución completa con código de salida 0]

Cómo arreglar la advertencia:

Para superar esta advertencia, debemos modificar los datos de modo que la variable predictora no separe perfectamente la variable de respuesta. Para hacer eso, necesitamos agregar algo de ruido a los datos. A continuación se muestra el código que no proporcionará la advertencia de que el algoritmo no convergió.

R

# create random data which consists of
# 50 numbers
 
x <- rnorm(50)
# create data with fifty 1's
y <- rep(1, 50)
 
# if x value is less than 0 the at that
# index replace 1 with 0 in y
y[x < 0] <- 0
 
# create dataframe
data <- data.frame(x, y)
 
# first 6 rows
head(data)  
 
# add noise
data$x <- data$x + rnorm(50)
 
# first 6 rows after data modification
head(data)
 
# fitting logistic regression model
glm(y ~ x, data, family = "binomial")

Producción

           xy

1 -0.5787936 0

2 0.1105818 1

3 -0.5324901 0

4 0.6043288 1

5 -0.2479408 0

6 1.2583220 1

           xy

1 0.06909437 0

2 2.01936841 1

3 0.08818184 0

4 0.22230790 1

5 0.19720200 0

6 1.44250592 1

Llamada: glm(fórmula = y ~ x, familia = “binomial”, datos = datos)

Coeficientes:

(intersección) x  

    0.09985 1.97047  

Grados de libertad: 49 en total (es decir, nulo); 48 residuos

Desviación nula: 69.23 

Desviación residual: 40,85 AIC: 44,85

[Ejecución completa con código de salida 0]

Aquí, los datos originales de la variable predictora se cambian al agregar datos aleatorios (ruido). Por lo tanto, perturba la naturaleza perfectamente separable de los datos originales. Este proceso se basa completamente en los datos. Si la correlación entre dos variables cualquiera es anormalmente muy alta, intente eliminar esas observaciones y ejecute el modelo hasta que no aparezca el mensaje de advertencia.

Manejo de advertencias

Hay dos formas de manejar este glm.fit: el algoritmo no convergió advertencia. Se enumeran a continuación-

  • Usar regresión penalizada
  • Utilice la variable predictora para predecir perfectamente la variable de respuesta

Método 1: Utilice la regresión penalizada:

Podemos usar la regresión logística penalizada, como la regresión logística de lazo o la regularización de red elástica para manejar el algoritmo que no convergió en advertencia. Para realizar una regresión penalizada en los datos, se usa el método glmnet que acepta variable predictora, variable de respuesta, tipo de respuesta, tipo de regresión, etc. Veamos la sintaxis de esto:

Sintaxis: glmnet(x, y, familia = “binomial”, alfa = 1, lambda = NULL)

dónde

  • x es la variable predictora
  • y es la variable de respuesta
  • familia indica el tipo de respuesta, para respuesta binaria (0,1) use binomial
  • alfa representa el tipo de regresión
    • 1 es para la regresión de lazo
    • 0 es para regresión de cresta

Lambda define la contracción

A continuación se muestra el código de regresión penalizado implementado

R

# import necessary libraries
library(glmnet)
 
# create random data which consists
# of 50 numbers
x < - rnorm(50)
 
# create data with fifty 1's
y < - rep(1, 50)
 
# if x value is less than 0 the at that
# index replace 1 with 0 in y
y[x < 0] < - 0
 
# fitting lasso regression model
glmnet(x, y, family="binomial", alpha=1, lambda=NULL)

Método 2: use la variable predictora para predecir perfectamente la variable de respuesta

Cuando existe una separabilidad perfecta en los datos dados, entonces es fácil encontrar el resultado de la variable de respuesta por la variable predictora. Los datos que consideramos en este artículo tienen una clara separabilidad y para cada variable predictora negativa la respuesta siempre es 0 y para cada variable predictora positiva, la respuesta es 1. Entonces podemos predecir perfectamente la variable de respuesta usando la variable predictora.

Ejemplo:

A continuación se muestra el código que predice la variable de respuesta utilizando la variable predictora con la ayuda del método de predicción.

R

# create random data which consists of
# 5 numbers
x < - rnorm(5)
 
# create data with five 1's
y < - rep(1, 5)
 
# if x value is less than 0 the at that index
# replace 1 with 0 in y
y[x < 0] < - 0
 
# create dataframe
data1 < - data.frame(x, y)
 
data1
 
# create a linear model
model < - glm(y ~ x, data1, family="binomial")
 
# predicting response variables
predict(model, newdata=data.frame(y=c(0, 0, 1, 1, 1)))

Producción

   x         y
1 -0.4057154 0
2  1.9408241 1
3 -0.2419725 0
4  0.2374463 1
5 -1.6208003 0
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 
         1          2          3          4          5 
 -39.25575  189.68953   23.27980   23.49574 -157.80817 

[Execution complete with exit code 0]

Publicación traducida automáticamente

Artículo escrito por akhilvasabhaktula03 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *