gpt4 book ai didi

stata - 计算动态范围内的观测值

转载 作者:行者123 更新时间:2023-12-02 21:22:12 25 4
gpt4 key购买 nike

考虑以下示例:

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 上的结转(ssc installarryforward)。就像您的 previousDate 想法一样,我确定最近一次治疗后的一年,并计算该窗口中的观察次数。

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

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

关于stata - 计算动态范围内的观测值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26817366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com