Not so. The bug is in your debugging line, not the surrounding code.
Consider
- noi di "t=" `t'
`t' calls up a variable name, which in this example is __000004. You
don't say which observation you want to look at. Neither Stata in
general nor -display- in particular will fill in for your lack of
information, either with the current loop index or with anything else.
By default -display- just defaults to showing the value for the first
observation, here `t'[1], every time around the loop.
What I think you intended was
. noi di "t=" `t'[`i']
-- which will, I predict, produce a display of 1, 2, etc.
The point can be seen independently of any programming context. Call up
the auto data and experiment
sysuse auto
di mpg
forval i = 1/74 {
di mpg
}
-display- is for display of scalars; given a variable name, it just
shows the value of that variable in observation 1, regardless of
context. If you want to describe this behaviour as perverse, I think you
have a good case, but regardless of that you did not ask for what you
wanted, so it is no surprise that Stata didn't comply.
(NB please trim your messages of past material. Digest readers have to
plough through a lot of gunk otherwise.)
Nick
[email protected]
Ilona Carneiro
Thanks Martin
Here is a sample of the data that requires this fix:
pin start end case tx
1 10 20 1 1
1 20 35 1 0
1 35 50 1 0
1 50 100 .
and here is an extract of the trace from the programme which is
'byable' and I'm running "by pin:" which is the personal
identification number. This shows that the programme should be
generating a variable that is equal to the observation number _n
within pin sorted by the observation start date. It calculates the _N
correctly for each pin, but as you can see from the "noi di "t=" `t',
the tempvar `t' stays constant at 1 when `i' =2 showing that it has
moved to the subsequent observation of the dataset. I would prefer not
to make the programme byable, as it actually needs to be nested within
a bigger programme, but I need a way to run the code sequentially.
- tempvar T t
- sort `_byvars' start
= sort pin start
- by `_byvars': gen `t' = _n
= by pin: gen __000004 = _n
- sort `_byvars' start
= sort pin start
- by `_byvars': gen `T' = _N * `touse'
= by pin: gen __000003 = _N * __000002
- sort `_byvars' start
= sort pin start
- sum `T', meanonly
= sum __000003, meanonly
- local tmax = r(max)
- drop `T'
= drop __000003
- replace lagend = (end + 19 + 1) if (anmal > 0 & anmal < .)
- sort `_byvars' start
= sort pin start
- forvalues i = 1(1)`tmax' {
= forvalues i = 1(1)2 {
- noi di "T=" `tmax'
= noi di "T=" 2
T=2
- noi di "t=" `t'
= noi di "t=" __000004
t=1
- noi di "i=" `i'
= noi di "i=" 1
i=1
- drop if end < lagend[`i'-1] & lagend[`i'-1] < . & `t'==`i' & `i'!=1
= drop if end < lagend[1-1] & lagend[1-1] < . & __000004==1 & 1!=1
- replace lagend = (end + 19 + 1) if (mal0 > 0 & mal0 < .) &
lagend==. & `t'==`i' & `i'<`tmax'
= replace lagend = (end + 19 + 1) if (mal0 > 0 & mal0 < .) &
lagend==. & __000004==1 & 1<2
- }
- noi di "T=" `tmax'
= noi di "T=" 2
T=2
- noi di "t=" `t'
= noi di "t=" __000004
t=1
- noi di "i=" `i'
= noi di "i=" 2
i=2
- drop if end < lagend[`i'-1] & lagend[`i'-1] < . & `t'==`i' & `i'!=1
= drop if end < lagend[2-1] & lagend[2-1] < . & __000004==2 & 2!=1
- replace lagend = (end + 21 + 1) if (mal0 > 0 & mal0 < .) &
lagend==. & `t'==`i' & `i'<`tmax'
= replace lagend = (end + 21 + 1) if (mal0 > 0 & mal0 < .) &
lagend==. & __000004==2 & 2<2
- }
- }
*
* 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/