# st: RE: Generating new variables with lags

 From "Nick Cox" To Subject st: RE: Generating new variables with lags Date Sun, 5 Oct 2008 19:35:52 +0100

```I can't comment easily on what did not work in your code, as you don't
show it. But very likely you are using " " where they don't belong. Not
surprisingly, the advice is not to do that.

But note further that time series operators in Stata are prefixes, not
suffixes.

You could try something like this, which may be similar in spirit to
what you tried:

local lag = <whatever>
gen sumx = x
qui forval l = 1/`lag' {
replace sumx = sumx + l`l'.x
}

However, there is another approach without looping. For example, the
result for lag 3 (i.e. this value PLUS the previous 3 values) can be got
without looping:

tsset id time
tsfill, full
bysort id (time) : gen cumx = sum(x)
by id : gen x3 = x + cumx - cumx[_n-3]

I learnt this trick from Michael Blasnik.

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

Malcolm Wardlaw

I'm trying to generalize a program to be able to create a new variable
out of a specified number of lagged variables.

gen sumx=x+x.l1+x.l2+x.l3 ...

I'd like to generalize this to be able to use various lags without
having to type out the entire sequence in the program.  Essentially, I'd
like to specify "lag=3" and generate sumx=x+x.l1+x.l2+x.l3 or "lag=2"
and generate sumx=x+x.l1+x.l2

I've tried building this expression into a macro and then evaluating the
results of the macro, but as I'm sure the more advanced people know,
this doesn't work.  Instead it creates a string variable
sumx="sumx=x+x.l1+x.l2+x.l3".  I've never figured out exactly how to
properly evaluate macros as directives within a program, but I don't
even know if that's the best way to handle this problem anyways.

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/
```