Wpisywanie brakujących wartości dla PCA

23

Użyłem tej prcomp()funkcji do wykonania PCA (analiza głównego składnika) w R. Jednak w tej funkcji jest błąd, który na.actionpowoduje, że parametr nie działa. Poprosiłem o pomoc w stosie przepływu ; dwóch użytkowników zaoferowało dwa różne sposoby radzenia sobie z NAwartościami. Problem z obydwoma rozwiązaniami polega jednak na tym, że gdy istnieje NAwartość, wiersz jest pomijany i nie jest uwzględniany w analizie PCA. Mój prawdziwy zestaw danych to macierz 100 x 100 i nie chcę stracić całego wiersza tylko dlatego, że zawiera jedną NAwartość.

Poniższy przykład pokazuje, że prcomp()funkcja nie zwraca żadnych głównych składników dla wiersza 5, ponieważ zawiera NAwartość.

d       <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10), 
                      V3 = sample(1:100, 10))
result  <- prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x                                # $
d$V1[5] <- NA                           # $
result  <- prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x

Zastanawiałem się, czy mogę ustawić NAwartości na określoną wartość liczbową, kiedy centeri scalesą ustawione na TRUEtak, aby prcomp()funkcja działała i nie usuwała wierszy zawierających je NA, ale także nie wpływała na wynik analizy PCA.

Myślałem o zastąpieniu NAwartości wartością mediany w jednej kolumnie lub wartością bardzo zbliżoną do 0. Nie jestem jednak pewien, jak to wpływa na analizę PCA.

Czy ktoś może wymyślić dobry sposób na rozwiązanie tego problemu?

użytkownik969113
źródło
8
Twój problem nie jest problemem PCA, ale szerszym problemem dotyczącym brakujących wartości . Jeśli go nie znasz, przeczytaj o tym trochę. Masz wiele możliwości: (1) usuń przypadki listowo lub (2) parami lub (3) zamień braki za pomocą średniej lub mediany. Lub (4) zastąp losowo wybranymi prawidłowymi wartościami (podejście z pokładu). Lub przypisać braki przez (5) regresję wzajemną (z dodawaniem hałasu lub bez) lub przez lepsze (6) podejście EM.
ttnphns
Jak pokazują komentarze i odpowiedzi, kluczem do uzyskania dobrej odpowiedzi jest wyjaśnienie, co oznaczająNA wartości : jaka jest przyczyna „zaginięcia”?
whuber
2
Myślę, że pakiet „pcaMethods” może rozwiązać Twój problem ( tutaj )
ToNoY

Odpowiedzi:

22

W rzeczywistości istnieje dobrze udokumentowany sposób radzenia sobie ze złymi matrycami - możesz rozłożyć macierz kowariancji utworzoną z twoich danychdo , która jest skalowana przez liczbę wspólnych wartości n : C = 1Xn

do=1nXT.X,                dojotl=X.jotY.l¯

a następnie rozwiń główne współczynniki poprzez dopasowanie co najmniej kwadratów (jak wspomina @ user969113). Oto przykład .

Xprcomp

Aktualizacja

Inną opcją przeprowadzania PCA na zboczonym zestawie danych jest „Rekurencyjnie odejmowane empiryczne funkcje ortogonalne” (Taylor i in. 2013). Poprawia również niektóre problemy w podejściu do najmniejszych kwadratów i jest obliczeniowo znacznie szybszy niż DINEOF. W tym poście porównano wszystkie trzy podejścia pod względem dokładności rekonstrukcji danych przy użyciu komputerów PC.

Referencje

Beckers, Jean-Marie i M. Rixen. „Obliczenia EOF i wypełnianie danych z niekompletnych zestawów danych oceanograficznych”. Journal of Atmospheric and Oceanic Technology 20.12 (2003): 1839-1856.

Taylor, M., Losch, M., Wenzel, M., i Schröter, J. (2013). O wrażliwości rekonstrukcji i prognozowania pola za pomocą empirycznych funkcji ortogonalnych pochodzących z niepewnych danych Journal of Climate, 26 (22), 9194–9205.

Marc w pudełku
źródło
(+1) To dla mnie cenny wkład, ponieważ jest to nowatorski pomysł. Już dawno zadałem podobne pytanie, które jest uderzająco podobne: jak oszacować macierz kowariancji, gdy dane są cenzurowane (zamiast ich brakować)? Jeśli masz jakieś przemyślenia na temat tej sytuacji, chętnie udzielę odpowiedzi!
whuber
Dzięki @whuber - Uważam, że ta metoda ma również wiele zalet. Nawet jeśli nie jesteś zainteresowany interpolowanymi wartościami, metoda jest znacznie lepsza niż opisywanie EOF / PC dla zestawu danych - np. Błąd między zrekonstruowanymi danymi a oryginałem jest minimalizowany przez algorytm.
Marc w pudełku
@whuber - Odnośnie cenzurowanych danych - to nie moja specjalizacja i, co ciekawe, kilka tygodni temu zadałem pytanie w tym kierunku (które skomentowałeś!) . Mam przeczucie, że należy wypełnić zera losowymi wartościami poniżej granicy wykrywalności, co przybliża rozkład obserwowanych wartości. Przejrzę trochę cytowanej literatury z twojego postu - to naprawdę bardzo interesujący temat.
Marc w pudełku
@ whuber - Być może zainteresuje Cię następujący artykuł opisujący podobną iteracyjną procedurę dopasowania macierzy kowariancji do rzadkich danych: Bien, Jacob i Robert J. Tibshirani. „Rzadkie oszacowanie macierzy kowariancji”. Biometrika 98.4 (2011): 807-820.
Marc w pudełku
Dzięki @Marc. Niestety cenzura i oszczędność to dwie różne rzeczy z różnymi obawami.
whuber
6

Moja sugestia zależy od tego, ile danych brakuje i dlaczego brakuje. Ale tak naprawdę nie ma to nic wspólnego z PCA. Jeśli brakuje bardzo mało danych, to nie ma większego znaczenia, co robisz. Zamiana na medianę nie jest idealna, ale jeśli niewiele jej brakuje, nie różni się niczym od lepszego rozwiązania. Możesz spróbować wykonać PCA zarówno z medianą zamiany, jak i usuwaniem listowym i sprawdzić, czy istnieją poważne różnice w wynikach.

Następnie, jeśli brakuje więcej danych, należy rozważyć, czy brakuje ich całkowicie losowo, czy losowo, czy nie losowo. Sugerowałbym wielokrotne przypisanie w dwóch pierwszych przypadkach, a czasem w trzecim przypadku - chyba że dane są wysoce zniekształcone przez status NMAR, myślę, że wielokrotne przypisanie będzie lepsze niż usunięcie listowe (Joe Schafer z Penn State dokonał dużo pracy nad brakującymi danymi - przypominam sobie trochę z jego pracy pokazującej, że wielokrotne przypisanie działało całkiem dobrze, nawet w niektórych przypadkach NMAR). Jeśli jednak danymi są MCAR lub MAR, można udowodnić właściwości wielokrotnej imputacji.

Jeśli zdecydujesz się na MI, jedna uwaga powinna być ostrożna, ponieważ znaki komponentów w PCA są arbitralne, a niewielka zmiana danych może zmienić znak. Wtedy, kiedy zrobisz PCA, dostaniesz bzdury. Dawno temu wypracowałem rozwiązanie w SAS - nie jest trudne, ale należy zachować ostrożność.

Peter Flom - Przywróć Monikę
źródło
1

Nie ma prawidłowego rozwiązania problemu. Każda współrzędna w wektorze musi zostać określona, ​​aby uzyskać prawidłowy zestaw głównych składników. Jeśli brakuje współrzędnej i zostaje zastąpiona jakąś wartością przypisaną, otrzymasz wynik, ale będzie ona zależna od wartości przypisanej. więc jeśli istnieją dwie rozsądne opcje dla wartości przypisanej, różne opcje dają różne odpowiedzi.

Michael R. Chernick
źródło
3
Właśnie szukałem PCA i brakujących danych i stwierdziłem, że: 4.2 Jak SIMCA radzi sobie z brakującymi danymi? Upraszczając, algorytm NIPALS interpoluje brakujący punkt przy użyciu dopasowania najmniejszych kwadratów, ale nie daje brakujących danych żadnego wpływu na model. Kolejne iteracje dopracowują brakującą wartość, po prostu mnożąc wynik i obciążenie dla tego punktu. Istnieje wiele różnych metod dla brakujących danych, takich jak szacowanie, ale ogólnie są one zbieżne z tym samym rozwiązaniem. Brakujące dane są dopuszczalne, jeśli są losowo dystrybuowane. Systematyczne bloki brakujących danych są problematyczne.
user969113
1
Nie wiem, co masz na myśli, mówiąc o braku wpływu na model. Każdy wybór brakującej wartości współrzędnej wpłynie na główne składniki.
Michael R. Chernick,
1

Niedawny artykuł, w którym dokonano przeglądu podejść do radzenia sobie z brakującymi wartościami w analizach PCA, to „Analiza głównych składników z brakującymi wartościami: badanie porównawcze metod” autorstwa Dray & Josse (2015) . Dwie najbardziej znane metody metod PCA, które pozwalają na brakujące wartości, to algorytm NIPALS, zaimplementowany w nipalsfunkcji ade4pakietu oraz iteracyjny PCA (Ipca lub EM-PCA), zaimplementowany w imputePCAfunkcjimissMDA pakietu. W artykule stwierdzono, że metoda Ipca działała najlepiej w najszerszym zakresie warunków.

Przykładowa składnia to:

Dla NIPALS:

library(ade4)
nipals(d[,c(1,2)])

W przypadku Ipca:

library(missMDA)
imputePCA(d[,c(1,2)],method="EM",ncp=1)
Tom Wenseleers
źródło