基于时间窗而非观测值的Stata移动平均值
我有一份人员名单、注册时间和分数。在Stata中,我想根据每个观察的时间窗口(而不是基于滞后/领先观察次数的窗口)计算得分的移动平均值 例如,假设两边都有+/-2天,不包括当前的观察结果,我试图计算如下:基于时间窗而非观测值的Stata移动平均值,stata,moving-average,Stata,Moving Average,我有一份人员名单、注册时间和分数。在Stata中,我想根据每个观察的时间窗口(而不是基于滞后/领先观察次数的窗口)计算得分的移动平均值 例如,假设两边都有+/-2天,不包括当前的观察结果,我试图计算如下: user_id day score window_avg A 1 1 1.5 = (avg of B and C) B 1 2 1 = (avg of
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
时间戳。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)
这将在
实际上,您不希望以毫秒为单位循环所有可能的日期时间。所以,试着对这种形式的观察进行循环。注意
元素
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'
}
这意味着如果缺少当前值,我们将从观测值的总和中减去0,从观测值的计数中减去0
编辑:利用内置函数并使用cofd(2)
以毫秒为单位编辑2天
replace window_avg = (r(sum) - cond(missing(score), 0, score)) / (r(N) - !missing(score)) in `i'