Stata The Stata listserver
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

st: RE: Re: RE: Multiple commands under "By varlist"?


From   "Nick Cox" <n.j.cox@durham.ac.uk>
To   <statalist@hsphsun2.harvard.edu>
Subject   st: RE: Re: RE: Multiple commands under "By varlist"?
Date   Sat, 26 Jun 2004 15:22:01 +0100

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 
n.j.cox@durham.ac.uk 

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
> > n.j.cox@durham.ac.uk
> >
> > 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/



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