Thank you very much. I have fixed it. The problem lied
with the fact that stdidt was never equal to x after
its initial value, as you have pointed out. Thanks for
the other suggestions. I shall learn the commands
"capture" and "forvalue".
Sincerely,
Sanmitra Ghosh
--- Nick Cox <[email protected]> wrote: > Sanmitra
Ghosh wrote
>
> > I am trying to calculate trend corrected
> coefficient
> > of variation. But the do file is not running
> properly.
> > I tried it using both while and for loops. The
> problem
> > with the while loop is that if there is any
> missing
> > value for the group variable, the do file
> terminates
> > there giving a r(2000) message. This problem
> doesn't
> > occur with the for loop, since there is a nostop
> > option. However, it is giving another error
> message
> > which is r(123), i.e. numlist has too many
> numbers. I
> > don't know how to get rid of these problems. Could
> > anyone kindly give me some suggestions? I am
> attaching
> > the do files.
>
> First, please note that Statalist members are asked
> _not_ to send attachments to the list, for the usual
> reasons (members whose software cannot handle
> attachments,
> precautions against viruses, etc.). This is
> explained in the FAQ.
>
> Sanmitra's -trial1.do- was
>
> use "C:\WINDOWS\DESKTOP\temp.dta"
> sort stcode distcode time
> sum stdist
> local min = r(min)
> local max = r(max)
> gen trend1 = 0
> local i = 1980
> while `i' <= 1991 {
> local j = `i' - 1979
> replace trend1 = `j' if time == `i'
> local i = `i' + 1}
> gen trend2 = 0
> local i = 1992
> while `i' <= 2000 {
> local j = `i' - 1991
> replace trend2 = `j' if time == `i'
> local i = `i' + 1}
> gen period = 0
> replace period = 1 if time >= 1992
> gen adjrsq1 = 0
> gen adjrsq2 = 0
> local x = `min'
> while `x' <= `max'{
> reg crop trend1 if (stdist == `x' & period == 0)
> replace adjrsq1 = e(r2_a) if (stdist == `x' & period
> == 0)
> reg crop trend2 if (stdist == `x' & period == 1)
> replace adjrsq2 = e(r2_a) if (stdist == `x' & period
> == 1)
> local x = `x' + 1}
> macro drop _min _max _i _j _x
> gen cov1 = sqrt(covarr1*(1 - adjrsq1*adjrsq1))
> gen cov2 = sqrt(covarr2*(1 - adjrsq2*adjrsq2))
>
> and -trial2.do- was
>
> use "C:\WINDOWS\DESKTOP\temp.dta"
> sort stcode distcode time
> sum stdist
> local min = r(min)
> local max = r(max)
> gen trend1 = 0
> local i = 1980
> while `i' <= 1991 {
> local j = `i' - 1979
> replace trend1 = `j' if time == `i'
> local i = `i' + 1}
> gen trend2 = 0
> local i = 1992
> while `i' <= 2000 {
> local j = `i' - 1991
> replace trend2 = `j' if time == `i'
> local i = `i' + 1}
> gen period = 0
> replace period = 1 if time >= 1992
> gen adjrsq1 = 0
> gen adjrsq2 = 0
>
> for NUM in num `min'/`max', nos : reg crop trend1 if
> (stdist == NUM & period
> == 0) \replace adjrsq1 = e(r2_a) if (stdist == NUM &
> period == 0) \reg crop
> trend2 if (stdist == NUM & period == 1) \replace
> adjrsq2 = e(r2_a) if
> (stdist == NUM & period == 1)
>
> macro drop _min _max _i _j
> gen cov1 = sqrt(covarr1*(1 - adjrsq1*adjrsq1))
> gen cov2 = sqrt(covarr2*(1 - adjrsq2*adjrsq2))
>
> One approach to the troublesome loop is to learn
> about -capture-.
>
> local x = `min'
> while `x' <= `max'{
> reg crop trend1 if (stdist == `x' & period == 0)
> replace adjrsq1 = e(r2_a) if (stdist == `x' &
> period == 0)
> reg crop trend2 if (stdist == `x' & period == 1)
> replace adjrsq2 = e(r2_a) if (stdist == `x' &
> period == 1)
> local x = `x' + 1
> }
>
> I guess that the problem arises if -stdist- is never
> equal to
> a particular value of `x'. In that circumstance the
> regression
> will crash, and the -replace- statement following
> must not
> be attempted:
>
> local x = `min'
> while `x' <= `max'{
> capture reg crop trend1 if (stdist == `x' & period
> == 0)
> if _rc == 0 {
> replace adjrsq1 = e(r2_a) if (stdist == `x' &
> period == 0)
> }
> capture reg crop trend2 if (stdist == `x' & period
> == 1)
> if _rc == 0 {
> replace adjrsq2 = e(r2_a) if (stdist == `x' &
> period == 1)
> }
> local x = `x' + 1
> }
>
> A secondary point is that in Stata 7, -forvalues- is
> nicer
> for this construct:
>
> forval x = `min'/`max'{
> capture reg crop trend1 if (stdist == `x' & period
> == 0)
> if _rc == 0 {
> replace adjrsq1 = e(r2_a) if (stdist == `x' &
> period == 0)
> }
> capture reg crop trend2 if (stdist == `x' & period
> == 1)
> if _rc == 0 {
> replace adjrsq2 = e(r2_a) if (stdist == `x' &
> period == 1)
> }
> }
>
> Another secondary point is that -if e(sample)- is
> useful, here
> and elsewhere, if only as a matter of conciseness:
>
> forval x = `min'/`max'{
> capture reg crop trend1 if (stdist == `x' & period
> == 0)
> if _rc == 0 {
> replace adjrsq1 = e(r2_a) if e(sample)
> }
> capture reg crop trend2 if (stdist == `x' & period
> == 1)
> if _rc == 0 {
> replace adjrsq2 = e(r2_a) if e(sample)
> }
> }
>
> I can't identify what is wrong with the numlist.
>
> An FAQ in this territory -- cycling through all
> possible values --
>
> http://www.stata.com/support/faqs/data/for.html
>
> Nick
> [email protected]
>
> *
> * For searches and help try:
> *
> http://www.stata.com/support/faqs/res/findit.html
> * http://www.stata.com/support/statalist/faq
> * http://www.ats.ucla.edu/stat/stata/
__________________________________________________
Do You Yahoo!?
Everything you'll ever need on one web page
from News and Sport to Email and Music Charts
http://uk.my.yahoo.com
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/