【发布时间】: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 匹配2 与63 与74 与8 匹配
谁能指出我正确的方向?
(不确定处理这个问题的最佳方法,但现在我有一个函数,它接受一个处理过的案例,选择控制个体并计算效果。所以我会很高兴有一个与特定匹配的控制 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