Jak wykonać przypisanie wartości w bardzo dużej liczbie punktów danych?

12

Mam bardzo duży zestaw danych i brakuje około 5% wartości losowych. Te zmienne są ze sobą skorelowane. Poniższy przykładowy zestaw danych R jest tylko zabawkowym przykładem z fałszywymi skorelowanymi danymi.

set.seed(123)

# matrix of X variable 
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated 

N <- 2000000*0.05 # 5% random missing values 
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA 
> xmat[1:10,1:10]
         M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1  -1 -1  1 NA  0 -1  1 -1  0  -1
sample2   1  1 -1  1  0  0  1 -1 -1   1
sample3   0  0  1 -1 -1 -1  0 -1 -1  -1
sample4   1  0  0 -1 -1  1  1  0  1   1
sample5  NA  0  0 -1 -1  1  0 NA  1  NA
sample6  -1  1  0  1  1  0  1  1 -1  -1
sample7  NA  0  1 -1  0  1 -1  0  1  NA
sample8   1 -1 -1  1  0 -1 -1  1 -1   0
sample9   0 -1  0 -1  1 -1  1 NA  0   1
sample10  0 -1  1  0  1  0  0  1 NA   0

Czy istnieje (najlepszy) sposób na przypisanie brakujących wartości w tej sytuacji? Czy algorytm Losowego Lasu jest pomocny? Wszelkie działające rozwiązania w R byłyby bardzo mile widziane.

Edycje:

(1) Brakujące wartości są losowo rozdzielane między zmienne i próbki. Ponieważ liczba zmiennych jest bardzo duża (tutaj w tym przykładzie - 10000), podczas gdy liczba próbek jest tutaj mała w powyższym fikcyjnym przykładzie wynosi około 200. Więc kiedy patrzymy na każdą próbkę ze wszystkich zmiennych (10000), istnieje duże prawdopodobieństwo, że przy niektórych zmiennych będzie brakować wartości - z powodu dużej liczby zmiennych. Więc samo usunięcie próbki nie jest opcją.

(2) Zmienna może być traktowana zarówno jako ilościowa, jak i jakościowa (binarna) w procesie przypisywania. Jedynym osądem jest to, jak dobrze możemy to przewidzieć (dokładność). Więc prognozy takie jak 0,98 zamiast 1 mogą być do przyjęcia raczej 0 vs 1 lub -1 vs 1. Mogę potrzebować kompromisu między czasem obliczeniowym a dokładnością.

(3) Zastanawiam się, jak nadmierne dopasowanie może wpływać na wyniki, ponieważ liczba zmiennych jest duża w porównaniu z liczbą próbek.

(4) Ponieważ całkowita ilość brakujących wartości wynosi około 5% i jest losowa (nie jest skoncentrowana w żadnych zmiennych lub próbkach, ponieważ podjęto środki ostrożności w celu usunięcia zmiennych lub próbek, które mają bardzo wysokie brakujące wartości)

(5) Uzupełnienie danych do analizy jest pierwszym celem, a dokładność drugim. Więc nie jest zbyt wrażliwy na dokładność.

Jan
źródło
1
Powodem dlaczego dane brakuje ponosi silnie od wyboru odpowiedniej techniki. Na przykład, jeśli dane zostaną całkowicie przypadkowo pominięte, niewiele stracisz, usuwając wszystkie przypadki z brakującymi wartościami (ponieważ zestaw danych jest duży i brakuje stosunkowo niewielu wartości); ale jeśli brak jest związany z ważnymi zmiennymi w analizie, porzucenie tych przypadków może wprowadzić błąd systematyczny.
whuber
1
@ whuber Zgadzam się, nie jest możliwe usunięcie zestawu danych o tym rozmiarze, ponieważ w każdym przypadku brakuje wartości co najmniej jednej zmiennej. Spowoduje to całkowitą utratę danych.
Jan
4
To znacznie zmienia pytanie, John, ponieważ w obecnej formie wyraźnie stwierdza inaczej: twierdzi, że brakuje tylko 5% wartości. Nawet jeśli zrozumiemy, że 5% ma zastosowanie do wszystkich wpisów w matrycy danych, a nie 5% przypadków, każdy , kto poda przykład jako wskazujący na charakter twoich danych, słusznie uzna, że ​​nie więcej niż 10 * 5% = 50 % przypadków ma brakujące wartości. Trzy najważniejsze rzeczy, które należy opisać w takich pytaniach, to (1) cel analizy, (2) charakter braków oraz (3) ilość braków.
whuber

Odpowiedzi:

8

Istnieją dwa sposoby radzenia sobie z problemem dużej zmiennej i małej próbki (obserwacji), w zależności od sytuacji i zestawu danych.

(1) po prostu użyj próbek (obserwacji) jako zmiennej, pod warunkiem, że wyniki dla zmiennych są takie same lub znormalizowane.

(2) Używaj zmiennych jako zmiennych, ale wykonuj losowe próbkowanie przy imputowaniu, aby zmienna liczbowa była mniejsza niż liczba próbek i ostatecznie scal dane.

Oto trening, który możesz dostosować do swoich potrzeb. Zakładam, że zmienna jest ciągła, ale ćwiczysz podobnie dla zmiennych dyskretnych. Oto mały przykład szybkiego sprawdzenia.

Po pierwsze, w przypadku treningu generującego skorelowane dane, tutaj obserwacje (próbki) są skorelowane, mogą być realistyczne w sytuacjach, w których zmienne są przyjmowane jako niezależne, a obserwacje są skorelowane. Ale w innych sytuacjach, w których zarówno obserwacje, jak i zmienne są skorelowane.

# example correlated data, correlated by observations 
# number of observations 
nobs = 200
nvars = 100
# number of variables 
# covariance matrix matrixCR to create correlated data 
matrixCR <- matrix(NA, nrow = nobs, ncol = nobs)
diag(matrixCR) <- 1
matrixCR[upper.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[lower.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[1:10,1:10]
L = chol(matrixCR)# Cholesky decomposition
nvars = dim(L)[1]
set.seed(123)
rM = t(L) %*% matrix(rnorm(nvars*nobs), nrow=nvars, ncol=nobs)
rownames(rM) <- paste("V", 1:nvars, sep = "") 
colnames(rM) <- paste("O", 1:nobs, sep = "")
rM[1:10,1:10]



# introduce missing values in random places 
N <- round(nobs*nvars*0.05,0) # 5% random missing values 
set.seed(123)
inds <- round ( runif(N, 1, length(rM)) )
rM1 <- rM
rM1[inds] <- NA

Korzystam z missForestpakietu do imputacji, które zależą od randomForestpakietu, aby to zrobić. Możesz wykonywać obliczenia równoległe, jeśli masz bardzo dużą liczbę punktów danych do przypisania.

# now use the rM1 matrix in imputation. 
require(missForest)
out.m <- missForest(rM1, maxiter = 10, ntree = 300)
# imputed 
imp.rM1 <- out.m$ximp

Ponieważ jest to symulowany zestaw danych, mamy luksus oszacowania dokładności imputacji poprzez porównanie oryginału przed brakującymi wartościami wprowadzonymi z imputacją.

# actual values that were made missing 
aval <- rM[inds]
impv <- imp.rM1[inds]

# accuracy - defined as correlation between actual (before na introduction) and imputed values 
cor(aval,impv)
[1] 0.6759404

Możesz obejść, aby zwiększyć dokładność. Powodzenia !

Ram Sharma
źródło
5

Istnieją pełne księgi przypisywania danych, więc trudno jest udzielić odpowiedzi w tych ramach.

W tym przypadku najłatwiej jest wybrać jedną z kolumn ( ) i zebrać drugą w macierzy .xyx

Model jest trenowany, a brakujące wartości są zastępowane wartościami przewidywanymi przez nasz model. Twoje dane wydają się być kategoryczne, więc losowy las może być dobrym wyborem.y=f(x)

Jeśli twój zestaw danych jest bardzo duży, użyj szybkiego lub skalowalnego algorytmu.

Donbeo
źródło
dzięki, Czy masz jakieś sugestie dotyczące książek?
Jan
nic szczególnego. ale jeśli przypisujesz dane Google, możesz znaleźć wiele rzeczy
Donbeo
W każdym razie, jeśli brakuje tylko kilku wartości, możesz po prostu usunąć całą linię. Z twoich zbiorów danych
Donbeo
3
Chociaż zawsze możesz po prostu usunąć przypadki z brakującymi wartościami, to czasami byłby zły wybór, w zależności od tego, dlaczego brakuje danych.
whuber
@ whuber Całkowicie się z tobą zgadzam, ale często jest to po prostu bezpieczniejszy wybór.
Donbeo
5

To naprawdę interesujące pytanie. Szukam również tego samego. W rzeczywistości istnieje wiele różnych sposobów radzenia sobie z tym.

Moim zdaniem pierwszą rzeczą będzie ustalenie, jaki rodzaj brakujących danych masz - brakujący całkowicie losowo (MCAR), brakujący losowo (MAR) lub brakujący losowo (NMAR). Jest to trudne i kontrowersyjne do udowodnienia, ale ten artykuł pokazuje ciekawy sposób spojrzenia na dane MAR.

Aby poradzić sobie z wieloma imputacjami, R ma kilka pakietów:

  • MICE (co wydaje się bardzo używane),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

To tylko kilka pakietów, które znalazłem do tej pory.

MICE wdrożył także losowy las i kilka innych metod, takich jak predykcyjne dopasowywanie średnich.

To niewiele, ale może pomóc ci zrozumieć kilka rzeczy. Jak tylko uzyskam wyniki lub zdecyduję, którą metodą postąpię, wyedytuję post.

Powodzenia!

psoares
źródło
Moje dane to MCAR.
Jan
1
Jeśli Twoje dane to MCAR, możesz użyć tylko pełnej analizy przypadku. Wiele artykułów podaje, że najlepszym rozwiązaniem jest zastosowanie pełnej analizy przypadków z danymi MCAR. Przynajmniej niektóre z dokumentów, które znalazłem, informują o tym, nawet w porównaniu z innymi metodami imputacji
psoares
3

Interesujące pytanie. Sztuczka polega na tym, że aby dokonać wielokrotnego przypisania, potrzebujesz czegoś więcej niż tylko modelu predykcyjnego (który można / byłoby łatwo uzyskać, powiedzmy, w podejściu uczenia maszynowego). Nazwiemy te modele modelami symulującymi, ponieważ nie są to modele prawdopodobieństwa.

Połączony aspekt wyboru funkcji (duża ) i szkolenia modelu symulacyjnego sprawia, że ​​uważam, że podejście bayesowskie jest najlepsze. Oznacza to również, że nie ma jasnego podejścia do tego. Według mnie najlepsze podejście miałoby następujące podejście:p

  1. Zidentyfikuj wszystkie wzorce braków
  2. Dla każdego wzoru użyj metody wyboru cech bayesowskich, aby przypisać wagi tylne do kompletnych obserwacji w danych.
  3. Losowo próbuj pełne przypadki iteracyjnie, aby wygenerować pełne ramki danych.
AdamO
źródło
3

Twój problem wydaje się być dostosowany do pewnego rodzaju uzupełniania macierzy niskiej rangi. Spróbuj użyć impute.svd()funkcji z bcvpakietu . Sugerowałbym użycie małej rangi (argumentu k) - coś w rodzaju 5.

Innuo
źródło