Wie die 'NA'-Werte in glm in R behandelt werden

19

Ich habe eine Datentabelle T1, die fast tausend Variablen (V1) und rund 200 Millionen Datenpunkte enthält. Die Daten sind spärlich und die meisten Einträge sind NA. Jeder Datenpunkt hat ein eindeutiges Paar aus ID und Datum, um sich von anderen zu unterscheiden.

Ich habe eine andere Tabelle T2, die einen separaten Satz von Variablen enthält (V2). Diese Tabelle hat auch ein Paar aus ID und Datum, das Einträge in T2 eindeutig identifiziert.

Wir vermuten, dass die Daten in T1 verwendet werden können, um Werte von Variablen in T2 vorherzusagen.

Um dies zu beweisen, habe ich mir überlegt, das 'glm'-Modell in R anzuwenden und zu prüfen, ob wir in T2 wirklich eine Variable finden können, die von Variablen in T1 abhängig ist.

Für jede Variable in T2 habe ich begonnen, alle Daten in T1 mit demselben ID- und Datumspaar zu extrahieren, was bei einigen Testvariablen zu viel kleineren ~ 50K-Datenpunkten führte.

Die Probleme, denen ich jetzt mit der Anwendung von glm gegenüberstehe, sind wie folgt.

  1. In einigen Fällen wird der Fehler "Nicht gefunden" und die Warnung "glm.fit: Algorithmus ist nicht konvergiert" angezeigt. Ich bin nicht sicher, warum es gezeigt wird?

  2. Wie werden die NAs in glm behandelt? Entfernt es zuerst alle Datensätze, die 'NA' betreffen, und führt dann eine Anpassung durch?

  3. Ist es eine gute Strategie, zuerst alle NAs zu entfernen und dann 'glm' aufzurufen? Ich befürchte, dass dies die Datenpunkte erheblich reduzieren könnte, da die meisten von ihnen NAs sind.

  4. Mit welcher Methode werden die Koeffizienten berechnet? Ich konnte keine Website, kein Papier oder kein Buch finden, auf denen die Berechnung der Ausgabe erläutert wird.

Ich habe glm mit und ohne 'NAs' getestet und verschiedene Antworten gefunden, die beim Anpassen der Daten berücksichtigt werden:

Beispiel 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 

Beispiel 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
quelle

Antworten:

27

NA-Behandlung: Sie können steuern, wie glm mit fehlenden Daten umgeht. glm () hat ein Argument, na.actiondas angibt, welche der folgenden generischen Funktionen von glm verwendet werden sollen, um NA in den Daten zu behandeln:

  • na.omitund na.exclude: Beobachtungen werden entfernt, wenn sie fehlende Werte enthalten; Wenn na.exclude verwendet wird, füllen einige Funktionen Residuen und Vorhersagen auf die richtige Länge auf, indem sie NAs für ausgelassene Fälle einfügen.
  • na.pass: Bewahren Sie alle Daten auf, einschließlich der NAs
  • na.fail: gibt das Objekt nur zurück, wenn es keine fehlenden Werte enthält

Wenn Sie na.action nicht festlegen, überprüft glm () die globalen Optionen von R, um festzustellen, ob dort eine Standardeinstellung festgelegt ist. Sie können auf Ihre Optionen mit getOption("na.action")oder zugreifen options("na.action")und diese zum Beispiel mit festlegen. options(na.action = "na.omit") Aus der in Beispiel 1 bereitgestellten R-Ausgabe geht jedoch hervor, dass Sie eine Einstellung vornehmen na.action = na.omit. Also, ja, zumindest in diesem Fall entfernen Sie alle Fälle / Zeilen mit NAs, bevor Sie sie anpassen. Außerdem bin ich mir ziemlich sicher na.action = na.pass, dass glm () fehlschlagen würde, wenn die Daten NAs haben (probieren Sie es aus).

Fehler: glm () verwendet ein iteratives Verfahren (iterierte gewichtete kleinste Quadrate; IWLS), um Schätzungen der maximalen Wahrscheinlichkeit vorzunehmen. Es kommt manchmal vor, dass Fehler auftreten, weil nur eine vordefinierte Anzahl von Iterationen durchlaufen wird. Wenn dies nicht passt, gibt es auf. Diese Zahl wird durch das Argument maxit gesteuert, das standardmäßig lautet maxit = 25. Sie können versuchen, eine höhere Einstellung zu wählen, dies dauert jedoch länger. (Wenn Sie festlegen trace=TRUE, wird das Ergebnis jeder Iteration angezeigt.)

Andere Informationsquellen: Die Hilfedatei für glm ist mit ?glmoder zugänglich help(glm)und erklärt vieles davon. Zwei weitere nützliche Ressourcen sind:

MattBagg
quelle