我有人员,注册时间和分数列表。在Stata中,我想根据每个观察点周围的时间窗口计算得分的移动平均值(不是基于滞后/超前观察数量的窗口)。
例如,假设任何一方+/- 2天而不包括当前观察,我正在尝试计算这样的事情:
user_id day score window_avg
A 1 1 1.5 = (avg of B and C)
B 1 2 1 = (avg of A and C)
C 3 1 2.25 = (avg of A, B, D, and E)
D 4 3 2 = (avg of C and E)
E 5 3 2.5 = (avg of C, D, F, and G
F 7 1 4 = (avg of E and G)
G 7 5 2 = (avg of E and F)
H 10 3 . = blank
我尝试使用tsset
定义数据集,然后使用tssmooth
,但无法使其工作。由于在给定时间段内可能存在多个观察结果,因此我不确定这是否是正确的方法。另外,实际上,day变量是tc
时间戳。
答案 0 :(得分:3)
tsset
即使您按时间间隔定时也无法提供帮助,因为您有一些重复的时间值,但您的数据不符合Stata意义上的面板数据。但问题应该产生一种可能性的循环。首先,让我们使用整数天来表示你的例子。
gen window_avg = .
su day, meanonly
qui forval d = `r(min)'/`r(max)' {
su score if inrange(day, `d' - 2, `d' + 2), meanonly
replace window_avg = (r(sum) - score) / (r(N) - 1) if day == `d'
}
这里我们假设没有缺失值。结转的原则是
其他人的平均值=(所有的总和 - 此值)/(值的数量 - 1)
在http://www.stata.com/support/faqs/data-management/creating-variables-recording-properties/
讨论实际上,您不希望以毫秒为单位循环所有可能的日期时间。因此,尝试循环观察此形式。注意<pseudocode>
个元素。
gen window_avg = .
qui forval i = 1/`=_N' {
su score if inrange(date, <date[`i'] - 2 days>, <date[`i'] + 2 days>), meanonly
replace window_avg = (r(sum) - score) / (r(N) - 1) in `i'
}
本文也是相关的:
Cox,N.J。2007.间隔事件。 Stata Journal 7:440-443。 http://www.stata-journal.com/sjpdf.html?articlenum=pr0033
如果遗漏可能,则需要更复杂的一行:
replace window_avg = (r(sum) - cond(missing(score), 0, score)) / (r(N) - !missing(score)) in `i'
意味着如果缺少当前值,我们从总和中减去0,从观察计数中减去0。
编辑:在2毫秒(毫秒)内,利用内置函数并使用cofd(2)
。