29 votos

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

Tengo una tabla de datos T1, que contiene casi mil variables (V1) y unos 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 id y fecha para distinguirlo de otro.

Tengo otra tabla T2, que contiene un conjunto separado de variables (V2). Esta tabla también tiene un par de id y fecha que identifican de forma única las entradas en T2.

Sospechamos que los datos de T1 pueden utilizarse para predecir los valores de las variables de T2.

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

Para cada variable de la T2, empecé a sacar todos los datos de la T1 que tuvieran el mismo par de id y fecha, lo que dio como resultado unos puntos de datos mucho más pequeños de ~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 "ajuste no encontrado" y la advertencia "glm.fit: el algoritmo no converge". No estoy seguro de por qué se muestra?

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

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

  4. Qué método se utiliza para calcular los coeficientes. No he podido encontrar ningún sitio web, documento o libro que hable de cómo se calcula el resultado.

He probado glm con y sin 'NAs' y he encontrado respuestas diferentes que apuntan a que los NAs son considerados 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

36voto

Olivier Pons Puntos 118

NA Manipulación: Puede controlar la forma en que glm maneja los datos perdidos. glm() tiene un argumento na.action que indica cuál de las siguientes funciones genéricas debe ser utilizada por glm para manejar NA en los datos:

  • na.omit y na.exclude Si se utiliza na.exclude, algunas funciones rellenarán los residuos y las predicciones hasta alcanzar la longitud correcta insertando NAs para los casos omitidos.
  • na.pass Conservar todos los datos, incluidos los NA
  • na.fail : devuelve el objeto sólo si no contiene valores perdidos

Si no se establece na.action, glm() comprobará las opciones globales de R para ver si se establece allí un valor por defecto. Puede acceder a sus opciones con getOption("na.action") o options("na.action") y se puede establecer con, por ejemplo, options(na.action = "na.omit") Sin embargo, a partir de la salida de R que proporcionas en el ejemplo 1, parece que estás configurando na.action = na.omit . Así que, sí, al menos en ese caso, está eliminando todos los casos/filas con NAs antes de encajar. Además, estoy bastante seguro de que na.action = na.pass haría que glm() fallara cuando los datos tienen NAs (pruébelo).

Errores: glm() utiliza un procedimiento iterativo (mínimos cuadrados ponderados iterados; IWLS) para realizar estimaciones de máxima probabilidad. A veces se producen errores porque sólo pasará por un número predefinido de iteraciones y, si no tiene un buen ajuste entonces, se rinde. Este número se controla con el argumento maxit, que por defecto es maxit = 25 . Puedes probar a ponerlo más alto, aunque, por supuesto, esto te llevará más tiempo. (Si se ajusta trace=TRUE le mostrará el resultado de cada iteración).

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

9 votos

Puedo ser definitivo en esto: glm no utilizará filas que contengan NAs, sin importar lo que se establezca na.action a. Utilizando na.fail arrojará un error, na.pass sólo pospondrá el error, na.omit y na.exclude eliminará las filas. El código de álgebra lineal subyacente no tiene capacidad para manejar los datos que faltan.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X