2016-01-25 20 views
1

我希望通過j獲得運行總和,例如,行_nj=3我想獲得x[_n] + x[_n+1] + x[_n+2]Stata:與缺失值一起運行的總和

我想到了就去做下面的技巧:

by grouping: gen foo = sum(log(x)) 
    by grouping: replace foo = foo - foo[_n - `y'] if _n > `y' 

然而,這並不穩健缺失值。 sum()爲缺失值生成0,而如果至少有一個要求和的值是.,則需要累積和爲.。我將如何實現這一目標?

我需要它也爲大j工作,所以手動添加這些是不可行的。

+0

說寧可'sum()'忽略缺失值。如果非缺失值的累加和非零,其結果將爲非零。 –

回答

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) 

如果你想要任何這些目前尚不清楚給我。

+0

這是有用的技術,但它不是OP想要的,甚至還使用差分累加和的技術,因爲這隻會忽略當前觀測中的缺失值。 'cond()'中的條件可以擴展,但是對於長窗口不是簡明的。 –

0

竊取羅伯託的可重複的例子(在這篇文章中沒有這樣的例子)另一種方法是使用tsegen(SSC),它必須與ssc inst tsegen一起安裝。這對於數據集tssetxtset至關重要。 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  . | 
    +----------------------+