2011-10-11 432 views
1

我應該避免rolling並手動編碼滾動迴歸?或者我最好創建一個具有重疊條目的巨型面板並使用statsby?即,給每個窗口自己的by條目。在R中,我可以將數據預先分割成日期框架列表,我認爲這會加速後續操作。在Stata加速滾動迴歸

當我一個月前從R轉換到Stata時,我的asked this on Statalist和共識是它應該需要很長時間。我編寫並編譯了Mata中的OLS,並注意到速度沒有提高(實際上略微惡化)。

這似乎是滾動迴歸是一種常見的技術,Stata似乎非常複雜;大多數研究人員運行這些迴歸1天以上?還是他們使用SAS進行這些計算?例如,我在1975年至2010年的Compustat數據庫上運行以下內容(約30,000次迴歸),大約需要12個小時。

rolling arbrisk = (e(rss)/e(N)), window(48) stepsize(12) /// 
     saving(arbrisk, replace) nodots: regress r1 ewretd 

回答

1

我認爲來自統計師的人在他們說這應該需要很長時間時是正確的。您在重要的觀察數據上運行30000次迴歸。

如果您想知道Stata花費的時間,可以使用profiler命令。

profiler clear 
profiler on 
rolling arbrisk = (e(rss)/e(N)), window(48) stepsize(12) /// 
    saving(arbrisk, replace) nodots: regress r1 ewretd 
profiler off 
profiler report 

我不知道是否創建巨型面板會有所幫助。你很可能會遇到內存問題。您應該檢查你的beforehands小組將有多大,它會多少內存需要:

http://www.stata.com/support/faqs/data/howbig.html

我並不感到驚訝,採用自編碼的OLS程序並沒有提高性能。 regress命令是一個所謂的內置命令,並且已經非常高效。這將很難做得更好。

就SAS而言,在SAS中運行幾次迴歸並檢查需要多少時間。在Stata中也一樣。我的經驗是,Stata的regress比SAS中的proc reg快一點。

+0

謝謝!我認爲這位統計學家是對的,但我並不認爲他們是對的。 'profiler'只是發現'rolling'有很多開銷的技巧。我認爲關鍵是使用'while'循環手動編碼迴歸和總和。 –

+0

我不覺得有太多開銷。 「滾動」意味着是一種通用的工具,應該相當健壯。它花費一些時間檢查你的數據。此外,它的意圖是使用大量的統計命令。如果您確信數據的結構,並且考慮到特定的技術,應該可以提高性能。 – 2011-10-13 07:42:09

1

「手動」求和的迴歸確實比使用rollingregress要快得多。下面的代碼比rollingregress快約400倍。當然,rolling更具可擴展性,但如果您只想要beta,alpha,R^2和sigma^2,那麼這將會起到訣竅的作用。

program rolling_beta 
    version 11.2 
    syntax varlist(numeric), window(real) 

    * get dependent and indpendent vars from varlist 
    tempvar x y x2 y2 xy xs ys xys x2s y2s covxy varx vary 
    tokenize "`varlist'" 
    generate `y' = `1' 
    generate `x' = `2' 
    local w = `window' 

    * generate products 
    generate `xy' = `x'*`y' 
    generate `x2' = `x'*`x' 
    generate `y2' = `y'*`y' 

    * generate cumulative sums 
    generate `xs' = sum(`x') 
    generate `ys' = sum(`y') 
    generate `xys' = sum(`xy') 
    generate `x2s' = sum(`x2') 
    generate `y2s' = sum(`y2') 

    * generate variances and covariances 
    generate `covxy' = (s`w'.`xys' - s`w'.`xs'*s`w'.`ys'/`w')/`w' 
    generate `varx' = (s`w'.`x2s' - s`w'.`xs'*s`w'.`xs'/`w')/`w' 
    generate `vary' = (s`w'.`y2s' - s`w'.`ys'*s`w'.`ys'/`w')/`w' 

    * generate alpha, beta, r2, s2 
    generate beta = `covxy'/`varx' 
    generate alpha = (s`w'.`ys' - beta*s`w'.`xs')/`w' 
    generate r2 = `covxy'*`covxy'/`varx'/`vary' 
    generate s2 = `vary'*`w'*(1 - r2)/(`w' - 2) 

end