Obsługa brakujących/niekompletnych Danych W R--czy istnieje funkcja do maskowania, ale nie usuwania NAs?

Jak można się spodziewać po DSL przeznaczonym do analizy danych, R radzi sobie bardzo dobrze z brakującymi/niekompletnymi danymi, na przykład:

Wiele funkcji R ma na,rm zaznacz, że po ustawieniu na TRUE Usuń NAs:

>>> v = mean( c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T)
>>> v
      (5, 6, 12, 87, 9, 43, 67)

Ale jeśli chcesz mieć do czynienia z NAs przed wywołaniem funkcji, musisz zrobić coś takiego:

Aby usunąć każde "NA" z wektora:

vx = vx[!is.na(a)]

Aby usunąć każde "NA" z wektora i zastąpić je w / a '0':

ifelse(is.na(vx), 0, vx)

Aby usunąć cały wiersz zawierający "NA" z ramki danych:

dfx = dfx[complete.cases(dfx),]

Wszystkie te funkcje na stałeusuwają 'NA' lub wiersze z 'NA' w nich.

Czasami jednak nie jest to dokładnie to, czego chcesz-wykonanie kopii " NA " -wyciętej ramki danych może być konieczne do następnego kroku w obiegu pracy, ale w kolejnych krokach często chcesz odzyskać te wiersze (np. wcześniejsze wywołanie 'complete cases', ale ta kolumna nie ma w sobie wartości 'NA').

Aby było jak najbardziej jasne, czego szukam: python/numpy ma klasę masked array, z metodą mask, która pozwala ukryć--ale nie usunąć--NAs podczas wywołania funkcji. Czy istnieje analogiczna Funkcja W R?

Author: Brian Tompsett - 汤莱恩, 2010-04-10

3 answers

Co dokładnie zrobić z brakującymi danymi -- które mogą być oznaczone jako NA jeśli wiemy, że ich brakuje -- mogą się różnić w zależności od domeny.

Aby wziąć przykład związany z szeregami czasowymi, gdzie można pominąć, wypełnić, interpolować, lub interpolować inaczej, ... czy po prostu (bardzo przydatne i popularne) zoo posiada wszystkie te funkcje związane z obsługąNA:

zoo::na.approx  zoo::na.locf    
zoo::na.spline  zoo::na.trim    

Pozwalający na przybliżenie (przy użyciu różnych algorytmów), przeniesienie lub do tyłu, użyj interpolacji splajnu lub przycięcia.

Innym przykładem mogą być liczne brakujące pakiety imputacji na CRAN - często dostarczające rozwiązania specyficzne dla domeny. [Więc jeśli nazywasz R DSL, co to jest? "Rozwiązania specyficzne dla subdomen dla języków specyficznych dla domen" lub SDSSFDSL? Całkiem niezłe:)] [[6]}

Ale dla Twojego konkretnego pytania: Nie, Nie znam znacznika poziomu bitowego w bazie R, który pozwala oznaczyć obserwacje jako "do wykluczenia". Przypuszczam, że większość użytkowników R do funkcji takich jak na.omit() et al lub użyj opcji na.rm=TRUE, o której wspomniałeś.

 19
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 14:50:51

Jest to dobra praktyka, aby spojrzeć na dane, stąd wnioskować o rodzaju brakujących wartości: czy MCAR( missing complete and random), MAR (missing at random) lub MNAR (missing not at random)? Na podstawie tych trzech typów można zbadać podstawową strukturę brakujących wartości i stwierdzić, czy imputacja jest w ogóle stosowana (masz szczęście, jeśli nie jest MNAR, ponieważ w takim przypadku brakujące wartości są uważane za nie-ignorowalne i są związane z jakimś nieznanym podstawowym wpływem, czynnikiem, proces, zmienna... nieważne).

Rozdział 3. w "interaktywna i dynamiczna Grafika dla analityka danych z R i GGobi" przez Di Cook i Deborah Swayne jest świetnym odniesieniem do tego tematu.

Zobaczysz norm pakiet w akcji w tym rozdziale, ale Hmisc pakiet ma procedury imputacji danych. Amelia, cat (w przypadku kategorycznych braków przypisyzobacz też), mi, mitools, VIM, vmv (do wizualizacji brakujących danych).

Szczerze, Nadal nie do końca rozumiem twoje pytanie o statystyki, czy o możliwości przypisywania danych R? Myślę, że podałem dobre referencje na drugim i o pierwszym: możesz zastąpić swoje NA albo z tendencją centralną( średnia, mediana lub podobne), a tym samym zmniejszyć zmienność, lub z losową stałą "wyciągniętą" obserwowanych (zarejestrowanych) przypadków, lub możesz zastosować analizę regresji ze zmienną, która zawiera NA jako kryteria, a inne zmienne jako predyktory, następnie przypisać pozostałości do NA ' s... to elegancki sposób radzenia sobie z NA, ale dość często nie pójdzie łatwo na procesorze (mam Celeron Na 1.1 GHz, więc muszę być delikatny).

Jest to problem optymalizacji... nie ma jednoznacznej odpowiedzi, powinieneś zdecydować,co / dlaczego trzymasz się jakiejś metody. Ale zawsze dobrze jest patrzeć na dane! =) Koniecznie sprawdź Cook & Swayne - to doskonały, umiejętnie napisany przewodnik. "Modele liniowe z R" przez Faraway zawiera również rozdział o brakujących wartościach.

Więc tam.

Powodzenia! =)
 15
Author: aL3xa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-08 03:03:10

Funkcja na.exclude() brzmi tak, jak chcesz, chociaż jest to tylko opcja dla niektórych (ważnych) funkcji.

W kontekście dopasowania i pracy z modelami, R ma rodzinę ogólnych funkcji do czynienia z NAs: na.fail(), na.pass(), na.omit(), i na.exclude(). Są to z kolei argumenty dla niektórych kluczowych funkcji modelowania R, takich jak lm(), glm(), i nls(), jak również funkcje w pakietach MASS, rpart i survival.

Wszystkie cztery funkcje ogólne działają w zasadzie jak filtry. na.fail() przekaże dane tylko wtedy, gdy nie ma serwera NAs, w przeciwnym razie nie powiedzie się. Przepuszcza wszystkie sprawy. na.omit() i na.exclude() opuszczą sprawy z NAs i przepuszczą Pozostałe sprawy. Ale na.exclude() ma inny atrybut, który mówi funkcjom przetwarzającym wynikowy obiekt, aby uwzględniały NAs. Możesz zobaczyć ten atrybut, jeśli zrobiłeś attributes(na.exclude(some_data_frame)). Oto demonstracja tego, jak na.exclude() zmienia zachowanie predict() w kontekście modelu liniowego.

fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40))

## We can tell the modeling function how to handle the NAs
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata)

predict(r_omitted)
#        1        2        4 
# 1.115385 1.846154 4.038462 
predict(r_excluded)
#        1        2        3        4 
# 1.115385 1.846154       NA 4.038462 

Twój default na.akcja, nawiasem mówiąc, jest określona przez options("na.action") i zaczyna się jako na.omit(), ale można ją ustawić.

 8
Author: MattBagg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-13 18:30:07