_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 + -
显示快捷键?