Bookmark and Share

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


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: st: Looping Enquiry


From   Nick Cox <n.j.cox@durham.ac.uk>
To   "'statalist@hsphsun2.harvard.edu'" <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/


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index