Jak traktuje się wartości „NA” w glm w R

19

Mam tabelę danych T1, która zawiera prawie tysiąc zmiennych (V1) i około 200 milionów punktów danych. Dane są rzadkie, a większość wpisów to NA. Każdy punkt danych ma unikalną parę identyfikatora i daty, aby odróżnić je od innych.

Mam inną tabelę T2, która zawiera osobny zestaw zmiennych (V2). Ta tabela ma także parę identyfikatora i daty, które jednoznacznie identyfikują wpisy w T2.

Podejrzewamy, że dane w T1 można wykorzystać do przewidywania wartości zmiennych w T2.

Aby to udowodnić, pomyślałem o zastosowaniu modelu „glm” w R i sprawdzeniu, czy naprawdę możemy znaleźć jakąś zmienną w T2, która jest zależna od zmiennych w T1.

Dla każdej zmiennej w T2 zacząłem wyciągać wszystkie dane w T1 mające ten sam identyfikator i parę dat, co spowodowało znacznie mniejsze ~ 50 000 punktów danych dla niektórych zmiennych testowych.

Problemy, z którymi mam teraz do czynienia przy stosowaniu glm, są następujące.

  1. W niektórych przypadkach pokazuje mi błąd „nie znaleziono dopasowania” i ostrzeżenie „glm.fit: algorytm nie zszedł”. Nie jestem pewien, dlaczego to pokazano?

  2. Jak traktowane są NA w GLM? Czy usuwa najpierw wszystkie rekordy dotyczące „NA”, a następnie wykonuje dopasowanie?

  3. Czy to dobra strategia, aby najpierw usunąć wszystkie NA, a następnie wywołać „glm”. Obawiam się, że może to znacznie zmniejszyć punkty danych, ponieważ większość z nich to NA.

  4. Którą metodę stosuje się do obliczenia współczynników. Nie mogłem znaleźć żadnej strony internetowej, papieru ani książki, która omawiałaby sposób obliczania wyników.

Przetestowałem GLM z „NA” i bez, i znalazłem różne odpowiedzi na pytania, które punkty NA są brane pod uwagę przy dopasowywaniu danych:

Przykład 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 

Przykład 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 
użytkownik 1140126
źródło

Odpowiedzi:

27

NA Obsługa: Możesz kontrolować, w jaki sposób glm obsługuje brakujące dane. glm () ma argument na.actionwskazujący, która z poniższych funkcji ogólnych powinna być używana przez glm do obsługi NA w danych:

  • na.omitoraz na.exclude: obserwacje są usuwane, jeśli zawierają jakiekolwiek brakujące wartości; jeśli zostanie użyty na.exclude, niektóre funkcje wprowadzą resztki i prognozy do prawidłowej długości, wstawiając NA dla pominiętych przypadków.
  • na.pass: przechowuj wszystkie dane, w tym NA
  • na.fail: zwraca obiekt tylko wtedy, gdy nie zawiera brakujących wartości

Jeśli nie ustawisz na.action, glm () sprawdzi globalne opcje R, aby sprawdzić, czy jest tam ustawiona wartość domyślna. Możesz uzyskać dostęp do opcji za pomocą getOption("na.action")lub options("na.action")i możesz to ustawić, na przykład options(na.action = "na.omit") Jednak z wyjścia R podanego w przykładzie 1 wydaje się, że ustawiasz na.action = na.omit. Tak, tak, przynajmniej w tym przypadku usuwasz wszystkie skrzynki / wiersze z NA przed dopasowaniem. Co więcej, jestem prawie pewien, na.action = na.passże spowodowałby błąd glm (), gdy dane mają NA (spróbuj).

Błędy: glm () stosuje procedurę iteracyjną (iterowane ważone najmniejszych kwadratów; IWLS) w celu oszacowania maksymalnego prawdopodobieństwa. Czasem pojawiają się błędy, ponieważ przejdzie tylko przez określoną liczbę iteracji, a jeśli nie ma dobrego dopasowania, poddaje się. Liczba ta jest kontrolowana przez argument maxit, którym domyślnie jest maxit = 25. Możesz spróbować ustawić go wyżej, ale oczywiście potrwa to dłużej. (Jeśli ustawisz trace=TRUE, pokaże wynik każdej iteracji.)

Inne źródła informacji: plik pomocy dla glm jest dostępny z ?glmlub help(glm)wyjaśnia wiele z tego. Dwa inne przydatne zasoby to:

MattBagg
źródło