首页 > 解决方案 > 如何根据年份模式匹配面板数据?

问题描述

我想从对照池中选择个体作为治疗病例的对照。如果他们在一年中的活动/不活动与治疗的活动模式相匹配,则选择控制个体。

例如。一个治疗病例有: 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应该搭配 with 5
2with 6
3with 7
4with8

谁能指出我正确的方向?

(不确定处理这个问题的最佳方法,但现在我有一个函数,它接受一个处理过的案例,为控制选择个体并计算效果。所以我会对与特定处理过的案例匹配的控制 ID 列表感到满意。然后我会使用这些 id 来对主控件 data.table 进行子集化。)

对于预期的输出,假设匹配方法在这个函数中:

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

然后在id上运行这个函数1

get_control_ids(1)

将产生一个包含与其匹配的控件 ID 的向量。因此,使用我的微型控制池,该函数将返回一个仅包含5.

编辑:我不确定输出应该是什么样子。所以任何关于这方面的提示也会很方便。也许一个 data.table 像:

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

标签: rdata.tablepanel-data

解决方案


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

推荐阅读