📄 svyheckman.ado
字号:
*! version 1.0.11 20dec2004
program define svyheckman, sortpreserve
version 8
if replay() {
if "`e(cmd)'" != "svyheckman" {
error 301
}
svyopts invalid diopts `0'
if "`invalid'" != "" {
di as err "`invalid' : invalid options for replay"
exit 198
}
Display, `diopts'
exit
}
else Estimate `0'
end
program define Estimate, eclass
/* Allow = after depvar */
gettoken depvar 0 : 0 , parse(" =,[")
unab depvar : `depvar'
confirm variable `depvar'
gettoken equals rest : 0 , parse(" =")
if "`equals'" == "=" {
local 0 `"`rest'"'
}
/* Parse. */
syntax varlist(default=none numeric) /*
*/ [pw iw] /* see _svy_newrule.ado
*/ [if] [in] /*
*/ , /*
*/ SELect(string) /* required
*/ [ /*
*/ noCONStant /* my options
*/ FROM(string) /*
*/ Mills(string) NShazard(string) /*
*/ OFFset(varname numeric) /*
*/ LOg /*
*/ SCore(string) /*
*/ svy /* ignored
*/ STRata(passthru) /* see _svy_newrule.ado
*/ PSU(passthru) /* see _svy_newrule.ado
*/ FPC(passthru) /* see _svy_newrule.ado
*/ * /* svy/ml/display options
*/ ]
_svy_newrule , `weight' `strata' `psu' `fpc'
mlopts mlopts rest, `options'
svyopts svymlopts diopts , `rest'
SelectEq seldep selind selnc seloff : `"`select'"'
if "`seloff'" != "" {
local soffopt "offset(`seloff')"
}
if `"`log'"' == "" {
local log nolog
local qui quietly
}
local rhometh 2 /* rhosigma is default */
/* Check syntax errors */
if "`constant'"!="" & "`varlist'" == "" {
noi di as err "must specify independent variables or " /*
*/ "allow constant for primary equation"
exit 102
}
if "`nshazard'" != "" & "`mills'" != "" {
di as txt /*
*/ "note: options nshazard() and mills() are synonyms;"
di as txt /*
*/ " using nshazard() and ignoring mills()"
}
if "`nshazard'" != "" {
local mills `nshazard'
}
if "`mills'" != "" {
confirm new var `mills'
}
/* Process scores */
if "`score'" != "" {
local n : word count `score'
if `n'==1 & substr("`score'",-1,1)=="*" {
local score = /*
*/ substr("`score'",1,length("`score'")-1)
local score `score'1 `score'2 `score'3 `score'4
local n : word count `score'
}
if `n' != 4 {
di as err /*
*/ "score() requires you specify four new variable names"
exit 198
}
confirm new var `score'
tempvar sc1 sc2 sc3 sc4
local scopt "score(`sc1' `sc2' `sc3' `sc4')"
}
if "`offset'" != "" {
local offopt "offset(`offset')"
}
/* Find estimation sample */
qui svyset
local wtype `r(wtype)'
local wtexp "`r(wexp)'"
if "`wtype'" != "" {
local wgt `"[`wtype'`wtexp']"'
}
/* Set observed/selected variable. */
if "`seldep'" == "" {
tempname seldep
qui gen byte `seldep' = `depvar' != .
local selname select
}
else local selname `seldep'
tempvar touse rtouse
mark `touse' `if' `in' `wgt', zeroweight
markout `touse' `seldep' `selind' `seloff' `cluster', strok
qui gen byte `rtouse' = `touse'
markout `rtouse' `depvar' `varlist' `offset'
qui replace `touse' = 0 if `seldep' & !`rtouse'
/* Remove collinearity */
_rmcoll `selind' if `touse', `selnc'
local selind "`r(varlist)'"
_rmdcoll `depvar' `varlist' if `touse' & `seldep', `constant'
local varlist "`r(varlist)'"
/* Check selection condition */
qui sum `seldep' if `touse'
if `r(N)' == `r(sum)' {
di as err "Dependent variable never censored due to selection: "
di as err "model would simplify to OLS regression"
exit 498
}
/* Full model.
* Starting values and comparison LL */
tempname b regll prbll
GetIval "`depvar'" "`varlist'" "`constant'" "`selind'" "`selnc'" /*
*/ `b' "`wgt'" "`wtype'" "`wtexp'" /*
*/ `touse' `seldep' "`offset'" "`soffopt'" /*
*/ "`rhometh'" "`twostep'" "`first'"
scalar `regll' = r(regll) /* not used for svy */
scalar `prbll' = r(prbll) /* not used for svy */
if "`from'" == "" {
local from "`b', copy"
}
/* Fit miss-specified model. */
`qui' FitMiss `depvar' `varlist' if `touse', /*
*/ sel(`seldep' = `selind', `selnc' `soffopt') /*
*/ `offopt' /*
*/ `diopts' /*
*/ mlopts(`mlopts') /*
*/ `svymlopts'
if "`r(results)'" != "" {
tempname Vmeff
mat `Vmeff' = e(V)
}
/* Fit full model */
ml model d2 heck_d2 /*
*/ (`depvar': `depvar' = `varlist', `offopt' `constant') /*
*/ (`selname': `seldep' = `selind', `selnc' `soffopt') /*
*/ /athrho /*
*/ /lnsigma /*
*/ if `touse', /*
*/ collinear /*
*/ missing /*
*/ max /*
*/ nooutput /*
*/ nopreserve /*
*/ `mlopts' /*
*/ svy /*
*/ `svymlopts' /*
*/ `scopt' /*
*/ `log' /*
*/ init(`from') /*
*/ search(off) /*
*/ title(Survey Heckman selection model) /*
*/ crittype("log pseudolikelihood") /*
*/
Reparm
/* Get Mills' ratio if requested */
if "`mills'" != "" {
qui _predict double `mills', eq(#2), if `touse'
qui replace `mills' = normd(`mills') / normprob(`mills')
label var `mills' "nonselection hazard"
}
/* Handle scores if requested */
if "`score'" != "" {
tokenize `score'
local i 1
while "``i''" != "" {
rename `sc`i'' ``i''
local i = `i' + 1
}
eret local scorevars `score'
}
else eret local scorevars
tokenize `e(depvar)'
if substr("`2'", 1, 2) == "__" {
eret local depvar `1'
}
qui count if `seldep' == 0 & `touse'
eret scalar N_cens = r(N)
eret local predict "heckma_p"
eret local mills `mills'
if "`Vmeff'" != "" {
_svy_mkmeff `Vmeff'
}
eret scalar k_aux = 2 /* # of ancillary parameters */
eret local cmd "svyheckman"
/* Double save. */
global S_E_nobs = e(N)
global S_E_nstr = e(N_strata)
global S_E_npsu = e(N_psu)
global S_E_npop = e(N_pop)
global S_E_wgt `e(wtype)'
global S_E_exp "`e(wexp)'"
global S_E_str `e(strata)'
global S_E_psu `e(psu)'
global S_E_depv `e(depvar)'
global S_E_f = e(F)
global S_E_mdf = e(df_m)
global S_E_cmd `e(cmd)'
Display, `diopts'
end
program define Display
syntax [, Level(cilevel) * ]
local opts svy level(`level') dof(`e(df_r)')
ml display , level(`level') `options' /*
*/ diparm(athrho, `opts' tanh label("rho")) /*
*/ diparm(lnsigma, `opts' exp label("sigma")) /*
*/ diparm(athrho lnsigma, /*
*/ func(exp(@2)*(exp(@1)-exp(-@1))/(exp(@1)+exp(-@1)) ) /*
*/ der( exp(@2)*(1-((exp(@1)-exp(-@1))/(exp(@1)+exp(-@1)))^2) /*
*/ exp(@2)*(exp(@1)-exp(-@1))/(exp(@1)+exp(-@1)) ) /*
*/ `opts' label("lambda")) /*
*/
end
program define Reparm, eclass
/* somewhat superceded by _diparm, but kept for
* lambda and so sigma and rho can be saved in e() */
tempname b v d tau lns rho sig tmp lambda lamse
mat `b' = get(_b)
mat `v' = get(VCE)
mat `tmp' = `b'[1,"athrho:_cons"]
scalar `tau' = `tmp'[1,1]
mat `tmp' = `b'[1,"lnsigma:_cons"]
scalar `lns' = `tmp'[1,1]
scalar `rho' = (exp(2*`tau')-1) / (exp(2*`tau')+1)
scalar `sig' = exp(`lns')
scalar `lambda' = `rho'*`sig'
mat `d' = ( `sig'*4*exp(2*`tau')/(exp(2*`tau')+1)^2 , `lambda' )
mat `v' = (`v'["athrho:_cons".."lnsigma:_cons", /*
*/ "athrho:_cons".."lnsigma:_cons"] )
mat `v' = `d'*`v'*`d''
scalar `lamse' = sqrt(`v'[1,1])
eret scalar rho = `rho'
eret scalar sigma = `sig'
eret scalar lambda = `lambda'
eret scalar selambda = `lamse'
end
program define GetIval, rclass
args depvar /*
*/ varlist /*
*/ constant /*
*/ selind /*
*/ selnc /*
*/ b0 /*
*/ wgt /*
*/ wtype /*
*/ wtexp /*
*/ touse /*
*/ seldep /* dependent variable is observed
*/ offset /* regression offset as -offvar-
*/ soffopt /* selection offset as -offset(offvar)-
*/ rhometh /* method of computing or handling rho
*/ twostep /*
*/ first /*
*/ lvmills
if "`first'" != "" {
local first noisily
}
if "`twostep'" == "" {
local do2 "*"
}
tempname bprb breg sigma lnsigma rho rho1 athrho Vprb deltbar wtobs
tempvar pxb delthat mills
qui {
/* First-step -- probit */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -