📄 _mprobitestimator.ado
字号:
foreach scr of global MPROBIT_CSCRS {
local robnms `"`robnms' `scr':_cons"'
}
local i = $MPROBIT_NCASECOEF
local `cscrs' `"$MPROBIT_CSCRS"'
local neq = rowsof(`caselvls')
forvalues j = 2/`neq' {
local aj = `caselvls'[`j',1]
foreach scr of global MPROBIT_CSCRS {
tempvar c`++i'
local robnms `"`robnms' `c`i'':_cons"'
local cscrs `"`cscrs' `c`i''"'
qui gen double `c`i'' = `scr' if `alternatives'==`aj'
qui replace `scr' = 0 if `alternatives' == `aj'
qui by `case': replace `c`i'' = sum(`c`i'')
qui by `case': replace `c`i'' = `c`i''[_N]
}
}
foreach scr of global MPROBIT_CSCRS {
qui replace `scr' = 0 if `alternatives'==`basealternative'
qui by `case': replace `scr' = sum(`scr')
qui by `case': replace `scr' = `scr'[_N]
}
}
if `ncov' > 0 {
/* dummy names for coefficients */
foreach scr of global MPROBIT_VSCRS {
local robnms `"`robnms' `scr':_cons"'
}
}
matrix colnames `V' = `robnms'
matrix rownames `V' = `robnms'
_robust $MPROBIT_ASCRS `cscrs' $MPROBIT_VSCRS if `choice'==1 ///
[`weight'`exp'], `clopt2' variance(`V')
local nms : colfullnames `from1'
matrix rownames `V' = `nms'
matrix colnames `V' = `nms'
local nc = r(N_clust)
ereturn repost b=`from1' V=`V'
ereturn local chi2
ereturn local p
if "`cluster'" != "" {
ereturn scalar N_clust = `nc'
ereturn scalar df_r = `nc' - 1
ereturn local clustvar "`cluster'"
}
if `nattrib'>0 | $MPROBIT_NCASECOEF>0 {
if `nattrib' > 0 {
qui test [`alternatives']
local accum a
}
if $MPROBIT_NCASECOEF-$MPROBIT_CONST > 0 {
foreach eq of global MPROBIT_CASEEQS {
qui test [`eq'], `accum'
local accum a
}
}
ereturn scalar df_m = r(df)
local dfr = `nattrib'+($MPROBIT_NCASECOEF-$MPROBIT_CONST)*`neq'
local neq = rowsof(`caselvls')
if "`cluster'" != "" {
ereturn local chi2type
if (r(df)==`dfr') ereturn scalar F = r(F)
else ereturn scalar F = .
}
else {
if (r(df)==`dfr') ereturn scalar chi2 = r(chi2)
else ereturn scalar chi2 = .
}
if (r(df)==`dfr') ereturn scalar p = r(p)
}
ereturn local vcetype "Robust"
}
if `cholesky' {
ChoiceOrderC "`corstr'" "`choices'" "internal" 1
ChoiceOrderC "`corfix'" "`choices'" "internal" 1
}
if `onerpc'== 0 {
tempname varstr varfix
matrix `varstr' = vecdiag(`corstr')
matrix `varfix' = vecdiag(`corfix')
forvalues i=1/`nchoice' {
matrix `corstr'[`i',`i'] = .
matrix `corfix'[`i',`i'] = .
}
local names : rownames `corstr'
matrix colnames `varstr' = `names'
matrix colnames `varfix' = `names'
ereturn matrix corpattern = `corstr'
ereturn matrix stdpattern = `varstr'
ereturn matrix corfixed = `corfix'
ereturn matrix stdfixed = `varfix'
}
ereturn matrix cat = `choices'
ereturn local indvars `"`attribs'"'
ereturn local ind2vars `"`casevars'"'
if $MPROBIT_NCASECOEF > 0 {
local n = rowsof(`caselvls')
forvalues i=1/`n' {
local ci = `caselvls'[`i',1]
local caselevels `"`caselevels' `ci'"'
}
ereturn local caselevels `"`caselevels'"'
ereturn local caseeqs `"$MPROBIT_CASEEQS"'
ereturn local baselab `"`baselab'"'
}
if `onerpc' == 0 {
ereturn local altvar `"`alternatives'"'
ereturn local casevar `"`case'"'
ereturn scalar cholesky = `cholesky'
ereturn scalar fullcov = `fullcov'
if `nchoice' > 2 {
if (`imeth'==1) ereturn local mc_method "Halton"
else if (`imeth'==2) ereturn local mc_method "Hammersley"
else {
ereturn local mc_method "uniform random"
ereturn local mc_seed `"$MPROBIT_SEED"'
}
}
if ("`correlation'" == "indep") ereturn local correlation "independent"
else if ("`correlation'" == "exch") ereturn local correlation "exchangeable"
else if ("`correlation'" == "unstruct") ereturn local correlation "unstructured"
else if ("`cormattype'" == "pattern") ereturn local correlation "pattern matrix"
else ereturn local correlation "fixed parameter matrix"
if ("`stddev'" == "heter") ereturn local stddev "heteroskedastic"
else if ("`stddev'" == "homo") ereturn local stddev "homoskedastic"
else if ("`varmattype'" == "pattern") ereturn local stddev "pattern matrix"
else ereturn local stddev "fixed parameter matrix"
if ("$MPROBIT_DELIMIT"!="") ereturn local delimit "$MPROBIT_DELIMIT"
}
ereturn scalar k_indvars = `nattrib'
ereturn scalar k_ind2vars = $MPROBIT_NCASECOEF-$MPROBIT_CONST
ereturn scalar const = $MPROBIT_CONST
ereturn scalar k_cat = `nchoice'
ereturn scalar basealt = `basealternative'
if (`onerpc') {
ereturn scalar k_points = `intpoints'
}
else {
if `nchoice' > 2 {
ereturn scalar mc_points = `intpoints'
ereturn scalar mc_antithetics = `antithetics'
if (`imeth'!=3) ereturn scalar mc_burn = `intburn'
}
ereturn scalar scalealt = `scalealternative'
ereturn scalar k_rho = `ncor'
ereturn scalar k_sigma = `nvar'
}
macro drop MPROBIT_*
ereturn local k_dv
ereturn local ic
ereturn local ilog
ereturn local k_eq
ereturn local cmd _mprobitestimator
end
program PostError
syntax , onerpc(integer) [SCore(string)]
if `onerpc'==0 & "`score'"!="" {
di as error "option scores() not allowed"
exit 198
}
end
program ParseTech, sclass
args technique initbhhh vce
tokenize `technique'
local d1 d1
local tech `technique'
if "`2'" == "" {
if "`1'" == "" {
local tech bfgs
local technique bfgs
}
if "`vce'" == "native" {
if ("`tech'" == "nr") local vce oim
else if ("`tech'" == "bhhh") local vce opg
}
if "`tech'" == "bhhh" {
local initbhhh = 0
/* must trick -ml- and let the likelihood evaluator compute the */
/* outer product gradient approximation to the negative Hessian */
local d1 d2
local tech nr
/* detect if a extra call to ml is needed to get the desired vce */
if "`vce'" == "oim" {
local tech2 nr
local vce2 oim
local d21 d1
}
}
else if "`vce'" == "opg"{
/* detect if a extra call to ml is needed to get the desired vce */
local tech2 nr
local vce2 oim
local d21 d2
}
if `initbhhh' > 0 {
if ("`tech'" == "nr") local techmeth Newton-Raphson
else local techmeth = upper("`technique'")
}
}
else {
local initbhhh = 0
local i = 0
while "``++i''" != "" {
if "``i''" == "bhhh" {
di as error "{p}technique(`technique') is invalid; " ///
"use the initbhhh({it:#}) option{p_end}"
exit 184
}
}
}
sreturn local technique `"`technique'"'
sreturn local tech `"`tech'"'
sreturn local d1 "`d1'"
sreturn local vce "`vce'"
sreturn local tech2 "`tech2'"
sreturn local vce2 "`vce2'"
sreturn local d21 "`d21'"
sreturn local initbhhh = `initbhhh'
sreturn local techmeth "`techmeth'"
end
program CoefFill
args mat1 mat2
local names1 : colfullnames `mat1'
local names2 : colfullnames `mat2'
local n1 : word count `names1'
local n2 : word count `names2'
forvalues j = 1/`n1' {
local labj : word `j' of `names1'
local i = 0
local found = 0
while `i'<`n1' & `found'==0 {
local labi : word `++i' of `names2'
local found = ("`labi'" == "`labj'")
}
if `found' == 0 {
di "{p 0 7}Note: coefficient `labj' of `mat1' is not a coefficient " ///
"of the model; ignoring it{p_end}"
}
else {
matrix `mat2'[1,`i'] = `mat1'[1,`j']
}
}
end
program CoefFrom, rclass
syntax anything, alternatives(varname) altlevels(string) ///
cholesky(integer) choice(varname) [ ///
attribs(varlist) ///
casevars(varlist) ///
base(string) ///
noCONSTant ]
local 0 `anything'
syntax namelist(min=1 max=1) [, copy]
tempname from1 caselvls
local from `namelist'
local copy = ("`copy'"=="copy")
local nacf : word count `attribs'
local nccf : word count `casevars'
local nvcf : word count `vcfnms'
local nalt = rowsof(`altlevels')
local const = ("`constant'"=="")
_labels2names `alternatives', stub(_alt_) noint
local altlabels `"`s(names)'"'
VParStripe `cholesky'
local nvcf = `r(nvcf)'
local vcfnms `"`r(cfnms)'"'
local thetas `"`r(thetas)'"'
local ncoef = `nacf' + (`nccf'+`const')*(`nalt'-1) + `nvcf'
if `copy' {
/* copy */
local nc = colsof(`from')
if `nc' != `ncoef' {
di as error "{p}option from(`from',copy) specifies a vector " ///
"of length `nc' but should be `ncoef'{p_end}"
exit 480
}
matrix `from1' = `from'
}
else {
matrix `from1' = J(1,`ncoef',0)
}
local cfnms
if `nacf' > 0 {
local altmodel `"(`alternatives':`choice'="'
foreach at of local attribs {
local cfnms `"`cfnms' `alternatives':`at'"'
local altmodel `"`altmodel' `at'"'
}
local altmodel `"`altmodel',nocons)"'
}
if `const' | `nccf'>0 {
local i = 0
matrix `caselvls' = J(`nalt'-1,1,.)
forvalues j = 1/`nalt' {
local aj = `altlevels'[`j',1]
if (`aj' == `base') {
local baselab : word `j' of `altlables'
continue
}
matrix `caselvls'[`++i',1] = `aj'
local aj : word `j' of `altlabels'
local casemodels `"`casemodels' (`aj':"'
if (`nacf'==0 & `i'==1) local casemodels `"`casemodels'`choice'="'
local caseeqs `"`caseeqs' `aj'"'
if `nccf' > 0 {
foreach cv of local casevars {
local cfnms `"`cfnms' `aj':`cv'"'
local casemodels `"`casemodels' `cv'"'
}
}
if `const' > 0 {
local cfnms `"`cfnms' `aj':_cons"'
local casemodels `"`casemodels')"'
}
else {
local casemodels `"`casemodels',nocons)"'
}
}
}
matrix colnames `from1' = `cfnms' `vcfnms'
if (`copy'==0) CoefFill "`from'" "`from1'"
return matrix from = `from1'
return local altmodel `"`altmodel'"'
return local casemodels `"`casemodels'"'
return local thetas `"`thetas'"'
return local caseeqs `"`caseeqs'"'
return local ncasecf = `nccf' + `const'
return local baselab `"`baselab'"'
if (`return(ncasecf)'>0) return matrix caselevels = `caselvls'
return local const = `const'
return local rcfnms `"`cfnms'"'
end
program InitMProbit, rclass
syntax varlist(max=1) [if] [fw pw iw], ///
alternatives(varname) ///
altlevels(string) ///
cholesky(integer) ///
base(string) [ ///
case(varname) ///
attribs(varlist) ///
noCONSTant ///
casevars(varlist) ///
constraints(numlist) ]
tempname from caselvls b ind
local np = 0
local nalt = rowsof(`altlevels')
local const = ("`constant'" == "")
local nccf : word count `casevars'
local nacf : word count `attribs'
_labels2names `alternatives', stub(_alt_) noint
local altlabels `"`s(names)'"'
local ncoef = 0
if `nacf' > 0 {
local altmodel `"(`alternatives':`varlist'="'
foreach attrib of local attribs {
local cfnms `"`cfnms' `alternatives':`attrib'"'
local altmodel `"`altmodel' `attrib'"'
local `++ncoef'
}
local altmodel `"`altmodel',nocons)"'
}
if `const' | `nccf'>0 {
matrix `caselvls' = J(`nalt'-1,1,.)
local k = 0
forvalues i=1/`nalt' {
local li = `altlevels'[`i',1]
if (`li'==`base') {
local baselab : word `i' of `altlabels'
continue
}
matrix `caselvls'[`++k',1] = `li'
local ai : word `i' of `altlabels'
if (`k'==1 & `nacf'==0) local casemodels `"`casemodels' (`ai':`varlist'="'
else local casemodels `"`casemodels' (`ai':"'
local caseeqs `"`caseeqs' `ai'"'
if `nccf' > 0 {
foreach cv of local casevars {
local cfnms `"`cfnms' `ai':`cv'"'
local casemodels `"`casemodels' `cv'"'
local `++ncoef'
}
}
if `const' {
local cfnms `"`cfnms' `ai':_cons"'
local casemodels `"`casemodels')"'
local `++ncoef'
}
else local casemodels `"`casemodels',nocons)"'
}
}
VParStripe `cholesky'
local nvcf = `r(nvcf)'
local thetas `"`r(thetas)'"'
local vcfnms `"`r(cfnms)'"'
local vconstr = 0
local bconstr = 0
if `"`constraints'"' != "" {
matrix `b' = J(1,`ncoef'+`nvcf',0)
matrix colnames `b' = `cfnms' `vcfnms'
CheckConstraints "`b'" `nvcf' `"`constraints'"'
/* vconstr is the number of constraints on the variance parameters */
/* bconstr is the number of constraints on the regression parameters */
local vconstr = `e(vconstr)'
local bconstr = `e(bconstr)'
if `bconstr' > 0 {
tempname C
matrix `C' = e(C)
}
}
if `nacf' == 0 {
if (`const'==0) local noconst noconstant
/* must generate mlogit coefficient names in case it drops variables due */
/* to collinearity */
forvalues i=1/`nalt' {
local ai = `altlevels'[`i',1]
if (`ai'==`base') continue
local ai : word `i' of `altlabels'
if `nccf' > 0 {
foreach cv of local casevars {
local initcf `"`initcf' `ai':`cv'"'
}
}
if (`const') local initcf `"`initcf' `ai':_cons"'
}
if (`const'==0) local noconst noconst
if `bconstr' > 0 {
matrix colnames `C' = `initcf'
local copt constraints(`C')
}
qui mlogit `alternatives' `casevars' [`weight'`exp'] `if', `noconst' ///
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -