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

저는 Statalist의 사람들은 이것이 오랜 시간이 걸릴 것이라고 말하면 옳다고 생각합니다. 중요한 관측 수에 대한 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 

거대한 패널을 만드는 것이 도움이되는지 궁금합니다. 메모리 문제가 발생할 가능성이 큽니다.

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

내가 자기 코드 OLS 루틴을 사용하는 것이 더 성능을 향상 않는 놀라지 아니다 : 당신은 당신의 패널이 될 것이며이 소요됩니다 얼마나 많은 메모리가 얼마나 큰 beforehands을 확인해야합니다. regress 명령은 소위 내장 명령이며 이미 매우 효율적입니다. 더 잘할 수 없을 것입니다.

SAS에 관해서는 SAS에서 몇 가지 회귀 분석을 실행하고 소요 시간을 확인하십시오. Stata에서도 똑같이하십시오. 내 경험으로 Stata의 regress은 SAS의 proc reg보다 약간 빠릅니다.

+0

고마워요! 나는 Statistist가 맞았지만 _ 나는 그들에게 맞기를 원하지 않았다. '프로파일 링 (profiler) '은 롤링 (rolling)에 많은 오버 헤드가 있음을 확인하는 트릭입니다. 나는 열쇠가'while' 루프와 합계를 사용하여 회귀를 수동으로 코딩하는 것이라고 생각합니다. –

+0

나는 오버 헤드가 너무 많다는 사실에 놀라지 않습니다. '롤링 (rolling) '은 일반적인 목적의 도구이며 오히려 견고해야합니다. 그것은 당신의 데이터를 확인하는 데 시간을 할애합니다. 또한, 많은 통계 명령을 사용하여 작업하기위한 것입니다. 데이터 구조에 대해 확신하고 특정 기술을 염두에두고 있다면 성능을 향상시킬 수 있어야합니다. –

1

"수동으로"회귀하는 것은 실제로 rollingregress을 사용하는 것보다 빠릅니다. 아래 코드는 rolling보다 약 400 배 빠르며 regress입니다. 물론 rolling은 확장 성이 뛰어나지 만 베타, 알파, R^2 및 σ^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