Statalist


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: st: Resetting the local in a nested loop


From   "Nick Cox" <n.j.cox@durham.ac.uk>
To   <statalist@hsphsun2.harvard.edu>
Subject   RE: st: Resetting the local in a nested loop
Date   Wed, 19 Aug 2009 18:36:16 +0100

Note that we can polish Phil's excellent reply a little further. 

forv i=1/100 {
	forv j = 1(2)5 {
		local k=`j'+1  
      	replace t`i' = 1 ///
		if BUSINESSPLAN_SP`j'<=`i' &  BUSINESSPLAN_SP`k'>=`i'
     }
}

Nick 
n.j.cox@durham.ac.uk 

Phil Schumm

On Aug 19, 2009, at 4:08 AM, Michael Stuetzer wrote:
> I have a small problem with a nested loop and maybe you can give me  
> an advice. For a specific business starting activity I have data for  
> the beginning (BUSINESSPLAN_SP[odd]) and the end  
> (BUSINESSPLAN_SP[even]) of this activity. For instance the  
> entrepreneur worked on the business plan in the months 4 till  7 as  
> well as 16 till 25. I want to transfer the information into a time  
> grid. In this grid t1, t2, etc. stands for the respective month.  
> They should take the value of 1 if the entrepreneur worked on the  
> business plan on the point of time. I have here a first draft of the  
> loop.
>
>
> set more off
> local r=5
> forvalues i=1/100 {
> 	local j=1
> 	local k=`j'+1
> 	while `j'<=`r' {
> 		replace t`i' = 1 BUSINESSPLAN_SP`j'<=`i' &
BUSINESSPLAN_SP`k'>=`i'
> 		local j=`j'+1
> 		}
> 	}
>
> The problem is that this loop recognizes the first sequence (4 to  
> 7), but not the second sequence (16 to 25). I suspect something is  
> wrong with the resetting of the local j (local j=`j'+1) and k.


I presume from your code that you have the variables BUSINESSPLAN_SP1- 
BUSINESSPLAN_SP6, that you've verified that no one worked on their  
business plan beyond month 100, and that you've already generated the  
variables t1-t100 set to 0.  Your code should read:


local r=5
forv i=1/100 {
     local j=1
     while `j'<=`r' {
         local k=`j'+1  // moved from above
         replace t`i' = 1 if BUSINESSPLAN_SP`j'<=`i' &  
BUSINESSPLAN_SP`k'>=`i'
         local j=`j'+2  // changed
     }
}


Note that you need to increment k within your -while- loop, and you  
need to increment j by 2 (instead of 1).  If you haven't already, you  
might also want to verify the following:


forv i = 1/5 {
     ass BUSINESSPLAN_SP`i' <= BUSINESSPLAN_SP`=`i'+1'
}


*
*   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/



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