📄 mlogit_p.ado
字号:
_predict double `xb' if `touse', eq(#`i') xb
replace `den' = cond(`xb'<. & exp(`xb')>=., /*
*/ cond(`den'<0,`den'-1,-1), `den'+exp(`xb')) /*
*/ if `touse'
if "`i'"=="`equatio'" {
tempvar xbsel
rename `xb' `xbsel'
}
else drop `xb'
/* If `den'<0, then `den'==+inf.
If `den'==-1, then there is just
one +inf: p=0 if exp(`xbsel')<.,
and p=1 if exp(`xbsel')>=. (i.e.,
requested category gave the +inf).
If `den' < -1, then there are two
or more +inf: p=0 if exp(`xbsel')<.;
and p=. if exp(`xbsel')>=. (since we
cannot say what its value should be).
*/
local i = `i' + 1
}
}
/* Noisily compute probability of selected category. */
if "`equatio'"=="" { /* basecategory */
gen `typlist' `varlist' = cond(`den'>0,1/`den',0) if `touse'
}
else if "`xbsel'"=="" { /* equation not found */
di in red `"equation #`equation' not found"'
exit 303
}
else {
gen `typlist' `varlist' = cond(`den'>0,exp(`xbsel')/`den', /*
*/ cond(exp(`xbsel')<.,0,cond(`den'==-1,1,.))) if `touse'
}
end
program define AllPmlog
args typlist varlist touse
quietly {
tempname miss
local same 1
mat `miss' = J(1,`e(k_cat)',0)
local i 1
while `i' <= e(k_cat) {
tempvar p`i'
local typ : word `i' of `typlist'
local val = el(e(cat),1,`i')
_predict `typ' `p`i'' if `touse', eq(`val')
count if `p`i''>=.
mat `miss'[1,`i'] = r(N)
if `miss'[1,`i']!=`miss'[1,1] {
local same 0
}
label var `p`i'' `"Pr(`e(depvar)'==`val')"'
local i = `i' + 1
}
}
tokenize `varlist'
local i 1
while `i' <= e(k_cat) {
rename `p`i'' ``i''
local i = `i' + 1
}
ChkMiss `same' `miss' `varlist'
end
program define AllPsvy
args typlist varlist touse
quietly {
tempvar den tmp
tempname miss cat
/* Compute denominator `den' = 1 + Sum(exp(`xb')). */
gen double `den' = 1 if `touse'
local i 1
while `i' < e(k_cat) {
tempvar xb
_predict double `xb' if `touse', eq(#`i') xb
replace `den' = cond(`xb'<. & exp(`xb')>=., /*
*/ cond(`den'<0,`den'-1,-1), `den'+exp(`xb')) /*
*/ if `touse'
/* see comments in OnePsvy */
if `i' < e(ibasecat) {
local p`i' `xb'
local i = `i' + 1
}
else {
local i = `i' + 1
local p`i' `xb'
}
}
/* Compute probabilities. */
local same 1
mat `miss' = J(1,`e(k_cat)',0)
mat `cat' = e(cat)
local i 1
while `i' <= e(k_cat) {
local typ : word `i' of `typlist'
if `i'==e(ibasecat) { /* basecategory */
tempvar p`i'
gen `typ' `p`i'' = cond(`den'>0,1/`den',0) /*
*/ if `touse'
local eqi `"`e(baselab)'"'
}
else {
gen `typ' `tmp' = cond(`den'>0, /*
*/ exp(`p`i'')/`den', /*
*/ cond(exp(`p`i'')<.,0, /*
*/ cond(`den'==-1,1,.))) /*
*/ if `touse'
drop `p`i''
rename `tmp' `p`i''
if `i' < e(ibasecat) {
local eqi : word `i' of `e(eqnames)'
}
else {
local ip1 = `i' - 1
local eqi : word `ip1' of `e(eqnames)'
}
}
/* Count # of missings. */
count if `p`i''>=.
mat `miss'[1,`i'] = r(N)
if `miss'[1,`i']!=`miss'[1,1] {
local same 0
}
/* Label variable. */
label var `p`i'' `"Pr(`e(depvar)'==`eqi')"'
local i = `i' + 1
}
}
tokenize `varlist'
local i 1
while `i' <= e(k_cat) {
rename `p`i'' ``i''
local i = `i' + 1
}
ChkMiss `same' `miss' `varlist'
end
program define OldPsvy
// NOTE: do not update this subroutine, it is for use with svymlogit
// which has been replaced by svy:mlogit
args typlist varlist touse
quietly {
tempvar den tmp
tempname miss cat cati
/* Compute denominator `den' = 1 + Sum(exp(`xb')). */
gen double `den' = 1 if `touse'
local i 1
while `i' < e(k_cat) {
tempvar xb
_predict double `xb' if `touse', eq(#`i') xb
replace `den' = cond(`xb'<. & exp(`xb')>=., /*
*/ cond(`den'<0,`den'-1,-1), `den'+exp(`xb')) /*
*/ if `touse'
/* see comments in OnePsvy */
if `i' < e(ibasecat) {
local p`i' `xb'
local i = `i' + 1
}
else {
local i = `i' + 1
local p`i' `xb'
}
}
/* Compute probabilities. */
local same 1
mat `miss' = J(1,`e(k_cat)',0)
mat `cat' = e(cat)
local i 1
while `i' <= e(k_cat) {
local typ : word `i' of `typlist'
if `i'==e(ibasecat) { /* basecategory */
tempvar p`i'
gen `typ' `p`i'' = cond(`den'>0,1/`den',0) /*
*/ if `touse'
}
else {
gen `typ' `tmp' = cond(`den'>0, /*
*/ exp(`p`i'')/`den', /*
*/ cond(exp(`p`i'')<.,0, /*
*/ cond(`den'==-1,1,.))) /*
*/ if `touse'
drop `p`i''
rename `tmp' `p`i''
}
/* Count # of missings. */
count if `p`i''>=.
mat `miss'[1,`i'] = r(N)
if `miss'[1,`i']!=`miss'[1,1] {
local same 0
}
/* Label variable. */
mat `cati' = `cat'[1,`i'..`i']
local eqi : coleq `cati'
label var `p`i'' `"Pr(`e(depvar)'==`eqi')"'
local i = `i' + 1
}
}
tokenize `varlist'
local i 1
while `i' <= e(k_cat) {
rename `p`i'' ``i''
local i = `i' + 1
}
ChkMiss `same' `miss' `varlist'
end
program define ChkMiss
args same miss
macro shift 2
if `same' {
SayMiss `miss'[1,1]
exit
}
local i 1
while `i' <= e(k_cat) {
SayMiss `miss'[1,`i'] ``i''
local i = `i' + 1
}
end
program define SayMiss
args nmiss varname
if `nmiss' == 0 { exit }
if "`varname'"!="" {
local varname "`varname': "
}
if `nmiss' == 1 {
di in blu "(`varname'1 missing value generated)"
exit
}
local nmiss = `nmiss'
di in blu "(`varname'`nmiss' missing values generated)"
end
program ParseNewVars, sclass
version 9, missing
syntax [anything(name=vlist)] [if] [in] [, * ]
local myif `"`if'"'
local myin `"`in'"'
local myopts `"`options'"'
if `"`vlist'"' == "" {
di as err "varlist required"
exit 100
}
local varspec `"`vlist'"'
local neq = e(k_cat)
local stub 0
if index("`vlist'","*") {
_stubstar2names `vlist', nvars(`neq')
local varlist `s(varlist)'
local typlist `s(typlist)'
confirm new var `varlist'
}
else {
syntax newvarlist [if] [in] [, * ]
}
local nvars : word count `varlist'
sreturn clear
sreturn local varspec `varspec'
sreturn local varlist `varlist'
sreturn local typlist `typlist'
sreturn local if `"`myif'"'
sreturn local in `"`myin'"'
sreturn local options `"`myopts'"'
end
program ParseOptions, sclass
version 9
syntax [, ///
Equation(string) ///
Outcome(string) ///
Index ///
XB ///
STDP ///
STDDP ///
Pr ///
SCores ///
]
// check options that take arguments
local rc 0
if `"`equation'"' != "" & `"`outcome'"' != "" {
local errmsg "equation() and outcome()"
local rc 198
}
if `rc' {
di as err "options `errmsg' may not be combined"
exit `rc'
}
local eq `"`equation'`outcome'"'
// check switch options
local type `index' `xb' `stdp' `stddp' `pr' `scores'
if `:word count `type'' > 1 {
local type : list retok type
di as err "the following options may not be combined: `type'"
exit 198
}
// save results
sreturn clear
sreturn local type `type'
sreturn local outcome `"`eq'"'
end
program GenScores, rclass
version 9, missing
local cmd = cond("`e(prefix)'"=="svy","svy:","")+"`e(cmd)'"
syntax [anything] [if] [in] [, * ]
marksample touse
_score_spec `anything', `options'
local varlist `s(varlist)'
local typlist `s(typlist)'
local nvars : word count `varlist'
local spec = substr("`s(eqspec)'",2,.)
if "`spec'" == "" {
numlist "1/`nvars'"
local spec `r(numlist)'
}
tempvar p d
forval i = 1/`nvars' {
local typ : word `i' of `typlist'
local var : word `i' of `varlist'
local eq : word `i' of `spec'
if "`e(cmd)'`e(prefix)'"=="mlogit" {
quietly _predict `typ' `p' if `touse', eq(#`eq')
}
else { /* svymlogit */
quietly OnePsvy `typ' `p' if `touse', eq(#`eq')
}
quietly GenD `d' if `touse', eq(#`eq')
quietly gen `typ' `var' = (`d'-`p')
version 6: Outcome #`eq'
label var `var' `"equation-level score from `cmd', `e(depvar)'==`s(outcome)'"'
drop `d' `p'
}
return local scorevars `varlist'
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -