Ускорение прокатных регрессий в Стате - PullRequest
1 голос
/ 11 октября 2011

Следует ли мне избегать rolling и вручную кодировать скользящие регрессии? Или мне лучше создать гигантскую панель с перекрывающимися записями и использовать statsby? То есть, дать каждому окну собственную запись by. В R я могу предварительно разбить данные на список фреймов даты, что, я думаю, ускоряет последующие операции.

Когда я впервые переключился с R на Stata месяц назад, я спросил об этом в Statalist , и все согласились с тем, что должно занять много времени. Я кодировал и компилировал OLS в Mata и не заметил улучшения скорости (на самом деле, небольшое ухудшение).

Кажется, что переходящие регрессии - обычная техника, и Stata кажется довольно сложной; большинство исследователей проводят эти регрессии в течение 1+ дней? Или они используют SAS для этих расчетов? Например, я выполняю следующие действия в базе данных Compustat с 1975 по 2010 год (около 30 000 регрессий), и это занимает около 12 часов.

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

Ответы [ 2 ]

1 голос
/ 16 октября 2011

«Ручная» регрессия с суммированием действительно намного быстрее, чем при использовании rolling с regress.Код ниже работает примерно в 400 раз быстрее, чем rolling с regress.Конечно, rolling более расширяемый, но если вам нужны только бета, альфа, 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
1 голос
/ 12 октября 2011

Я думаю, что люди из 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 не улучшает производительность.Команда regress является так называемой встроенной командой и уже довольно эффективна.Это будет трудно сделать лучше.

Что касается SAS, запустите пару регрессий в SAS и проверьте, сколько времени это займет.Сделайте то же самое в Stata.Мой опыт показывает, что Stata regress немного быстрее, чем proc reg в SAS.

...