Comment les valeurs «NA» sont traitées en glm dans R

19

J'ai un tableau de données T1, qui contient près d'un millier de variables (V1) et environ 200 millions de points de données. Les données sont rares et la plupart des entrées sont NA. Chaque point de données a un identifiant et une paire de dates uniques pour se distinguer les uns des autres.

J'ai une autre table T2, qui contient un ensemble distinct de variables (V2). Cette table a également une paire id et date qui identifie de manière unique les entrées dans T2.

Nous pensons que les données de T1 peuvent être utilisées pour prédire les valeurs des variables de T2.

Pour le prouver, j'ai pensé appliquer le modèle «glm» dans R et vérifier si nous pouvons vraiment trouver une variable dans T2 qui dépend de variables dans T1.

Pour chaque variable de T2, j'ai commencé à extraire toutes les données de T1 ayant la même paire d'ID et de date, ce qui a entraîné des points de données beaucoup plus petits de ~ 50 000 pour certaines des variables de test.

Les problèmes auxquels je suis confronté maintenant avec l'application de glm sont les suivants.

  1. Dans certains cas, il me montre une erreur «fit not found» et un avertissement «glm.fit: l'algorithme n'a pas convergé». Je ne sais pas pourquoi est-ce affiché?

  2. Comment les AN sont-ils traités en glm? Supprime-t-il d'abord tous les enregistrements impliquant «NA», puis effectue-t-il l'ajustement?

  3. Est-ce une bonne stratégie de supprimer d'abord toutes les NA, puis d'appeler «glm». Je crains que cela ne réduise considérablement les points de données car la plupart d'entre eux sont des NA.

  4. Quelle méthode est utilisée pour calculer les coefficients. Je n'ai pu trouver aucun site Web, papier ou livre expliquant comment la sortie est calculée.

J'ai testé glm avec et sans 'NAs' et trouvé des réponses différentes qui indiquent que les NA sont prises en compte lors de l'ajustement des données:

Exemple 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 

Exemple 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 
user1140126
la source

Réponses:

27

NA Handling: vous pouvez contrôler la façon dont glm gère les données manquantes. glm () a un argument na.actionqui indique laquelle des fonctions génériques suivantes doit être utilisée par glm pour gérer NA dans les données:

  • na.omitet na.exclude: les observations sont supprimées si elles contiennent des valeurs manquantes; si na.exclude est utilisé, certaines fonctions remplissent les résidus et les prédictions à la bonne longueur en insérant des NA pour les cas omis.
  • na.pass: conserver toutes les données, y compris les AN
  • na.fail: renvoie l'objet uniquement s'il ne contient aucune valeur manquante

Si vous ne définissez pas na.action, glm () vérifiera les options globales de R pour voir si une valeur par défaut y est définie. Vous pouvez accéder à vos options avec getOption("na.action")ou options("na.action")et vous pouvez le définir avec, par exemple, options(na.action = "na.omit") Cependant, à partir de la sortie R que vous fournissez dans l'exemple 1, il semble que vous définissez na.action = na.omit. Donc, oui, dans ce cas au moins, vous supprimez tous les cas / lignes avec des NA avant de les ajuster. De plus, je suis sûr que na.action = na.passcela entraînerait l'échec de glm () lorsque les données ont des NA (essayez-le).

Erreurs: glm () utilise une procédure itérative (moindres carrés pondérés itérés; IWLS) pour effectuer des estimations de vraisemblance maximale. Vous obtenez parfois des erreurs car il ne passera que par un nombre prédéfini d'itérations et, s'il n'a pas un bon ajustement, il abandonne. Ce nombre est contrôlé par l'argument maxit, qui est par défaut maxit = 25. Vous pouvez essayer de le régler plus haut, bien sûr, cela prendra plus de temps. (Si vous le définissez, trace=TRUEil vous montrera le résultat de chaque itération.)

Autres sources d'information: Le fichier d'aide de glm est accessible avec ?glmou help(glm)et explique une grande partie de cela. Deux autres ressources utiles sont:

MattBagg
la source