📄 svytab.ado
字号:
/* Display error and warning messages. */
if "`e(zero)'"!="" {
di _n as txt " Table contains a zero in the marginals." _n /*
*/ " Statistics cannot be computed."
}
if e(r) == 1 {
di _n as txt " Only one row category." _n /*
*/ " Statistics cannot be computed."
}
if e(c) == 1 {
di _n as txt " Only one column category." _n /*
*/ " Statistics cannot be computed."
}
if e(N_psu) - e(N_strata) < (e(r) - 1)*(e(c) - 1) {
di _n as txt " Note: variance estimate degrees of freedom " /*
*/ "= " as res e(N_psu) - e(N_strata) _n as txt /*
*/ " are less than" _n /*
*/ " nominal table degrees of freedom = " /*
*/ as res (e(r) - 1)*(e(c) - 1)
}
/* Display statistics. */
if "`pearson'`lr'`wald'`llwald'`fuller'"=="" {
local pearson "pearson"
}
if "`pearson'"!="" {
if "`null'"!="" {
DispStat "Pearson:" Pear Penl
}
else DispStat "Pearson:" Pear
}
if "`lr'"!="" {
if "`null'"!="" {
DispStat "Likelihood ratio:" LR LRnl
}
else DispStat "Likelihood ratio:" LR
}
if "`fuller'"!="" {
DispStat "Pearson (Fuller version):" Full
}
if "`wald'"!="" {
DispWald "Wald (Pearson):" Wald `adjust'
}
if "`llwald'"!="" {
DispWald "Wald (log-linear):" LLW `adjust'
}
/* Display mean generalized deff and cv. */
if "`deff'`deft'"!="" {
di _n as txt " Mean generalized deff" _col(35) "= " as res /*
*/ %9.4f e(mgdeff) _n as txt " CV of generalized deffs" /*
*/ _col(35) "= " as res %9.4f e(cvgdeff)
}
/* Display FPC warning. */
if "`e(fpc)'"!="" { /* print FPC note */
di _n as txt "Finite population correction (FPC) assumes " /*
*/ "simple random sampling without " _n /*
*/ "replacement of PSUs within each stratum with no " /*
*/ "subsampling within PSUs."
}
end
program DispTab
args label se deff deft marginals percent proportion cell count row /*
*/ column level ci format vertical obs /*
*/ cellwid /*
*/ csepwid /*
*/ stubwid /*
*/
if "`format'"=="" {
local format "%6.0g"
}
/* Preserve, then make data set for -tabdisp-. */
preserve
drop _all
tempname b matr matc Row Col
local ncat = e(r)*e(c)
local iii "int((_n-1)/e(c))+1" /* row position */
local jjj "mod(_n-1,e(c))+1" /* column position */
mat `b' = e(Prop)
local bij "`b'[`iii',`jjj']"
mat `matr' = J(1,e(c),1)
mat `matr' = `matr'*`b'' /* row marginals */
mat `matc' = J(1,e(r),1)
mat `matc' = `matc'*`b' /* column marginals */
mat `Row' = e(Row)
mat `Col' = e(Col)
quietly {
/* Set obs. */
if "`marginals'"=="" {
local Nr1 = `ncat' + 1 /* start row marginals */
local Nr2 = `ncat'+e(r) /* end row marginals */
local Nc1 = `Nr2' + 1 /* start column marginals */
local Nc2 = `Nr2' + e(c) /* end column marginals */
local N = `Nc2' + 1 /* end */
local total "total"
}
else {
local Nr1 = 1
local Nr2 = `ncat'
local Nc1 = 1
local Nc2 = `ncat'
local N `ncat'
}
set obs `N'
/* Make stubs of table. */
gen double `e(rowvar)' = `Row'[1,`iii'] in 1/`ncat'
gen double `e(colvar)' = `Col'[1,`jjj'] in 1/`ncat'
if "`marginals'"=="" {
replace `e(rowvar)' = `Row'[1,_n-`Nr1'+1] in `Nr1'/`Nr2'
replace `e(colvar)' = `Col'[1,_n-`Nc1'+1] in `Nc1'/`Nc2'
}
/* Make variable labels and value labels for stub variables. */
if "`label'"=="" {
label variable `e(rowvar)' `"`e(rowvlab)'"'
label variable `e(colvar)' `"`e(colvlab)'"'
if "`e(rowlab)'"!="" {
tempname lblname
MakeLab `lblname' `e(rowvar)' `Row'
}
if "`e(collab)'"!="" {
tempname lblname
MakeLab `lblname' `e(colvar)' `Col'
}
}
/* Handle display of missing values if necessary. */
tempname lblname
SwitchMiss `lblname' `e(rowvar)' `ncat' `Nr1' `Nr2' `Row'
tempname lblname
SwitchMiss `lblname' `e(colvar)' `ncat' `Nc1' `Nc2' `Col'
/* Make counts and proportions or percents. */
local keyi 1
if "`count'"!="" {
tempvar xc
gen double `xc' = e(total)*`bij' in 1/`ncat'
if "`marginals'"=="" {
replace `xc' = e(total)*`matr'[1,_n-`Nr1'+1] /*
*/ in `Nr1'/`Nr2'
replace `xc' = e(total)*`matc'[1,_n-`Nc1'+1] /*
*/ in `Nc1'/`Nc2'
replace `xc' = e(total) in l
}
if "`e(wtype)'"!="" {
local key`keyi' "weighted counts"
}
else local key`keyi' "counts"
local keyi = `keyi' + 1
}
if "`percent'"!="" {
local porp 100 /* percent or proportion */
local kporp "percentages"
}
else {
local porp 1
local kporp "proportions"
}
if "`cell'"!="" {
tempvar xp
gen double `xp' = `porp'*`bij' in 1/`ncat'
if "`marginals'"=="" {
replace `xp' = `porp'*`matr'[1,_n-`Nr1'+1] /*
*/ in `Nr1'/`Nr2'
replace `xp' = `porp'*`matc'[1,_n-`Nc1'+1] /*
*/ in `Nc1'/`Nc2'
replace `xp' = `porp' in l
}
local key`keyi' "cell `kporp'"
local keyi = `keyi' + 1
}
if "`row'"!="" {
tempvar xrow
gen double `xrow' = `porp'*`bij'/`matr'[1,`iii'] /*
*/ in 1/`ncat'
if "`marginals'"=="" {
replace `xrow' = `porp' in `Nr1'/`Nr2'
replace `xrow' = `porp'*`matc'[1,_n-`Nc1'+1] /*
*/ in `Nc1'/`Nc2'
replace `xrow' = `porp' in l
}
local key`keyi' "row `kporp'"
local keyi = `keyi' + 1
}
if "`column'"!="" {
tempvar xcol
gen double `xcol' = `porp'*`bij'/`matc'[1,`jjj'] /*
*/ in 1/`ncat'
if "`marginals'"=="" {
replace `xcol' = `porp'*`matr'[1,_n-`Nr1'+1] /*
*/ in `Nr1'/`Nr2'
replace `xcol' = `porp' in `Nc1'/`Nc2'
replace `xcol' = `porp' in l
}
local key`keyi' "column `kporp'"
local keyi = `keyi' + 1
}
/* From here to `obs', only one of count, cell, row, or column is
chosen.
*/
local keylast = `keyi' - 1
local item "`key`keylast''"
if "`count'"!="" {
local porp 1
}
if "`se'`ci'"!="" {
tempvar xse
tempname V
mat `V' = e(V)
gen double `xse' = `porp'*sqrt(`V'[_n,_n]) /*
*/ in 1/`ncat'
if "`marginals'"=="" {
if "`row'"=="" {
mat `V' = e(V_row)
replace `xse' = `porp'* /*
*/ sqrt(`V'[_n-`Nr1'+1, /*
*/ _n-`Nr1'+1]) in `Nr1'/`Nr2'
}
if "`column'"=="" {
mat `V' = e(V_col)
replace `xse' = `porp'* /*
*/ sqrt(`V'[_n-`Nc1'+1, /*
*/ _n-`Nc1'+1]) in `Nc1'/`Nc2'
}
}
if "`se'"!="" {
if "`vertical'"=="" {
local key`keyi' /*
*/ "(standard errors of `item')"
}
else {
local key`keyi' /*
*/ "standard errors of `item'"
}
local keyi = `keyi' + 1
}
}
if "`ci'"!="" {
tempname t
tempvar lb ub
scalar `t' = /*
*/ invttail(e(N_psu)-e(N_strata),(1-`level'/100)/2)
if "`count'"=="" {
local x "`xp'`xrow'`xcol'"
if `porp' == 100 {
local x "(`x'/100)"
}
gen double `lb' = `porp'/(1 + /*
*/ exp(-(log(`x'/(1-`x')) /*
*/ - `t'*`xse'/(`porp'*`x'*(1-`x')))))
gen double `ub' = `porp'/(1 + /*
*/ exp(-(log(`x'/(1-`x')) /*
*/ + `t'*`xse'/(`porp'*`x'*(1-`x')))))
}
else {
gen double `lb' = `xc' - `t'*`xse'
gen double `ub' = `xc' + `t'*`xse'
}
local xci "`lb' `ub'"
if "`se'"=="" {
local xse /* erase tempvar */
}
if "`vertical'"=="" {
local key`keyi' /*
*/ `"[`=strsubdp("`level'")'% confidence intervals for `item']"'
}
else {
local key`keyi' /*
*/ `"lower `=strsubdp("`level'")'% confidence bounds for `item'"'
local keyi = `keyi' + 1
local key`keyi' /*
*/ `"upper `=strsubdp("`level'")'% confidence bounds for `item'"'
}
local keyi = `keyi' + 1
}
if "`vertical'"=="" & "`se'`ci'"!="" {
if "`se'"=="" {
local nose "*"
}
if "`ci'"=="" {
local noci "*"
}
`nose' tempvar xxse
`nose' gen str1 `xxse' = "" in 1
`noci' tempvar xci
`noci' gen str1 `xci' = "" in 1
local i 1
while `i' <= `N' {
`nose' local ses : di `format' `xse'[`i']
`nose' replace `xxse' = "("+trim("`ses'")+")" /*
*/ in `i' if `xse'<.
`noci' local slb : di `format' `lb'[`i']
`noci' local sub : di `format' `ub'[`i']
`noci' replace `xci' = "["+trim("`slb'") /*
*/ +","+trim("`sub'")+"]" in `i' /*
*/ if `lb'<. & `ub'<.
local i = `i' + 1
}
`nose' local xse "`xxse'"
}
if "`deff'"!="" {
tempvar xdeff
DeffVar `xdeff' f `Nr1' `Nr2' `Nc1' `Nc2' /*
*/ "`marginals'" "`row'" "`column'"
local key`keyi' "deff for variances of `item'"
local keyi = `keyi' + 1
}
if "`deft'"!="" {
tempvar xdeft
DeffVar `xdeft' t `Nr1' `Nr2' `Nc1' `Nc2' /*
*/ "`marginals'" "`row'" "`column'"
local key`keyi' "deft for variances of `item'"
local keyi = `keyi' + 1
}
if "`obs'"!="" {
tempname Obs
tempvar xobs
if "`e(ObsSub)'" ~= "" {
mat `Obs' = e(ObsSub)
}
else mat `Obs' = e(Obs)
gen long `xobs' = `Obs'[`iii',`jjj'] in 1/`ncat'
if "`marginals'"=="" {
tempname J
mat `J' = J(1,e(c),1)
mat `J' = `J'*`Obs''
replace `xobs' = `J'[1,_n-`Nr1'+1] /*
*/ in `Nr1'/`Nr2'
mat `J' = J(1,e(r),1)
mat `J' = `J'*`Obs'
replace `xobs' = `J'[1,_n-`Nc1'+1] /*
*/ in `Nc1'/`Nc2'
if "`e(N_sub)'" ~= "" {
replace `xobs' = e(N_sub) in l
}
else replace `xobs' = e(N) in l
}
local key`keyi' "number of observations"
local keyi = `keyi' + 1
}
}
local vars "`xc' `xp' `xrow' `xcol' `xse' `xci' `xdeff' `xdeft' `xobs'"
tabdisp `e(rowvar)' `e(colvar)', cell(`vars') `total' /*
*/ format(`format') /*
*/ `cellwid' /*
*/ `csepwid' /*
*/ `stubwid' /*
*/
if "`e(tab)'"!="" {
di as txt " Tabulated variable: `e(tab)'" _n
}
di as txt " Key: " _c
local col 1
local i 1
while `i' < `keyi' {
di _col(`col') as res "`key`i''"
local col 9
local i = `i' + 1
}
end
program DeffVar
args var ft Nr1 Nr2 Nc1 Nc2 marginals row column
local ncat = e(r)*e(c)
tempname def
mat `def' = e(Def`ft')
quietly {
gen double `var' = cond(`def'[1,_n]!=0,`def'[1,_n],.) /*
*/ in 1/`ncat'
if "`marginals'"=="" {
if "`row'"=="" {
mat `def' = e(Def`ft'_row)
replace `var' = cond(`def'[1,_n-`Nr1'+1]!=0, /*
*/ `def'[1,_n-`Nr1'+1],.) in `Nr1'/`Nr2'
}
if "`column'"=="" {
mat `def' = e(Def`ft'_col)
replace `var' = cond(`def'[1,_n-`Nc1'+1]!=0, /*
*/ `def'[1,_n-`Nc1'+1],.) in `Nc1'/`Nc2'
}
}
}
end
program SwitchMiss
args lblname var N N1 N2 mat
local lab : value label `var'
if "`lab'" == "" {
local lab `lblname'
}
else local add ", add"
/* Note that a key assumption here is that after encountering the
* first missing value, the rest of the columns of `mat' (moving to
* the right) contain missing values. Otherwise the `newid' may
* collide with non-missing valued labels.
*/
local newid 0
local ncols = colsof(`mat')
forval i = 1/`ncols' {
if missing(`mat'[1,`i']) {
local miss = `mat'[1,`i']
local ++newid
label define `lab' `newid' "`miss'" `add'
qui replace `var' = `newid' ///
if `var' == `miss' ///
& (_n<=`N'|(`N1'<=_n&_n<=`N2'))
local add ", add"
}
else local newid = `mat'[1,`i']
}
if "`lab'" == "`lblname'" {
label value `var' `lab'
}
end
program FixMiss
args lblname var missval N N1 N2
local missval = round((`missval')+1,1)
local lab : value label `var'
if "`lab'"=="" {
local lab `lblname'
label define `lab' `missval' "."
label value `var' `lab'
}
else label define `lab' `missval' "." , add
qui replace `var' = `missval' ///
if missing(`var') & (_n<=`N'|(`N1'<=_n&_n<=`N2'))
end
program MakeLab
args labname var stub
tempname imat
local dim = colsof(matrix(`stub'))
local i 1
while `i' <= `dim' {
mat `imat' = `stub'[1,`i'..`i']
local lab : colnames `imat'
if "`lab'"!="hoborxqc" {
local x = `stub'[1,`i']
label define `labname' `x' "`lab'", `add'
local add "add"
}
local i = `i' + 1
}
if "`add'"!="" {
label value `var' `labname'
}
end
program DispStat
args title stat null
local col0 5 /* left margin */
local col1 19 /* statistic */
local col2 35 /* equal sign */
local col3 51 /* p-value */
local dfnom = (e(r)-1)*(e(c)-1)
local df1 "e(df1_`stat')"
local df2 "e(df2_`stat')"
if `df1' != int(`df1') {
local df1 "%4.2f `df1'"
}
if `df2' != int(`df2') {
local df2 "%4.2f `df2'"
}
di _n as txt " `title'"
di as txt _col(`col0') "Uncorrected" _col(`col1') "chi2(" as res /*
*/ `dfnom' as txt ")" _col(`col2') "= " as res %9.4f e(cun_`stat')
if "`null'"!="" {
local df1n "e(df1_`null')"
local df2n "e(df2_`null')"
if `df1n' != int(`df1n') {
local df1n "%4.2f `df1n'"
}
if `df2n' != int(`df2n') {
local df2n "%4.2f `df2n'"
}
di as txt _col(`col0') "D-B (null)" _col(`col1') "F(" as res /*
*/ `df1n' as txt ", " as res `df2n' as txt ")" _col(`col2') "= " /*
*/ as res %9.4f e(F_`null') _col(`col3') as txt "P = " as res /*
*/ %6.4f e(p_`null')
}
di as txt _col(`col0') "Design-based" _col(`col1') "F(" as res `df1' /*
*/ as txt ", " as res `df2' as txt ")" _col(`col2') "= " as res %9.4f /*
*/ e(F_`stat') _col(`col3') as txt "P = " as res %6.4f e(p_`stat')
end
program DispWald
args title stat unadj
local col0 5 /* left margin */
local col1 19 /* statistic */
local col2 35 /* equal sign */
local col3 51 /* p-value */
di _n as txt " `title'"
local df1 = (e(r) - 1)*(e(c) - 1)
di as txt _col(`col0') "Unadjusted" _col(`col1') "chi2(" as res /*
*/ `df1' as txt ")" _col(`col2') "= " as res %9.4f /*
*/ e(cun_`stat')
if "`unadj'"!="" {
di as txt _col(`col0') "Unadjusted" _col(`col1') "F(" as res /*
*/ `df1' as txt ", " as res e(df_r) /*
*/ as txt ")" _col(`col2') "= " as res %9.4f e(Fun_`stat') /*
*/ _col(`col3') as txt "P = " as res %6.4f e(pun_`stat')
}
di as txt _col(`col0') "Adjusted" _col(`col1') "F(" as res /*
*/ `df1' as txt ", " as res e(df_r)-`df1'+1 as txt ")" /*
*/ _col(`col2') "= " as res %9.4f e(F_`stat') _col(`col3') /*
*/ as txt "P = " as res %6.4f e(p_`stat')
end
exit
(1) Non-Wald statistics:
Pear = Pearson with observed misspecified variance
Penl = Pearson with null misspecified variance
LR = LR with observed
LRnl = LR with null
all these yield
cun_Pear uncorrected (i.e., misspecified) chi2
F_Pear F-statistic: F = chi2/df1
df1_Pear df1 = tr^2/tr2
df2_Pear df2 = df1*(#psu - #strata)
p_Pear p-value for above F-statistic ~ F(df1,df2)
(2) Fuller variant:
Full = Pearson with null misspecified variance using Fuller et al.'s
formula.
F_Full F = chi2/df1 ~ F(df1,df2)
df1_Full df1 = <complex formula>
df2_Full df2 = #psu - #strata
p_Full p-value for above F-statistic ~ F(df1,df2)
(3) Wald statistics:
Wald = "Pearson" Wald
LLW = log-linear Wald
both of these produce (with W or T in place of W below):
F_Wald adjusted F = (dfv-df1+1)*chi2/(df1*dfv)
df1_Wald (# rows - 1)*(# columns - 1)
df2_Wald df2 = dfv - df1 + 1, where dfv = #psu - #strata
p_Wald p-value for adjusted F-statistic ~ F(df1,df2)
cun_Wald unadjusted chi2
Fun_Wald unadjusted F = chi2/df1
pun_Wald p-value for unadjusted F-statistic ~ F(df1,dfv)
<end of file>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -