Cómo se tratan los valores 'NA' en glm en R

19

Tengo una tabla de datos T1, que contiene casi mil variables (V1) y alrededor de 200 millones de puntos de datos. Los datos son escasos y la mayoría de las entradas son NA. Cada punto de datos tiene un par único de identificación y fecha para distinguir de otro.

Tengo otra tabla T2, que contiene un conjunto separado de variables (V2). Esta tabla también tiene un par de identificación y fecha que identifica de forma exclusiva las entradas en T2.

Sospechamos que los datos en T1 pueden usarse para predecir valores de variables en T2.

Para probar esto, pensé en aplicar el modelo 'glm' en R y verificar si realmente podemos encontrar alguna variable en T2 que dependa de las variables en T1.

Para cada variable en T2, comencé a extraer todos los datos en T1 con el mismo par de identificación y fecha, lo que resultó en puntos de datos mucho más pequeños ~ 50K para algunas de las variables de prueba.

Los problemas que estoy enfrentando ahora con la aplicación de glm son los siguientes.

  1. En algunos casos, me muestra un error 'fit not found' y una advertencia 'glm.fit: el algoritmo no convergió'. No estoy seguro de por qué se muestra?

  2. ¿Cómo se tratan los NA en glm? ¿Elimina todos los registros que involucran 'NA' primero y luego realiza el ajuste?

  3. ¿Es una buena estrategia eliminar primero todas las NA y luego llamar 'glm'? Me temo que esto puede reducir significativamente los puntos de datos, ya que la mayoría de ellos son NA.

  4. Qué método se usa para calcular los coeficientes. No pude encontrar ningún sitio web o documento o libro que discuta cómo se calcula la salida.

Probé glm con y sin 'NA' y encontré diferentes respuestas sobre los puntos que se consideran NA mientras se ajustan los datos:

Ejemplo 1:

> tmpData
  x1 x2 x3        Y
1  1  1  1        3
2  1  0  4        5
3  1  2  3        6
4  0  3  1        4

Call:  glm(formula = as.formula(paste(dep, " ~ ", paste(xn, collapse = "+"))), 
    na.action = na.exclude)

Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  
                        5.551e-16                          1.000e+00                          1.000e+00  
as.numeric(unlist(tmpData["x3"]))  
                        1.000e+00  

Degrees of Freedom: 3 Total (i.e. Null);  0 Residual
Null Deviance:      5 
Residual Deviance: 9.861e-31    AIC: -260.6 

Ejemplo 2

'x1'    'x2'    'x3'    'Y'
100000  1   NA  2
1   1   1   3
1   NA  -1124   2
1   0   4   5
1   2   3   6
0   3   1   4



Coefficients:
                      (Intercept)  as.numeric(unlist(tmpData["x1"]))  as.numeric(unlist(tmpData["x2"]))  as.numeric(unlist(tmpData["x3"]))  
                       -2.3749044                         -0.0000625                          0.6249899                          1.8749937  

Degrees of Freedom: 5 Total (i.e. Null);  2 Residual
Null Deviance:      13.33 
Residual Deviance: 1.875    AIC: 20.05 
usuario1140126
fuente

Respuestas:

27

Manejo de NA: puede controlar cómo glm maneja los datos faltantes. glm () tiene un argumento na.actionque indica cuál de las siguientes funciones genéricas debe usar glm para manejar NA en los datos:

  • na.omity na.exclude: las observaciones se eliminan si contienen valores faltantes; Si se utiliza na.exclude, algunas funciones rellenarán los residuos y las predicciones a la longitud correcta insertando NA para los casos omitidos.
  • na.pass: mantener todos los datos, incluidos los NA
  • na.fail: devuelve el objeto solo si no contiene valores faltantes

Si no configura na.action, glm () verificará las opciones globales de R para ver si hay un valor predeterminado allí. Puede acceder a sus opciones con getOption("na.action")o options("na.action")y puede configurarlo con, por ejemplo, options(na.action = "na.omit") Sin embargo, desde la salida R que proporciona en el ejemplo 1, parece que está configurando na.action = na.omit. Entonces, sí, al menos en ese caso, está eliminando todos los casos / filas con NA antes de ajustar. Además, estoy bastante seguro de na.action = na.passque fallará glm () cuando los datos tengan NA (pruébelo).

Errores: glm () está utilizando un procedimiento iterativo (mínimos cuadrados ponderados iterativos; IWLS) para hacer estimaciones de máxima verosimilitud. A veces se obtienen errores porque solo pasará por un número predefinido de iteraciones y, si no tiene un buen ajuste, entonces se da por vencido. Este número está controlado por el argumento maxit, que por defecto es maxit = 25. Puede intentar configurarlo más alto, aunque, por supuesto, esto llevará más tiempo. (Si lo configura trace=TRUE, le mostrará el resultado de cada iteración).

Otras fuentes de información: El archivo de ayuda para glm es accesible con ?glmo help(glm)y explica gran parte de esto. Otros dos recursos útiles son:

MattBagg
fuente