我希望获得超过j
的运行总和,例如对于行_n
和j=3
,我想获得x[_n] + x[_n+1] + x[_n+2]
。
我想做以下几招:
by grouping: gen foo = sum(log(x))
by grouping: replace foo = foo - foo[_n - `y'] if _n > `y'
但是,这对于缺失值并不稳健。 sum()
为缺失值生成0
,如果要求总和的值中的至少一个为.
,则需要累计总和为.
。我将如何实现这一目标?
我也需要它来处理大型j
,所以手动添加它们是不可行的。
答案 0 :(得分:1)
有几种方法可以解释和解决它:
clear
set more off
input ///
id myvar
1 3
1 4
1 .
1 8
1 7
1 2
1 .
1 8
2 3
2 4
2 .
2 8
2 7
2 2
2 .
2 8
end
// this?
bysort id: gen s = cond(!missing(myvar), sum(myvar), .)
// or this? (or something else?)
clonevar s2 = s
bysort id: replace s2 = . if missing(s2[_n-1]) & _n > 1
list, sepby(id)
如果你想要其中任何一个,我不清楚。
答案 1 :(得分:0)
窃取Roberto的可重复示例(在帖子中没有这样做)另一种方法是使用tsegen
(SSC),它必须与ssc inst tsegen
一起安装。对tsset
或xtset
数据集至关重要。 tsegen
已经将语法连接到一个规定最小数量的非缺失参数的方法,这里所有这些都是。
clear
set more off
input ///
id myvar
1 3
1 4
1 .
1 8
1 7
1 2
1 .
1 8
2 3
2 4
2 .
2 8
2 7
2 2
2 .
2 8
end
sort id, stable
by id: gen t = _n
tsset id t
tsegen run = rowtotal(F(0/2).myvar, 3)
list , sepby(id)
+----------------------+
| id myvar t run |
|----------------------|
1. | 1 3 1 . |
2. | 1 4 2 . |
3. | 1 . 3 . |
4. | 1 8 4 17 |
5. | 1 7 5 . |
6. | 1 2 6 . |
7. | 1 . 7 . |
8. | 1 8 8 . |
|----------------------|
9. | 2 3 1 . |
10. | 2 4 2 . |
11. | 2 . 3 . |
12. | 2 8 4 17 |
13. | 2 7 5 . |
14. | 2 2 6 . |
15. | 2 . 7 . |
16. | 2 8 8 . |
+----------------------+