如何根据年份模式匹配面板数据?
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
2
和 6
3
与 7
4
与 8
任何人都可以指出我正确的方向吗?
(不确定处理这个问题的最佳方法,但现在我有一个函数,它接受一个处理过的案例,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
我想 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
2
和 6
3
与 7
4
与 8
任何人都可以指出我正确的方向吗?
(不确定处理这个问题的最佳方法,但现在我有一个函数,它接受一个处理过的案例,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