Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down on April 23, and its replacement, statalist.org is already up and running.


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

st: local macro no longer available after some cycle in a forvalues


From   lorenzo baldini <lorissj2@hotmail.com>
To   <statalist@hsphsun2.harvard.edu>
Subject   st: local macro no longer available after some cycle in a forvalues
Date   Thu, 26 Jul 2012 22:57:22 +0000

Hello, 
i created loops for make a matching between a variable and index. the index change with the dipendent variable and, moreover, the computation of index is done by relaxing a constraint if i find that the first formulation (not relaxed) isn't able to create the index itself, and in case furthe relaxing and so on.
i find that when stata finds an index for each observation (after some cycle in the third forvalues), then the macro "disappears" so return to me an "invalid syntax" error. so i try to don't compute the index when the index is complete by an if condition on that local (if `rmax'!=.) but the same problem remains. So i've no idea what is the problem.
the following is the code: 


sort day id_firm
gen week=week(day)
gen year=year(day)
egen x=group(week year)
drop year week
compress
sort day id_firm
gen step=.               /* Step will track at which step (1,2,3 and potentially 4) the index is computed */
qui sum x, meanonly
local samp=`r(max)'
save $mc_file, replace


// as it is coded now, it should take about an hour to compute the index for each firm-day obs

/// NEW CODE 


timer on 1
qui { 
	forvalues j=1/`samp' {   
		use $mc_file, clear
		keep if x==`j'
		drop x
		gen n=_n
		save tmps_`j', replace
		
		/// FIRST STEP
		sum n, meanonly
		forvalues i=1/`r(max)' {           
			local day_target=day[`i']
			local spread_target=cds_pre[`i']
			local slope_target=slope_pre[`i']
			local spread_min=$low_bound*`spread_target'
			local spread_max=$high_bound*`spread_target'
			local slope_min=$low_bound*`slope_target'
			local slope_max=$high_bound*`slope_target'
	
			sum cds_pre if day==`day_target' & cds_pre>=`spread_min' & cds_pre<=`spread_max' & slope_pre>=`slope_min' & slope_pre<=`slope_max'  & n!=`i', meanonly 
			replace index_pre=r(mean) if n==`i' & index_pre==.
			replace nf_index=r(N) if n==`i' & nf_index==. & index_pre!=.

			sum cds_post if day==`day_target' & cds_pre>=`spread_min' & cds_pre<=`spread_max' & slope_pre>=`slope_min' & slope_pre<=`slope_max'  & n!=`i', meanonly  
			replace index_post=r(mean) if n==`i' & index_post==.
		}
		replace step=1 if index_pre!=. & index_post!=. & step==.
		
		/// SECOND STEP : Less restrictive boundary on Slope
		
		gen missing = (index_pre==. | index_post==.)
		bysort missing: gen nn=_n                        /* sequential identifier of obs. with the index still missing */
		replace nn=. if missing==0
		replace index_pre=. if missing==1            /* be sure that if you have the index you have it for both days of interest (probably useless check) */
		replace index_post=. if missing==1
		drop missing
		sort nn
		sum nn, meanonly
		if `r(max)'!=. {
			forvalues k=1/`r(max)' {
				sum n if nn==`k', meanonly                /* it finds for which observation we have to compute the index */ 
				local i=r(mean)
				local day_target=day[`i']
				local spread_target=cds_pre[`i']
				local slope_target=slope_pre[`i']
				local spread_min=$low_bound*`spread_target'
				local spread_max=$high_bound*`spread_target'
				local slope_min=$low_bound2*`slope_target'
				local slope_max=$high_bound2*`slope_target'
	
				sum cds_pre if day==`day_target' & cds_pre>=`spread_min' & cds_pre<=`spread_max' & slope_pre>=`slope_min' & slope_pre<=`slope_max'  & n!=`i', meanonly 
				replace index_pre=r(mean) if n==`i' & index_pre==.
				replace nf_index=r(N) if n==`i' & nf_index==. & index_pre!=.
			
				sum cds_post if day==`day_target' & cds_pre>=`spread_min' & cds_pre<=`spread_max' & slope_pre>=`slope_min' & slope_pre<=`slope_max'  & n!=`i', meanonly  
				replace index_post=r(mean) if n==`i' & index_post==.
			}
		}
		
		replace step=2 if index_pre!=. & index_post!=. & step==.
		
		/// THIRD STEP: Less restricitve boundary on both Spread and Slope
		
		gen missing = (index_pre==. | index_post==.)
		bysort missing: gen nnn=_n                        /* sequential identifier of obs. with the index still missing */
		replace nnn=. if missing==0
		replace index_pre=. if missing==1            /* be sure that if you have the index you have it for both days of interest (probably useless check) */
		replace index_post=. if missing==1
		drop missing
		sort nnn
		sum nnn, meanonly
		
		if `r(max)'!=. {	
			forvalues z=1/`r(max)' {
				sum n if nnn==`z', meanonly
				local i=r(mean)
				local day_target=day[`i']
				local spread_target=cds_pre[`i']
				local slope_target=slope_pre[`i']
				local spread_min=$low_bound2*`spread_target'
				local spread_max=$high_bound2*`spread_target'
				local slope_min=$low_bound2*`slope_target'
				local slope_max=$high_bound2*`slope_target'
	
				sum cds_pre if day==`day_target' & cds_pre>=`spread_min' & cds_pre<=`spread_max' & slope_pre>=`slope_min' & slope_pre<=`slope_max'  & n!=`i', meanonly 
				replace index_pre=r(mean) if n==`i' & index_pre==.
				replace nf_index=r(N) if n==`i' & nf_index==. & index_pre!=. 
			
				sum cds_post if day==`day_target' & cds_pre>=`spread_min' & cds_pre<=`spread_max' & slope_pre>=`slope_min' & slope_pre<=`slope_max'  & n!=`i', meanonly  
				replace index_post=r(mean) if n==`i' & index_post==.
			}
		}
		
		replace step=3 if index_pre!=. & index_post!=. & step==.
		
		drop n nn nnn
		save tmps_`j', replace
	} 
	/* stack all subsamples results */
	use tmps_1, clear
	forvalues j=2/`samp' {
		append using tmps_`j', nolabel
	}
	sort id_firm day
	label var step "index computed at this step"
	save $mc_file, replace

	/* eliminate subsamples */
	forvalues j=1/`samp' {
		erase tmps_`j'.dta
	}
}
timer off 1


and this is the error:
- replace index_pre=r(mean) if n==`i' & index_pre==.
= replace index_pre=r(mean) if n==197 & index_pre==.
- replace nf_index=r(N) if n==`i' & nf_index==. & index_pre!=.
= replace nf_index=r(N) if n==197 & nf_index==. & index_pre!=.
- sum cds_post if day==`day_target' & cds_pre>=`spread_min' & cds_pre<=`spread_max' & slope_pre>=`slope_min' & slope_pre<=`slope_max' & n!=`i', meanonly
= sum cds_post if day==16442 & cds_pre>=16.4699993133545 & cds_pre<=20.12999916076661 & slope_pre>=58.55999755859375 & slope_pre<=87.83999633789063 & n!=
> 197, meanonly
- replace index_post=r(mean) if n==`i' & index_post==.
= replace index_post=r(mean) if n==197 & index_post==.
- }
- }
- replace step=2 if index_pre!=. & index_post!=. & step==.
- gen missing = (index_pre==. | index_post==.)
- bysort missing: gen nnn=_n
- replace nnn=. if missing==0
- replace index_pre=. if missing==1
- replace index_post=. if missing==1
- drop missing
- sort nnn
- sum nnn, meanonly
- if `r(max)'!=. {
= if !=. {
=:  operator invalid
  forvalues z=1/`r(max)' {
  sum n if nnn==`z', meanonly
  local i=r(mean)
  local day_target=day[`i']
  local spread_target=cds_pre[`i']
  local slope_target=slope_pre[`i']
  local spread_min=$low_bound2*`spread_target'
  local spread_max=$high_bound2

Thanks for your help and sorry for my bad english!

 		 	   		  
*
*   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   |   Site index