Jak poradzić sobie z wieloma rodzajami missingness w R?

Wiele ankiet ma kody dla różnych rodzajów missingness. Na przykład książka kodowa może wskazywać:

0-99 DANE

-1 pytanie nie zadane

-5 Nie wiem

-7 odmówił odpowiedzi

-9 moduł nie pytany

Stata ma piękne możliwości radzenia sobie z wieloma rodzajami missingness, ponieważ pozwala na przypisanie generycznego . do brakujących danych, ale bardziej konkretne rodzaje brakujących danych (.na,,,b, .c, ..., .z) są również dozwolone. Wszystkie polecenia, które patrzą na missingness raport odpowiedzi dla wszystkich brakujących wpisów jednak określone, ale można sortować różne rodzaje missingness później, jak również. Jest to szczególnie pomocne, gdy uważasz, że odmowa odpowiedzi ma inne implikacje dla strategii przypisania niż pytanie, którego nie zadano.

Nigdy nie natknąłem się na taki obiekt w R, ale naprawdę chciałbym mieć taką możliwość. Czy są jakieś sposoby oznaczania kilka różnych typów NA? Mógłbym sobie wyobrazić tworzenie większej ilości danych (albo wektor długości nrow (mój.data.ramka) zawierające typy missingness, lub bardziej zwarty indeks, które wiersze miały jakie typy missingness), ale to wydaje się dość nieporęczne.

Author: Metrics, 2011-03-17

6 answers

Wiem czego szukasz, a to nie jest zaimplementowane w R. nie mam wiedzy o pakiecie, w którym to jest zaimplementowane, ale nie jest to zbyt trudne do zakodowania.

Wykonalnym sposobem jest dodanie ramki danych do atrybutów, zawierającej kody. Aby zapobiec podwojeniu całej ramki danych i zaoszczędzić miejsce, dodałbym indeksy w tej ramce zamiast rekonstruować pełną ramkę danych.

Eg:

NACode <- function(x,code){
    Df <- sapply(x,function(i){
        i[i %in% code] <- NA
        i
    })

    id <- which(is.na(Df))
    rowid <- id %% nrow(x)
    colid <- id %/% nrow(x) + 1
    NAdf <- data.frame(
        id,rowid,colid,
        value = as.matrix(x)[id]
    )
    Df <- as.data.frame(Df)
    attr(Df,"NAcode") <- NAdf
    Df
}

Pozwala to na:

> Df <- data.frame(A = 1:10,B=c(1:5,-1,-2,-3,9,10) )
> code <- list("Missing"=-1,"Not Answered"=-2,"Don't know"=-3)
> DfwithNA <- NACode(Df,code)
> str(DfwithNA)
'data.frame':   10 obs. of  2 variables:
 $ A: num  1 2 3 4 5 6 7 8 9 10
 $ B: num  1 2 3 4 5 NA NA NA 9 10
 - attr(*, "NAcode")='data.frame':      3 obs. of  4 variables:
  ..$ id   : int  16 17 18
  ..$ rowid: int  6 7 8
  ..$ colid: num  2 2 2
  ..$ value: num  -1 -2 -3

Funkcja może należy również dostosować, aby dodać dodatkowy atrybut, który daje etykietę dla różnych wartości, patrz również to pytanie . Możesz cofnąć przez:

ChangeNAToCode <- function(x,code){
    NAval <- attr(x,"NAcode")
    for(i in which(NAval$value %in% code))
        x[NAval$rowid[i],NAval$colid[i]] <- NAval$value[i]

    x
}

> Dfback <- ChangeNAToCode(DfwithNA,c(-2,-3))
> str(Dfback)
'data.frame':   10 obs. of  2 variables:
 $ A: num  1 2 3 4 5 6 7 8 9 10
 $ B: num  1 2 3 4 5 NA -2 -3 9 10
 - attr(*, "NAcode")='data.frame':      3 obs. of  4 variables:
  ..$ id   : int  16 17 18
  ..$ rowid: int  6 7 8
  ..$ colid: num  2 2 2
  ..$ value: num  -1 -2 -3

To pozwala zmienić tylko kody, które chcesz, jeśli kiedykolwiek jest to konieczne. Funkcja może być dostosowana do zwracania wszystkich kodów, gdy nie podano żadnego argumentu. Podobne funkcje można skonstruować, aby wyodrębnić dane w oparciu o kod, myślę, że możesz sam to rozgryźć.

Ale w jednej linii: używając atrybutów i indeksy mogą być dobrym sposobem na to.

 10
Author: Joris Meys,
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
2017-05-23 12:32:32

Najbardziej oczywistym sposobem wydaje się użycie dwóch wektorów:

  • Wektor 1: wektor danych, w którym wszystkie brakujące wartości są reprezentowane za pomocą NA. Na przykład, c(2, 50, NA, NA)
  • Wektor 2: wektor czynników, wskazujący rodzaj danych. Na przykład, factor(c(1, 1, -1, -7)) gdzie współczynnik 1 wskazuje na prawidłowe pytanie.

Posiadanie tej struktury dałoby ci pewną elastyczność, ponieważ wszystkie standardowe argumenty na.rm nadal działają z Twoim wektorem danych, ale możesz użyć bardziej złożone pojęcia z wektorem czynnikowym.

Aktualizacja po pytaniach od @gsk3

  1. przechowywanie danych znacznie się zwiększy: przechowywanie danych podwoi się. Jeśli jednak podwojenie rozmiaru powoduje prawdziwy problem, warto pomyśleć o innych strategiach.
  2. programy nie radzą sobie z tym automatycznie.To dziwny komentarz. Niektóre funkcje domyślnie obsługują NAs w rozsądny sposób. Jednak chcesz leczyć NAs inaczej więc oznacza to, że będziesz musiał zrobić coś na zamówienie. Jeśli chcesz po prostu analizować dane, w których NA są "Question not asked", po prostu użyj podzbioru ramki danych.
  3. teraz musisz manipulować dwoma wektorami razem za każdym razem, gdy chcesz koncepcyjnie manipulować zmienną przypuszczam, że przewidywałem ramkę danych dwóch wektorów. Chciałbym podzbiór ramki danych na podstawie drugiego wektora.
  4. nie ma standardowej implementacji, więc moje rozwiązanie może / align = "left" / Jeśli jednak pakiet z półki nie spełnia Twoich potrzeb ,to (prawie) z definicji chcesz zrobić coś innego.

Powinienem stwierdzić, że nigdy nie analizowałem danych z badań (chociaż analizowałem duże zbiory danych biologicznych). Moje odpowiedzi powyżej wydają się dość defensywne, ale nie jest to moim zamiarem. Myślę, że twoje pytanie jest dobre i jestem zainteresowany innymi odpowiedziami.

 6
Author: csgillespie,
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
2011-03-17 15:16:38

To coś więcej niż tylko" techniczny " problem. Powinieneś mieć dokładne tło statystyczne w brakującej analizie wartości i imputacji. Jedno rozwiązanie wymaga gry z R i ggobi. Możesz przypisać skrajnie ujemne wartości do kilku typów NA( umieść NAs na marginesie) i wykonać pewną diagnostykę "ręcznie". Należy pamiętać, że istnieją trzy rodzaje NA:

  • MCAR-brak całkowicie losowo, gdzie p (brak|obserwowany,niezauważony) = P (brak)
  • MAR - missing at random, where P (missing|observed,unobserved) = P (missing|observed)
  • MNAR-brakujący nie losowo( lub nie-ignorowalny), gdzie p(brakujący|obserwowany, niezauważalny) nie może być w żaden sposób określony ilościowo.

IMHO to pytanie jest bardziej odpowiednie dla Crossvalided.

Ale tutaj jest link z tak, że może się przydać:

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

 4
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
2017-05-23 10:30:53

Możesz całkowicie zrezygnować z NA i po prostu użyć zakodowanych wartości. Następnie można je również zwinąć do globalnej brakującej wartości. Często wolę kodować bez NA, ponieważ NA może powodować problemy w kodowaniu i lubię być w stanie kontrolować dokładnie to, co dzieje się w analizie. If have również używane ciąg "NA" do reprezentowania NA, który często sprawia, że rzeczy łatwiejsze.

-Ralph Winters

 4
Author: Ralph Winters,
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
2011-03-17 13:32:54

Zwykle używam ich jako wartości, jak już zasugerował Ralph, ponieważ Typ brakującej wartości wydaje się być danymi, ale w jednym lub dwóch przypadkach, gdy chciałem go głównie do dokumentacji, użyłem atrybutu na wartości, np.

> a <- NA
> attr(a, 'na.type') <- -1
> print(a)
[1] NA
attr(,"na.type")
[1] -1

W ten sposób moja analiza jest czysta, ale nadal przechowuję dokumentację. Ale jak powiedziałem: zazwyczaj zachowuję wartości.

/ Align = "left" /
 1
Author: Allan Engelhardt,
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
2011-03-19 15:23:26

Id jak dodać do "komponentu tła statystycznego" tutaj. Analiza statystyczna z brakujących danych jest bardzo dobrym odczytem na ten temat.

 1
Author: Matt Bannert,
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
2011-11-11 13:08:43