*! version 1.0.0 06/22/94 ssi6.2, STB-21 program define bs version 3.1 local cmd "`1'" if "`1'"=="" { error 198 } mac shift if "`1'"=="" { error 198 } local macr "*" local isexp 1 if "`1'"=="exp" | "`1'"=="macro" { if "`1'"=="macro" { local expr "*" local macr } mac shift if "`1'"=="" { error 198 } } parse "`*'", parse(" ,()[]") local done 0 local np 0 while !`done' { if "`1'"=="" { if `np'==0 { local done 1 } else error 198 } else if "`1'"=="(" | "`1'"=="[" { local np = `np' + 1 local rtn "`rtn'`1'" } else if "`1'"==")" | "`1'"=="]" { local np = `np' - 1 if `np'<0 { error 198 } local rtn "`rtn'`1'" } else { if `np'==0 & "`1'"=="," { local done 1 } else local rtn "`rtn'`1'" } if !`done' { mac shift } } local options "Dots Eci LEAve Level(integer $S_level) Reps(integer 50)" parse "`*'" if `level'<50 | `level'>99 { di in red "level() invalid" exit 198 } if `reps'<1 { di in red "reps() invalid" exit 198 } if `reps'>=200 { local eci "eci" } quietly describe if _result(4)-20 < `reps' { di in red "insufficient memory (observations)" exit 901 } if "`dots'"=="" { local dots "*" } else local dots "noisily" tempfile result preserve tempname overall i N z capture `cmd' if _rc { di in red "`cmd'" _n "produces: " _c error _rc } `expr' capture scalar `overall' = `rtn' `macr' capture scalar `overall' = ${`rtn'} if _rc { di in red "`cmd'" _n "works, but" `expr' di in red "scalar overall = `rtn'" `macr' di in red "scalar overall = \$`rtn'" di "produces: " _c error _rc } postfile result using `result' quietly { scalar `i'=1 scalar `N'=`reps' while (`i' <= `N') { restore, preserve bootsamp _N `dots' di in gr "." _c `cmd' `expr' post `rtn' `macr' post ${`rtn'} scalar `i' = `i' + 1 } `dots' di postclos use `result', clear if "`eci'"!="" { drop if result==. sort result tempname i p scalar `p' = (1-`level'/100)/2 scalar `i' = _N*`p'+1 global S_4 = cond(`i'-int(`i')>.01 | `i'==1, /* */ result[`i'], /* */ (result[`i'-1]+result[`i'])/2 ) scalar `i' = _N*(1-`p')+1 global S_5 = cond(`i'-int(`i')>.01 | `i'==1, /* */ result[`i'], /* */ (result[`i'-1]+result[`i'])/2 ) } else { global S_4 "." global S_5 "." } summ result global S_1 = `overall' global S_2 = _result(3) global S_3 = sqrt(_result(4)) } scalar `z' = invnorm(1-(1-`level'/100)/2) local lower = `overall' - `z'*$S_3 local upper = `overall' + `z'*$S_3 di in gr _n _col(26) "Bootstrap" _n /* */ _col(5) "Reps" _col(15) "Pt. Est." _col(26) "Std. Err." /* */ _col(42) "[`level'% Conf. Interval]" _n /* */ _dup(61) "-" di in ye %8.0f `reps' /* */ _col(13) %9.0g `overall' /* */ _col(25) %9.0g sqrt(_result(4)) /* */ _col(41) %9.0g `lower' /* */ _col(53) %9.0g `upper' /* */ _col(64) in gr "(normal based)" if "`eci'"=="" { di in gr "(average)" in ye /* */ _col(13) %9.0g _result(3) } else di in gr "(average)" in ye /* */ _col(13) %9.0g _result(3) /* */ _col(41) %9.0g $S_4 /* */ _col(53) %9.0g $S_5 /* */ _col(64) in gr "(empirical)" if "`leave'"!="" { global S_FN restore, not } end