Interesting, but your interpretation of the timings
conflates two distinct issues. Also, it should not be
generalised without care.
1. The interpretative overhead of -while-
(e.g. as compared to -forval- or -by:-
when the approaches are comparable).
2. The way -if- is implemented. The
command
regress returns factor if `i' == month
is implemented by testing every observation
to see whether it should be included in
the regression. In your case 99.9% of
the observations are irrelevant to each
regression, but Stata takes no special
action to avoid that. You should be
able to substitute -if- by -in-:
gen long obsno = _n
sort month port
forval i = 1/1000 {
local min = ...
local max = ...
regress returns factor in `min'/`max'
...
}
and by Blasnik's Law this should be much faster.
In short, your -while- loop is slow mostly
because of what happens within it, or so
I guess.
Note that my code was based, in the absence
of precise information, on a guess that
-month- took on 12 distinct values. As
your -month- variable takes on 1000 values,
other approaches become very competitive.
That is, doing something 12 times, on
each which 11/12 of the data are irrelevant,
is not the same as doing something 1000
times, on each of which 999/1000 of the
data are irrelevant.
You comment
> Given this, it would be really wonderful to be able to
> execute multiple commands under -by-...
> Some wishful thinking!
but this isn't wishful thinking at all, as I indicated,
so long as you are willing to do programming.
See help -byable-.
Nick
[email protected]
Subhankar Nayak
> I tried the -statsby- command as Scott Merryman suggested and
> the -forval-
> command that you are suggesting. But both these take almost
> exactly the same
> amount of time as the -while- looping command... (Given my
> program code,
> each simulation round is taking about 240-330 seconds, and I
> have got 1000
> simulation rounds, if not more).
>
> The -by- command is so much faster than the -while- command...
>
> If I compare
>
> by month: regress returns factor
>
> vs.
>
> local i = 1
> while i <= 1000 {
> regress returns factor if `i' == month
> local i = `i' + 1
> }
>
> I find that the -by- command is atleast 15-20 times faster
> than the -while-
> loop.
> Given this, it would be really wonderful to be able to
> execute multiple
> commands under -by-...
> Some wishful thinking!
>
Nick Cox
> > The short answer is that -by:- cannot
> > be extended in this way. But there
> > are several nearly equivalent procedures.
> >
> > Scott Merryman suggested -statsby-
> > which is one good answer. You may
> > or may not want the data reduction
> > (collapsing of the data) that produces.
> >
> > You could write a program to be "byable".
> > That way, an arbitrarily complex operation
> > can be carried out by your own program.
> >
> > For this kind of example, however, an approach
> > based on -forval- or -foreach- is indicated.
> > You may want something like
> >
> > gen tintcp = .
> > gen tslope = .
> > forval i = 1/12 {
> > regress returns factor if month == `i'
> > replace tintcp = _b[_con] if month == `i'
> > replace tslope = _b[factor] if month == `i'
> > }
> >
> > There is a much fuller discussion at
> > http://www.stata.com/support/faqs/data/foreach.html
> >
> > Nick
> > [email protected]
> >
> > Subhankar Nayak
> > >
> > > Is it possible to give multiple commands following a particular
> > > by varlist command?
> > >
> > > Can I give something like:
> > >
> > > by month: {
> > > regress returns factor
> > > replace tintcp = _b[_con]
> > > replace tslope = _b[factor]
> > > }
> > >
> > >
> > > Of course, what I give here is not working, but is there
> > > anyway to make it functional?
*
* 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/