You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
4.8 KiB
Plaintext
188 lines
4.8 KiB
Plaintext
8 months ago
|
*! Bollen-Stine bootstrap, v.1.3, Stas Kolenikov
|
||
|
program define bollenstine, eclass
|
||
|
|
||
|
syntax, [Reps(int 200) SAVing(str) notable noheader nolegend ///
|
||
|
SAFER CONFAOPTions(str) *]
|
||
|
|
||
|
|
||
|
* this is a post-estimation command following confa1
|
||
|
if "`e(cmd)'" ~= "confa1" & "`e(cmd)'" ~= "confa" error 301
|
||
|
|
||
|
* the low level preserve
|
||
|
preserve
|
||
|
tempfile pres
|
||
|
tempname confares
|
||
|
est store `confares'
|
||
|
qui save `pres'
|
||
|
|
||
|
qui keep if e(sample)
|
||
|
local T = e(lr_u)
|
||
|
|
||
|
local safer cap noi
|
||
|
|
||
|
if "`saving'" == "" {
|
||
|
tempfile bsres
|
||
|
local saving `bsres'
|
||
|
}
|
||
|
|
||
|
if "`e(cmd)'" == "confa1" {
|
||
|
|
||
|
local varlist = "`e(depvar)'"
|
||
|
local p : word count `varlist'
|
||
|
|
||
|
tempname Sigma bb
|
||
|
mat `Sigma' = e(Model)
|
||
|
mat `bb' = e(b)
|
||
|
|
||
|
mata: CONFA1_BSrotate("`Sigma'","`varlist'")
|
||
|
|
||
|
`safer' bootstrap _b (T: T = e(lr_u)) (reject: reject = (e(lr_u) > `T') ) , ///
|
||
|
reps(`reps') saving(`saving') notable noheader nolegend ///
|
||
|
reject( e(converged) == 0) `options' ///
|
||
|
: confa1 `varlist' , from(`bb', skip) `confaoptions'
|
||
|
* may need some other options, too!
|
||
|
nobreak if "`safer'"~="" & _rc {
|
||
|
* for whatever reason, the bootstrap broke down
|
||
|
qui use `pres' , clear
|
||
|
qui est restore `confares'
|
||
|
qui est drop `confares'
|
||
|
error _rc
|
||
|
}
|
||
|
* just to display the results
|
||
|
* the covariance matrix should have been reposted by the -bootstrap-!
|
||
|
|
||
|
* we still need to trick Stata back into confa1!
|
||
|
ereturn local cmd confa1
|
||
|
|
||
|
}
|
||
|
|
||
|
else if "`e(cmd)'" == "confa" {
|
||
|
|
||
|
local varlist = "`e(observed)'"
|
||
|
local p : word count `varlist'
|
||
|
|
||
|
tempname Sigma bb
|
||
|
mat `Sigma' = e(Sigma)
|
||
|
mat `bb' = e(b)
|
||
|
|
||
|
mata: CONFA1_BSrotate("`Sigma'","`varlist'")
|
||
|
|
||
|
* set up the call
|
||
|
local k = 1
|
||
|
while "`e(factor`k')'" ~= "" {
|
||
|
local call `call' (`e(factor`k')')
|
||
|
local ++k
|
||
|
}
|
||
|
|
||
|
* the first call and resetting the from vector
|
||
|
cap confa `call' , from(`bb') `confaoptions'
|
||
|
if _rc {
|
||
|
di as err "cannot execute confa with rotated data only"
|
||
|
restore
|
||
|
qui est restore `confares'
|
||
|
cap est drop `confares'
|
||
|
exit 309
|
||
|
}
|
||
|
mat `bb' = e(b)
|
||
|
if ~strpos("`confaoptions'", "from") local from from(`bb')
|
||
|
|
||
|
* correlated errors?
|
||
|
* unit variance identification?
|
||
|
|
||
|
`safer' bootstrap _b (T: T = e(lr_u)) (reject: reject = (e(lr_u) > `T') ) , ///
|
||
|
reps(`reps') saving(`saving') notable noheader nolegend ///
|
||
|
reject( e(converged) == 0) `options' ///
|
||
|
: confa `call' , `from' `confaoptions'
|
||
|
* may need some other options, too!
|
||
|
nobreak if "`safer'"~="" & _rc {
|
||
|
* for whatever reason, the bootstrap broke down
|
||
|
qui use `pres' , clear
|
||
|
qui est restore `confares'
|
||
|
cap est drop `confares'
|
||
|
error _rc
|
||
|
}
|
||
|
* the covariance matrix should have been reposted by the -bootstrap-!
|
||
|
|
||
|
* we still need to trick Stata back into confa!
|
||
|
ereturn local cmd confa
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
* what on earth was that?
|
||
|
error 301
|
||
|
}
|
||
|
|
||
|
|
||
|
* the bootstrap test on T
|
||
|
gettoken bsres blah : saving , parse(",")
|
||
|
* to strip off replace option, if there is any
|
||
|
qui use `bsres', clear
|
||
|
sum reject_reject, mean
|
||
|
|
||
|
local pBS = r(mean)
|
||
|
local BBS = r(N)
|
||
|
|
||
|
qui sum T_T, det
|
||
|
local q05 = r(p5)
|
||
|
local q95 = r(p95)
|
||
|
|
||
|
qui use `pres', clear
|
||
|
qui est restore `confares'
|
||
|
qui est drop `confares'
|
||
|
|
||
|
ereturn scalar p_u_BS = `pBS'
|
||
|
ereturn scalar B_BS = `BBS'
|
||
|
* ereturn scalar lr_u = `T'
|
||
|
* ereturn scalar p_u = chi2tail(e(df_u),e(lr_u))
|
||
|
|
||
|
ereturn scalar T_BS_05 = `q05'
|
||
|
ereturn scalar T_BS_95 = `q95'
|
||
|
ereturn local vce BollenStine
|
||
|
ereturn local vcetype Bollen-Stine
|
||
|
|
||
|
`e(cmd)'
|
||
|
|
||
|
end
|
||
|
|
||
|
cap mata: mata drop CONFA1_BSrotate()
|
||
|
mata:
|
||
|
void CONFA1_BSrotate(
|
||
|
string SigmaName, // the parameter matrix name
|
||
|
string varnames // the variable names
|
||
|
) {
|
||
|
|
||
|
// declarations
|
||
|
real matrix data // views of the data
|
||
|
real matrix Sigma, SS, S2, SS2 // the covariance matrices and temp matrices
|
||
|
real matrix means // the means -- need modifications for weighted data!!!
|
||
|
real scalar p, n // dimension, no. obs
|
||
|
|
||
|
// get the data in
|
||
|
st_view(data=., ., tokens(varnames) )
|
||
|
n=rows(data)
|
||
|
p=cols(data)
|
||
|
|
||
|
Sigma = st_matrix(SigmaName)
|
||
|
|
||
|
// probability weights!!!
|
||
|
means = colsum(data)/n
|
||
|
SS = (cross(data,data)-n*means'*means)/(n-1)
|
||
|
|
||
|
S2 = cholesky(Sigma)
|
||
|
SS2 = cholesky(SS)
|
||
|
SS2 = solveupper(SS2',I(rows(SS)))
|
||
|
|
||
|
data[,] = data*SS2*S2'
|
||
|
|
||
|
}
|
||
|
|
||
|
end
|
||
|
|
||
|
|
||
|
exit
|
||
|
|
||
|
History:
|
||
|
v.1.1 -- Jan 9, 2007
|
||
|
v.1.2 -- Mar 26, 2008: confa1 options added; reject() added
|
||
|
v.1.3 -- July 12, 2008: upgraded to confa
|