📄 bootstrap.ado
字号:
// try to use the cmdnames's replay routine
capture findfile `cmdname'.ado
if !c(rc) & substr("`cmdname'",1,3) != "svy" {
capture `cmdname'
if !c(rc) {
local replay `cmdname'
}
}
}
tempname esave
estimates store `esave', nocopy
}
// temp variables for post
local stats
local xstats
forvalues j = 1/`K' {
tempname x`j'
local stats `stats' (`b'[1,`j'])
local xstats `xstats' (`x`j'')
}
// jackknife estimates of acceleration
if `"`bca'"' != "" {
// expand the expression list
forvalues i = 1/`K' {
local name : word `i' of `names'
local exp_list `exp_list' `name'=(`exp`i'')
}
if "`cluster'" != "" {
local clopt cluster(`cluster')
}
if "`nodots'`noisily'`trace'" == "" {
local jkopts notable nolegend
}
else {
local jkopts `nodots' `noisily' `trace'
local qui quietly
}
`qui' `noisily' `version' JKAccel ///
`exp_list' , ///
keep ///
`clopt' `jkopts' ///
reject(`reject') ///
: `command'
tempname accel
matrix `accel' = r(accel)
}
// prepare post
tempname postid
postfile `postid' `names' using `"`saving'"', ///
`double' `every' `replace'
// bsample, compute and post
if `"`idcluster'"' != "" {
local clustopts `clustopts' idcluster(`idcluster')
}
local bsamopts `strataopt' `clustopts'
if "`dots'" == "*" {
local noiqui noisily quietly
}
if "`nodots'" == "" | "`noisily'" != "" {
di
_dots 0, title(Bootstrap replications) reps(`reps') `nodots'
}
local rejected 0
forvalues i = 1/`reps' {
restore, preserve
bsample `size' , `bsamopts'
if "`group'" != "" {
tempvar newgroup
sort `idcluster' `group', stable
quietly by `strata' `idcluster' `group': ///
gen `newgroup' = _n==1
quietly replace `newgroup' = sum(`newgroup')
drop `group'
rename `newgroup' `group'
}
if `tsop' {
// -tsset- will result in an error if the user
// misspecified at least the -cluster()-,
// -idcluster()-, and -group()- options
capture noisily quietly tsset `panelvar' `timevar'
if c(rc) {
di as err "{p 0 0 2}" ///
"the most likely cause for this error is misspecifying the cluster(), " ///
"idcluster(), or group() option{p_end}"
exit c(rc)
}
}
// run command and post results
`noi' di as inp `". `command'"'
`traceon'
capture `noiqui' `noisily' `version' `command'
`traceoff'
if (c(rc) == 1) error 1
local bad = c(rc) != 0
if c(rc) {
`noi' di as error ///
`"{p 0 0 2}an error occurred when bootstrap executed `cmdname', "' ///
`"posting missing values{p_end}"'
post `postid' `mis'
}
else {
if `"`reject'"' != "" {
capture local rejected = `reject'
if c(rc) {
local rejected 1
}
}
if `rejected' {
local bad 1
`noi' di as error ///
`"{p 0 0 2}rejected results from `cmdname', "' ///
`"posting missing values{p_end}"'
post `postid' `mis'
}
else {
forvalues j = 1/`K' {
capture scalar `x`j'' = `exp`j''
if (c(rc) == 1) error 1
if c(rc) {
local bad 1
`noi' di as error ///
`"{p 0 0 2}captured error in `exp`j'', posting missing value{p_end}"'
scalar `x`j'' = .
}
else if missing(`x`j'') {
local bad 1
}
}
post `postid' `xstats'
}
}
`dots' `i' `bad'
}
`dots' `reps'
} // capture noisily break
local rc = c(rc)
// cleanup post
if "`postid'" != "" {
postclose `postid'
}
if "`esave'" != "" {
if `rc' {
quietly estimates drop `esave'
}
else {
quietly estimates restore `esave', drop
}
}
} // nobreak
if (`rc') exit `rc'
// load file with bootstrap results and display output
capture use `"`saving'"', clear
if c(rc) {
if inrange(c(rc),900,903) {
di as err ///
"insufficient memory to load file with bootstrap results"
}
error c(rc)
}
// fix the column stripes
if "`eexpress'" == "(_b)" ///
& inlist("`cmdname'", "ologit", "oprobit") ///
& missing(e(version)) {
_prefix_relabel_eqns `b'
local k_eq = s(k_eq)
local k_aux = `k_eq' - 1
local colna : colna `b'
local coleq : coleq `b'
}
// save bootstrap characteristics and labels to data set
label data `"bootstrap: `cmdname'"'
char _dta[command] `"`command'"'
char _dta[seed] `"`seed'"'
char _dta[N_cluster] `nclust'
char _dta[cluster] `cluster'
char _dta[strata] `ustrata'
char _dta[N_strata] `nstrata'
char _dta[N] `obs'
char _dta[bs_version] 3
char _dta[k_eq] `k_eq'
char _dta[k_extra] `k_extra'
forvalues i = 1/`K' {
local name : word `i' of `names'
char `name'[observed] `= `b'[1,`i'] '
if `"`bca'"' != "" {
char `name'[acceleration] `= `accel'[1,`i'] '
}
local label = substr(`"`exp`i''"',1,80)
label variable `name' `"`label'"'
char `name'[expression] `"`exp`i''"'
if `"`coleq'"' != "" {
char `name'[colname]
local na : word `i' of `colna'
local eq : word `i' of `coleq'
char `name'[coleq] `eq'
char `name'[colname] `na'
if `i' <= `k_eexp' {
char `name'[is_eexp] 1
}
}
}
if `"`filetmp'"' == "" {
quietly save `"`saving'"', replace
}
// compute results
tempname bs_v
capture noisily _bs_sum, level(`level') `mse'
if c(rc) {
ereturn clear
exit c(rc)
}
matrix `bs_v' = r(V)
restore
if "`eexpress'" == "(_b)" {
// make a copy of what is in -e()-, with some eXclusions
local xmac cmd _estimates_name chi2type novariance
if "`noecluster'" == "" {
local xmac `xmac' clustvar
}
local xsca F chi2 df_r df_m
local xmat b V
if "`e(cmd)'" != "`cmdname'" {
local ecmd `e(cmd)'
}
_e2r, xmac(`xmac') xsca(`xsca') xmat(`xmat') add
if "`e(depvar)'" != "" {
local depvar `e(depvar)'
if `:word count `depvar'' == 1 {
local depname depname(`depvar')
}
}
}
if "`:word 1 of `eexpress''" == "(_b)" {
tempname Cns
capture mat `Cns' = get(Cns)
if (c(rc)) local Cns
else {
// get constraints matrix for post
local cols = colsof(`Cns')
// note: if no other expressions were added, then the
// constraint matrix has 1 more column than the
// coefficient vector
if `cols' <= colsof(`b') {
// add columns of zeros for other statistics
local colsm1 = `cols'-1
local rows = rowsof(`Cns')
local fill = colsof(`b')-`colsm1'
tempname cns1 cns2
mat `cns1' = `Cns'[1...,1..`colsm1']
mat `cns2' = `Cns'[1...,`cols']
mat `Cns' = `cns1',J(`rows',`fill',0),`cns2'
matrix drop `cns1' `cns2'
}
}
}
if inlist("`cmdname'", "binreg", "glm") {
if !missing(r(vf)) & r(vf) != 1 {
matrix `bs_v' = r(vf)*`bs_v'
}
}
// save results
ereturn post `b' `bs_v' `Cns', obs(`obs') esample(`touse') `depname'
// restore the copied elements back to -e()-
_r2e, xmat(b V)
ereturn local seed `seed'
ereturn scalar k_eq = `k_eq'
ereturn scalar k_exp = `k_exp'
ereturn scalar k_eexp = `k_eexp'
ereturn scalar k_extra = `k_extra'
if "`k_aux'" != "" {
ereturn scalar k_aux = `k_aux'
}
if `"`title'"' != "" {
ereturn local title `"`title'"'
}
else {
_prefix_title `cmdname' "Bootstrap results"
ereturn local title `"`r(title)'"'
}
if inlist("`wtype'","fweight","iweight") {
tempvar wvar
quietly gen `wvar' `wexp'
sum `wvar' if e(sample), mean
ereturn scalar N = r(sum)
}
else {
quietly count if e(sample)
ereturn scalar N = r(N)
}
ereturn local prefix bootstrap
ereturn local cmdname `cmdname'
if "`size'" != "" {
ereturn local size `"`size'"'
}
if "`noecluster'" != "" {
ereturn local cluster
}
// NOTE: this must be the last thing posted to -e()-
if "`eexpress'`k_exp'" != "(_b)0" {
ereturn local predict _no_predict
ereturn local cmd bootstrap
}
else {
if !inlist("`e(predict)'", "", "_no_predict") {
// compute e(chi2) and e(df_m)
_prefix_model_test `cmdname'
}
if "`ecmd'" == "" {
ereturn local cmd `cmdname'
}
else ereturn local cmd `ecmd'
}
if "`leave'" != "" {
ereturn local leave leave
}
// Display output
if "`replay'" != "" & "`table'`header'`legend'`verbose'" == "" {
`replay', level(`level') `efopt'
}
else Display, `diopts'
end
program JKAccel, rclass
di
jackknife `0'
tempname accel
matrix `accel' = e(b)
local names `e(pseudo)'
local K = colsof(`accel')
// The following depends heavily on the fact that jackknife's
// pseudovalues s[j]=N*s-(N-1)*s(j) and the leave one out values s(j)
// are equivalent when calculating acceleration, i.e. skew(s[j]) =
// -skew(s(j)).
forvalues i = 1/`K' {
local name : word `i' of `names'
quietly summ `name', detail
if missing(r(skewness)) {
matrix `accel'[1,`i'] = .
}
else matrix `accel'[1,`i'] = r(skewness)/(6*sqrt(r(N)))
capture drop `name'
}
matrix colnames `accel' = `names'
return matrix accel `accel'
end
program Display
local extra = `"`e(cmd)'"' != `"`e(cmdname)'"'
if `"`e(cmd)'"' != "" {
is_svysum `e(cmd)'
local is_svysum = r(is_svysum)
local svylist svyb svyj svyr
local proplist : properties `e(cmd)'
local svyable = `"`: list proplist & svylist'"' != ""
}
else {
local is_svysum 0
local svyable 0
}
if `extra' | `is_svysum' | `svyable' {
_prefix_display `0'
exit
}
syntax [, ///
notable ///
TItle(passthru) ///
noHeader ///
noLegend ///
Verbose ///
* ///
]
if ("`table'" != "" & "`header'" != "") exit
`e(cmd)', `options'
end
program GetPanelVar, rclass
capture tsset
if ! c(rc) {
local panelvar `r(panelvar)'
local timevar `r(timevar)'
}
if "`panelvar'" == "" {
capture xt_iis
if !c(rc) {
local panelvar `s(ivar)'
}
}
if "`panelvar'" == "" {
syntax [, I(varname) * ]
local panelvar `"`i'"'
}
else if "`panelvar'" != "" {
return local setpanel yes
}
return local panelvar `panelvar'
return local timevar `timevar'
end
exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -