Multiple Imputation für fehlende Zähldaten in einer Zeitreihe aus einer Panelstudie

9

Ich versuche, ein Problem anzugehen, das sich mit der Imputation fehlender Daten aus einer Paneldatenstudie befasst. (Ich bin mir nicht sicher, ob ich die Paneldatenstudie richtig verwende - wie ich es heute gelernt habe.) Ich habe Daten zur Gesamtzahl der Todesfälle für die Jahre 2003 bis 2009 alle Monate, männlich und weiblich, für 8 verschiedene Bezirke und für 4 Altersgruppen.

Der Datenrahmen sieht ungefähr so ​​aus:

         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

In den 10 Monaten über 2007 und 2008 wurden einige der Todesfälle in allen Distrikten nicht erfasst. Ich versuche, diesen fehlenden Wert durch eine Mehrfachimputationsmethode abzuschätzen. Entweder mit generalisierten linearen Modellen oder mit SARIMA-Modellen.

Mein größtes Problem ist die Verwendung von Software und die Codierung. Ich habe eine Frage zu Stackoverflow gestellt, in der ich die Daten in kleinere Gruppen wie diese extrahieren möchte:

         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

Ich gehe zu

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

Aber jemand schlug vor, ich sollte lieber meine Frage hierher bringen - vielleicht nach einer Richtung fragen? Derzeit kann ich diese Daten nicht als ordnungsgemäße Zeitreihen- / Panel-Studie in R eingeben. Mein letztendliches Ziel ist es, diese Daten und das amelia2Paket mit seinen Funktionen zu verwenden, um das Fehlen TotalDeathsfür bestimmte Monate in den Jahren 2007 und 2008 zu unterstellen, in denen sich die Daten befinden fehlt.

Jede Hilfe, wie dies zu tun ist und vielleicht Vorschläge, wie dieses Problem angegangen werden kann, wäre dankbar.

Wenn das hilft, versuche ich einen ähnlichen Ansatz zu folgen , was Clint Robert hat in seiner Doktorarbeit .

BEARBEITEN:

Nach dem Erstellen der Variablen 'time' und 'group', wie von @Matt vorgeschlagen:

> 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

Wie Sie bemerken, gibt es tatsächlich weitere Details: "Natürlich" und "Unnatürlich".

OSlOlSO
quelle

Antworten:

10

Sie können das AmeliaPaket verwenden, um die Daten zu unterstellen (vollständige Offenlegung: Ich bin einer der Autoren von Amelia). Die Paketvignette enthält ein erweitertes Beispiel für die Verwendung fehlender Daten.

Es scheint, als hätten Sie Einheiten, die auf monatlicher Ebene nach Distrikt-Geschlecht-Alter-Gruppe beobachtet werden. Zuerst erstellen Sie eine Faktorvariable für jeden Einheitentyp (dh eine Ebene für jede Distrikt-Geschlecht-Altersgruppe). Nennen wir das group. Dann würden Sie eine Variable für die Zeit benötigen, was wahrscheinlich die Anzahl der Monate seit Januar 2003 ist. Daher wäre diese Variable im Januar 2004 13. Rufen Sie diese Variable auf time. Amelia ermöglicht es Ihnen, basierend auf den Zeittrends mit den folgenden Befehlen zu rechnen:

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

Die Argumente tsund csbezeichnen einfach die Zeit- und Einheitsvariablen. Das splinetimeArgument legt fest, wie flexibel die Zeit verwendet werden soll, um die fehlenden Daten zu unterstellen. Hier bedeutet eine 2, dass die Imputation eine quadratische Funktion der Zeit verwendet, höhere Werte jedoch flexibler sind. Das intercsArgument hier weist Amelia an, für jede Distrikt-Geschlecht-Altersgruppe einen eigenen Zeittrend zu verwenden. Dadurch werden dem Modell viele Parameter FALSEhinzugefügt. Wenn Sie also auf Probleme stoßen, können Sie diese so einstellen , dass versucht wird, sie zu debuggen.

In jedem Fall erhalten Sie dadurch Anrechnungen unter Verwendung der Zeitinformationen in Ihren Daten. Da die fehlenden Daten auf Null begrenzt sind, können Sie das boundsArgument verwenden, um Imputationen in diese logischen Grenzen zu zwingen.

BEARBEITEN: So erstellen Sie Gruppen- / Zeitvariablen

Die Zeitvariable ist möglicherweise am einfachsten zu erstellen, da Sie nur ab 2002 zählen müssen (vorausgesetzt, dies ist das niedrigste Jahr in Ihren Daten):

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

Die Gruppenvariable ist etwas schwieriger, aber eine schnelle Möglichkeit besteht darin, den Befehl Einfügen zu verwenden:

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

Wenn diese Variablen erstellt wurden, möchten Sie die ursprünglichen Variablen aus der Imputation entfernen. Dazu können Sie das folgende idvarsArgument verwenden:

a.out <- amelia(my.data, ts = "time", cs = "group", splinetime = 2, intercs = TRUE,
                idvars = c("District", "Gender", "Month", "Year", "AgeGroup"))
Matt Blackwell
quelle
Vielen Dank für Ihre Antwort! Ich habe Ameliaein bisschen mit gespielt, aber aufgegeben (vorher). Ich habe die Vignette schon einmal gesehen (aber irgendwie verloren!). Ich habe sie mir nur kurz angesehen und werde sie gründlich durchgehen. Ein Problem, das ich jetzt habe, ist, dass ich nicht sicher bin, wie ich die Variablen groupund erstellen soll time. (Ich habe versucht, sie für die Analyse / Vorhersage von Zeitreihen zu erstellen, habe aber eine Schleife um sie herum.) Ich bin sicher, dass sie in der Vigette stehen - also melde ich mich bei Ihnen, wenn ich Probleme habe.
Nochmals vielen
Ich bin froh, dass es nützlich ist. Ich habe ein Beispiel hinzugefügt, wie diese Variablen erstellt werden. Ich hoffe, das hilft.
Matt Blackwell
Danke für die Beispiele @Matt. Aus irgendeinem seltsamen Grund gab es einen Fehler, als ich "ts = time" und "cs = group" verwendete. Ich ersetze einfach "Zeit" und "Gruppe" durch die jeweilige Spaltennummer und dann hat es funktioniert. 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
Für die Grenzen folgte ich der Vignette und erstellte Grenzen mit: bds <- matrix(c(6, 7, 8,0, 0,0, 500, 500,500), nrow = 3, ncol = 3)Ich habe im Grunde nur 500 als zufällige Obergrenze gewählt. Ich habe versucht, keine dritte Spalte anzugeben, Ameliawarnte aber davor, dass die dritte erforderlich ist. Gibt es vielleicht eine Möglichkeit, nur eine Untergrenze festzulegen?
OSlOlSO
Ich habe ein Beispiel für die Daten in der Frage hinzugefügt - vielleicht, ob dies den Fehler verursacht hat? Aber ich bezweifle es.
OSlOlSO