2011-10-11 433 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