📄 svy_x_7.ado
字号:
*! version 1.1.6 07feb2002 updated 20dec2004
program define svy_x_7, sortpreserve
version 6, missing
gettoken cmd 0 : 0
if replay() {
if "`e(cmd)'"!="svy`cmd'" {
error 301
}
svy_disp `0' /* display results */
exit
}
nobreak {
capture noisily break {
tempvar doit subvar
SvyParse `cmd' `doit' `subvar' `0'
local dopt "$S_VYdopt" /* display options */
if "$S_VYcomp"!="" { /* complete cases */
Complete `doit'
}
else { /* available; do one variable at a time */
Avail `doit' `subvar'
}
}
local rc = _rc
macro drop S_VY*
if `rc' {
estimates clear
exit `rc'
}
}
svy_disp, `dopt' /* display results */
end
program define Complete
args doit
tempname b V Vdeff Vmeff nsub osub error
global S_VYdeff "`Vdeff'"
global S_VYmeff "`Vmeff'"
global S_VYerr "`error'"
global S_VYosub "`osub'"
global S_VYnsub "`nsub'"
if "$S_VYfpc"!="" {
tempname Vdeft
global S_VYdeft "`Vdeft'"
}
if "$S_VYwgt"!="" {
local wt "[$S_VYwgt=$S_VYexp]"
}
if "$S_VYnby"!="" {
local srssub "srssub"
if $S_VYnby > 1 {
local onopt "obs($S_VYosub) npop($S_VYnsub)"
}
}
/* Main call to _svy. */
_svy $S_VYvl `wt' if `doit', type($S_VYcmd) $S_VYopt /*
*/ b(`b') v(`V') vsrs($S_VYdeff) `onopt'
global S_VYnobs = r(N)
global S_VYnstr = r(N_strata)
global S_VYnpsu = r(N_psu)
global S_VYnpop = r(N_pop)
if "`onopt'"=="" { MakeN $S_VYnvl `osub' `nsub' }
local dim = colsof(`b')
matrix `error' = J(1,`dim',0)
if r(errcode)==3 | r(errcode)==4 { CompErr `b' $S_VYerr }
/* Call for meff. */
if "$S_VYcmd"=="total" { local cmd "mean" }
else local cmd "$S_VYcmd"
_svy $S_VYvl if `doit', type(`cmd') $S_VYsopt /*
*/ vsrs($S_VYmeff) `srssub'
if "$S_VYcmd"=="total" { CompMeff }
/* Create Vdeft if fpc. */
if "$S_VYfpc"!="" { CompDeft }
/* Label matrices. */
Labelmat `b' `V' $S_VYosub $S_VYnsub /*
*/ $S_VYdeff $S_VYdeft $S_VYmeff $S_VYerr
/* Post. */
local cmd = upper(substr("$S_VYcmd",1,1)) + substr("$S_VYcmd",2,.)
local dof = $S_VYnpsu - $S_VYnstr
estimates post `b' `V', dof(`dof') obs($S_VYnobs) depn(`cmd') /*
*/ esample(`doit')
SvySave /* set macros, etc. */
end
program define Avail
args doit subvar
tempname b b1 V V1 Vdeff Vdeff1 Vmeff Vmeff1 /*
*/ nsub nsub1 osub osub1 error error1 /*
*/ mstr mstr1 mpsu mpsu1 zero sqzero
global S_VYb "`b'"
global S_VYv "`V'"
global S_VYdeff "`Vdeff'"
global S_VYmeff "`Vmeff'"
global S_VYerr "`error'"
global S_VYosub "`osub'"
global S_VYnsub "`nsub'"
global S_VYmstr "`mstr'"
global S_VYmpsu "`mpsu'"
if "$S_VYfpc"!="" {
tempname Vdeft
global S_VYdeft "`Vdeft'"
}
if "$S_VYwgt"!="" {
local wt "[$S_VYwgt=$S_VYexp]"
}
if "$S_VYnby"!="" {
local srssub "srssub"
local dim "$S_VYnby"
if $S_VYnby > 1 {
local onopt "obs(`osub1') npop(`nsub1')"
}
}
else local dim 1
matrix `zero' = J(1,`dim',0)
matrix `sqzero' = J(`dim',`dim',0)
if "$S_VYfpc"!="" {
matrix $S_VYdeft = J(1,$S_VYnvl,0)
}
if "$S_VYcmd"=="total" { local meffcmd "mean" }
else local meffcmd "$S_VYcmd"
/* Sort. */
if "$S_VYstr$S_VYpsu"!="" {
sort $S_VYstr $S_VYpsu
}
/* Get $S_VYnpop, etc., for dataset assuming no missing values. */
_svy `doit' `wt' if `doit', type(total) $S_VYopt vsrs(*)
global S_VYnobs = r(N)
global S_VYnstr = r(N_strata)
global S_VYnpsu = r(N_psu)
global S_VYnpop = r(N_pop)
/* Step through varlist. */
tokenize $S_VYvl
local first 1
local i 1
while `i' <= $S_VYnvl {
if "$S_VYcmd"=="ratio" {
local i2 = 2*`i'
local i1 = `i2' - 1
local vl "``i1'' ``i2''"
}
else local vl "``i''"
local setzero 0
/* Main call to _svy. */
cap _svy `vl' `wt' if `doit', type($S_VYcmd) $S_VYopt /*
*/ b(`b1') v(`V1') vsrs(`Vdeff1') `onopt'
if _rc {
local rc = _rc
if `rc' == 460 {
matrix `error1' = J(1,`dim',2)
local nobs 0
local setzero 1
}
else error `rc'
}
else if r(N)==0 {
matrix `error1' = J(1,`dim',1)
local setzero 1
}
else matrix `error1' = `zero'
/* Build vectors. */
if `setzero' {
matrix `b1' = `zero'
matrix `V1' = `sqzero'
matrix `Vdeff1' = `sqzero'
matrix `osub1' = `zero'
matrix `nsub1' = `zero'
matrix `mstr1' = `zero'
matrix `mpsu1' = `zero'
}
if `first' {
matrix `b' = `b1'
matrix `V' = vecdiag(`V1')
matrix `Vdeff' = vecdiag(`Vdeff1')
if "`onopt'"=="" {
MakeN `dim' `osub' `nsub' `mstr' `mpsu'
}
else {
matrix `osub' = `osub1'
matrix `nsub' = `nsub1'
MakeN `dim' "" "" `mstr' `mpsu'
}
if r(errcode)==3 | r(errcode)==4 /*
*/ | ("$S_VYcmd"=="total" & !`setzero') {
AvErr `b1' `error' `osub'
}
else matrix `error' = `error1'
}
else {
matrix `b' = `b' , `b1'
matrix `V1' = vecdiag(`V1')
matrix `Vdeff1' = vecdiag(`Vdeff1')
matrix `V' = `V' , `V1'
matrix `Vdeff' = `Vdeff' , `Vdeff1'
if "`onopt'"=="" {
MakeN `dim' `osub1' `nsub1' `mstr1' `mpsu1'
}
else {
MakeN `dim' "" "" `mstr1' `mpsu1'
}
matrix `osub' = `osub' , `osub1'
matrix `nsub' = `nsub' , `nsub1'
matrix `mstr' = `mstr' , `mstr1'
matrix `mpsu' = `mpsu' , `mpsu1'
if r(errcode)==3 | r(errcode)==4 /*
*/ | ("$S_VYcmd"=="total" & !`setzero') {
AvErr `b1' `error1' `osub1'
}
matrix `error' = `error' , `error1'
}
/* Check obs. */
if r(N)!=$S_VYnobs {
global S_VYmiss "missing"
}
/* Set deft if fpc. */
if "$S_VYfpc"!="" {
matrix $S_VYdeft[1,`i'] /*
*/ = cond(1/(1-r(N)/r(N_pop))<., /*
*/ 1/(1-r(N)/r(N_pop)), 0)
}
/* Call for meff. */
cap _svy `vl' if `doit', type(`meffcmd') vsrs(`Vmeff1') /*
*/ $S_VYsopt `srssub'
if _rc | r(N)==0 {
matrix `Vmeff1' = `sqzero'
}
if `first' {
matrix `Vmeff' = vecdiag(`Vmeff1')
local first 0
}
else {
matrix `Vmeff1' = vecdiag(`Vmeff1')
matrix `Vmeff' = `Vmeff' , `Vmeff1'
}
local i = `i' + 1
}
if "$S_VYcmd"=="total" { AvMeff }
/* Create Vdeft if fpc. */
if "$S_VYfpc"!="" { AvDeft }
/* Label matrices. */
Labelmat $S_VYb $S_VYv $S_VYosub $S_VYnsub /*
*/ $S_VYdeff $S_VYdeft $S_VYmeff /*
*/ $S_VYerr $S_VYmstr $S_VYmpsu
/* Do fake post to set e(sample). */
matrix `b1' = 0
matrix `V1' = 0
matrix colnames `b1' = dummy
matrix colnames `V1' = dummy
matrix rownames `V1' = dummy
estimates post `b1' `V1', esample(`doit')
SvySave /* set macros, etc. */
end
program define CompErr
args b error
local dim = colsof(`b')
local i 1
while `i' <= `dim' {
if reldif(`b'[1,`i'],1e99) < 1e-14 {
matrix `b'[1,`i'] = 0
matrix `error'[1,`i'] = r(errcode) /* from _svy call */
}
local i = `i' + 1
}
end
program define AvErr
args b error osub
local dim = colsof(`b')
matrix `error' = J(1,`dim',0)
if "$S_VYcmd"=="total" {
local i 1
while `i' <= `dim' {
if `osub'[1,`i']==0 {
matrix `error'[1,`i'] = 1
}
local i = `i' + 1
}
exit
}
/* Here only if mean or ratio with error. */
local i 1
while `i' <= `dim' {
if reldif(`b'[1,`i'],1e99) < 1e-14 {
matrix `b'[1,`i'] = 0
if `osub'[1,`i']==0 {
matrix `error'[1,`i'] = 1
}
else if "$S_VYcmd"!="ratio" {
matrix `error'[1,`i'] = 3
}
else matrix `error'[1,`i'] = 4
}
local i = `i' + 1
}
end
program define CompDeft /* version for complete case */
tempname c
if "$S_VYsrss"=="" {
scalar `c' = cond(1/(1-$S_VYnobs/$S_VYnpop)<., /*
*/ 1/(1-$S_VYnobs/$S_VYnpop), 0)
matrix $S_VYdeft = `c'*$S_VYdeff
exit
}
/* Here only if srssubpop. */
matrix $S_VYdeft = J(1,$S_VYnby,0)
local i 1
while `i' <= $S_VYnby {
matrix $S_VYdeft[1,`i'] /*
*/ = cond(1/(1-$S_VYosub[1,`i']/$S_VYnsub[1,`i'])<., /*
*/ 1/(1-$S_VYosub[1,`i']/$S_VYnsub[1,`i']), 0)
local i = `i' + 1
}
matrix `c' = J(1,$S_VYnvl,1)
matrix $S_VYdeft = `c' # $S_VYdeft
matrix $S_VYdeft = diag($S_VYdeft)
matrix $S_VYdeft = $S_VYdeft*$S_VYdeff
end
program define CompMeff /* version for complete case */
tempname c
if "$S_VYnby"=="" | "$S_VYnby"=="1" {
scalar `c' = $S_VYnsub[1,1]^2
matrix $S_VYmeff = `c'*$S_VYmeff
exit
}
matrix `c' = J(1,$S_VYnby,0)
local i 1
while `i' <= $S_VYnby {
matrix `c'[1,`i'] = $S_VYnsub[1,`i']^2
local i = `i' + 1
}
tempname a
matrix `a' = J(1,$S_VYnvl,1)
matrix `c' = `a' # `c'
matrix `c' = diag(`c')
matrix $S_VYmeff = `c'*$S_VYmeff
end
program define AvDeft /* version for available case */
if "$S_VYsrss"=="" {
if "$S_VYnby"!="" {
local dim = $S_VYnby*$S_VYnvl
if $S_VYnby > 1 {
tempname c
matrix `c' = J(1,$S_VYnby,1)
matrix $S_VYdeft = $S_VYdeft # `c'
}
}
else local dim "$S_VYnvl"
local i 1
while `i' <= `dim' {
matrix $S_VYdeft[1,`i'] = $S_VYdeft[1,`i'] /*
*/ *$S_VYdeff[1,`i']
local i = `i' + 1
}
exit
}
/* Here only if srssubpop. */
local dim = $S_VYnby*$S_VYnvl
matrix $S_VYdeft = $S_VYdeff
local i 1
while `i' <= `dim' {
matrix $S_VYdeft[1,`i'] /*
*/= cond(1/(1-$S_VYosub[1,`i']/$S_VYnsub[1,`i'])<.,/*
*/ 1/(1-$S_VYosub[1,`i']/$S_VYnsub[1,`i']), 0)/*
*/ *$S_VYdeff[1,`i']
local i = `i' + 1
}
end
program define AvMeff /* version for available case */
local dim = colsof($S_VYnsub)
local i 1
while `i' <= `dim' {
matrix $S_VYmeff[1,`i'] = $S_VYnsub[1,`i']^2*$S_VYmeff[1,`i']
local i = `i' + 1
}
end
program define MakeN
args dim osub nsub nstr npsu
/* Note: r() refer to an _svy call before MakeN is called. */
tempname one s
if "$S_VYnby"=="" {
local obs "r(N)"
local npop "r(N_pop)"
}
else {
local obs "r(N_sub)"
local npop "r(N_subpop)"
}
matrix `one' = J(1,`dim',1)
if "`osub'"!="" {
scalar `s' = cond(`obs'<.,`obs',0)
matrix `osub' = `s'*`one'
scalar `s' = cond(`npop'<.,`npop',0)
matrix `nsub' = `s'*`one'
}
if "`nstr'"!="" {
scalar `s' = cond(r(N_strata)<.,r(N_strata),0)
matrix `nstr' = `s'*`one'
scalar `s' = cond(r(N_psu)<.,r(N_psu),0)
matrix `npsu' = `s'*`one'
}
end
program define Labelmat /* list of matrices */
GetNames /* get equation and column names */
local M 1
while "``M''"!="" {
matrix coleq ``M'' = $S_VYceq
matrix colname ``M'' = $S_VYcnam
if rowsof(``M'')==colsof(``M'') {
matrix roweq ``M'' = $S_VYceq
matrix rowname ``M'' = $S_VYcnam
}
local M = `M' + 1
}
end
program define GetNames
if "$S_VYby"=="" {
if "$S_VYcmd"!="ratio" {
global S_VYceq "_"
global S_VYcnam "$S_VYvl"
exit
}
/* Do ratio with no by() subpops. */
tokenize $S_VYvl
local y 1
while "``y''"!="" {
local x = `y' + 1
global S_VYceq "$S_VYceq ``y''"
global S_VYcnam "$S_VYcnam ``x''"
local y = `y' + 2
}
exit
}
/* If here, there are by() subpops. */
local nvar : word count $S_VYby
if `nvar'==1 { /* there is one subpop label */
local twoby "*"
local cnam "$S_VYcnam"
global S_VYcnam
}
else { /* use numbers (isub) for subpop labels */
local isub 1
while `isub' <= $S_VYnby {
local cnam "`cnam' `isub'"
local isub = `isub' + 1
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -