基于时间窗而非观测值的Stata移动平均值

基于时间窗而非观测值的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

我有一份人员名单、注册时间和分数。在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
时间戳。

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'