在Stata中具有非偶数时间的不平衡面板的滚动和

在Stata中具有非偶数时间的不平衡面板的滚动和,stata,Stata,我有一个不平衡的每日面板,其中条目出现在不平衡的时间。我想生成某个变量在过去365天内的滚动总和x。我可以想出两种方法来实现这一点,但第一种是内存不足,第二种是处理器不足。有没有第三种选择可以避免这些问题 clear set obs 200 set seed 2001 /* panel variables */ generate id = 1 + int(2*runiform()) generate time = mdy(1, 1, 2000) + int(10*365*runiform())

我有一个不平衡的每日面板,其中条目出现在不平衡的时间。我想生成某个变量在过去365天内的滚动总和
x
。我可以想出两种方法来实现这一点,但第一种是内存不足,第二种是处理器不足。有没有第三种选择可以避免这些问题

clear
set obs 200
set seed 2001

/* panel variables */
generate id = 1 + int(2*runiform())
generate time = mdy(1, 1, 2000) + int(10*365*runiform())
format time %td
duplicates drop
xtset id time

/* data */
generate x = runiform()

/* first approach is to fill the panel with `tsfill` */
/* then remove "seasonality" with `s.` */
tsfill
generate sx = sum(x)
generate ssx = s365.sx

/* second approach without `tsfill` */
/* but nested loop is fairly slow */
drop if missing(x)
generate double ssx_alt = 0
forvalues i = 1/`= _N' {
    local j = `i'
    local delta = time[`i'] - time[`j']
    while ((`j' > 0) & (`delta' < 365) & (id[`i'] == id[`j'])) {
        local x = cond(missing(x[`j']), 0, x[`j'])
        replace ssx_alt = ssx_alt + `x' in `i'
        local j = `j' - 1
        local delta = time[`i'] - time[`j']
    }
}
以下是我的两个解决方案。有没有第三种解决方案没有内存或速度问题

clear
set obs 200
set seed 2001

/* panel variables */
generate id = 1 + int(2*runiform())
generate time = mdy(1, 1, 2000) + int(10*365*runiform())
format time %td
duplicates drop
xtset id time

/* data */
generate x = runiform()

/* first approach is to fill the panel with `tsfill` */
/* then remove "seasonality" with `s.` */
tsfill
generate sx = sum(x)
generate ssx = s365.sx

/* second approach without `tsfill` */
/* but nested loop is fairly slow */
drop if missing(x)
generate double ssx_alt = 0
forvalues i = 1/`= _N' {
    local j = `i'
    local delta = time[`i'] - time[`j']
    while ((`j' > 0) & (`delta' < 365) & (id[`i'] == id[`j'])) {
        local x = cond(missing(x[`j']), 0, x[`j'])
        replace ssx_alt = ssx_alt + `x' in `i'
        local j = `j' - 1
        local delta = time[`i'] - time[`j']
    }
}
清除
设置obs 200
2001年播种
/*面板变量*/
生成id=1+int(2*runiform())
生成时间=mdy(1,1,2000)+int(10*365*runiform())
格式化时间%td
重复下降
设置id时间
/*资料*/
生成x=runiform()
/*第一种方法是用“tsfill”填充面板*/
/*然后用's'去掉“季节性”*/
tsfill
生成sx=总和(x)
生成ssx=s365.sx
/*不带“tsfill”的第二种方法*/
/*但是嵌套循环相当慢*/
如果缺失,则删除(x)
生成双ssx_alt=0
对于值i=1/`=\u N'{
局部j=`i'
局部增量=时间[`i']-时间[`j']
而(`j'>0)&(`delta'<365)&(id[`i']==id[`j'])){
本地x=cond(缺少(x[`j']),0,x[`j'])
替换'i'中的ssx_alt=ssx_alt+'x'
局部j=`j'-1
局部增量=时间[`i']-时间[`j']
}
}
过去#天的总和是两个累计总和之间的差值,即到目前为止的累计总和和到#天之前的累计总和。面板数据的扩展很简单,但此处未显示。我认为,一旦您应用了
tsfill
,间隙不会影响这一原则

. set obs 20
obs was 0, now 20

. gen t = _n

. gen y = 100 + _n

. gen sumy = sum(y)

. tsset t
    time variable:  t, 1 to 20
            delta:  1 unit

. gen diff = sumy - L10.sumy
(10 missing values generated)

. l

     +------------------------+
    |  t     y   sumy   diff |
    |------------------------|
 1. |  1   101    101      . |
 2. |  2   102    203      . |
 3. |  3   103    306      . |
 4. |  4   104    410      . |
 5. |  5   105    515      . |
    |------------------------|
 6. |  6   106    621      . |
 7. |  7   107    728      . |
 8. |  8   108    836      . |
 9. |  9   109    945      . |
10. | 10   110   1055      . |
    |------------------------|
11. | 11   111   1166   1065 |
12. | 12   112   1278   1075 |
13. | 13   113   1391   1085 |
14. | 14   114   1505   1095 |
15. | 15   115   1620   1105 |
    |------------------------|
16. | 16   116   1736   1115 |
17. | 17   117   1853   1125 |
18. | 18   118   1971   1135 |
19. | 19   119   2090   1145 |
20. | 20   120   2210   1155 |
     +------------------------+

啊,谢谢!这与我的第一种方法相同,但我没有意识到使用时间序列操作符时,我不必首先填充面板(这只需要使用
[\u n-1]
下标)。谢谢