📄 bstat_8.ado
字号:
*! version 2.3.10 17mar2005
program bstat_8
version 8.0, missing
local version : di "version " string(_caller()) ", missing:"
// version control
if _caller() < 8 {
`version' bstat_7 `0'
exit
}
// check syntax
syntax [anything] [using/] [if] [in] [, ///
accel(string) ///
bca ///
Level(cilevel) ///
noBC ///
noNormal ///
noPercentile ///
notable ///
SEParate ///
Stat(string) ///
TItle(string) ///
n(integer -1) ///
]
if `"`using'"' != "" {
preserve
qui use `"`using'"', clear
}
GetValues `anything' ///
`if' `in', ///
`bca' ///
accel(`accel') ///
stat(`stat') ///
n(`n')
local nobs `r(Nobs)'
local nrep `r(Nrep)'
local nstr `r(Nstr)'
local nclu `r(Nclu)'
local bca `r(bca)'
local varlist `r(varlist)'
// mark here since we now have varlist
tempvar touse
mark `touse' `if' `in'
tempname eb
matrix `eb' = r(b)
if `"`bca'"' != "" {
tempname va
matrix `va' = r(a)
}
if (`"`bc'"' != "") & ///
(`"`normal'"' != "") & ///
(`"`percentile'"' != "") & ///
(`"`bca'"' == "") {
local tablestar "*"
}
else if `"`table'"' != "" {
local bc nobc
local normal nonormal
local percentile nopercentile
local bca
local tablestar "*"
}
// the number of listed bootstrapped variables
local nstat : word count `varlist'
// null vector for return vectors
tempname vzero
matrix `vzero' = J(1,`nstat',0)
matrix colnames `vzero' = `varlist'
// setup ereturn matrices
if `"`bca'"' != "" {
local rvecs accel
local rmats ci_bca
}
local rvecs `rvecs' z0 se bias reps
foreach vecname of local rvecs {
tempname `vecname'
matrix ``vecname'' = `vzero'
matrix rownames ``vecname'' = `vecname'
}
local rmats `rmats' ci_bc ci_percentile ci_normal
foreach vecname of local rmats {
tempname `vecname'
matrix ``vecname'' = `vzero' \ `vzero'
matrix rownames ``vecname'' = ll ul
}
matrix drop `vzero'
local rmats `rvecs' `rmats'
local rvecs
// Calculate and Display
`tablestar' TableHead ///
`"`title'"' ///
"`level'" ///
"`nobs'" ///
"`nstr'" ///
"`nclu'" ///
"`nrep'"
// ebi - observed value of the statistic for the current variable
tempname ebi
if `"`bca'"' != "" {
// vai - estimated acceleration of ebi
tempname vai
}
// Loop through varlist
forvalues i = 1/`nstat' {
local name : word `i' of `varlist'
scalar `ebi' = `eb'[1,colnumb(`eb',"`name'")]
if `"`bca'"' != "" {
scalar `vai' = `va'[1,colnumb(`va',"`name'")]
}
if `i' > 1 {
local sep `separate'
}
OneBstat ///
`touse' ///
`name' ///
`ebi' ///
"`vai'" ///
`level' ///
"`sep'" ///
"`normal'" ///
"`percentile'" ///
"`bc'" ///
"`bca'"
// retrieve return vectors
foreach vecname of local rmats {
mat ``vecname''[1,`i'] = r(`vecname')
}
}
`tablestar' TableFoot , `normal' `percentile' `bc' `bca'
// return vectors
local mats
foreach vecname of local rmats {
local mats `mats' `vecname' ``vecname''
}
local ns nobs nclu nrep nstr
foreach n of local ns {
if `"``n''"' != "" {
local nopts `"`nopts' `n'(``n'')"'
}
}
Estimate `varlist', ///
b(`eb') ///
accel(`va') ///
`nopts' ///
`mats'
end
// check options, then save results to be used for display
//
// Saved results:
//
// Scalars:
// r(Nobs) n(), _dta[N] or '.'
// r(Nrep) number of replications, _dta[N_reps]
// r(Nstr) number of strata, _dta[N_strata]
// r(Nclu) number of clusters, _dta[N_cluster]
//
// Macros:
// r(varlist) varlist
// r(bca) bca, or ""
//
// Matrices:
// r(b) observed values of statistics
// r(a) observed acceleration values
program GetValues, rclass
syntax [varlist(numeric)] ///
[if] [in] [, ///
bca ///
accel(string) ///
stat(string) ///
n(integer -1) ///
]
return local varlist `varlist'
qui count `if' `in'
if r(N)==0 {
error 2000
}
return scalar Nrep = r(N)
// retrieve bootstrap characteristics
local version : char _dta[bs_version]
if `"`version'"' == "2" {
if `n' < 0 {
local n : char _dta[N]
cap confirm integer number `n'
if !_rc {
if `n' > 0 {
return scalar Nobs = `n'
}
}
}
else return scalar Nobs = `n'
local nstr : char _dta[N_strata]
cap confirm integer number `nstr'
if !_rc {
if `nstr' > 0 {
return scalar Nstr = `nstr'
}
}
local nclu : char _dta[N_cluster]
cap confirm integer number `nclu'
if !_rc {
if `nclu' > 0 {
return scalar Nclu = `nclu'
}
}
GetMat `varlist', ///
char(observed) ///
opt(stat) ///
mat(`stat')
tempname b
mat `b' = r(mat)
return matrix b `b'
if `"`bca'`accel'"' != "" {
GetMat `varlist', ///
char(acceleration) ///
opt(accel) ///
mat(`accel')
tempname a
mat `a' = r(mat)
return matrix a `a'
return local bca bca
}
exit
}
// version 1 or some other dataset
GetMat `varlist', ///
char(bstrap) ///
opt(stat) ///
mat(`stat')
tempname b
mat `b' = r(mat)
return matrix b `b'
if `"`bca'`accel'"' != "" {
GetMat `varlist', opt(accel) mat(`accel')
tempname a
mat `a' = r(mat)
return matrix a `a'
return local bca bca
}
if `n' > 0 {
return scalar Nobs = `n'
}
end
program GetMat, rclass
syntax varlist , opt(name) [ char(name) mat(string) ]
local ncol : word count `varlist'
tempname b
if `"`mat'"' != "" {
// user supplied matrix
capture confirm matrix `mat'
if _rc {
capture matrix `b' = `mat'
if _rc {
di as err "option `opt'() invalid"
exit 198
}
}
else matrix `b' = `mat'
if rowsof(`b') != 1 {
di as err "option `opt'() requires a row vector"
exit 198
}
if `ncol' < colsof(`b') {
di as err "too many values in `opt'()"
exit 503
}
else if `ncol' > colsof(`b') {
di as err "too few values in `opt'()"
exit 503
}
local coln : colnames `b'
if !`:list coln in varlist' {
matrix colnames `b' = `varlist'
}
}
else {
if `"`char'"' == "" {
NeedOpt `opt'
}
// get matrix elements from variable characteristics
foreach var of local varlist {
local ch : char `var'[`char']
cap confirm number `ch'
if !_rc {
matrix `b' = nullmat(`b'), `ch'
}
else {
NeedOpt `opt'
}
}
matrix colnames `b' = `varlist'
}
return matrix mat `b'
end
program NeedOpt
args opt
di in smcl as err "{p 0 0 2}option `opt'() is required" ///
" with datasets that are not generated" ///
" by the bootstrap command{p_end}"
exit 198
end
program OneBstat, rclass
args touse x ebi vai level sep normal percentile bc bca
tempname sd zalpha z0 zz
quietly {
summarize `x' if `touse'
local n = r(N)
local bias = r(mean) - `ebi'
scalar `sd' = r(sd)
// Compute bias-corrected (and accelerated) percentiles
local eps = (1e-7)*max(`sd',abs(`ebi'))
count if `x'<=`ebi'+`eps' & `touse'
if r(N) > 0 & r(N) < `n' {
scalar `z0' = invnorm(r(N)/`n')
scalar `zalpha' = invnorm((100 + `level')/200)
// bias-corrected
local p1 = 100*normprob(2*`z0' - `zalpha')
local p2 = 100*normprob(2*`z0' + `zalpha')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -