# RE: st: Programming question

 From "Nick Cox" To Subject RE: st: Programming question Date Fri, 4 Mar 2005 18:19:59 -0000

```Frankly, I think you will be better off
starting with -rollreg-, notwithstanding
the apparent quirk that Kit Baum
is currently looking at.

all present within a sequence;

calculates the SD of residuals
even though that is a result left behind
by -regress-;

wires in your own particular variable
names;

order of observations.

None of these is necessarily fatal,
but the whole means that this program
may not bear very much pressure.

Rolling regressions is a little tricky
as a Stata programming problem. Even
if it weren't it would make sense
to start from Kit's program as the
best that's visible in Stataland.

Nick
n.j.cox@durham.ac.uk

Cameron Hooper

> David Kantor wrote:
> > At 12:00 PM 3/4/2005 -0500, Cameron Hooper wrote:
> >
> >> A novice programming question.
> >>
> >> forvalues i = 1(1)<number of companies> {
> >>   for values j = 1(1)<number of observations for company `i'> {
> >>     <do stuff>
> >>   }
> >> }
> >>
> >
> > If you tell us more about what you want to do, then we may
> find that you
> > really don't need to do all that explicit looping.
> Experience has shown
> > that it is very rare that you really need such looping.
> >
>
> David Harrison suggested:
>
> summ id, meanonly
> forvalues i = 1/`r(max)' {
>     qui count if id==`i'
>     forvalues j = 1/`r(N)' {
>       <do stuff>
>     }
> }
>
> Which does what I asked for (thanks David). However my
> ultimate goal is
> more complex than my original question suggested and upon
> using David's
> code I've seen a new difficulty. (I'm learning as I go!) Here
> is my full
> problem.
>
> I want to estimate rolling regressions on a firm by firm
> basis. Then for
> each regression I want to find the standard deviation of the
> residuals.
> Something like:
>
> program rstdres
> version 8.0
> syntax varlist , window(int) gen(string)
> generate `gen' = .
> tempvar resid
> sum id, meanonly
> quietly{
> for values i = 1/'r(max)' {
>    count if id==`i'
>    while `b' < `r(N)' {
>    regress y x in `a'/`b' if id == `i' /// See comment below
>    cap drop `resid'
>    predict `resid' if e(sample), resid
>    summarize `resid'
>    replace `gen' = r(sd) in `b'
>    local a = `a' + 1
>    local b = `b' + 1
>    }
> }}
>
> My problem now is getting `a' and `b'. At the moment that are just
> placeholders in the code. They represent the rolling window. I don't
> know how to set them properly. Here is how they should behave:
>
> id x y
> 1  1 5
> 1  2 6
> 1  4 2
> 2  2 5
> 2  8 9
> 2  6 1
> 2  2 4
> 2  4 9
>
> When id == 2 I and `window' = 3 then I want a and b to be:
>
> Iteration
>     1       a = 4 b = 6
>     2       a = 5 b = 7
>     3       a = 6 b = 8
>
> Can you suggest how to achieve this. Or am I approaching the entire
> problem in the wrong way?

*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/
```