Stata移动平均线基于时间窗口,而非#观察

时间:2013-12-06 16:04:55

标签: 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 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时间戳。

1 个答案:

答案 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)