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: Speed of bsample and nested loops


From   "Poliquin, Christopher" <cpoliquin@hbs.edu>
To   "statalist@hsphsun2.harvard.edu" <statalist@hsphsun2.harvard.edu>
Subject   st: Speed of bsample and nested loops
Date   Wed, 5 Oct 2011 15:51:17 -0400

Hi,

I am trying to speed up my code for bootstrapping and suspect there are significant gains to be made because right now it is super slow.

I am trying to draw samples of size 1-3 with replacement from a file with about 300,000 rows.  It is a panel dataset of companies and their daily stock returns for two years.

I have written a little program to loop over groups of companies and draw samples of size 1-3 from 5 different variables with returns data.  The mean of the sample is then written to a file.

Could someone please look at this code and suggest areas that could be modified to make this run at a reasonable speed?  I have omitted the beginning because the real issue is probably the nested loops.

program bootstrapping
	// Bootstapping mean abnormal returns
	// Pass sample name as first argument for saving output
	// Pass replication number as second argument
		
	egen boot_grp = group(id cl)
	*[Some omitted stuff that is fast already]
	
	// Open a file to hold the bootstrapped results.
	file open boot using `1'_boots.txt, write text replace
	file write boot "id" _tab "cl" _tab "sampsize" _tab "ar" _tab "mean" _n
	forvalues k=1/`2' {
		* This is the number of draws to make for each sample size
		set seed `k'
		forvalues j=1/3 {
			*Draws of size 1-3
			capture drop w
			quietly gen w = .
			// Sample with replacement, fweight in w
			bsample `j', strata(id cl permno) weight(w)
			foreach b of local boots {
				// Mean abnormal return for the sample
				// within id and cl grouping.
				forvalues x = 1/5 {
					// Within each abnormal return measure...
					quietly summarize ar`x' if boot_grp == `b' [fweight=w]
					loc mu = r(mean) * 100
					// Write bootstapped means to the output file
					file write boot "`idb`b''" _tab "`gb`b''" _tab
					file write boot "`j'" _tab "`x'" _tab 
					file write boot "`mu'" _n
				}
			}
		}
	}
	file close boot
end


Best wishes,
Chris



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