Как сопоставить данные панели на основе шаблона года? - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу выбрать людей из контрольного пула, которые будут действовать в качестве контроля для рассматриваемого случая.Лица для контроля отбираются, если их активность / неактивность в течение года соответствует характеру активности обработанного.

Например.Рассмотренный случай имеет: активность в 2009, 2011, но нет активности в 2010 году (поэтому нет записей за этот год).Этот обработанный контроль должен состоять только из лиц, которые также имели активность в 2009 и 2011 годах и не имели активности в 2010 году.

Я смотрю только на 3-летние блоки в схеме обработанной активности.Таким образом, начиная с максимального года, в котором была активность, до 2-х лет до этого.

Если у меня есть отдельные data.tables для обработанного и контрольного пула, как бы мне их сопоставить?

Обработановыглядело бы так:

treated <- data.table(id = c(1, 1, 1, 2, 2, 3, 3, 4),
                      yr = c(2010, 2011, 2012, 2011, 2012, 2010, 2012, 2013))
id     yr
1   2010            
1   2011            
1   2012            
2   2011            
2   2012            
3   2010            
3   2012            
4   2013

Контроль

control <- data.table(id = c(rep(5, 6), rep(6, 3), 7, 7, 8, 8, 8),
                      yr = c(2009:2014, 2011, 2012, 2013, 2010, 2012, 2009, 2013, 2014))
id     yr
5   2009            
5   2010            
5   2011            
5   2012            
5   2013            
5   2014            
6   2011            
6   2012            
6   2013            
7   2010    
7   2012            
8   2009
8   2013    
8   2014    

Я пытался перевести оба формата в широкий, чтобы можно было создавать NA за недостающие годы, но не смогНе могу понять, как найти соответствие оттуда.

dcast(treated, id ~ yr, value.var = "yr")

id    2010    2011    2012    2013
-----------------------------------
1     2010    2011    2012     NA
2     NA      2011    2012     NA
3     2010    NA      2012     NA
4     NA      NA      NA       2013

Таким образом, картина активности / неактивности для каждого из обработанных будет:

id   pattern
=====================
1  2010  2011  2012
2  NA    2011  2012
3  2010  NA    2012
4  NA    NA    2013
dcast(control, id ~ yr, value.var = "yr")

id    2009    2010    2011    2012    2013    2014
----------------------------------------------------
5     2009    2010    2011    2012    2013    2014
6     NA      NA      2011    2012    2013    NA
7     NA      2010    NA      2012    NA      NA
8     2009    NA      NA      NA      2013    2014

Так 1 должно совпадать с 5
2 с 6
3 с 7
4 с 8

Может кто-нибудь указатьменя в правильном направлении?

(Не уверен насчет лучшего способа справиться с этим, но сейчас у меня есть функция, которая берет обработанный случай, выбирает индивидуумов для элемента управления и вычисляет эффекты. Поэтому я был бы счастлив со списком идентификаторов элементов управления, которыесопоставить конкретный обработанный случай. Затем я использовал бы эти идентификаторы для подстановки основного управляющего data.table.)

Для ожидаемого вывода , скажем, метод сопоставления был в этой функции:

get_control_ids <- function(treated_id){
  ...
  return(vector_of_control_ids)
}

Тогда выполнение этой функции с идентификатором 1

get_control_ids(1)

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

Редактировать: я не уверен, как должен выглядеть вывод.Так что любые советы по этому вопросу тоже пригодятся.Может быть, data.table вроде:

treated_id    control_ids
-----------------------------------
1               5, 10, 13
2               6, 22, 23

Для большего контекста у меня есть функция calculate_effects(treated_key), которая работает следующим образом:

У меня есть 3 data.tables:
treated - идентификаторы повторяются с каждым годом активности (плюс другие столбцы)
treated_keys - уникальные идентификаторы (в моих реальных данных у меня есть два столбца для идентификации конкретного обработанного)
control

Я использую свою функцию calculate_effects(treated_key) следующим образом:

results <- treated_keys[, calculate_effects(.SD), by = 1:nrow(treated_keys)]

Внутри функции treated подмножество использует конкретный treated_key, который будет извлекать все записи, относящиеся к этой конкретной обработаннойcase.

Также внутри функции control подмножество в соответствии с некоторыми правилами соответствия, а затем используется в вычислениях.

Я хотел бы добавить код в мой calculate_effects(treated_key), который будет правильновыберите элемент управления для этого конкретного treated_key.

1 Ответ

0 голосов
/ 04 февраля 2019

Предполагая 3 годичных блока, вы можете сделать следующее:

#expand treated to fill in gap years if any
exptrt <- treated[, .(yr=seq(max(yr)-2L, max(yr))), by=.(id)][,
    att := 0L][
        treated, att := 1, on=.(id, yr)]

#pivot control into id against yr
pctrl <- dcast(control, id ~ yr, length, value.var = "yr")

#for each id, pivot treated and join with control using 
#whatever years are in treated incl gap years
exptrt[, cid := id]
exptrt[, {
    ptrt <- dcast(.SD, cid ~ yr, value.var="att")

    pctrl[ptrt, on=names(ptrt)[-1L], x.id]
}, by=.(id)]

вывод:

   id V1
1:  1  5
2:  2  6
3:  3  7
4:  4  8
...