📄 _svy_subpop.ado
字号:
*! version 1.0.5 28jan2005
program _svy_subpop, rclass sort
version 9
// touse subuse [, <options> ]
syntax namelist(min=2 max=2) [, ///
hasover /// undocumented
over(string asis) ///
SUBpop(string asis) ///
SRSsubpop ///
wvar(varname numeric) ///
STRata(varname) ///
NOSUBDROP ///
]
tokenize `namelist'
args touse genvar
confirm numeric var `touse'
confirm new var `genvar'
tempvar subuse
if `"`subpop'"' != "" {
capture ParseSubpopOption `subpop'
if c(rc) {
di as err "invalid subpop() option"
exit c(rc)
}
local subvar `s(varlist)'
local if `s(if)'
local in `s(in)'
local subpop `subvar' `if' `in'
if "`srssubpop'" == "" {
local srssubpop `s(srssubpop)'
}
}
if `"`over'"' != "" {
capture noisily ParseOverOption `over'
if c(rc) {
di as err "invalid over() option"
exit c(rc)
}
local over `s(over)'
markout `touse' `over'
local over_nolabel `s(over_nolabel)'
if "`srssubpop'" == "" {
local srssubpop `s(srssubpop)'
}
}
if `"`over'`hasover'`subpop'"' == "" & "`srssubpop'" != "" {
di as err ///
"{p 0 0 2}option subpop() requires a variable name or" ///
" an if expression when the srssubpop option is specified{p_end}"
exit 198
}
// generate the subpop indicator variable
if `"`subvar'`if'`in'"' != "" {
mark `subuse' `if' `in'
if "`if'" != "" {
gettoken if exp : if
quietly replace `subuse' = . if missing(`exp')
}
markout `touse' `subvar' `subuse'
quietly replace `subuse' = 0 if `touse' == 0
if "`subvar'" != "" {
quietly replace `subuse' = 0 if `subvar' == 0
}
}
else quietly gen byte `subuse' = `touse'
// saved results
return local over `over'
return local over_nolabel `over_nolabel'
return local subpop `"`subpop'"'
return local srssubpop `srssubpop'
quietly count if `touse'
return scalar N = r(N)
if return(N) == 0 {
error 2000
}
// nothing more to do, so exit
if "`subpop'`over'" == "" {
return scalar N_sub = return(N)
return scalar N_strata_omit = 0
rename `subuse' `genvar'
exit
}
quietly count if `subuse'
return scalar N_sub = r(N)
if return(N_sub) == 0 {
di as err ///
"no observations in subpop() subpopulation" _n ///
"subpop() = 1 indicates observation in subpopulation" _n ///
"subpop() = 0 indicates observation not in subpopulation"
exit 461
}
if "`wvar'" != "" {
quietly count if `subuse' != 0 & `wvar' != 0
if r(N) == 0 {
di as err ///
"all observations in subpop() subpopulation have zero weights"
exit 461
}
}
if "`subpop'" != "" & return(N_sub) == return(N) {
di as txt _n ///
"Note: subpop() subpopulation is same as full population" _n ///
" subpop() = 1 indicates observation in subpopulation" _n ///
" subpop() = 0 indicates observation not in subpopulation"
local same 1
}
if "`subvar'" != "" {
quietly count if `subvar' != 1 & `subvar' != 0 & `touse'
if r(N) > 0 {
if "`same'"=="" {
di as txt _n ///
"Note: subpop() takes on values other than 0 and 1" _n ///
" subpop() != 0 indicates subpopulation"
}
}
}
rename `subuse' `genvar'
local subuse `genvar'
// with over(), `subuse' identifies multiple subpops
if "`over'" != "" {
GenSub `touse' `subuse' "`over_nolabel'" `over'
return local over_namelist `"`r(names)'"'
return local over_labels `"`r(labels)'"'
}
if "`strata'" == "" | "`same'`nosubdrop'" != "" {
return scalar N_strata_omit = 0
exit
}
// Check for strata with no subpopulation members
sort `touse' `strata'
tempvar strobs
quietly by `touse' `strata': ///
gen long `strobs' = cond(_n==_N, sum(`subuse'!=0), .) ///
if `touse'
quietly count if `strobs' == 0
return scalar N_strata_omit = r(N)
if r(N) != 0 {
quietly by `touse' `strata': ///
replace `touse' = 0 if `strobs'[_N]==0
}
end
program ParseSubpopOption, sclass
syntax [varname(default=none numeric)] [if] [in] [, SRSsubpop ]
sreturn clear
sreturn local varlist `varlist'
sreturn local if `"`if'"'
sreturn local in `"`in'"'
sreturn local srssubpop `srssubpop'
end
program ParseOverOption, sclass
syntax [varlist(default=none)] [, NOLABel SRSsubpop ]
sreturn clear
sreturn local over `varlist'
sreturn local over_nolabel `nolabel'
sreturn local srssubpop `srssubpop'
end
program GenSub, rclass sortpreserve
gettoken touse 0 : 0
gettoken subvar 0 : 0
gettoken nolabel 0 : 0
tempvar sub
local n_overvars : word count `0'
if `n_overvars' != 1 & "`nolabel'" != "" {
_strip_labels `0'
local vlist `"`s(varlist)'"'
local llist `"`s(labellist)'"'
local nolabel
}
else local renum renumber
capture noisily {
quietly egen `sub' = group(`0') if `subvar', label
quietly replace `subvar' = `sub' if `subvar' & `touse'
if `n_overvars' == 1 {
local uvar `0'
}
else {
local uvar `sub'
}
_labels2names `uvar' if `subvar' , `nolabel' `renum' stub(_subpop_)
return local names `"`s(names)'"'
return local labels `"`s(labels)'"'
} // capture noisily
local rc = c(rc)
if "`vlist'" != "" {
nobreak _restore_labels `vlist', labels(`llist')
}
exit `rc'
end
exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -