Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: st: Looping Enquiry
From
Nick Cox <[email protected]>
To
"'[email protected]'" <[email protected]>
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
[email protected]
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 <[email protected]> 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/