Imputación múltiple de datos de recuento perdido en una serie temporal de un estudio de panel

9

Estoy tratando de abordar un problema que trata con la imputación de datos faltantes de un estudio de datos de panel (no estoy seguro si estoy usando correctamente el 'estudio de datos de panel', como lo aprendí hoy). Tengo datos de recuento total de muertes para los años 2003 hasta 2009, todos los meses, hombres y mujeres, para 8 distritos diferentes y para 4 grupos de edad.

El marco de datos se parece a esto:

         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

Durante los 10 meses repartidos entre 2007 y 2008, no se registraron algunas de las muertes totales de todos los distritos. Estoy tratando de estimar estos valores perdidos a través de un método de imputación múltiple. Ya sea utilizando modelos lineales generalizados o modelos SARIMA.

Mi mayor problema es el uso de software y la codificación. Hice una pregunta sobre Stackoverflow, donde quiero extraer los datos en grupos más pequeños como este:

         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

Caminante a

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

Pero alguien sugirió que preferiría traer mi pregunta aquí, ¿tal vez pedir una dirección? Actualmente no puedo ingresar estos datos como un estudio adecuado de series de tiempo / panel en R. Mi objetivo final es utilizar estos datos y el amelia2paquete con sus funciones para imputarlos por faltar TotalDeathsdurante ciertos meses en 2007 y 2008, donde los datos están desaparecido.

Agradeceríamos cualquier ayuda, cómo hacer esto y tal vez sugerencias sobre cómo abordar este problema.

Si esto ayuda, estoy tratando de seguir un enfoque similar al que Clint Roberts hizo en su tesis doctoral .

EDITAR:

Después de crear la variable 'tiempo' y 'grupo' como sugiere @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

Como notará, en realidad hay más detalles 'Natural' y 'Antinatural'.

OSlOlSO
fuente

Respuestas:

10

Puede usar el Ameliapaquete para imputar los datos (divulgación completa: soy uno de los autores de Amelia). La viñeta del paquete tiene un ejemplo extendido de cómo usarla para imputar datos faltantes.

Parece que tiene unidades que son observadas a nivel mensual por distrito, género y edad. Primero crea una variable de factor para cada tipo de unidad (es decir, un nivel para cada distrito-género-grupo de edad). Llamemos esto group. Entonces, necesitaría una variable de tiempo, que probablemente sea el número de meses desde enero de 2003. Por lo tanto, esta variable sería 13 en enero de 2004. Llame a esta variable time. Amelia te permitirá imputar según las tendencias de tiempo con los siguientes comandos:

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

Los argumentos tsy cssimplemente denotan las variables de tiempo y unidad. El splinetimeargumento establece qué tan flexible debe usarse el tiempo para imputar los datos faltantes. Aquí, un 2 significa que la imputación utilizará una función cuadrática del tiempo, pero los valores más altos serán más flexibles. El intercsargumento aquí le dice a Amelia que use una tendencia de tiempo separada para cada grupo de distrito-género-edad. Esto agrega muchos parámetros al modelo, por lo que si tiene problemas, puede configurarlo FALSEpara tratar de depurar.

En cualquier caso, esto le dará imputaciones utilizando la información de tiempo en sus datos. Como los datos que faltan están limitados a cero, puede usar el boundsargumento para forzar las imputaciones dentro de esos límites lógicos.

EDITAR: Cómo crear variables de grupo / tiempo

La variable de tiempo podría ser la más fácil de crear, porque solo necesita contar desde 2002 (suponiendo que sea el año más bajo en sus datos):

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

La variable de grupo es un poco más difícil, pero una forma rápida de hacerlo es usando el comando pegar:

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

Con estas variables creadas, desea eliminar las variables originales de la imputación. Para hacer eso puedes usar el idvarsargumento:

a.out <- amelia(my.data, ts = "time", cs = "group", splinetime = 2, intercs = TRUE,
                idvars = c("District", "Gender", "Month", "Year", "AgeGroup"))
Matt Blackwell
fuente
¡Muchas gracias por su respuesta! He estado jugando Ameliaun poco pero me di por vencido (antes de esto). Anteriormente he visto la viñeta (¡pero la perdí de alguna manera!) Acabo de echarle un vistazo y la pasaré por completo. Un problema que tengo ahora es que no estoy seguro de cómo crear las variables groupy time. (Intenté crearlos para el análisis / pronóstico de series de tiempo, pero obtuve un bucle al respecto). Estoy seguro de que está en la vigencia, así que me pondré en contacto con usted si tengo dificultades. Gracias de nuevo :)
OSlOlSO
Me alegra que sea útil. Agregué un ejemplo de cómo crear esas variables. Espero que ayude.
Matt Blackwell
Gracias por los ejemplos @Matt. Por alguna extraña razón me dio un error cuando usé "ts = time" y "cs = group". Simplemente reemplazo "tiempo" y "grupo" por el número de columna respectivo y luego funcionó. 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
Para los límites, seguí la viñeta y creé límites usando: bds <- matrix(c(6, 7, 8,0, 0,0, 500, 500,500), nrow = 3, ncol = 3)Básicamente, elegí 500 como límite superior aleatorio. Intenté simplemente no dar una tercera columna, pero Ameliaadvertí que requiere la tercera. ¿Hay alguna forma de especificar un límite inferior?
OSlOlSO
Agregué un ejemplo de los datos en la pregunta, ¿tal vez si esto causó el error? Pero lo dudo.
OSlOlSO