Wielokrotna imputacja brakujących danych zliczeniowych w szeregach czasowych z badania panelowego

9

Usiłuję rozwiązać problem, który dotyczy przypisania brakujących danych z badania danych panelowych (Nie jestem pewien, czy prawidłowo używam „badania danych panelowych” - tak jak się dzisiaj nauczyłem). Mam dane dotyczące całkowitej liczby zgonów w latach 2003 do 2009 r., wszystkie miesiące, kobiety i mężczyźni, w 8 różnych dzielnicach i dla 4 grup wiekowych.

Ramka danych wygląda mniej więcej tak:

         District  Gender Year Month    AgeGroup TotalDeaths
         Northern    Male 2006    11        01-4           0
         Northern    Male 2006    11       05-14           1
         Northern    Male 2006    11         15+          83
         Northern    Male 2006    12           0           3
         Northern    Male 2006    12        01-4           0
         Northern    Male 2006    12       05-14           0
         Northern    Male 2006    12         15+         106
         Southern  Female 2003     1           0           6
         Southern  Female 2003     1        01-4           0
         Southern  Female 2003     1       05-14           3
         Southern  Female 2003     1         15+         136
         Southern  Female 2003     2           0           6
         Southern  Female 2003     2        01-4           0
         Southern  Female 2003     2       05-14           1
         Southern  Female 2003     2         15+         111
         Southern  Female 2003     3           0           2
         Southern  Female 2003     3        01-4           0
         Southern  Female 2003     3       05-14           1
         Southern  Female 2003     3         15+         141
         Southern  Female 2003     4           0           4

Dla 10 miesięcy rozłożonych na lata 2007 i 2008 niektóre z całkowitych zgonów ze wszystkich dzielnic nie zostały zarejestrowane. Próbuję oszacować tę brakującą wartość za pomocą metody wielokrotnego imputacji. Albo za pomocą Uogólnionych modeli liniowych lub modeli SARIMA.

Moim największym problemem jest korzystanie z oprogramowania i kodowanie. Zadałem pytanie na Stackoverflow, gdzie chcę wyodrębnić dane do mniejszych grup, takich jak to:

         District  Gender Year Month    AgeGroup TotalDeaths
         Northern    Male 2003     1        01-4           0
         Northern    Male 2003     2        01-4           1
         Northern    Male 2003     3        01-4           0
         Northern    Male 2003     4        01-4           3
         Northern    Male 2003     5        01-4           4
         Northern    Male 2003     6        01-4           6
         Northern    Male 2003     7        01-4           5
         Northern    Male 2003     8        01-4           0
         Northern    Male 2003     9        01-4           1
         Northern    Male 2003    10        01-4           2
         Northern    Male 2003    11        01-4           0
         Northern    Male 2003    12        01-4           1
         Northern    Male 2004     1        01-4           1
         Northern    Male 2004     2        01-4           0

Zamierzam

         Northern    Male 2006    11        01-4           0
         Northern    Male 2006    12        01-4           0

Ale ktoś zasugerował, że powinienem tu raczej zadać pytanie - może poprosić o wskazówki? Obecnie nie jestem w stanie wprowadzić tych danych jako właściwego szeregu czasowego / badania panelowego do R. Moim ostatecznym celem jest wykorzystanie tych danych i amelia2pakietu wraz z jego funkcjami do przypisania za brak TotalDeathsw niektórych miesiącach w 2007 i 2008 r., Gdzie dane są brakujący.

Będziemy wdzięczni za wszelką pomoc, jak to zrobić i być może sugestie dotyczące rozwiązania tego problemu.

Jeśli to pomoże, staram się zastosować podobne podejście do tego, co zrobił Clint Roberts w swojej pracy doktorskiej .

EDYTOWAĆ:

Po utworzeniu zmiennej „time” i „group” zgodnie z sugestią @Matt:

> head(dat)
     District Gender Year Month AgeGroup Unnatural Natural Total time                    group
1 Khayelitsha Female 2001     1        0         0       6     6    1     Khayelitsha.Female.0
2 Khayelitsha Female 2001     1     01-4         1       3     4    1  Khayelitsha.Female.01-4
3 Khayelitsha Female 2001     1    05-14         0       0     0    1 Khayelitsha.Female.05-14
4 Khayelitsha Female 2001     1     15up         8      73    81    1  Khayelitsha.Female.15up
5 Khayelitsha Female 2001     2        0         2       9    11    2     Khayelitsha.Female.0
6 Khayelitsha Female 2001     2     01-4         0       2     2    2  Khayelitsha.Female.01-4

Jak zauważyłeś, w rzeczywistości są bardziej szczegółowe „Naturalne” i „Nienaturalne”.

OSlOlSO
źródło

Odpowiedzi:

10

Możesz użyć tego Ameliapakietu do przypisania danych (pełne ujawnienie: jestem jednym z autorów Amelia). Pakiet winieta ma wydłużony przykład, jak go używać, aby przypisać brakujące dane.

Wygląda na to, że masz jednostki, które są grupami dzielnic-wiek-wiek obserwowanymi na poziomie miesięcznym. Najpierw tworzysz zmienną czynnikową dla każdego rodzaju jednostki (tj. Jeden poziom dla każdej grupy okręgowej-płci-wieku). Nazwijmy to group. Następnie potrzebna byłaby zmienna czasu, która prawdopodobnie jest liczbą miesięcy od stycznia 2003 r. Tak więc zmienna ta wynosiłaby 13 w styczniu 2004 r. Wywołaj tę zmienną time. Amelia pozwoli ci przypisywać przypisania na podstawie trendów czasowych za pomocą następujących poleceń:

library(Amelia)
a.out <- amelia(my.data, ts = "time", cs = "group", splinetime = 2, intercs = TRUE)

Te tsi csargumenty po prostu oznaczają zmienne w czasie i jednostkowych. Te splinetimezestawy argumentów jak elastyczny czas powinien być stosowany przypisać brakujące dane. Tutaj 2 oznacza, że ​​imputacja będzie wykorzystywała kwadratową funkcję czasu, ale wyższe wartości będą bardziej elastyczne. intercsArgumentem tutaj mówi Amelia użyć osobnego trend czasowy dla każdego obszaru-płciowym ageGroup. Dodaje to wiele parametrów do modelu, więc jeśli napotkasz problemy, możesz ustawić to, FALSEaby próbować debugować.

W każdym razie uzyskasz przypisania, korzystając z informacji o czasie w danych. Ponieważ brakujące dane są ograniczone do zera, można użyć boundsargumentu, aby wymusić imputacje w tych granicach logicznych.

EDYCJA: Jak tworzyć zmienne grupy / czasu

Zmienna czasowa może być najłatwiejsza do utworzenia, ponieważ wystarczy policzyć od 2002 roku (zakładając, że jest to najniższy rok w danych):

my.data$time <- my.data$Month + 12 * (my.data$Year - 2002)

Zmienna grupy jest nieco trudniejsza, ale szybkim sposobem na to jest użycie polecenia wklej:

my.data$group <- with(my.data, 
                      as.factor(paste(District, Gender, AgeGroup, sep = ".")))

Po utworzeniu tych zmiennych chcesz usunąć oryginalne zmienne z imputacji. Aby to zrobić, możesz użyć idvarsargumentu:

a.out <- amelia(my.data, ts = "time", cs = "group", splinetime = 2, intercs = TRUE,
                idvars = c("District", "Gender", "Month", "Year", "AgeGroup"))
Matt Blackwell
źródło
Bardzo Ci dziękuję za odpowiedź! Bawiłem Ameliasię trochę, ale poddałem się (wcześniej). Wcześniej widziałem winietę (ale jakoś ją zgubiłem!) Po prostu rzuciłem na nią okiem i naprawdę ją przejrzę. Jednym z moich problemów jest to, że nie jestem pewien, jak utworzyć zmienne groupi time. (Próbowałem utworzyć je do analizy / prognozowania szeregów czasowych, ale obejrzałem to.) Jestem pewien, że jest w winiecie - więc wrócę do ciebie, jeśli będę miał problemy.
Jeszcze
Cieszę się, że to przydatne. Dodałem przykład tworzenia tych zmiennych. Mam nadzieję, że to pomaga.
Matt Blackwell
Dzięki za przykłady @Matt. Z jakiegoś dziwnego powodu dał mi błąd, gdy użyłem „ts = czas” i „cs = grupa”. Po prostu zastępuję „czas” i „grupę” odpowiednim numerem kolumny, a potem zadziałało. a.out=amelia(dat,ts=time,cs=group,splinetime=2,intercs=TRUE,idvars=c("District","Gender","Month","Year","AgeGroup"),bounds=bds) Amelia Error Code: 6 The 'ts' variable is out of the range of possible column numbers or is not an integer.
OSlOlSO
Dla granic podążałem za winietą i tworzyłem granice za pomocą: bds <- matrix(c(6, 7, 8,0, 0,0, 500, 500,500), nrow = 3, ncol = 3)Zasadniczo wybrałem 500 jako losowy górny limit. Starałem się nie podawać trzeciej kolumny, ale Ameliaostrzegałem, że wymaga trzeciej. Czy jest jakiś sposób na określenie dolnej granicy?
OSlOlSO
Dodałem przykład danych w pytaniu - być może, jeśli spowodowało to Błąd? Ale wątpię w to.
OSlOlSO