Imputação múltipla para dados de contagem ausentes em uma série temporal de um estudo de painel

9

Estou tentando resolver um problema que lida com a imputação de dados ausentes de um estudo de dados em painel (não tenho certeza se estou usando o 'estudo de dados em painel' corretamente - como o aprendi hoje.) Tenho dados de contagem total de mortos nos anos 2003 até 2009, todos os meses, masculino e feminino, em 8 distritos diferentes e em 4 faixas etárias.

O dataframe se parece com isso:

         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

Nos 10 meses distribuídos em 2007 e 2008, algumas das mortes totais de todos os distritos não foram registradas. Estou tentando estimar esse valor ausente por meio de um método de imputação múltipla. Utilizando modelos lineares generalizados ou modelos SARIMA.

Meu maior problema é o uso de software e a codificação. Fiz uma pergunta no Stackoverflow, onde quero extrair os dados em grupos menores 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

Indo a

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

Mas alguém sugeriu que eu deveria trazer minha pergunta aqui - talvez pedir uma direção? Atualmente, não consigo inserir esses dados como um estudo de série / painel da R. adequado. Meu objetivo final é usar esses dados e o amelia2pacote com suas funções para atribuir a falta TotalDeathspor certos meses em 2007 e 2008, onde os dados são ausência de.

Qualquer ajuda, como fazer isso e talvez sugestões sobre como lidar com esse problema seriam apreciadas com gratidão.

Se isso ajudar, estou tentando seguir uma abordagem semelhante ao que Clint Roberts fez em sua tese de doutorado .

EDITAR:

Depois de criar a variável 'time' e 'group', conforme sugerido por @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 você percebe, há realmente mais detalhes 'Natural' e 'Não Natural'.

OSlOlSO
fonte

Respostas:

10

Você pode usar o Ameliapacote para imputar os dados (divulgação completa: sou um dos autores de Amelia). A vinheta de pacote tem um exemplo extenso de como usá-lo para imputar dados ausentes.

Parece que você tem unidades que são do grupo distrito-gênero-idade observadas no nível mensal. Primeiro, você cria uma variável de fator para cada tipo de unidade (ou seja, um nível para cada grupo de distrito-sexo-idade). Vamos chamar assim group. Então, você precisaria de uma variável para o tempo, que provavelmente é o número de meses desde janeiro de 2003. Portanto, essa variável seria 13 em janeiro de 2004. Chame essa variável time. Amelia permitirá que você imute com base nas tendências de tempo com os seguintes comandos:

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

Os argumentos tse cssimplesmente indicam as variáveis ​​de tempo e unidade. O splinetimeargumento define o quão flexível o tempo deve ser usado para imputar os dados ausentes. Aqui, um 2 significa que a imputação usará uma função quadrática do tempo, mas valores mais altos serão mais flexíveis. O intercsargumento aqui diz a Amelia para usar uma tendência temporal separada para cada grupo de distrito-gênero-idade. Isso adiciona muitos parâmetros ao modelo; portanto, se você tiver problemas, poderá configurá-lo FALSEpara tentar depurar.

De qualquer forma, você receberá imputações usando as informações de tempo em seus dados. Como os dados ausentes são delimitados a zero, você pode usar o boundsargumento para forçar imputações nesses limites lógicos.

EDIT: Como criar variáveis ​​de grupo / hora

A variável time pode ser a mais fácil de criar, porque você só precisa contar a partir de 2002 (supondo que esse seja o ano mais baixo dos seus dados):

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

A variável de grupo é um pouco mais difícil, mas uma maneira rápida de fazer isso é usando o comando colar:

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

Com essas variáveis ​​criadas, você deseja remover as variáveis ​​originais da imputação. Para fazer isso, você pode usar o idvarsargumento:

a.out <- amelia(my.data, ts = "time", cs = "group", splinetime = 2, intercs = TRUE,
                idvars = c("District", "Gender", "Month", "Year", "AgeGroup"))
Matt Blackwell
fonte
Muito obrigado pela sua resposta! Eu já brinco Ameliaum pouco, mas desisti (antes disso). Eu já tinha visto a vinheta (mas a perdi de alguma forma!) Basta dar uma olhada rápida e passar por ela. Um problema que eu agora tenho é que eu sou incerto sobre como criar os groupe timevariáveis. (Eu tentei criá-los para análise / previsão de séries temporais, mas tenho um loop em torno disso.) Tenho certeza de que está na vigília - por isso, retornarei a você se estiver com dificuldades. Obrigado novamente :)
OSlOlSO
Ainda bem que é útil. Eu adicionei um exemplo de como criar essas variáveis. Espero que ajude.
Matt Blackwell
Obrigado pelos exemplos @Matt. Por algum motivo estranho, ocorreu um erro quando usei "ts = time" e "cs = group". Acabei de substituir "time" e "group" pelo respectivo número da coluna e, em seguida, funcionou. 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 os limites, segui a vinheta e criei limites usando: bds <- matrix(c(6, 7, 8,0, 0,0, 500, 500,500), nrow = 3, ncol = 3)Basicamente, apenas escolhi 500 como um limite superior aleatório. Tentei não dar uma terceira coluna, mas Ameliaavisei que ela requer a terceira. Existe talvez uma maneira de apenas especificar um limite inferior?
OSlOlSO
Adicionei um exemplo dos dados na pergunta - talvez se isso tenha causado o erro? Mas duvido.
OSlOlSO