Chciałbym użyć imputacji do zastąpienia brakujących wartości w moim zbiorze danych z pewnymi ograniczeniami.
Na przykład chciałbym, aby zmienna przypisana x1
była większa lub równa sumie moich dwóch innych zmiennych, powiedzmy x2
i x3
. Chcę też x3
zostać przypisany przez jeden 0
lub >= 14
i chcę x2
zostać przypisany przez jeden 0
lub >= 16
.
Próbowałem zdefiniować te ograniczenia w SPSS dla wielokrotnego imputacji, ale w SPSS mogę zdefiniować tylko wartości maksymalne i minimalne. Czy jest jakiś sposób na zdefiniowanie dalszych ograniczeń w SPSS lub znasz jakiś pakiet R, który pozwoliłby mi zdefiniować takie ograniczenia dla przypisania brakujących wartości?
Moje dane są następujące:
x1 =c(21, 50, 31, 15, 36, 82, 14, 14, 19, 18, 16, 36, 583, NA,NA,NA, 50, 52, 26, 24)
x2 = c(0, NA, 18,0, 19, 0, NA, 0, 0, 0, 0, 0, 0,NA,NA, NA, 22, NA, 0, 0)
x3 = c(0, 0, 0, 0, 0, 54, 0 ,0, 0, 0, 0, 0, 0, NA, NA, NA, NA, 0, 0, 0)
dat=data.frame(x1=x1, x2=x2, x3=x3)
> dat
x1 x2 x3
1 21 0 0
2 50 NA 0
3 31 18 0
4 15 0 0
5 36 19 0
6 82 0 54
7 14 NA 0
8 14 0 0
9 19 0 0
10 18 0 0
11 16 0 0
12 36 0 0
13 583 0 0
14 NA NA NA
15 NA NA NA
16 NA NA NA
17 50 22 NA
18 52 NA 0
19 26 0 0
20 24 0 0
0 or 16 or >= 16
na,0 or >= 16
ponieważ>=16
zawiera wartość16
. Mam nadzieję, że to nie zepsuło twojego znaczenia. To samo dotyczy0 or 14 or >= 14
Odpowiedzi:
Jednym z rozwiązań jest napisanie własnych niestandardowych funkcji imputacji dla
mice
pakietu. Pakiet jest na to przygotowany, a konfiguracja zaskakująco bezbolesna.Najpierw konfigurujemy dane zgodnie z sugestią:
Następnie ładujemy
mice
pakiet i sprawdzamy, jakie metody wybierze domyślnie:pmm
Oznacza predykcyjnej średniej dopasowywania - prawdopodobnie najbardziej popularnym algorytmem zaliczenia do przypisania zmiennych ciągłych. Oblicza przewidywaną wartość za pomocą modelu regresji i wybiera 5 elementów najbliższych przewidywanej wartości (według odległości euklidesowej ). Te wybrane elementy są nazywane pulą dawców, a ostateczna wartość jest wybierana losowo z tej puli dawców.Z macierzy prognoz wynika, że metody pobierają zmienne, które są interesujące dla ograniczeń. Zauważ, że wiersz jest zmienną docelową, a kolumna predyktorami. Gdyby x1 nie miał 1 w kolumnie x3, musielibyśmy dodać to do macierzy:
imp_base$predictorMatrix["x1","x3"] <- 1
Teraz część zabawy, generowanie metod imputacji. Wybrałem tutaj dość prymitywną metodę, w której odrzucam wszystkie wartości, jeśli nie spełniają kryteriów. Może to skutkować długim czasem pętli i potencjalnie bardziej efektywne może być zachowanie prawidłowych imputacji i ponowne wykonanie tylko pozostałych, wymagałoby to jednak nieco drobniejszych poprawek.
Po zakończeniu definiowania metod, po prostu zmieniamy poprzednie metody. Jeśli chcesz zmienić tylko jedną zmienną, możesz po prostu użyć,
imp_base$method["x2"] <- "pmm_x2"
ale w tym przykładzie zmienimy wszystko (nazewnictwo nie jest konieczne):Teraz spójrzmy na trzeci przypisany zestaw danych:
Ok, to działa. Podoba mi się to rozwiązanie, ponieważ możesz korzystać z głównych funkcji i dodawać ograniczenia, które uważasz za istotne.
Aktualizacja
Aby wymusić rygorystyczne ograniczenia @ t0x1n wymienione w komentarzach, możemy chcieć dodać następujące funkcje do funkcji otoki:
Powoduje to nieco bardziej skomplikowaną funkcję opakowania:
Zauważ, że to nie działa tak dobrze, najprawdopodobniej z powodu tego, że sugerowany zestaw danych nie spełnia ograniczeń dla wszystkich przypadków, nie tracąc ich. Muszę zwiększyć długość pętli do 400-500, zanim zacznie się ona zachowywać. Zakładam, że jest to niezamierzone, twoje przypisanie powinno naśladować sposób generowania rzeczywistych danych.
Optymalizacja
Argument
ry
zawiera brakujące wartości i prawdopodobnie moglibyśmy przyspieszyć pętlę, usuwając elementy, dla których znaleźliśmy kwalifikujące się przypisania, ale ponieważ nie jestem zaznajomiony z funkcjami wewnętrznymi, powstrzymałem się od tego.Myślę, że najważniejszą rzeczą, kiedy masz silne ograniczenia, które wymagają pełnego wypełnienia, jest równoległe przypisanie imputacji ( zobacz moją odpowiedź na temat CrossValidated ). Większość ma dziś komputery z 4-8 rdzeniami, a R domyślnie używa tylko jednego z nich. Czas można (prawie) skrócić na pół, podwajając liczbę rdzeni.
Brakujące parametry przy imputacji
Jeśli chodzi o problem
x2
zaginięcia w momencie przypisania, myszy tak naprawdę nigdy nie wprowadzają brakujących wartości dox
-data.frame
. Metoda myszy obejmuje wypełnienie losowej wartości na początku. Część łańcuchowa imputacji ogranicza wpływ tej wartości początkowej. Jeśli spojrzysz namice
-funkcję, możesz to znaleźć przed wywołaniem imputacji (mice:::sampler
-funkcja):data.init
Może być dostarczany domice
funkcji i mice.imput.sample to podstawowa procedura pobierania próbek.Sekwencja odwiedzin
Jeśli kolejność odwiedzin jest ważna, możesz określić kolejność, w której
mice
funkcja uruchamia imputacje. Domyślnie jest z,1:ncol(data)
ale możesz ustawić dowolną wartośćvisitSequence
.źródło
pmm_x1
jednak: (1) Biorąc pod uwagę sumę maksymalną każdej możliwej kombinacjix2
ix3
od całego zestawu danych jest znacznie Stringer niż oryginalny ograniczeń. Prawidłowe rzeczą byłoby sprawdzić, czy dla każdego wiersza ,x1 < x2 + x3
. Oczywiście im więcej masz rzędów, tym mniejsza jest szansa na spełnienie takiego ograniczenia (ponieważ jeden zły rząd rujnuje wszystko) i tym dłużej może potencjalnie uzyskać pętlę.x1
ix2
brakuje, można przypisać wartośćx1
, dla których ograniczenia są utrzymywane (powiedzmy 50), ale gdyx2
zostanie przypisane są łamane (powiedzmy to być przypisana do 55). Czy istnieje sposób przypisywania „w poziomie”, a nie w pionie? W ten sposób możemy przypisać jeden wierszx1
,x2
orazx3
i po prostu ponownie przypisać go do momentu, że specyficzny rząd podlega ograniczeniom. To powinno być wystarczająco szybkie, a gdy to zrobimy, możemy przejść do następnego rzędu. Oczywiście, jeśli MI ma charakter „pionowy”, nie mamy szczęścia. W takim razie może podejście, o którym wspominał Aleksandr?mice
pakietu. Dzięki za udostępnienie.debug()
, aby zobaczyć, jakmice.impute.pmm
i jego rodzeństwo działa pod maską.Najbliższe, co mogłem znaleźć, to wcześniejsze włączenie informacji Amelii . Zobacz rozdział 4.7 winiety , w szczególności 4.7.2:
Tak więc, chociaż ogólnie nie będziesz w stanie powiedzieć czegoś takiego
x1<x2+x3
, możesz zapętlić swój zestaw danych i dodać poziom obserwacji przed każdym odpowiednim przypadkiem. Można również zastosować stałe granice (takie jak ustawienie wartości x1, x2 i x3, aby były nieujemne). Na przykład:źródło
Ograniczenia są prawdopodobnie łatwiejsze do wdrożenia w predykcyjnym dopasowaniu średnim wielokrotnej imputacji. Zakłada się, że istnieje znaczna liczba obserwacji z brakującymi zmiennymi ograniczającymi, które spełniają ograniczenia. Myślę o zaimplementowaniu tego w funkcji
Hmisc
pakietu R.aregImpute
Możesz sprawdzić ponownie za około miesiąc. Ważne będzie określenie maksymalnej odległości od celu, jaką może być obserwacja dawcy, ponieważ ograniczenia popchną dawców dalej od idealnego, nieograniczonego dawcy.źródło
x<y<z
.x1<x2
zostanie spełnione określone ograniczenie (np. )?aregImpute
funkcją R z predykcyjnym dopasowaniem średnim. Ale co, jeśli żadna obserwacja dawcy (w pobliżu dopasowań prognoz) nie spełnia ograniczeń przypisywanych obserwacji celu, chociaż oczywiście musiały one spełniać ograniczenia zbioru zmiennych dawcy?Uważam, że
Amelia
pakiet (Amelia II) ma obecnie najbardziej kompleksowe wsparcie dla określania ograniczeń zakresu wartości danych. Problem polega jednak na tymAmelia
, że dane są normalne na wielu odmianach.Jeśli w twoim przypadku nie obowiązuje założenie wielowymiarowej normalności, możesz sprawdzić
mice
pakiet, który implementuje wielokrotną imputację (MI) za pomocą równań łańcuchowych . Ten pakiet nie zakłada normalności wielowymiarowej . Ma również funkcję, która może wystarczyć do określenia ograniczeń , ale nie jestem pewien, do jakiego stopnia. Funkcja jest wywoływanasqueeze()
. Możesz o tym przeczytać w dokumentacji: http://cran.r-project.org/web/packages/mice/mice.pdf . Dodatkową zaletąmice
jest jego elastyczność w zakresie umożliwiania specyfikacji zdefiniowanych przez użytkownika funkcji imputacji i szerszego wyboru algorytmów. Oto samouczek na temat wykonywania MI przy użyciumice
:http://www.ats.ucla.edu/stat/r/faq/R_pmm_mi.htm .O ile rozumiem,
Hmisc
pakiet dr. Harrella , wykorzystujący takie same łańcuchowe równania ( predykcyjne dopasowywanie średnich ), prawdopodobnie obsługuje dane nienormalne (z wyjątkiemnormpmm
metody). Być może zaimplementował już funkcjonalność specyfikacji ograniczeń zgodnie z powyższą odpowiedzią. Nie korzystałemaregImpute()
, więc nie mogę powiedzieć więcej na ten temat (korzystałemAmelia
imice
, ale zdecydowanie nie jestem ekspertem w dziedzinie statystyki, staram się tylko nauczyć jak najwięcej).Na koniec możesz znaleźć interesujące, nieco przestarzałe, ale wciąż ładne, omówienie podejść, metod i oprogramowania do wielokrotnego przypisywania danych z brakującymi wartościami: http://www.ncbi.nlm.nih.gov/pmc/articles / PMC1839993 . Jestem pewien, że są nowsze artykuły przeglądowe na temat MI, ale to wszystko, o czym wiem obecnie. Mam nadzieję, że jest to nieco pomocne.
źródło
aregImpute
.squeeze
polega na tym, że jego granice są stałe, więc nie można podać niczego podobnegox1<x2
. Wydaje się również, że jest on wywoływany na domniemanym wektorze wyników, który moim zdaniem jest za późno. Wydaje mi się, że granice należy brać pod uwagę podczas procesu przypisywania, więc mają one większe znaczenie niż korekta po fakcie.Amelia
, ponieważ przeszedłem z niego namice
, gdy tylko moje testy potwierdziły, że moje dane nie są normalne na wielu odmianach. Jednak ja niedawno biegł tym bardzo ładnym zestawem slajdów prezentacji na temat (MI metod i oprogramowania): statistik.lmu.de/~fkreuter/imputation_sose2011/downloads/... . Jeśli dobrze zrozumiałem, opisuje potencjalne rozwiązanie problemu ograniczeń (patrz strona 50 w PDF - nie slajd nr 50!). Mam nadzieję że to pomoże.Jeśli dobrze rozumiem twoje pytanie, wydaje mi się, że już wiesz, jakie wartości powinny przyjąć brakujące zmienne z zastrzeżeniem pewnych ograniczeń. Nie jestem zbyt biegły w SPSS, ale w RI myślę, że możesz napisać funkcję, aby to zrobić (co nie powinno być zbyt trudne w zależności od twojego doświadczenia, powinienem powiedzieć). Nie znam żadnego pakietu, który działałby z takimi ograniczeniami.
źródło