如何根据年份模式匹配面板数据?

时间:2019-02-01 10:20:40

标签: r data.table panel-data

我想从对照库中选择个体,以作为已治疗病例的对照。如果对照组的个人一年内的活动/不活动与治疗的活动模式相匹配,则选择该个人。

例如。一个治疗的病例有:2009年,2011年活跃,但2010年没有活跃(因此该年没有记录)。受治疗者的控制只能由在2009年和2011年也有活动但在2010年没有活动的个人组成。

我只看治疗活动模式中的3年障碍。因此,从有活动的最大年份到两年之前。

如果我为治疗池和对照池分别设置了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匹配
26
37
48

有人能指出我正确的方向吗?

(不确定如何处理此问题的最佳方法,但是现在我有一个函数可以处理情况,为控件选择个体并计算效果。因此,我对与特定ID匹配的控件ID列表感到满意处理过的情况。然后,我将使用这些ID来对主控件data.table进行子集化。)

对于预期的输出,说匹配方法在此函数中:

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

然后在ID 1上运行此功能

get_control_ids(1)

将导致一个包含与之匹配的控件ID的向量。 因此,使用我的小型控制池,该函数将返回仅包含5的向量。

编辑:我不确定输出应该是什么样。因此,任何有关此的技巧也很方便。 也许像这样的数据表:

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

有关更多信息,我有一个calculate_effects(treated_key)函数,该函数以这种方式工作:

我有3个data.tables:
treated-每年的活动都有重复的ID(加上其他列)
treated_keys-具有唯一的ID(在我的实际数据中,我有两列来标识特定的已处理对象)
control

我像这样使用calculate_effects(treated_key)函数:

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

在函数中,treated使用特定的treated_key进行了子集化,该特定的control会提取属于该特定治疗案例的所有记录。

在函数中,calculate_effects(treated_key)根据某些匹配规则被子集,然后用于计算。

我想在我的treated_key中添加代码,以正确选择该特定state = { checkedServicesIds: [] // Array<number> } 的控件。

1 个答案:

答案 0 :(得分:1)

假设每年进行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