2014-03-30 717 views
1

我使用Stata來估算ROA的滾動標準偏差(使用前一年的4個窗口)。現在,我只想保留ROA中至少有3次觀測值(4分之一)的滾動標準偏差。我如何使用Stata做到這一點?滾動標準偏差

ROA roa_sd 。 。
。 。 。 。 .0108869。
.0033411。
0.0032814 0.0053356(此值應缺少,因爲它是隻使用2有效值計算) 0.0030827 0.0043739 0.0029793 0.0038275

+1

這個問題似乎是題外話,因爲「問題,要求代碼必須證明正在解決這個問題的一個最小的瞭解。包括嘗試的解決方案,爲什麼他們沒有工作,和預期的結果。」請參閱http://stackoverflow.com/help/on-topic –

+1

ROA未在此處解釋。這似乎是偶然的問題,但同時最好不要假設可能會有答案的人在與您完全相同的領域工作。 –

+0

這個跨界別貼?這個確切的問題是[在博客上這裏回答](http://statadaily.wordpress.com/2014/03/31/rolling-standard-deviations-and-missing-observations/)。 –

回答

2

你的問題回答上blog post我鏈接到上面的意見。您可以使用rolling,然後添加額外的屏幕以在觀察次數不符合閾值時丟棄西格瑪。

但是對於像西格馬和貝塔等簡單計算(即標準偏差和單變量回歸係數),使用更多的手動方法可以做得更好。將rolling解決方案與我的手動解決方案進行比較。

/* generate panel by adpating the linked code */ 
clear 
set obs 20000 
gen date = _n 
gen id = floor((_n - 1)/20) + 1 
gen roa = int((100) * runiform()) 
replace roa = . in 1/4 
replace roa = . in 10/12 
replace roa = . in 18/20 

/* solution with rolling */ 
/* http://statadaily.wordpress.com/2014/03/31/rolling-standard-deviations-and-missing-observations/ */ 
timer on 1 
xtset id date 
rolling sd2 = r(sd), window(4) keep(date) saving(f2, replace): sum roa 
merge 1:1 date using f2, nogenerate keepusing(sd2) 
xtset id date 
gen tag = missing(l3.roa) + missing(l2.roa) + missing(l1.roa) + missing(roa) > 1 
gen sd = sd2 if (tag == 0) 
timer off 1 

/* my solution */ 
timer on 2 
rolling_sd roa, window(4) minimum(3) 
timer off 2 

/* compare */ 
timer list 
list in 1/50 

我顯示手動解決方案要快得多。

. /* compare */ 
. timer list 
    1: 132.38/  1 =  132.3830 
    2:  0.10/  1 =  0.0990 

保存按照您的個人文件的ADO目錄rolling_sd.ado(或在您的當前工​​作目錄)。我相信有人可以進一步簡化這些代碼。請注意,該代碼還具有滿足窗口前沿最小數據要求的額外優勢(即,用前三個觀察值計算西格瑪,而不是等待全部四個)。

*! 0.2 Richard Herron 3/30/14 
    * added minimum data requirement 
*! 0.1 Richard Herron 1/12/12 

program rolling_sd 
    version 11.2 
    syntax varlist(numeric), window(int) minimum(int) 

    * get dependent and indpendent vars from varlist 
    tempvar n miss xs x2s nonmiss1 nonmiss2 sigma1 sigma2 
    local w = `window' 
    local m = `minimum' 

    * generate cumulative sums and missing values 
    xtset 
    bysort `r(panelvar)' (`timevar'): generate `n' = _n 
    by `r(panelvar)': generate `miss' = sum(missing(`varlist')) 
    by `r(panelvar)': generate `xs' = sum(`varlist') 
    by `r(panelvar)': generate `x2s' = sum(`varlist' * `varlist') 

    * generate variance 1 (front of window) 
    generate `nonmiss1' = `n' - `miss' 
    generate `sigma1' = sqrt((`x2s' - `xs'*`xs'/`nonmiss1')/(`nonmiss1' - 1)) if inrange(`nonmiss1', `m', `w') & !missing(`nonmiss1') 

    * generate variance 2 (back of window, main part) 
    generate `nonmiss2' = `w' - s`w'.`miss' 
    generate `sigma2' = sqrt((s`w'.`x2s' - s`w'.`xs'*s`w'.`xs'/`nonmiss2')/(`nonmiss2' - 1)) if inrange(`nonmiss2', `m', `w') & !missing(`nonmiss2') 

    * return standard deviation 
    egen sigma = rowfirst(`sigma2' `sigma1') 
end