*! version 1.2.2 15Feb2012 MLB
*  version 1.0.1 21Nov2011 MLB
*  version 1.0.0 14Nov2011 MLB
program define marg_betapp_prep, rclass
	version 10.1
	
	syntax [if] ,   ///
	[               ///
	simvars(string) ///
	simopts(string) ///
	noPArsamp       ///
	]               ///
	ptheor(string)  ///
	pobs(varname)   ///
	sims(integer)   ///
	n(integer)      ///
	y(varname)      ///
	e(real)
	
	marksample touse 
	
	tempvar alpha beta first fw
	qui predict double `alpha' if `touse', alpha
	qui replace `alpha' = cond(`alpha' < 0.05, .05, ///
			              cond(`alpha' > 1e5, 1e5, `alpha')) if `touse'	
	qui predict double `beta' if `touse', beta
	qui replace `beta' = cond(`beta' < 0.15, .15, ///
                         cond(`beta' > 1e5, 1e5, `beta')) if `touse'
	
	sort `y' `pobs'
	qui gen `ptheor' = .
	local var "`y' `simvars'"
	local pvar "`ptheor' `simvars'"

	if "`parsamp'" == "" {
		tempname bname vname orig
		matrix `bname' = e(b)
		matrix `vname' = e(V)
		est store `orig'
			
		tempvar alpha2 beta2
		qui gen `alpha2' = .
		qui gen `beta2' = .
		
		forvalues i = 1/`sims' {
			local nvar : word `i' of `simvars'
			
			drop `alpha2' `beta2'
			marg_parsamp, bname(`bname') v(`vname')
			qui predict double `alpha2' if `touse', alpha
			qui replace `alpha2' = cond(`alpha2' < 0.05, .05, ///
			                       cond(`alpha2' > 1e5, 1e5, `alpha2')) if `touse'
			qui predict double `beta2' if `touse', beta
			qui replace `beta2' = cond(`beta2' < 0.15, .15, ///
			                      cond(`beta2' > 1e5, 1e5, `beta2')) if `touse'			
			qui gen `nvar' = rbeta(`alpha2', `beta2') if `touse'
	
			local gr "`gr' || line `nvar' `pobs', lpattern(solid) lcolor(gs10) `simopts'"
		}
		qui est restore `orig'
	}
	else {
		forvalues i = 1/`sims' {
			local nvar : word `i' of `simvars'
			qui gen `nvar' = rbeta(`alpha', `beta') if `touse'
			local gr "`gr' || line `nvar' `pobs', lpattern(solid) lcolor(gs10) `simopts'"
		}
	}
	sort `alpha' `beta'
	by `alpha' `beta' : gen byte `first' = cond(`touse', _n == 1, 0)
	qui by `alpha' `beta' : gen float `fw' = _N if `touse'
	sort `y' `pobs'

	mata marg_betapp("`var'", "`pvar'", "`alpha'", "`beta'", "`first'", "`fw'", "`touse'", `e')
	return local gr `"`gr'"'
end