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

How to match panel data based on year pattern?

我想 select 对照池中的个体作为治疗病例的对照。如果对照组的个体在一年中的 activity/inactivity 与治疗组的 activity 模式相匹配,则将对其进行 select 编辑。

例如。一个治疗的病例有:2009 年、2011 年 activity 但 2010 年没有 activity(所以那一年没有记录)。这种治疗的控制应该只由在 2009 年和 2011 年也有 activity 而在 2010 年没有 activity 的人组成。

我只查看经过处理的 activity 模式中的 3 年期。因此,从 activity 到 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

因此每个被处理的 activity/inactivity 模式将是:

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

任何人都可以指出我正确的方向吗?

(不确定处理这个问题的最佳方法,但现在我有一个函数,它接受一个处理过的案例,selects 个人进行控制并计算效果。所以我会很高兴有一个列表匹配特定处理案例的控件 ID。然后我将使用这些 ID 对主控件进行子集 data.table。)

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

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

然后运行这个函数就id 1

get_control_ids(1)

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

的向量

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

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

有关更多上下文,我有一个 calculate_effects(treated_key) 函数以这种方式工作:

我有3个data.tables:
treated - activity 的每一年都有重复的 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) 中添加代码,它将正确 select 特定 treated_key.

的控件

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