Imputation multiple pour les données de comptage manquantes dans une série chronologique à partir d'une étude par panel


9

J'essaie de résoudre un problème qui concerne l'imputation des données manquantes d'une étude de données de panel (je ne sais pas si j'utilise correctement «l'étude de données de panel» - telle que je l'ai apprise aujourd'hui.) J'ai des données sur le nombre total de décès pour les années 2003 jusqu'en 2009, tous les mois, hommes et femmes, pour 8 districts différents et pour 4 tranches d'âge.

La trame de données ressemble à ceci:

         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

Pour les 10 mois s'étalant sur 2007 et 2008, certains des décès totaux de tous les districts n'ont pas été enregistrés. J'essaie d'estimer ces valeurs manquantes par une méthode d'imputation multiple. Soit en utilisant des modèles linéaires généralisés ou des modèles SARIMA.

Mon plus gros problème est l'utilisation des logiciels et du codage. J'ai posé une question sur Stackoverflow, où je veux extraire les données en petits groupes comme celui-ci:

         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

Aller à

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

Mais quelqu'un a suggéré que je préfère poser ma question ici - peut-être demander une direction? Actuellement, je ne suis pas en mesure d'entrer ces données en tant que série chronologique / étude de panel appropriée dans R. Mon objectif final est d'utiliser ces données et le amelia2package avec ses fonctions pour imputer les manquants TotalDeathspendant certains mois en 2007 et 2008, où les données sont manquant.

Toute aide, comment procéder et peut-être des suggestions sur la façon de résoudre ce problème seraient grandement appréciées.

Si cela aide, j'essaie de suivre une approche similaire à ce que Clint Roberts a fait dans sa thèse de doctorat .

ÉDITER:

Après avoir créé la variable 'time' et 'group' comme suggéré par @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

Comme vous le remarquez, il y a en fait plus de détails «Naturel» et «Non naturel».

Réponses:


10

Vous pouvez utiliser le Ameliapackage pour imputer les données (divulgation complète: je suis l'un des auteurs de Amelia). La vignette du package contient un exemple détaillé de la façon de l'utiliser pour imputer des données manquantes.

Il semble que vous ayez des unités qui sont observées au niveau mensuel par groupe d'âge par district. Vous créez d'abord une variable de facteur pour chaque type d'unité (c'est-à-dire un niveau pour chaque groupe de district-sexe-âge). Appelons ça group. Ensuite, vous auriez besoin d'une variable de temps, qui est probablement le nombre de mois depuis janvier 2003. Ainsi, cette variable serait de 13 en janvier 2004. Appelez cette variable time. Amelia vous permettra d'imputer en fonction des tendances temporelles avec les commandes suivantes:

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

Les arguments tset csdésignent simplement les variables de temps et d'unité. L' splinetimeargument définit la flexibilité du temps à utiliser pour imputer les données manquantes. Ici, un 2 signifie que l'imputation utilisera une fonction quadratique du temps, mais des valeurs plus élevées seront plus flexibles. L' intercsargument ici dit à Amelia d'utiliser une tendance temporelle distincte pour chaque groupe de district-sexe-âge. Cela ajoute de nombreux paramètres au modèle, donc si vous rencontrez des problèmes, vous pouvez le définir FALSEpour essayer de déboguer.

En tout état de cause, cela vous permettra d'obtenir des imputations en utilisant les informations temporelles dans vos données. Étant donné que les données manquantes sont limitées à zéro, vous pouvez utiliser l' boundsargument pour forcer les imputations dans ces limites logiques.

EDIT: comment créer des variables de groupe / temps

La variable de temps peut être la plus facile à créer, car il vous suffit de compter à partir de 2002 (en supposant que c'est l'année la plus basse dans vos données):

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

La variable de groupe est légèrement plus difficile, mais un moyen rapide de le faire consiste à utiliser la commande coller:

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

Une fois ces variables créées, vous souhaitez supprimer les variables d'origine de l'imputation. Pour ce faire, vous pouvez utiliser l' idvarsargument:

a.out <- amelia(my.data, ts = "time", cs = "group", splinetime = 2, intercs = TRUE,
                idvars = c("District", "Gender", "Month", "Year", "AgeGroup"))

Merci beaucoup pour votre réponse! Je joue avec Ameliadepuis un moment mais j'ai abandonné (avant ça). J'ai déjà vu la vignette (mais je l'ai perdue d'une façon ou d'une autre!) Un problème que j'ai maintenant, c'est que je ne sais pas comment créer les variables groupet time. (J'ai essayé de les créer pour l'analyse / la prévision de séries chronologiques, mais j'ai fait le tour.) Je suis sûr que c'est dans la vigette - donc je vous répondrai si j'ai du mal. Merci encore :)
OSlOlSO

Heureux que ce soit utile. J'ai ajouté un exemple de création de ces variables. J'espère que cela pourra aider.
Matt Blackwell

Merci pour les exemples @Matt. Pour une raison étrange, cela m'a donné une erreur lorsque j'ai utilisé "ts = time" et "cs = group". Je remplace simplement "heure" et "groupe" par le numéro de colonne respectif, puis cela a fonctionné. 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

Pour les limites, j'ai suivi la vignette et créé des limites en utilisant: bds <- matrix(c(6, 7, 8,0, 0,0, 500, 500,500), nrow = 3, ncol = 3)j'ai simplement choisi 500 comme limite supérieure aléatoire. J'ai essayé de ne pas donner une troisième colonne, mais j'ai Ameliaaverti que cela nécessitait la troisième. Existe-t-il peut-être un moyen de spécifier simplement une limite inférieure?
OSlOlSO

J'ai ajouté un exemple des données dans la question - peut-être si cela a causé l'erreur? Mais j'en doute.
OSlOlSO
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.