2015-07-06 57 views
1

我得到了面板數據(時間:日期名稱:ticker)。我想爲x創建多達10個滯後變量。所以我使用下面的代碼。如何使用tsrevar創建滯後變量使用stata

tsrevar L(1/10).x 
rename (`r(varlist)') x_#, addnumber 

因爲我的數據是以小時計,而只有在白天進行觀察。使用上面的代碼,每個交易日的第一次觀察就會丟失。 我的另一種解決方案是:

by ticker: gen lag1 = return[_n-1] 

然後,我必須複製和10倍,這看起來非常凌亂粘貼此代碼。任何人都可以教我如何解決這個問題,請

+0

我解決了這個循環使用,但請讓我知道是否有更好的解決方案 – fly36

+0

重疊與http://stackoverflow.com/questions/31234458/how-to-efficiently-create-lag-variable-using-stata請不要重複非常類似的問題。 –

+0

當然,如果您的觀察結果是小時和交易是白天活動,那麼當天第一次觀察的滯後就會丟失。您的解決方案將使用前一天的值作爲滯後時間。在當天的前10個時期,價值將來自前一天的最後10個時期。如果這就是你想要的,只需使用'bysort ticker(hour):gen period = _n'來重新定義時間。 –

回答

0

這是我的「10分鐘猜測」,因爲我實際上並沒有比日常週期更好的工作。

Stata沒有每小時我知道的顯示格式。實現您想要的一種方法是使用delta()選項,當您的數據爲tsset時。

clear 
set more off 

*----- example data ----- 

// an "hour-by-hour" time series which really has millisecond format 
set obs 25 

gen double t = _n*1000*60 
format %tcDDmonCCYY_HH:MM:SS:.sss t 

set seed 3129745 
gen ret = runiform() 

list, sep(0) 

*----- what you want? ----- 

// 1000*60 milliseconds conform 1 hour 
tsset t, delta((1000*60)) 

// one way 
tsrevar L(1/2).ret 
rename (`r(varlist)') ret_#, addnumber 

// two other ways 
gen ret1 = L.ret 
gen ret11 = ret[_n-1] 

// check 
assert ret_1 == ret1 
assert ret_1 == ret11 

list, sep(0) 

tsset也有generic選項,delta()本身有幾種規格。看看和測試,看看你是否找到更合適的。

(你提到的「小時工頻率」,但你不與具體給出的示例數據。實在沒有辦法確切知道你正在處理什麼用。)