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ść.
źródło
Odpowiedzi:
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.
Korzystam z
missForest
pakietu do imputacji, które zależą odrandomForest
pakietu, aby to zrobić. Możesz wykonywać obliczenia równoległe, jeśli masz bardzo dużą liczbę punktów danych do przypisania.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ą.
Możesz obejść, aby zwiększyć dokładność. Powodzenia !
źródło
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 .xy x
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.
źródło
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!
źródło
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
źródło
Twój problem wydaje się być dostosowany do pewnego rodzaju uzupełniania macierzy niskiej rangi. Spróbuj użyć
impute.svd()
funkcji zbcv
pakietu . Sugerowałbym użycie małej rangi (argumentuk
) - coś w rodzaju 5.źródło