Багаторазова імпутація даних про відсутніх підрахунків у часових рядах з панельного дослідження


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

Як ви помітили, насправді є додаткові деталі «Природне» та «Неприродне».

Відповіді:


10

Ви можете використовувати Ameliaпакет для імпультування даних (повне розкриття: Я один з авторів Amelia). Пакет віньєтка має розширений приклад того , як використовувати його для розрахунку відсутніх даних.

Схоже, у вас є одиниці, які мають місцеву групу за статтю та віком, що спостерігаються на місячному рівні. Спочатку ви створюєте змінну коефіцієнта для кожного типу одиниць (тобто, одного рівня для кожної округи за статтю-віком). Давайте назвемо це group. Тоді вам знадобиться змінна для часу, яка, мабуть, кількість місяців з січня 2003 року. Таким чином, ця змінна була б 13 січня 2004 року. Назвіть цю змінну time. Amelia дозволить вмикати на основі часових тенденцій наступні команди:

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

Аргументи tsі csпросто позначають змінні часу та одиниці. У splinetimeнаборах аргументів , наскільки гнучким повинні часу бути використані приписувати відсутні дані. Тут 2 означає, що для імпутації буде використана квадратична функція часу, але більш високі значення будуть більш гнучкими. intercsАргумент тут говорить Амелії використовувати окрему тимчасову тренд для кожного район-пол-вікової групи. Це додає моделі багато параметрів, тому якщо ви зіткнулися з проблемою, ви можете встановити це, FALSEщоб спробувати налагодити.

У будь-якому випадку, це отримає вам імпутації, використовуючи інформацію про час у ваших даних. Оскільки відсутні дані обмежені нулем, ви можете використовувати boundsаргумент, щоб примусити імпутації до цих логічних меж.

EDIT: Як створити змінну групи / часу

Змінна часу може бути найпростішою у створенні, тому що потрібно просто рахувати з 2002 року (якщо припустити, що це найменший рік у ваших даних):

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

Змінна групи трохи складніше, але швидкий спосіб це зробити за допомогою команди 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змінних. (Я спробував створити їх для аналізу / прогнозування часових рядів, але отримав цикл навколо нього.) Я впевнений, що це в віньєтці - тому я з вами повернуся, якщо борюся. Ще раз дякую :)
OSlOlSO

Радий, що це корисно. Я додав приклад того, як створити ці змінні. Сподіваюся, що це допомагає.
Метт Блеквелл

Дякую за приклади @Matt. З якоїсь дивної причини це призвело до помилки, коли я використовував "ts = час" і "cs = група". Я просто замінюю "час" і "групу" відповідним номером стовпця, і тоді воно спрацювало. 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

Я додав приклад даних у запитання - можливо, якщо це спричинило помилку? Але я сумніваюся в цьому.
OSlOlSO
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.