我想从对照库中选择个体,以作为已治疗病例的对照。如果对照组的个人一年内的活动/不活动与治疗的活动模式相匹配,则选择该个人。
例如。一个治疗的病例有: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
匹配
2
与6
3
与7
4
和8
有人能指出我正确的方向吗?
(不确定如何处理此问题的最佳方法,但是现在我有一个函数可以处理情况,为控件选择个体并计算效果。因此,我对与特定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>
}
的控件。
答案 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