_svy_tabulate.ado
来自「是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到」· ADO 代码 · 共 2,036 行 · 第 1/4 页
ADO
2,036 行
*! version 3.1.4 01apr2005
program _svy_tabulate, sortpreserve
version 9
if replay() {
if `"`e(cmd)':`e(prefix)'"' != "tabulate:svy" {
error 301
}
Display `0'
exit
}
capture noisily SvyTab `0'
if c(rc) {
ClearE
}
exit c(rc)
end
program ClearE, eclass
ereturn clear
end
program SvyTab, eclass
syntax varlist(min=1 max=2) [if] [in] [, ///
TAB(varname numeric) /// <tabulate_options>
MISSing ///
SUBpop(passthru) /// <svy_options>
VCE(string) ///
* /// Display options
]
// this subroutines checks the display options and creates the
// appropriate local macros, including `options' which contains other
// options not allowed with Display but possibly with -svy:-
CheckSyntax, `options'
if "`srssubpop'" != "" & `"`subpop'"' == "" {
di as err "option srssubpop requires the subpop() option"
exit 198
}
// collect the display options in the following macros:
// diitems : <display_items>
// diopts : <display_options>
// tabopts : -tabdisp- options
// statopts : <stat_options>
local diitems `cell' `count' `row' `column' `obs' ///
`se' `ci' `deff' `deft'
local diopts `proportion' `percent' `label' `marginals' ///
`format' `vertical' `level'
local tabopts `cellwidth' `csepwidth' `stubwidth' `notable'
local statopts `pearson' `lr' `fuller' `null' `wald' `llwald' `adjust'
// defaults for building labels for the matrix stripes
if "`cellw'" == "" {
local cellw 8
}
if "`stubw'" == "" {
local stubw 8
}
if "`se'`ci'`deff'`deft'" != "" {
local setype `count'`row'`column'
}
// check/get svy settings
tempvar touse subuse
mark `touse' `if' `in'
_svy_setup `touse' `subuse', ///
svy cmdname(tabulate) `subpop' `srssubpop'
if "`r(poststrata)'" != "" & "`deff'`deft'" != "" {
di as err ///
"options deff and deft are not allowed with poststratification"
exit 198
}
if "`tab'" != "" & "`r(wtype)'" != "" {
tempvar wvar
if "`r(poststrata)'" != "" {
svygen post `wvar' ///
[`r(wtype)'`r(wexp)'] ///
if `touse', ///
posts(`r(poststrata)') ///
postw(`r(postweight)')
}
else {
quietly gen double `wvar' `r(wexp)' if `touse'
}
}
local vce2 `r(vce)'
if !missing(r(N_strata_omit)) {
local N_omit = r(N_strata_omit)
}
if `"`subpop'"' != "" {
local srssub `r(srssubpop)'
local subopt subpop(`subuse')
local subpop `"`r(subpop)'"'
local subopt2 subpop(`subuse', `srssub')
}
// rebuild the vce() option for -_svy_summarize-
if `"`vce'"' != "" {
_svy_check_vce `vce'
if `"`s(vce)'"' != "" {
local vce `s(vce)'
// this will only be used by replication VCE type
local mse `s(mse)'
local vceopt vce(`vce', `mse')
}
}
else local vce `vce2'
if "`missing'" == "" {
markout `touse' `varlist'
}
quietly count if `touse'
if r(N) == 0 {
exit 2000
}
// identify the row and column vars individually
local rowvar : word 1 of `varlist'
local colvar : word 2 of `varlist'
if "`rowvar'" == "`colvar'" {
di as err "row and column variable may not be the same"
exit 198
}
if "`colvar'" == "" & `:word count `statopts'' {
di as err ///
"option `:word 1 of `statopts'' is not allowed with one-way tables"
exit 198
}
// tabulate results
// matrices
tempname Obs ObsSub b V cstub rstub b0 row col ///
Vrow Vcol X1 X2 D Da
// scalars
tempname s zero Xp Xlr Wl Wp tr tr2 tra tr2a ///
total N_pop
tempvar cat
if "`tab'" != "" {
local mult "`tab'*"
local vartype : type `tab'
local type ratio
Total `total' `tab' `touse' `subuse' "`wvar'" "`subpop'"
}
else {
local vartype byte
local type mean
}
quietly {
sort `touse' `varlist', stable
by `touse' `varlist': gen byte `cat' = (_n == 1) if `touse'
if `"`subpop'"' != "" {
tabulate `varlist' if `touse', ///
`missing' matcell(`ObsSub') subpop(`subuse')
}
if "`colvar'" != "" {
local matcol matcol(`cstub')
}
else {
matrix `cstub' = 1
matrix colname `cstub' = "one"
}
tabulate `varlist' if `touse', ///
`missing' matcell(`Obs') matrow(`rstub') `matcol'
matrix `rstub' = `rstub''
local nrow = r(r)
local ncol = cond("`colvar'" == "", 1, r(c))
CheckRowCol `nrow' `ncol' `row'`column'
replace `cat' = sum(`cat') if `touse'
local ncat = `cat'[_N]
forval k = 1/`ncat' {
tempvar x
gen `vartype' `x' = `mult'(`cat'==`k') if `touse'
// cell proportions
if "`type'" == "ratio" {
local vars `vars' (`x' `tab')
}
else local vars `vars' `x' `tab'
// totals
local vt `vt' `x'
}
if inlist("`setype'","row","column") {
if "`setype'" == "row" {
local var `rowvar'
local colo "*"
}
else {
local var `colvar'
local rowo "*"
}
tempvar catx
sort `touse' `var', stable
by `touse' `var': gen byte `catx' = (_n==1) if `touse'
replace `catx' = sum(`catx') if `touse'
local ncatx = `catx'[_N]
forval i = 1/`ncatx' {
tempvar x`i'
gen `vartype' `x`i'' = `mult'(`catx'==`i') if `touse'
}
local i 1
local j 1
forval k = 1/`ncat' {
tempvar x
gen `vartype' `x' = `mult'(`cat'==`k') if `touse'
while `Obs'[`i',`j'] == 0 {
local j = mod(`j', `ncol') + 1
local i = cond(`j'==1, `i'+1, `i')
}
`rowo' local vs "`vs' (`x' `x`i'')"
`colo' local vs "`vs' (`x' `x`j'')"
local j = mod(`j', `ncol') + 1
local i = cond(`j'==1, `i'+1, `i')
}
}
} // quietly
ValueLab `rowvar' `rstub' `stubw'
local rowlab `r(label)'
if "`colvar'" != "" {
ValueLab `colvar' `cstub' `cellw'
local collab `r(label)'
}
// estimation for the cell proportions
_prefix_note tabulate
quietly svy, notable `subopt2' `vceopt' `options' ///
: `type' `vars' if `touse', `stdopt'
local vce `"`e(vce)'"'
local mse `"`e(mse)'"'
local vetype `"`e(vcetype)'"'
local brrweight `"`e(brrweight)'"'
local jkrweight `"`e(jkrweight)'"'
matrix `b' = e(b)
matrix `V' = e(V)
if "`setype'" == "" & "`e(V_srs)'" == "matrix" {
tempname Vsrs
if "`srssub'" == "" {
matrix `Vsrs' = e(V_srs)
}
else matrix `Vsrs' = e(V_srssub)
}
local N = e(N)
local N_strata = e(N_strata)
local N_psu = e(N_psu)
local dof = e(df_r)
scalar `N_pop' = e(N_pop)
if `"`subpop'"' != "" {
tempname N_subpop
local N_sub = e(N_sub)
scalar `N_subpop' = e(N_subpop)
}
if "`tab'" == "" {
if `"`subpop'"' == "" {
scalar `total' = `N_pop'
}
else scalar `total' = `N_subpop'
}
// computations for the totals
if "`wald'" != "" | "`setype'" == "count" {
if "`setype'" == "count" {
local topt "`subopt2'"
}
else local topt "`subopt'"
if "`dots'" == "" & `"`vce'"' != "linearized" {
di as txt _n proper("`vce'") ": for cell counts"
}
quietly svy, notable `topt' `vceopt' `options' ///
: total `vt' if `touse'
tempname Vt
matrix `Vt' = e(V)
if "`setype'" == "count" {
if "`e(V_srs)'" == "matrix" {
tempname Vsrs
if "`srssub'" == "" {
matrix `Vsrs' = e(V_srs)
}
else matrix `Vsrs' = e(V_srssub)
}
tempname bs
matrix `bs' = e(b)
}
}
// computations for the row or column proportions
if inlist("`setype'", "row", "column") {
if "`dots'" == "" & `"`vce'"' != "linearized" {
di as txt _n proper("`vce'") ": for `setype's"
}
quietly svy, notable `subopt' `vceopt' `options' ///
: ratio `vs' if `touse', `stdopt'
tempname bs Vs
matrix `bs' = e(b)
matrix `Vs' = e(V)
if "`e(V_srs)'" != "" {
tempname Vsrs
if "`srssub'" == "" {
matrix `Vsrs' = e(V_srs)
}
else matrix `Vsrs' = e(V_srssub)
}
}
// add zeroes for empty cells
if `ncat' != `nrow'*`ncol' {
AddZeros `Obs' `b' `V' `Vsrs' `Vt' `bs' `Vs'
}
// get mariginal row and column sums
Marginal `nrow' `ncol' `b' `row' `col'
// variance estimates for margins
if "`setype'" != "count" {
VMargin `nrow' `ncol' `V' `Vrow' `Vcol'
}
else VMargin `nrow' `ncol' `Vt' `Vrow' `Vcol'
if "`Vsrs'" != "" {
tempname Vsrsrow Vsrscol
VMargin `nrow' `ncol' `Vsrs' `Vsrsrow' `Vsrscol'
}
// expected values of proportions assuming independence:
// b0 = pi.*p.j
Getb0 `row' `col' `b0'
// `zero' = true if there is a zero in marginal totals
// (sum of weights must be zero for this to occur)
ChkZero `row' `col' `zero'
// check for single row or column
local one = (`nrow'==1 | `ncol'==1)
if !`zero' & !`one' {
// unadjusted statistics
// Pearson statistic
Pearson `N' `b' `b0' `Xp'
// likelihood ratio statistic
LikeRat `N' `b' `b0' `Xlr'
// contrasts for test of independence
IndCon `nrow' `ncol' `X1' `X2'
// adjustment factors and Wald tests
// design effects matrix D using b0
DeffMat `N' `b0' `V' `X2' `D' `tr' `tr2'
// design effects matrix D using b
DeffMat `N' `b' `V' `X2' `Da' `tra' `tr2a'
// Standard log-linear Wald test
LLWald `b' `b' `V' `X2' `Wl'
// Pearson Wald test
if "`wald'" != "" {
PearWald `b' `Vt' `total' `row' `col' `Wp'
}
}
else SetMiss `Xp' `Xlr' `tr' `tr2' `tra' `tr2a' `Wl' `Wp'
// mean generalized deff and C.V. of eigenvalues
local dfnom = (`nrow'-1)*(`ncol'-1)
if "`Vsrs'" != "" {
tempname mgdeff cv
scalar `mgdeff' = `tr'/`dfnom'
scalar `cv' = sqrt(`dfnom'*`tr2'/`tr'^2 - 1)
}
// saved results
// e(b) and e(V)
if "`setype'" == "" {
// `bs' is destroyed by post we save a copy of `b'
tempname bs
matrix `bs' = `b'
local Vs "`V'"
}
else if "`setype'" == "count" {
local Vs "`Vt'"
}
LabelMat `nrow' `ncol' `b' `bs' `Vs'
local xsca k_eq k_eform
local xmac cmd varlist namelist title cmdname command
local xmat V_srs V_srswr V_srssub V_srssubwr ///
deff deft deffsub deftsub error _N _N_subp
_e2r, xsca(`xsca') xmac(`xmac') xmat(`xmat')
ereturn post `bs' `Vs', dof(`dof') obs(`N') esample(`touse')
_r2e
// adjust and save Pearson and LR statistics
if !missing(`dfnom') & `dfnom' != 0 {
MakeStat `dfnom' `tr' `tr2' `Xp' Penl
MakeStat `dfnom' `tra' `tr2a' `Xp' Pear
MakeStat `dfnom' `tr' `tr2' `Xlr' LRnl
MakeStat `dfnom' `tra' `tr2a' `Xlr' LR
MakeFull `dfnom' `tr' `tr2' `Xp' Full
// adjust and save Wald tests
MakeWald `dfnom' `Wl' LLW
if "`wald'" != "" {
MakeWald `dfnom' `Wp' Wald
}
}
ereturn scalar N = `N'
ereturn scalar N_strata = `N_strata'
ereturn scalar N_psu = `N_psu'
ereturn scalar N_pop = `N_pop'
if "`subpop'" != "" {
ereturn scalar N_sub = `N_sub'
ereturn scalar N_subpop = `N_subpop'
}
ereturn local setype = cond("`setype'" != "", "`setype'", "cell")
ereturn local subpop `"`subpop'"'
ereturn local srssubpop `"`srssub'"'
ereturn local rowvar `"`rowvar'"'
ereturn local rowvlab `"`: variable label `rowvar''"'
if "`colvar'" != "" {
ereturn local colvar `"`colvar'"'
ereturn local colvlab `"`: variable label `colvar''"'
}
ereturn local rowlab `rowlab'
ereturn local collab `collab'
ereturn local tab `"`tab'"'
ereturn scalar r = `nrow'
ereturn scalar c = `ncol'
ereturn scalar total = `total'
if `zero' {
ereturn local zero "zero marginal"
}
if "`mgdeff'" != "" {
ereturn sca mgdeff = `mgdeff' // mean deff eigenvalue
ereturn sca cvgdeff = `cv' // c.v. of deff eigenvalues
}
ereturn matrix Obs `Obs' // cell # of observations
if "`subpop'" != "" {
ereturn matrix ObsSub `ObsSub' // cell # of obs in subpop
}
// convert cell proportions to matrix
VectoMat `b' e(r) e(c)
ereturn matrix Prop `b' // proportions
ereturn matrix Row `rstub' // row stub
ereturn matrix Col `cstub' // column stub
ereturn matrix V_row `Vrow' // variance of row margins
ereturn matrix V_col `Vcol' // variance of column margins
if "`Vsrs'" != "" {
MakeDeff `Vsrs' // e(Deff) and e(Deft)
MakeDeff `Vsrsrow' _row // e(Deff_row) and e(Deft_row)
MakeDeff `Vsrscol' _col // e(Deff_col) and e(Deft_col)
}
ereturn local estat_cmd svy_estat
ereturn local predict _no_predict
ereturn local cmdname "tabulate"
ereturn local prefix "svy"
ereturn local cmd "tabulate"
// display results
Display, `diitems' `diopts' `tabopts' `statopts'
end
program ValueLab, rclass
args var stub maxwidth
local dim = colsof(`stub')
local lab : value label `var'
if "`lab'" == "" {
exit
}
forval i = 1/`dim' {
local x = `stub'[1,`i']
local xlab : label `lab' `x'
if `"`xlab'"'==`"`x'"' | missing(`x') {
local list `"`list' __no__label__"'
}
else {
local xlab = trim(substr(`"`xlab'"',1,`maxwidth'))
// change periods to commas and colons to semicolons
if index(`"`xlab'"',".") {
local xlab : subinstr local xlab "." ",", all
}
if index(`"`xlab'"',":") {
local xlab : subinstr local xlab ":" ";", all
}
local list `"`list' "`xlab'""'
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?