📄 mprobit.ado
字号:
*! version 1.0.6 03jun2005
* mprobit - multinomial probit model for case specific variables
program mprobit, eclass byable(onecall) prop(ml_score)
version 9
if _by() {
local BY `"by `_byvars'`_byrc0':"'
}
`BY' _vce_parserun mprobit : `0'
if "`s(exit)'" != "" {
exit
}
if replay() {
if `"`BY'"' != "" error 190
if `"`e(cmd)'"' != "mprobit" error 301
Replay `0'
exit
}
cap noi `BY' Estimate `0'
local rc = _rc
macro drop MPROBIT_*
exit `rc'
end
program Estimate, eclass byable(recall) sortpreserve
syntax varlist [if] [in] [fw pw iw], [ ///
INTPoints(integer 15) ///
noCONstant ///
BASEoutcome(string) ///
Robust ///
CLuster(varname) ///
CONSTraints(passthru) ///
FROM(string) ///
SCore(passthru) ///
Level(cilevel) ///
noLOg ///
noDROP ///
*]
gettoken choice indvars : varlist
mlopts mlopts, `options'
local diopts level(`level')
cap confirm string variable `choice'
if _rc == 0 {
di as error "{p}depvar `choice' is a string variable; " ///
"use {help encode##|_new:encode} to convert it{p_end}"
exit 108
}
local nvar : word count `indvars'
if `nvar'==0 & "`constant'"!="" {
di as error "too few variables specified"
exit 102
}
marksample touse
if `"`cluster'"' != "" {
markout `touse' `cluster'
local robust robust
local clopt cluster(`cluster')
}
if "`drop'"!="" & "`from'"=="" {
/* nodrop is undocumented; prevents dropping collinear */
/* variables. */
di as error "must use from() with the nodrop option"
exit 198
}
if "`drop'" == "" {
/* remove collinear variables */
_rmcoll `indvars' if `touse', `constant'
local indvars `"`r(varlist)'"'
}
tempvar depvar
tempname label
cap qui egen `depvar' = group(`choice') if `touse', lname(`label')
if _rc > 0 {
/* should not happen */
di as error "failed to renumber outcome levels"
error _rc
}
tempname N altlevels
local tabwgt "`weight'"
if ("`tabwgt'" == "pweight") local tabwgt "iweight"
qui tabulate `choice' [`tabwgt'`exp'] if `touse', matcell(`N') matrow(`altlevels')
local nalt = r(r)
if `nalt' == 1 {
di as error "there is only one outcome in `choice'"
exit 148
}
if `nalt' > 30 {
di as error "there are `nalt' outcomes in `choice'; the maximum " ///
"number of outcomes is 30"
exit 149
}
if "`baseoutcome'" == "" {
/* mimic -mlogit-: use maximum frequency as default base outcome */
local ni = `N'[1,1]
local ibase = 1
local baseoutcome = `altlevels'[1,1]
forvalues i=2/`nalt' {
if `N'[`i',1] > `ni' {
local ni = `N'[`i',1]
local ibase = `i'
local baseoutcome = `altlevels'[`i',1]
}
}
}
else {
local altlabels : value label `choice'
AlternativeIndex "`altlevels'" "`altlabels'" "`baseoutcome'" "`choice'"
local ibase = r(index)
}
/* number of quadrature points */
if `nalt' <= 2 {
local intpoints = 0
}
else if `intpoints' < 1 {
di as error "intpoints() must be greater than zero"
exit 498
}
else if `intpoints' > 500 {
di as error "{p}intpoints(`intpoints') is excessive; typically " ///
"no accuracy is gained beyond 30{p_end}"
exit 498
}
global MPROBIT_NPOINTS = `intpoints'
global MPROBIT_NALT = `nalt'
global MPROBIT_BASE = `ibase'
global MPROBIT_CHOICE `depvar'
global MPROBIT_TOUSE `touse'
GetModel `depvar' `indvars' if `touse', ibase(`ibase') `constant'
local models `"`r(models)'"'
local alteqs `"`r(alteqs)'"'
local const = `r(const)'
local coefnames `"`r(coefnames)'"'
local neq : word count `alteqs'
local `--neq'
if `"`from'"' == "" {
qui mlogit `depvar' `indvars' if `touse', base(`ibase') `constant'
tempname from
matrix `from' = e(b)
matrix colnames `from' = `coefnames'
}
/* need one extra score var for the base; -mprobit_lf- will pass */
/* it on to mata routine _mprobit_quadrature */
tempvar cb
gen double `cb' = 0
global MPROBIT_SCRS `cb'
global MPROBIT_ALTEQS `alteqs'
if `nalt' > 2 {
tempname qx qw
mata: _mprobit_weights_roots_laguerre(`intpoints', "`qw'", "`qx'")
global MPROBIT_QX `qx'
global MPROBIT_QW `qw'
}
if ("`score'"!="") local nopre nopre
ml model d1 mprobit_lf `models' if `touse' [`weight'`exp'], collinear ///
`constraints' init(`from') `clopt' `robust' wald(`neq') `log' ///
search(off) max nooutput `score' `nopre' `mlopts'
local labs : value label `choice'
forvalues i=`nalt'(-1)1 {
local a`i' = `altlevels'[`i',1]
if "`labs'" != "" {
local lab`i' : label `labs' `a`i''
ereturn local out`i' `"`lab`i''"'
}
else ereturn local out`i' `"`a`i''"'
}
local kind : word count `indvars'
ereturn scalar k_indvars = `kind'
ereturn scalar const = `const'
ereturn scalar k_out = `nalt'
ereturn scalar i_base = `ibase'
ereturn scalar k_points = `intpoints'
ereturn matrix outcomes = `altlevels'
ereturn local outeqs `"`alteqs'"'
ereturn local indvars `"`:list retok indvars'"'
ereturn local depvar `"`choice'"'
ereturn local k_dv
ereturn local title "Multinomial probit regression"
ereturn local predict mprobit_p
ereturn local cmd2 mprobit
ereturn local cmd mprobit
ereturn repost, esample(`touse')
Replay, `diopts'
end
program Replay
syntax [, Level(cilevel)]
local neq : word count `e(outeqs)'
local `--neq'
ml display, level(`level') neq(`neq') nofootnote
local i = `e(i_base)'
if (wordcount("`e(out`i')'") > 1) local base `""`=abbrev("`e(out`i')'",17)'""'
else local base `"`=abbrev(`"`e(out`i')'"',17)'"'
di in gr `"{p}(`e(depvar)'=`base' is the base outcome){p_end}"'
ml_footnote
end
program GetModel, rclass
syntax varlist if, ibase(integer) [ noCONstant ]
gettoken choice indvars : varlist
local const = ("`constant'" == "")
local nind : word count `indvars'
_labels2names `choice' `if', stub(_outcome_) noint
local altlabels `"`s(names)'"'
local nalt = `s(n_cat)'
forvalues i=1/`nalt' {
if (`i' == `ibase') continue
local ai : word `i' of `altlabels'
local models `"`models' (`ai':"'
local eqs `"`eqs' `ai'"'
if `nind' > 0 {
foreach cv of local indvars {
local cfnms `"`cfnms' `ai':`cv'"'
local models `"`models' `cv'"'
}
}
if `const' {
local cfnms `"`cfnms' `ai':_cons"'
local models `"`models')"'
}
else local models `"`models',nocons)"'
}
return local models `"`models'"'
return local eqs `"`eqs'"'
return local const = `const'
return local coefnames `"`cfnms'"'
return local alteqs `"`altlabels'"'
end
program AlternativeIndex, rclass
args altlevels altlabels level choice
local index = .
local nalt = rowsof(`altlevels')
if "`level'"!="" {
local i = 0
while `++i'<=`nalt' & `index'>=. {
local ialt = `altlevels'[`i',1]
if (`"`level'"'==`"`ialt'"') local index = `i'
}
if `index'>=. & "`altlabels'"!="" {
local i = 0
while `++i'<=`nalt' & `index'>=. {
local label : label `altlabels' `=`altlevels'[`i',1]'
if (`"`level'"'==`"`label'"') local index = `i'
}
}
if `index'>=. {
di as error "{p}baseoutcome(`level') is not an " ///
"outcome of `choice'; use {help tabulate##|_new:tabulate} for a " ///
"list of values{p_end}"
exit 459
}
}
return local index = `index'
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -