【问题标题】:How to match panel data based on year pattern?如何根据年份模式匹配面板数据?
【发布时间】:2019-06-25 21:48:36
【问题描述】:

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

例如。一个治疗病例有: 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 匹配
26
37
48 匹配

谁能指出我正确的方向?

(不确定处理这个问题的最佳方法,但现在我有一个函数,它接受一个处理过的案例,选择控制个体并计算效果。所以我会很高兴有一个与特定匹配的控制 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 的控件。

【问题讨论】:

  • 您可以使用合并函数并在 by 参数中指定所有年份变量,这些变量存在于处理中。类似于 merge(dcasted_treatment, dcasted_control, by = c("2010", "2011", "2012", "2013"), all.x = T)。不知道它如何处理 na,但如果你可以用 -99 或之前的东西替换 NA。
  • 你能显示预期的输出吗?
  • 与其添加更多描述,不如根据您提供的输入显示预期输出不是更好吗?
  • 正如我在问题中所写,预期的输出是一个匹配 id 的向量。因此,对于我的示例,处理过的1 的预期输出只是c(5) - 这是我的控件中与处理过的匹配的 id。对于实际数据,向量当然会有很长的 id 列表。
  • @happyspace 我知道你写的,但你为什么不更新你的问题并显示dcast(treated, id ~ yr, value.var = "yr")dcast(control, id ~ yr, value.var = "yr") 匹配后你期望什么?周围的 data.table 向导之一可能会在几分钟内为您提供解决方案。

标签: r data.table panel-data


【解决方案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

【讨论】:

  • 2 与 5 不匹配,因为我只查看以 3 年为单位的处理,从最大(非 NA)年开始倒数。所以对于 1,模式是“2010, 2011, 2012”。对于 2,模式为“NA, 2011, 2012”。我将编辑问题以使其清楚。
  • 请问如果是 3y 块,为什么 2 与 6 匹配?从最近的一年开始,回顾 3 年?
  • 是的,没错。所以我们不在乎之后的几年。
猜你喜欢
  • 2020-06-04
  • 2019-09-06
  • 2021-11-25
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多