Множественное вложение для пропущенных данных подсчета во временном ряду из группового исследования

9

Я пытаюсь решить проблему, связанную с вменением недостающих данных из исследования данных панели (не уверен, правильно ли я использую «исследование данных панели» - как я узнал это сегодня.) У меня есть данные общего количества смертей за 2003 год до 2009 года, все месяцы, мужчины и женщины, для 8 различных районов и для 4 возрастных групп.

Фрейм данных выглядит примерно так:

         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

За 10 месяцев, распределенных в течение 2007 и 2008 годов, некоторые из всех смертей во всех районах не были зарегистрированы. Я пытаюсь оценить эти недостающие значения с помощью метода множественного вменения. Либо с использованием обобщенных линейных моделей, либо моделей SARIMA.

Моя самая большая проблема - использование программного обеспечения и кодирования. Я задал вопрос о Stackoverflow, где я хочу выделить данные в меньшие группы, такие как эта:

         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

Собираюсь

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

Но кто-то предложил мне поставить этот вопрос здесь - может быть, спросить направление? В настоящее время я не могу ввести эти данные в качестве правильного временного ряда / панельного исследования в R. Моя конечная цель состоит в том, чтобы использовать эти данные и amelia2пакет с их функциями, чтобы рассчитать их отсутствие в TotalDeathsтечение определенных месяцев в 2007 и 2008 годах, где данные отсутствует.

Буду признателен за любую помощь, как это сделать и, возможно, предложения о том, как решить эту проблему.

Если это помогает, я пытаюсь следовать подходу, аналогичному тому, что сделал Клинт Робертс в своей диссертации .

РЕДАКТИРОВАТЬ:

После создания переменных time и group, предложенных @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

Как вы заметили, на самом деле есть еще детали «Естественный» и «Неестественный».

OSlOlSO
источник

Ответы:

10

Вы можете использовать Ameliaпакет для вменения данных (полное раскрытие: я один из авторов Amelia). Пакет виньетка имеет расширенный пример того , как использовать его для расчета недостающих данных.

Похоже, что у вас есть единицы, которые по району, полу и возрасту наблюдаются на месячном уровне. Сначала вы создаете факторную переменную для каждого типа единиц (то есть один уровень для каждой группы округ-пол-возраст). Давайте назовем это group. Затем вам понадобится переменная времени, которая, вероятно, будет числом месяцев с января 2003 года. Таким образом, эта переменная будет 13 в январе 2004 года. Вызовите эту переменную time. Амелия позволит вам вменять, основываясь на временных тенденциях, следующие команды:

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

В tsи csаргументы просто обозначают временные и единичные переменные. В splinetimeнаборах аргументов , насколько гибким должны времени быть использованы приписывать недостающие данные. Здесь 2 означает, что вменение будет использовать квадратичную функцию времени, но более высокие значения будут более гибкими. intercsАргумент здесь говорит Амелии использовать отдельную временную тренд для каждого район-пол-возрастной группы. Это добавляет много параметров в модель, поэтому, если у вас возникнут проблемы, вы можете установить это FALSEдля попытки отладки.

В любом случае это даст вам возможность использовать данные о времени в ваших данных. Поскольку отсутствующие данные ограничены нулем, вы можете использовать boundsаргумент для навязывания этих логических границ.

РЕДАКТИРОВАТЬ: Как создать переменные группы / времени

Переменная времени может быть проще всего создать, потому что вам просто нужно сосчитать с 2002 года (при условии, что это самый низкий год в ваших данных):

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

Переменная group немного сложнее, но быстрый способ сделать это - использовать команду paste:

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

Создав эти переменные, вы хотите удалить исходные переменные из вменения. Для этого вы можете использовать idvarsаргумент:

a.out <- amelia(my.data, ts = "time", cs = "group", splinetime = 2, intercs = TRUE,
                idvars = c("District", "Gender", "Month", "Year", "AgeGroup"))
Мэтт Блэквелл
источник
Большое вам спасибо за ваш ответ! Я играл Ameliaнемного, но сдался (до этого). Ранее я видел виньетку (но как-то ее потерял!), Просто быстро взглянул на нее и подробно ее расскажу. Одна из проблем , теперь у меня есть то , что я неопределенный о том , как создать groupи timeпеременные. (Я пытался создать их для анализа / прогнозирования временных рядов, но у меня получилось зацикливаться на этом.) Я уверен, что это в vigette - так что я свяжусь с вами, если буду бороться.
Еще
Рад, что это полезно. Я добавил пример того, как создать эти переменные. Надеюсь, это поможет.
Мэтт Блэквелл
Спасибо за примеры @Matt. По какой-то странной причине это дало мне ошибку, когда я использовал "ts = time" и "cs = group". Я просто заменил «время» и «группа» на соответствующий номер столбца, и тогда это сработало. 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
Для границ я следовал за виньеткой и создавал границы, используя: bds <- matrix(c(6, 7, 8,0, 0,0, 500, 500,500), nrow = 3, ncol = 3)я просто выбрал 500 в качестве случайного верхнего предела. Я попытался просто не дать третий столбец, но Ameliaпредупредил, что для этого нужен третий. Есть ли способ указать конкретный нижний предел?
OSlOlSO
Я добавил пример данных в вопросе - возможно, это вызвало ошибку? Но я сомневаюсь в этом.
ОСАДО