计算动态范围内的观测值

强尼

考虑以下示例:

input group day month year number treatment NUM
1 1 2 2000 1 1 2
1 1 6 2000 2 0 .
1 1 9 2000 3 0 .
1 1 5 2001 4 0 .
1 1 1 2010 5 1 1
1 1 5 2010 6 0 .
2 1 1 2001 1 1 0
2 1 3 2002 2 1 0
end

gen date = mdy(month,day,year) 
format date %td
drop day month year

对于每个小组,我都有不同数量的观察结果。每个观察值都引用一个指定了日期的事件。可变编号是每个组中的编号。

现在,我想计算从该组中每个治疗观察(不包括其自身)的日期起一年内发生的观察的数量。这意味着,我想创建上面示例中已放入的变量NUM。我不在乎处理= 0的观察次数。

编辑开始:发现以下信息丢失,但对于解决此问题是必需的:如果去年同一组中没有观察到,则治疗变量的值为1。因此,变量NUM也不必考虑处理= 1的观测值。原则上,一个组中可能有两个观测值具有相同日期的观测值。编辑结束

我研究了Stata技巧51:间隔事件看来可行,但是我的数据集很大(> 1个mio观测值),因此它实际上效率很低-尤其是因为我并不关心所有处理= 0个观测值。

我想知道是否还有其他选择。我的方法是寻找每个组中的最新日期仍在1年以内的观测值(并可能将其存储在可变的latestDate中)。然后,我将简单地从处理= 0变量的计数值中减去观察到的变量数中的值。

注意:我的“低效”代码如下所示

gsort -treatment
gen treatment_id = _n
replace treatment_id = . if treatment==0
gen count=.
sum treatment_id, meanonly
qui forval i = 1/`r(max)'{
        count if inrange(date-date[`i'],1,365) & group == group[`i']
        replace count = r(N) in `i'
}
sort group date
jfig树

我假设该治疗不能在上次治疗后(在该组中)在1年内发生。在您的示例数据中,这是正确的,但通常可能并非如此。但是,假设是这种情况,那么这应该可以工作。我正在使用carryforwardSSC(ssc install carryforward)上的内容。像您的latestDate想法一样,我确定最近一次治疗后的一年并计算该窗口中的观察次数。

sort group date
gen yrafter = (date + 365) if treatment == 1
by group: carryforward yrafter, replace
format yrafter %td
gen in_window = date <= yrafter & treatment == 0
egen answer = sum(in_window), by(group yrafter)
replace answer = . if treatment == 0

我不能保证这样做会比循环快,但我怀疑会这样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章