计算动态范围内的观测值 [英] Count observations within dynamic range

查看:17
本文介绍了计算动态范围内的观测值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑以下示例:

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 tip 51: Events in intervals。这似乎是可行的,但是我的数据集很大(>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

推荐答案

我假设治疗不能在上一次治疗后一年内发生(在该组中)。这在您的示例数据中是正确的,但在一般情况下可能不正确。但是,假设情况是这样的,那么这应该是可行的。我使用的是SSC上的carryforward(ssc install carryforward)。就像你最近的想法一样,我在最近一次治疗后一年确定,并计算在该窗口中观察到的次数。

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

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

这篇关于计算动态范围内的观测值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆