📄 jackknife.ado
字号:
_prefix_checkopt ZEROweight, `cmdopts'
if `"`s(zeroweight)'"' == "" {
local novar "`novar' zeroweight"
}
}
}
if `"`reject'"' != "" {
local reject `"reject(`reject')"'
}
capture confirm integer number `r(N)'
if !c(rc) {
local RN = r(N)
}
forvalues i = 1/`K' {
local name`i' : word `i' of `names'
}
if "`force'" == "" & "`wtype'" == "aweight" {
local 0 `wgt'
syntax [fw]
exit 101
}
local diopts level(`level') ///
`table' ///
`header' ///
`legend' ///
`verbose' ///
`efopt' ///
// blank
// check options
if `"`keep'"' != "" {
confirm new variable `names'
}
if `"`idcluster'"' != "" & `"`cluster'"' == "" {
di as err "option idcluster() requires the cluster() option"
exit 198
}
if `"`saving'"'=="" {
tempfile saving
local filetmp "yes"
}
else {
_prefix_saving `saving'
local saving `"`s(filename)'"'
if "`double'" == "" {
local double `"`s(double)'"'
}
local every `"`s(every)'"'
local replace `"`s(replace)'"'
}
local ntype `nocount' `eclass' `rclass' `=cond(`"`n'"'!="","n()","")'
if `:word count `ntype'' > 1 {
di as err "options `:list retok ntype' may not be combined"
exit 198
}
if `"`keepesample'"' != "" & `"`subpop'"' == "" {
quietly replace `touse' = 0 if ! e(sample)
quietly replace `subuse' = 0 if ! e(sample)
}
if "`:sortedby'" != "`sortvars'" {
sort `sortvars' `order'
}
if "`jkrw'" == "" {
if !`usesvy' {
if "`rclass'" != "" {
local nfunc "r(N)"
}
else if "`eclass'" != "" {
local nfunc "e(N)"
}
else local nfunc `"`n'"'
}
else {
if `"`n'`rclass'"' != "" {
if "`rclass'" != "" {
local nfunc "r(N)"
}
else local nfunc `"`n'"'
}
else local nfunc "e(N)"
}
}
else if `"`rclass'`eclass'`n'"' != "" & "`Nimplied'" == "" {
if `"`n'"' != "" {
local opt "n()"
}
else local opt `rclass'`eclass'
di as txt "{p 0 0 2}note: " ///
"ignoring `opt' option since jkrweight() was specified with svyset"
}
quietly replace `touse' = 2 if `touse' == 0
quietly replace `subuse' = 2 if `subuse' == 0
if "`wtype'" == "fweight" {
quietly sum `wvar' if `touse' == 1
scalar `touseN' = r(sum)
}
else {
quietly count if `touse' == 1
scalar `touseN' = r(N)
}
scalar `nobs' = r(N)
// sort observations to use
sort `touse' `strata' `cluster' `subuse', stable
quietly replace `order' = _n
// sample size function
if `"`nfunc'"' != "" {
if `"`nfunc'"' == "r(N)" & "`RN'" != "" {
capture scalar `N' = `RN'
}
else if `"`nfunc'"' == "r(N)" & "`RN'" == "" {
capture scalar `N' = .
}
else {
if `usesvy' {
capture scalar `N' = int(e(N_sub))
}
else capture scalar `N' = int(`nfunc')
}
if c(rc) {
di as err `"n(`nfunc') invalid"'
exit c(rc)
}
if missing(`N') | `N' == 0 {
local zm = cond(missing(`N'),"missing","zero")
di as err ///
`"number of obs. `nfunc' evaluated to `zm' in full sample"'
exit 322
}
}
else scalar `N' = `touseN'
if "`strata'" != "" {
tempvar strid
quietly by `touse' `strata': ///
gen `strid' = (_n==1) if `touse' == 1
quietly replace `strid' = sum(`strid') if `touse' == 1
}
// check clusters
if "`cluster'" != "" {
tempvar cluse
mark `cluse' if `touse' == 1
markout `cluse' `cluster'
capture assert `cluse' == 1 if `touse' == 1
if c(rc) {
gettoken clname : cluster
di as err ///
"missing values not allowed in cluster variable `clname'"
exit 459
}
tempvar firstofcl
quietly by `touse' `strata' `cluster': ///
gen `clid' = (_n == 1) if `touse' == 1
quietly gen byte `firstofcl' = `clid'
// total number of clusters
quietly count if `clid' & `touse' == 1
if r(N) <= 2 & "`svy'" == "" {
di as err "jackknife requires more than 2 clusters"
exit 459
}
local nclust = r(N)
if "`strata'" != "" {
quietly by `touse' `strata': ///
gen double `ncl' = sum(`clid')
quietly by `touse' `strata': replace `ncl' = `ncl'[_N]
}
else quietly gen double `ncl' = `nclust'
quietly replace `clid' = sum(`clid') if `touse' == 1
if "`wtype'" == "fweight" {
// fweights must be constant within cluster
capture by `touse' `cluster': ///
assert `wvar' == `wvar'[1] if `touse' == 1
if c(rc) {
di as err ///
"fweights must be constant within `cluster'"
exit 198
}
}
}
else {
local nclust = `nobs'
// count the number of strata
local clid `order'
sort `touse' `strata', stable
by `touse' `strata': gen double `ncl' = _N
}
if min(`nclust',_N) <= 1 {
di as err "insufficient observations to perform jackknife"
exit 459
}
// restore subpop indicator to 0/1
quietly replace `subuse' = (`subuse' == 1)
// jackknife temp pseudovalue variables
forval i = 1/`K' {
tempname tv`i'
local pseudo `pseudo' `tv`i''
}
nobreak {
capture noisily break {
if "`eexpress'" == "(_b)" {
if "`svy'" == "" & `k_extra' == 0 {
// 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'
}
if "`sortvars'" != "" {
// NOTE: this must be run before calling -RWeights-
sort `sortvars', stable
}
local jkstrvar __jk_strata
local jkmultvar __jk_multiplier
local jkfpcvar __jk_fpc
if "`jkrw'" != "" {
tempvar jkrm fpc strid
RWeights `jkrm' `strid' `fpc' : `jkrw'
local postextra ///
`:type `strid'' `jkstrvar' `jkmultvar' `jkfpcvar'
local strata `strid'
local goodstrid `s(goodstrid)'
}
else {
if `"`strata'"' != "" {
local postextra `:type `strata'' `strata'
local jkstrvar `strata'
}
local postextra `postextra' `clid'
if `"`fpc'"' != "" {
local postextra `postextra' `:type `fpc'' `fpc'
local jkfpcvar `fpc'
}
if "`wtype'" == "fweight" {
local postextra `postextra' `jkmultvar'
}
else if !inlist("`svy'`wtype'", "", "aweight", "fweight") {
local jk_wtype `wtype'
local postextra `postextra' `jkmultvar'
}
}
if "`jkrw'" != "" {
if "`mse'" != "" {
local sumwgt [pw=`jkmultvar']
}
local jk_wtype pweight
}
// prepare post
tempname postid
postfile `postid' `postextra' `names' ///
using `"`saving'"', `double' `every' `replace'
if inlist("`wtype'", "aweight", "") {
local cmd1 `"cmd1(`version' `cmdname' `cmdargs' `wgt')"'
}
else local cmd1 `"cmd1(`version' `cmdname' `cmdargs')"'
local cmd2 `"cmd2(`cmdopts'`novar'`rest')"'
if inlist("`svy'`wtype'", "", "aweight") {
_loop_jknife `touse' `clid' `pseudo', ///
command(`command') ///
express(`express') ///
`cmd1' `cmd2' ///
n0(`N') ///
nclust(`nclust') ///
nfunc(`nfunc') ///
postid(`postid') ///
`dots' ///
`noisily' ///
`trace' ///
`reject' ///
// blank
}
else if "`wtype'" == "fweight" {
_loop_jknife_fw `touse' `clid' `pseudo', ///
command(`command') ///
express(`express') ///
`cmd1' `cmd2' ///
wvar(`wvar') ///
n0(`N') ///
nclust(`nclust') ///
nfunc(`nfunc') ///
postid(`postid') ///
`dots' ///
`noisily' ///
`trace' ///
`reject' ///
// blank
// use the same weights to summarize results
local sumwgt [fw=`jkmultvar']
local jk_wtype fweight
}
else {
if "`jkrw'" != "" {
_loop_rw `touse' `subuse' `pseudo', ///
caller(Jackknife) ///
command(`command') ///
express(`express') ///
`cmd1' `cmd2' ///
rwvars(`jkrw') ///
owvar(`wvar') ///
`pstropt' ///
postid(`postid') ///
postextra(`strid' `jkrm' `fpc') ///
`dots' ///
`noisily' ///
`trace' ///
`reject' ///
// blank
}
else {
if "`wvar'" == "" {
tempname wvar
quietly gen double `wvar' = `touse'
}
if "`strata'" == "" {
tempvar strid
quietly gen byte `strid' = 1
}
if "`fpc'" != "" {
local fpcopt fpc(`fpc')
}
if `usesvy' {
local svyopt svy
}
_loop_jknife_iw `touse' `subuse' ///
`strid' `clid' `ncl' `pseudo', ///
command(`command') ///
express(`express') ///
`cmd1' `cmd2' `svyopt' ///
`wtype' ///
wvar(`wvar') ///
`pstropt' ///
n0(`N') ///
nclust(`nclust') ///
strata(`strata') ///
`fpcopt' ///
nfunc(`nfunc') ///
postid(`postid') ///
`dots' ///
`noisily' ///
`trace' ///
`reject' ///
// blank
}
}
} // 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'
// merge in the pseudovalues, and label them
if "`keep'" != "" {
preserve
quietly use `"`saving'"', clear
_jk_pseudo `names' `sumwgt', b(`b') strata(`strata')
sort `strata' `clid'
tempfile keepfile
quietly save `"`keepfile'"', replace
restore
sort `strata' `clid'
quietly merge `strata' `clid' using `"`keepfile'"'
drop _merge
forval i = 1/`K' {
local var : word `i' of `names'
if "`firstofcl'" != "" {
quietly replace `var' = . if !`firstofcl'
}
local label = substr(`"`exp`i''"',1,65)
label var `var' `"pseudovalues: `label'"'
}
if "`idcluster'" != "" {
capture confirm new variable `idcluster'
if c(rc) {
confirm variable `idcluster'
drop `idcluster'
}
rename `clid' `idcluster'
}
}
if "`svy'" != "" {
if `"`subpop'"' != "" {
local subopt by(`subuse') nby(1)
sum `subuse' [aw=`wvar'] if `subuse', mean
scalar `nsub' = r(N)
scalar `nsubpop' = r(sum_w)
}
if "`jkrw'" != "" {
if `goodstrid' {
quietly tabulate `strid'
scalar `nstrata' = r(r)
}
else scalar `nstrata' = 1
scalar `npsu' = .
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -