You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
8.5 KiB
Plaintext

7 months ago
*! version 1.7.2 2Nov2005 ztp ztnb
* version 1.7.1 13Apr2005
* version 1.7.0 27Mar2004 slogit
* version 1.6.4 27Apr2001 change to work with forvalues
* version 1.6.3 17Mar2001
capture program drop praccum
program define praccum
version 6
tempname newmat
*=> classify each valid type of model
if "`e(cmd)'"=="cloglog" { local io = "typical binary" }
if "`e(cmd)'"=="cnreg" { local io = "typical regress" }
if "`e(cmd)'"=="fit" { local io = "typical regress" }
if "`e(cmd)'"=="gologit" { local io = "typical mlogit" }
if "`e(cmd)'"=="intreg" { local io = "typical regress" }
if "`e(cmd)'"=="logistic" { local io = "typical none" }
if "`e(cmd)'"=="logit" { local io = "typical binary" }
if "`e(cmd)'"=="mlogit" { local io = "typical mlogit" }
if "`e(cmd)'"=="nbreg" { local io = "typical count" }
if "`e(cmd)'"=="ologit" { local io = "typical ordered" }
if "`e(cmd)'"=="oprobit" { local io = "typical ordered" }
if "`e(cmd)'"=="poisson" { local io = "typical count" }
if "`e(cmd)'"=="probit" { local io = "typical binary" }
if "`e(cmd)'"=="regress" { local io = "typical regress" }
if "`e(cmd)'"=="slogit" { local io = "typical ordered" }
if "`e(cmd)'"=="tobit" { local io = "typical regress" }
if "`e(cmd)'"=="zinb" { local io = "twoeq count" }
if "`e(cmd)'"=="zip" { local io = "twoeq count" }
if "`e(cmd)'"=="ztp" { local io = "typical count" }
if "`e(cmd)'"=="ztnb" { local io = "typical count" }
if "`io'"=="" {
di
di in y "praccum" in r /*
*/ " does not work for the last type of model estimated."
exit
}
local input : word 1 of `io' /* input routine to _pepred */
local output : word 2 of `io' /* output routine */
*=> decode specified input
syntax [, Saving(string) Using(string) GENerate(string) XIS(string)]
*truncate generate root if more than five characters
if "`generate'" ~= "" {
local gen = substr("`generate'",1,29)
cap version 7
if _rc != 0 { local gen = substr("`gen'",1,5) }
version 6.0
}
if "`output'" == "ordered" | "`output'" == "mlogit" {
tempname values
mat `values' = r(values)
local outcms = rowsof(r(probs))
local count = 1
while `count' <= `outcms' {
local k`count' = `values'[`count',1]
if `k`count'' < -9 | `k`count'' > 99 | int(`k`count'')!=`k`count'' {
di in red "category values must be integers between -9 and 99"
exit 198
}
if `k`count'' < 0 {
local k`count' = abs(`k`count'')
local k`count' = "_`k`count''"
}
local count = `count' + 1
}
}
if "`xis'"!="" {
tempname results
if "`output'" == "regress" {
matrix `results' = ( `xis' , r(xb) )
}
if "`output'" == "binary" {
* grab output from binary model
matrix `results' = ( `xis' , r(p0) , r(p1) )
}
if "`output'" == "ordered" | "`output'" == "mlogit" {
tempname probs newprob
mat `probs' = r(probs)
local outcms = rowsof(r(probs))
matrix `results' = `xis'
local count = 1
while `count' <= `outcms' {
matrix `newprob' = `probs'[`count', 1]
matrix `results' = `results' , `newprob'
local count = `count' + 1
}
}
if "`output'" == "count" {
tempname probs newprob values
mat `values' = r(values)
mat `probs' = r(probs)
local outcms = rowsof(r(probs))
local rmu = r(mu)
matrix `results' = `xis', `rmu'
local count = 1
while `count' <= `outcms' {
matrix `newprob' = `probs'[`count', 1]
matrix `results' = `results' , `newprob'
local count = `count' + 1
}
}
if "`input'" == "twoeq" & "`output'"=="count" {
tempname az
matrix `az' = r(always0)
matrix `results' = `results' , `az'
}
*=> saving is the initial run
if "`saving'" ~= "" { mat `saving' = `results' }
if "`using'" ~= "" {
cap mat list `using'
if _rc ~= 0 {
mat `using' = `results'
* OLD SYNTAX: error if `using' matrix does not already exist
* di in r "matrix `using' does not exist"
* exit 111
}
else { mat `using' = (`using') \ (`results') }
}
}
*=> generates creates the new variables
if "`gen'" ~= "" {
if "`output'" == "regress" {
local columns = "`gen'x `gen'xb"
}
if "`output'" == "binary" {
local columns = "`gen'x `gen'p0 `gen'p1"
}
if "`output'" == "ordered" | "`output'" == "mlogit" {
local columns "`gen'x"
local outcms = rowsof(r(probs))
local count = 1
while `count' <= `outcms' {
local columns "`columns' `gen'p`k`count''"
local count = `count' + 1
}
}
if "`output'" == "count" {
local columns "`gen'x `gen'mu"
local outcms = rowsof(r(probs))
local count = 0
while `count' <= (`outcms'-1) {
local columns "`columns' `gen'p`count'"
local count = `count' + 1
}
if "`input'"=="twoeq" {
local columns "`columns' `gen'inf"
}
}
* create new variables
matrix colnames `using' = `columns'
svmat `using', names(col)
*=> label variables
label variable `gen'x "value of x"
if "`output'" == "regress" {
label variable `gen'xb "value of xb"
}
if "`output'" == "binary" {
label variable `gen'p0 "Pr(0)"
label variable `gen'p1 "Pr(1)"
}
if "`output'" == "ordered" {
tempname values
mat `values' = r(values)
local outcms = rowsof(r(probs))
local count = 1
while `count' <= `outcms' {
local count2 = `count'
label variable `gen'p`k`count'' "Pr(`k`count'')"
local count = `count' + 1
}
}
if "`output'" == "mlogit" {
tempname values
mat `values' = r(values)
local outcms = rowsof(r(probs))
local count = 1
while `count' <= `outcms' {
local value = `values'[`count', 1]
local count2 = `count'
label variable `gen'p`k`count'' "Pr(`k`count'')"
local count = `count' + 1
}
}
if "`output'" == "count" {
tempname values
mat `values' = r(values)
local outcms = rowsof(r(probs))
local count = 1
while `count' <= `outcms' {
local value = `values'[`count', 1]
label variable `gen'p`value' "Pr(`value')"
local count = `count' + 1
}
if "`input'"=="twoeq" {
label variable `gen'inf "Pr(always0)"
}
}
*=> for ordered and count variables, generate cumulative counts
if "`output'" == "ordered" {
local outcms = rowsof(r(probs))
local count = 1
while `count' <= `outcms' {
qui egen `gen's`k`count'' = rsum(`gen'p`k1'-`gen'p`k`count'') if `gen'p`k1'~=.
local cumul = "`cumul'`gen's`k`count'' "
label variable `gen's`k`count'' "Pr(<=`k`count'')"
local count = `count' + 1
}
}
if "`output'" == "count" {
local outcms = rowsof(r(probs))
local count = 0
while `count' <= (`outcms'-1) {
qui egen `gen's`count' = rsum(`gen'p0-`gen'p`count') if `gen'p0~=.
local cumul = "`cumul'`gen's`count' "
label variable `gen's`count' "Pr(<=`count')"
local count = `count' + 1
}
}
*=> display new variables
di _n in g "New variables created by" in w " praccum" in y ":"
sum `columns' `cumul'
} /* generate */
end