在Stata中具有非偶数时间的不平衡面板的滚动和
我有一个不平衡的每日面板,其中条目出现在不平衡的时间。我想生成某个变量在过去365天内的滚动总和在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())
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]
下标)。谢谢