Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down on April 23, and its replacement, statalist.org is already up and running.

# RE: st: Looping Enquiry

 From Nick Cox To "'statalist@hsphsun2.harvard.edu'" Subject RE: st: Looping Enquiry Date Thu, 29 Sep 2011 15:24:42 +0100

```This looks a neat solution, assuming that Richard has correctly understood the question.

I'd add a thought that no harm would be done by putting the result of -generate- into a -double-. These numbers don't look problematic, but a little worry about loss of precision would do no harm.

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

Richard Herron

If I understand the question, I think you can do this without a loop.
If you sort on group and time, then you can create a sequential time
index, use -tsset-, and use lag operators to generate your product.
Here's my attempt, please let me know if I got your question wrong.

* begin code
clear
input    time   group   var  RESULT
30       1        0  -0.958
57       0        0  -0.916
58       0        0  -0.834
67       0        0  -0.874
74       0        0  -0.792
79       0        0  -0.750
79       1        1   0.125
82       1        1   0.125
89       0        0  -0.706
95       1        0  -0.662
98       0        0  -0.678
101       0        0  -0.574
104       0        0  -0.532
110       0        0  -0.448
118       0        0  -0.444
end

bysort group (time): generate time_seq = _n
tsset group time_seq
by group: generate observ = RESULT * l.RESULT * l2.RESULT * l3.RESULT
* end code

which produces

. list, clean

time   group   var   RESULT   time_seq     observ
1.     57       0     0    -.916          1          .
2.     58       0     0    -.834          2          .
3.     67       0     0    -.874          3          .
4.     74       0     0    -.792          4   .5288082
5.     79       0     0     -.75          5   .4329761
6.     89       0     0    -.706          6   .3665241
7.     98       0     0    -.678          7   .2843288
8.    101       0     0    -.574          8   .2060666
9.    104       0     0    -.532          9   .1461699
10.    110       0     0    -.448         10   .0927537
11.    118       0     0    -.444         11   .0607414
12.     30       1     0    -.958          1          .
13.     79       1     1     .125          2          .
14.     82       1     1     .125          3          .
15.     95       1     0    -.662          4   .0099093

.

On Thu, Sep 29, 2011 at 09:22, George Bouliotis <g.bouliotis@bham.ac.uk> wrote:

> Although an old Stata user, currently I am doing my first steps in programming.
>
> One of the parts in my programme tries (unsuccessfully) to replicate the column RESULT below. The difficulty is in how to loop a sequential product as, for instance: observ4= obs4 X obs3 (lag1) X obs2 (lag2)  X obs1 (lag1).
>
> I tried some loops with "forvalue" but none was successful. I would appreciate any help with this.

[...]

>
> #####################################
> set more off
> clear
> input    time   group   var  RESULT
>           30       1        0  -0.958
>           57       0        0  -0.916
>           58       0        0  -0.834
>           67       0        0  -0.874
>           74       0        0  -0.792
>           79       0        0  -0.750
>           79       1        1   0.125
>           82       1        1   0.125
>           89       0        0  -0.706
>           95       1        0  -0.662
>           98       0        0  -0.678
>          101       0        0  -0.574
>          104       0        0  -0.532
>          110       0        0  -0.448
>          118       0        0  -0.444
> end
>
>
> list , clean
>
> //Generating Ssize variable
> egen ssize=seq() if var==0,from(47) to(1)
> replace ssize=ssize[_n-1] if ssize==.
> list, noobs clean
>
>
> //Generating product variable
> gen  product= (ssize/(ssize+1))
>
>
> //Generating Score variable (PRODUCT)
> gen  score= 1-(2*product) in 1/1 if var==0
> // for the first observation only
>
> //**REPLACEMENT A: when var==0
> replace  score= 1-(2*(product*product[_n-1]))  if var==0 & score==.
> // fine for the second obs only  (correct formula for when var=0)
>
> //**REPLACEMENT B: when var==1
> replace  i1= 1-1*(score*score[_n-1])  if var==1
> // fine for the second observ only (correct formula for when var=1)
> // but instead of [_n-1] I need a loop for [_n-`n(lagged)'] with "forvalue" command?
>
> list, clean noobs

*
*   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/
```