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.
4496 lines
159 KiB
Plaintext
4496 lines
159 KiB
Plaintext
9 months ago
|
*! version 3.13 06aug2009 Ben Jann
|
||
|
|
||
|
program define estout, rclass
|
||
|
version 8.2
|
||
|
return local cmdline estout `macval(0)'
|
||
|
syntax [anything] [using] [ , ///
|
||
|
Cells(string asis) ///
|
||
|
Drop(string asis) ///
|
||
|
Keep(string asis) ///
|
||
|
Order(string asis) ///
|
||
|
REName(passthru) ///
|
||
|
Indicate(string asis) ///
|
||
|
TRansform(string asis) ///
|
||
|
EQuations(passthru) ///
|
||
|
NOEFORM eform EFORM2(string) ///
|
||
|
NOMargin Margin Margin2(string) ///
|
||
|
NODIscrete DIscrete(string asis) ///
|
||
|
MEQs(string) ///
|
||
|
NODROPPED dropped DROPPED2(string) ///
|
||
|
level(numlist max=1 int >=10 <=99) ///
|
||
|
Stats(string asis) ///
|
||
|
STARLevels(string asis) ///
|
||
|
NOSTARDetach STARDetach ///
|
||
|
STARKeep(string asis) ///
|
||
|
STARDrop(string asis) ///
|
||
|
VARwidth(numlist max=1 int >=0) ///
|
||
|
MODELwidth(numlist int >=0) ///
|
||
|
NOABbrev ABbrev ///
|
||
|
NOUNStack UNStack ///
|
||
|
EXTRAcols(numlist sort) ///
|
||
|
BEGin(string asis) ///
|
||
|
DELimiter(string asis) ///
|
||
|
INCELLdelimiter(string asis) ///
|
||
|
end(string asis) ///
|
||
|
DMarker(string) ///
|
||
|
MSign(string) ///
|
||
|
NOLZ lz ///
|
||
|
SUBstitute(string asis) ///
|
||
|
TItle(string) ///
|
||
|
note(string) ///
|
||
|
NOLEgend LEgend ///
|
||
|
PREHead(string asis) ///
|
||
|
POSTHead(string asis) ///
|
||
|
PREFoot(string asis) ///
|
||
|
POSTFoot(string asis) ///
|
||
|
HLinechar(string) ///
|
||
|
NOLabel Label ///
|
||
|
VARLabels(string asis) ///
|
||
|
REFcat(string asis) ///
|
||
|
MLabels(string asis) ///
|
||
|
NONUMbers NUMbers NUMbers2(string asis) ///
|
||
|
COLLabels(string asis) ///
|
||
|
EQLabels(string asis) ///
|
||
|
MGRoups(string asis) ///
|
||
|
LABCOL2(string asis) ///
|
||
|
TOPfile(string) ///
|
||
|
BOTtomfile(string) ///
|
||
|
STYle(string) ///
|
||
|
DEFaults(string) ///
|
||
|
* ///
|
||
|
]
|
||
|
MoreOptions, `options'
|
||
|
if "`style'"!="" local defaults "`style'"
|
||
|
|
||
|
*Matrix mode
|
||
|
MatrixMode, `anything' `rename' // resets the cells argument
|
||
|
// and returns r(coefs) etc. and local 'matrixmode'
|
||
|
|
||
|
*Parse suboptions
|
||
|
local elnum 0
|
||
|
if `"`cells'"'!="none" {
|
||
|
gettoken row rest: cells, bind match(par) qed(qed)
|
||
|
if `"`par'"'=="(" local qed 1
|
||
|
local cells
|
||
|
while `"`row'"'!="" {
|
||
|
local newrow
|
||
|
gettoken opt row: row, parse(" ([&")
|
||
|
if `"`macval(row)'"'=="" & `qed'==0 {
|
||
|
local row0
|
||
|
gettoken trash: rest, parse("[")
|
||
|
if `"`trash'"'=="[" {
|
||
|
gettoken trash rest: rest, parse("[")
|
||
|
gettoken mrow rest: rest, parse("]") q
|
||
|
gettoken trash rest: rest, parse("]")
|
||
|
if `"`trash'"'!="]" {
|
||
|
error 198
|
||
|
}
|
||
|
}
|
||
|
gettoken trash: rest, match(par)
|
||
|
if `"`par'"'=="(" {
|
||
|
gettoken opt2 rest: rest, match(par)
|
||
|
}
|
||
|
else local opt2
|
||
|
}
|
||
|
else {
|
||
|
gettoken trash: row, parse("[")
|
||
|
if `"`trash'"'=="[" {
|
||
|
gettoken trash row: row, parse("[")
|
||
|
gettoken mrow row: row, parse("]") q
|
||
|
gettoken trash row: row, parse("]")
|
||
|
if `"`trash'"'!="]" {
|
||
|
error 198
|
||
|
}
|
||
|
}
|
||
|
gettoken trash row0: row, match(par)
|
||
|
gettoken opt2: row, match(par)
|
||
|
}
|
||
|
while "`opt'"!="" {
|
||
|
if "`opt'"!="&" & "`opt'"!="." {
|
||
|
local `opt'_tname "el`++elnum'"
|
||
|
local ``opt'_tname'_ "`opt'"
|
||
|
local newrow `"`newrow' ``opt'_tname'"'
|
||
|
if `"`par'"'!="(" local opt2
|
||
|
ParseValueSubopts ``opt'_tname' `opt', mrow(`mrow') `macval(opt2)'
|
||
|
local mrow
|
||
|
}
|
||
|
else {
|
||
|
if `"`par'"'=="(" | `"`mrow'"'!="" error 198
|
||
|
local newrow `"`newrow' `opt'"'
|
||
|
}
|
||
|
if `"`par'"'!="(" {
|
||
|
gettoken opt row: row, parse(" ([&")
|
||
|
}
|
||
|
else {
|
||
|
gettoken opt row: row0, parse(" ([&")
|
||
|
}
|
||
|
gettoken trash: row, parse("[")
|
||
|
if `"`trash'"'=="[" {
|
||
|
gettoken trash row: row, parse("[")
|
||
|
gettoken mrow row: row, parse("]") q
|
||
|
gettoken trash row: row, parse("]")
|
||
|
if `"`trash'"'!="]" {
|
||
|
error 198
|
||
|
}
|
||
|
}
|
||
|
gettoken trash row0: row, match(par)
|
||
|
gettoken opt2: row, match(par)
|
||
|
}
|
||
|
local newrow: list retok newrow
|
||
|
if `qed' local cells `"`cells'"`newrow'" "'
|
||
|
else local cells `"`cells'`newrow' "'
|
||
|
gettoken row rest: rest, bind match(par) qed(qed)
|
||
|
if `"`par'"'=="(" local qed 1
|
||
|
}
|
||
|
local cells: list retok cells
|
||
|
}
|
||
|
if "`eform2'"!="" {
|
||
|
local eform "`eform2'"
|
||
|
local eform2
|
||
|
}
|
||
|
if `"`transform'"'!="" {
|
||
|
ParseTransformSubopts `transform'
|
||
|
}
|
||
|
if "`margin2'"!="" {
|
||
|
local margin "`margin2'"
|
||
|
local margin2
|
||
|
}
|
||
|
if `"`dropped'"'!="" local dropped "(dropped)"
|
||
|
if `"`macval(dropped2)'"'!="" {
|
||
|
local dropped `"`macval(dropped2)'"'
|
||
|
local dropped2
|
||
|
}
|
||
|
if `"`macval(stats)'"'!="" {
|
||
|
ParseStatsSubopts `macval(stats)'
|
||
|
if `"`macval(statslabels)'"'!="" {
|
||
|
if trim(`"`statslabels'"')=="none" {
|
||
|
local statslabelsnone none
|
||
|
local statslabels
|
||
|
}
|
||
|
else {
|
||
|
ParseLabelsSubopts statslabels `macval(statslabels)'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
foreach opt in mgroups mlabels eqlabels collabels varlabels {
|
||
|
if `"`macval(`opt')'"'!="" {
|
||
|
if trim(`"``opt''"')=="none" {
|
||
|
local `opt'none none
|
||
|
local `opt'
|
||
|
}
|
||
|
else {
|
||
|
ParseLabelsSubopts `opt' `macval(`opt')'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if `"`macval(numbers2)'"'!="" {
|
||
|
local numbers `"`macval(numbers2)'"'
|
||
|
local numbers2
|
||
|
}
|
||
|
if `"`macval(indicate)'"'!="" {
|
||
|
ParseIndicateOpts `macval(indicate)'
|
||
|
}
|
||
|
if `"`macval(refcat)'"'!="" {
|
||
|
ParseRefcatOpts `macval(refcat)'
|
||
|
}
|
||
|
if `"`macval(starlevels)'"'!="" {
|
||
|
ParseStarlevels `macval(starlevels)'
|
||
|
}
|
||
|
if `"`macval(labcol2)'"'!="" {
|
||
|
ParseLabCol2 `macval(labcol2)'
|
||
|
}
|
||
|
|
||
|
*Process No-Options
|
||
|
foreach opt in unstack eform margin dropped discrete stardetach wrap ///
|
||
|
legend label refcatlabel numbers lz abbrev replace append type showtabs ///
|
||
|
smcltags smclrules smclmidrules smcleqrules asis outfilenoteoff {
|
||
|
if "`no`opt''"!="" local `opt'
|
||
|
}
|
||
|
|
||
|
*Defaults
|
||
|
if "`defaults'"=="esttab" local defaults "tab"
|
||
|
if "`defaults'"=="" & `"`using'"'=="" local defaults "smcl"
|
||
|
if inlist("`defaults'", "", "smcl", "tab", "fixed", "tex", "html","mmd") {
|
||
|
local varwidthfactor = (1 + ("`eqlabelsmerge'"!="" & "`unstack'"=="")*.5)
|
||
|
if inlist("`defaults'", "", "tab") {
|
||
|
if `"`macval(delimiter)'"'=="" local delimiter _tab
|
||
|
}
|
||
|
else if "`defaults'"=="smcl" {
|
||
|
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor'
|
||
|
if "`modelwidth'"=="" local modelwidth 12
|
||
|
if "`noabbrev'"=="" local abbrev abbrev
|
||
|
if `"`macval(delimiter)'"'=="" local delimiter `"" ""'
|
||
|
if "`nosmcltags'"=="" local smcltags smcltags
|
||
|
if "`nosmclrules'"=="" local smclrules smclrules
|
||
|
if "`asis'"=="" local noasis noasis
|
||
|
}
|
||
|
else if "`defaults'"=="fixed" {
|
||
|
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor'
|
||
|
if "`modelwidth'"=="" local modelwidth 12
|
||
|
if "`noabbrev'"=="" local abbrev abbrev
|
||
|
if `"`macval(delimiter)'"'=="" local delimiter `"" ""'
|
||
|
}
|
||
|
else if "`defaults'"=="tex" {
|
||
|
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor'
|
||
|
if "`modelwidth'"=="" local modelwidth 12
|
||
|
if `"`macval(delimiter)'"'=="" local delimiter &
|
||
|
if `"`macval(end)'"'=="" {
|
||
|
local end \\\
|
||
|
}
|
||
|
}
|
||
|
else if "`defaults'"=="html" {
|
||
|
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor'
|
||
|
if "`modelwidth'"=="" local modelwidth 12
|
||
|
if `"`macval(begin)'"'=="" local begin <tr><td>
|
||
|
if `"`macval(delimiter)'"'=="" local delimiter </td><td>
|
||
|
if `"`macval(end)'"'=="" local end </td></tr>
|
||
|
}
|
||
|
else if "`defaults'"=="mmd" {
|
||
|
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor'
|
||
|
if "`modelwidth'"=="" local modelwidth 12
|
||
|
if `"`macval(begin)'"'=="" local begin "| "
|
||
|
if `"`macval(delimiter)'"'=="" local delimiter " | "
|
||
|
if `"`macval(end)'"'=="" local end " |"
|
||
|
}
|
||
|
if "`nostatslabelsfirst'"=="" local statslabelsfirst first
|
||
|
if "`nostatslabelslast'"=="" local statslabelslast last
|
||
|
if "`novarlabelsfirst'"=="" local varlabelsfirst first
|
||
|
if "`novarlabelslast'"=="" local varlabelslast last
|
||
|
if "`noeqlabelsfirst'"=="" local eqlabelsfirst first
|
||
|
if "`noeqlabelslast'"=="" local eqlabelslast last
|
||
|
if "`nolz'"=="" local lz lz
|
||
|
if `"`macval(discrete)'"'=="" & "`nodiscrete'"=="" {
|
||
|
local discrete `"" (d)" for discrete change of dummy variable from 0 to 1"'
|
||
|
}
|
||
|
if `"`macval(indicatelabels)'"'=="" local indicatelabels "Yes No"
|
||
|
if `"`macval(refcatlabel)'"'=="" & "`norefcatlabel'"=="" local refcatlabel "ref."
|
||
|
if `"`macval(incelldelimiter)'"'=="" local incelldelimiter " "
|
||
|
}
|
||
|
else {
|
||
|
capture findfile estout_`defaults'.def
|
||
|
if _rc {
|
||
|
di as error `"`defaults' style not available "' ///
|
||
|
`"(file estout_`defaults'.def not found)"'
|
||
|
exit 601
|
||
|
}
|
||
|
else {
|
||
|
tempname file
|
||
|
file open `file' using `"`r(fn)'"', read text
|
||
|
if c(SE) local max 244
|
||
|
else local max 80
|
||
|
while 1 {
|
||
|
ReadLine `max' `file'
|
||
|
if `"`line'"'=="" continue, break
|
||
|
gettoken opt line: line
|
||
|
else if index(`"`opt'"',"_") {
|
||
|
gettoken opt0 opt1: opt, parse("_")
|
||
|
if `"``opt0'_tname'"'!="" {
|
||
|
local opt `"``opt0'_tname'`opt1'"'
|
||
|
}
|
||
|
}
|
||
|
if `"`macval(`opt')'"'=="" & `"`no`opt''"'=="" {
|
||
|
if `"`opt'"'=="cells" {
|
||
|
local newline
|
||
|
gettoken row rest: line, match(par) qed(qed)
|
||
|
if `"`par'"'=="(" local qed 1
|
||
|
while `"`row'"'!="" {
|
||
|
local newrow
|
||
|
gettoken el row: row, parse(" &")
|
||
|
while `"`el'"'!="" {
|
||
|
if `"`el'"'!="." & `"`el'"'!="&" {
|
||
|
local `el'_tname "el`++elnum'"
|
||
|
local ``el'_tname'_ "`el'"
|
||
|
local newrow "`newrow' ``el'_tname'"
|
||
|
}
|
||
|
else {
|
||
|
local newrow "`newrow' `el'"
|
||
|
}
|
||
|
gettoken el row: row, parse(" &")
|
||
|
}
|
||
|
local newrow: list retok newrow
|
||
|
if `qed' local newline `"`newline'"`newrow'" "'
|
||
|
else local newline `"`newline'`newrow' "'
|
||
|
gettoken row rest: rest, match(par) qed(qed)
|
||
|
if `"`par'"'=="(" local qed 1
|
||
|
}
|
||
|
local line `"`newline'"'
|
||
|
}
|
||
|
local line: list retok line
|
||
|
local `opt' `"`macval(line)'"'
|
||
|
}
|
||
|
}
|
||
|
file close `file'
|
||
|
}
|
||
|
}
|
||
|
if "`notype'"=="" & `"`using'"'=="" local type type
|
||
|
if "`smcltags'"=="" & "`noasis'"=="" local asis asis
|
||
|
if "`asis'"!="" local asis "_asis"
|
||
|
if "`smclrules'"!="" & "`nosmclmidrules'"=="" local smclmidrules smclmidrules
|
||
|
if "`smclmidrules'"!="" & "`nosmcleqrules'"=="" local smcleqrules smcleqrules
|
||
|
local haslabcol2 = (`"`macval(labcol2)'"'!="")
|
||
|
|
||
|
*title/notes option
|
||
|
if `"`macval(prehead)'`macval(posthead)'`macval(prefoot)'`macval(postfoot)'"'=="" {
|
||
|
if `"`macval(title)'"'!="" {
|
||
|
local prehead `"`"`macval(title)'"'"'
|
||
|
}
|
||
|
if `"`macval(note)'"'!="" {
|
||
|
local postfoot `"`"`macval(note)'"'"'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Generate/clean-up cell contents
|
||
|
if `"`:list clean cells'"'=="" {
|
||
|
local cells b
|
||
|
local b_tname "b"
|
||
|
local b_ "b"
|
||
|
}
|
||
|
else if `"`:list clean cells'"'=="none" {
|
||
|
local cells
|
||
|
}
|
||
|
CellsCheck `"`cells'"'
|
||
|
if `:list sizeof incelldelimiter'==1 gettoken incelldelimiter: incelldelimiter
|
||
|
|
||
|
*Special treatment of confidence intervalls
|
||
|
if "`level'"=="" local level $S_level
|
||
|
if `level'<10 | `level'>99 {
|
||
|
di as error "level(`level') invalid"
|
||
|
exit 198
|
||
|
}
|
||
|
if "`ci_tname'"!="" {
|
||
|
if `"`macval(`ci_tname'_label)'"'=="" {
|
||
|
local `ci_tname'_label "ci`level'"
|
||
|
}
|
||
|
if `"`macval(`ci_tname'_par)'"'=="" {
|
||
|
local `ci_tname'_par `""" , """'
|
||
|
}
|
||
|
gettoken 1 2 : `ci_tname'_par
|
||
|
gettoken 2 3 : 2
|
||
|
gettoken 3 : 3
|
||
|
local `ci_tname'_l_par `""`macval(1)'" "`macval(2)'""'
|
||
|
local `ci_tname'_u_par `""" "`macval(3)'""'
|
||
|
}
|
||
|
if "`ci_l_tname'"!="" {
|
||
|
if `"`macval(`ci_l_tname'_label)'"'=="" {
|
||
|
local `ci_l_tname'_label "min`level'"
|
||
|
}
|
||
|
}
|
||
|
if "`ci_u_tname'"!="" {
|
||
|
if `"`macval(`ci_u_tname'_label)'"'=="" {
|
||
|
local `ci_u_tname'_label "max`level'"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Formats
|
||
|
local firstv: word 1 of `values'
|
||
|
if "`firstv'"=="" local firstv "b"
|
||
|
if "``firstv'_fmt'"=="" local `firstv'_fmt %9.0g
|
||
|
foreach v of local values {
|
||
|
if "``v'_fmt'"=="" local `v'_fmt "``firstv'_fmt'"
|
||
|
if `"`macval(`v'_label)'"'=="" {
|
||
|
local `v'_label "``v'_'"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Check margin option / prepare discrete option / prepare dropped option
|
||
|
if "`margin'"!="" {
|
||
|
if !inlist("`margin'","margin","u","c","p") {
|
||
|
di as error "margin(`margin') invalid"
|
||
|
exit 198
|
||
|
}
|
||
|
if `"`macval(discrete)'"'!="" {
|
||
|
gettoken discrete discrete2: discrete
|
||
|
}
|
||
|
}
|
||
|
else local discrete
|
||
|
local droppedison = (`"`macval(dropped)'"'!="")
|
||
|
|
||
|
*Formats/labels/stars for statistics
|
||
|
if "`statsfmt'"=="" local statsfmt: word 1 of ``firstv'_fmt'
|
||
|
ProcessStatslayout `"`stats'"' `"`statsfmt'"' `"`statsstar'"' ///
|
||
|
`"`statslayout'"' `"`statspchar'"'
|
||
|
local stats: list uniq stats
|
||
|
if "`statsstar'"!="" local p " p"
|
||
|
else local p
|
||
|
|
||
|
*Significance stars
|
||
|
local tablehasstars 0
|
||
|
foreach v of local values {
|
||
|
local el "``v'_'"
|
||
|
if "``v'_star'"!="" | inlist("`el'","_star","_sigsign") {
|
||
|
if "``v'_pvalue'"=="" local `v'_pvalue p
|
||
|
local tablehasstars 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Check/define starlevels/make levelslegend
|
||
|
if `tablehasstars' | `"`statsstar'"'!="" {
|
||
|
if `"`macval(starlevels)'"'=="" ///
|
||
|
local starlevels "* 0.05 ** 0.01 *** 0.001"
|
||
|
CheckStarvals `"`macval(starlevels)'"' `"`macval(starlevelslabel)'"' ///
|
||
|
`"`macval(starlevelsdelimiter)'"'
|
||
|
}
|
||
|
|
||
|
*Get coefficients/variances/statistics: _estout_getres
|
||
|
* - prepare transform/eform
|
||
|
if `"`transform'"'=="" { // transform() overwrites eform()
|
||
|
if "`eform'"!="" {
|
||
|
local transform "exp(@) exp(@)"
|
||
|
if "`eform'"!="eform" {
|
||
|
local transformpattern "`eform'"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
foreach m of local transformpattern {
|
||
|
if !( "`m'"=="1" | "`m'"=="0" ) {
|
||
|
di as error "invalid pattern in transform(,pattern()) or eform()"
|
||
|
exit 198
|
||
|
}
|
||
|
}
|
||
|
* - handle pvalue() suboption
|
||
|
if `tablehasstars' {
|
||
|
local temp
|
||
|
foreach v of local values {
|
||
|
local temp: list temp | `v'_pvalue
|
||
|
}
|
||
|
foreach v of local temp {
|
||
|
if `"``v'_tname'"'=="" {
|
||
|
local `v'_tname "el`++elnum'"
|
||
|
local ``v'_tname'_ "`v'"
|
||
|
local values: list values | `v'_tname
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
* - prepare list of results to get from e()-matrices
|
||
|
if "`ci_tname'"!="" {
|
||
|
local values: subinstr local values "`ci_tname'" "`ci_tname'_l `ci_tname'_u", word
|
||
|
local `ci_tname'_l_ "ci_l"
|
||
|
local ci_l_tname "`ci_tname'_l"
|
||
|
local `ci_tname'_u_ ci_u
|
||
|
local ci_u_tname "`ci_tname'_u"
|
||
|
}
|
||
|
foreach v of local values {
|
||
|
local temp = ("``v'_transpose'"!="")
|
||
|
local values1mrow `"`values1mrow' `"``v'_' `temp' ``v'_mrow'"'"'
|
||
|
}
|
||
|
tempname B D St
|
||
|
if `matrixmode'==0 {
|
||
|
* - expand model names
|
||
|
if `"`anything'"'=="" {
|
||
|
capt est_expand $eststo
|
||
|
if !_rc {
|
||
|
local anything `"$eststo"'
|
||
|
}
|
||
|
}
|
||
|
if `"`anything'"'=="" local anything "."
|
||
|
capt est_expand `"`anything'"'
|
||
|
if _rc {
|
||
|
if _rc==301 { // add e(cmd)="." to current estimates if undefined
|
||
|
if `:list posof "." in anything' & `"`e(cmd)'"'=="" {
|
||
|
if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" {
|
||
|
qui estadd local cmd "."
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
est_expand `"`anything'"'
|
||
|
}
|
||
|
local models `r(names)'
|
||
|
// could not happen, ...
|
||
|
if "`models'" == "" {
|
||
|
exit
|
||
|
}
|
||
|
* - get results
|
||
|
local temp names(`models') coefs(`values1mrow') stats(`stats'`p') ///
|
||
|
`rename' margin(`margin') meqs(`meqs') dropped(`droppedison') level(`level') ///
|
||
|
transform(`transform') transformpattern(`transformpattern')
|
||
|
_estout_getres, `equations' `temp'
|
||
|
local ccols = r(ccols)
|
||
|
if `"`equations'"'=="" & "`unstack'"=="" & `ccols'>0 { // specify equations("") to deactivate
|
||
|
TableIsAMess
|
||
|
if `value' {
|
||
|
_estout_getres, equations(main=1) `temp'
|
||
|
}
|
||
|
}
|
||
|
mat `St' = r(stats)
|
||
|
}
|
||
|
else { // matrix mode
|
||
|
local models `r(names)'
|
||
|
// define `St' so that code does not break
|
||
|
if `"`stats'"'!="" {
|
||
|
mat `St' = J(`:list sizeof stats',1,.z)
|
||
|
mat coln `St' = `models'
|
||
|
mat rown `St' = `stats'
|
||
|
}
|
||
|
}
|
||
|
local nmodels = r(nmodels)
|
||
|
local ccols = r(ccols)
|
||
|
if `ccols'>0 {
|
||
|
mat `B' = r(coefs)
|
||
|
}
|
||
|
return add
|
||
|
* - process order() option
|
||
|
if `"`order'"' != "" {
|
||
|
ExpandEqVarlist `"`order'"' `B' append
|
||
|
local order `"`value'"'
|
||
|
Order `B' `"`order'"'
|
||
|
}
|
||
|
* - process indicate() option
|
||
|
local nindicate 0
|
||
|
foreach indi of local indicate {
|
||
|
local ++nindicate
|
||
|
ProcessIndicateGrp `nindicate' `B' `nmodels' "`unstack'" ///
|
||
|
`"`macval(indicatelabels)'"' `"`macval(indi)'"'
|
||
|
}
|
||
|
* - process keep() option
|
||
|
if `"`keep'"' != "" {
|
||
|
ExpandEqVarlist `"`keep'"' `B'
|
||
|
DropOrKeep 1 `B' `"`value'"'
|
||
|
}
|
||
|
* - process drop() option
|
||
|
if `"`drop'"' != "" {
|
||
|
ExpandEqVarlist `"`drop'"' `B'
|
||
|
DropOrKeep 0 `B' `"`value'"'
|
||
|
}
|
||
|
|
||
|
* - names and equations of final set
|
||
|
capt confirm matrix `B'
|
||
|
if _rc {
|
||
|
return local coefs "" // erase r(coefs)
|
||
|
return local ccols ""
|
||
|
local R 0
|
||
|
local varlist ""
|
||
|
local eqlist ""
|
||
|
local eqs "_"
|
||
|
local fullvarlist ""
|
||
|
}
|
||
|
else {
|
||
|
return matrix coefs = `B', copy // replace r(coefs)
|
||
|
local R = rowsof(`B')
|
||
|
local C = colsof(`B')
|
||
|
QuotedRowNames `B'
|
||
|
local varlist `"`value'"'
|
||
|
local eqlist: roweq `B', q
|
||
|
local eqlist: list clean eqlist
|
||
|
UniqEqsAndDims `"`eqlist'"'
|
||
|
MakeQuotedFullnames `"`varlist'"' `"`eqlist'"'
|
||
|
local fullvarlist `"`value'"'
|
||
|
* - dropped coefs
|
||
|
local droppedpos = `ccols'
|
||
|
if "`margin'"!="" {
|
||
|
local droppedpos `droppedpos' - 1
|
||
|
}
|
||
|
* - 0/1-variable indicators (for marginals)
|
||
|
mat `D' = `B'[1...,1], J(`R',1,0) // so that row names are copied from `B'
|
||
|
mat `D' = `D'[1...,2]
|
||
|
if "`margin'"!="" {
|
||
|
forv i = 1/`R' { // last colum for each model contains _dummy info
|
||
|
forv j = `ccols'(`ccols')`C' {
|
||
|
if `B'[`i',`j']==1 {
|
||
|
mat `D'[`i',1] = 1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Prepare element specific keep/drop
|
||
|
local dash
|
||
|
tempname tmpmat
|
||
|
foreach v in star `values' {
|
||
|
local temp `"`fullvarlist'"'
|
||
|
if "`unstack'"!="" {
|
||
|
local temp2: list uniq eqs
|
||
|
local `v'`dash'eqdrop: list uniq eqs
|
||
|
}
|
||
|
if `"``v'`dash'keep'"'!="" {
|
||
|
capt mat `tmpmat' = `B'
|
||
|
ExpandEqVarlist `"``v'`dash'keep'"' `tmpmat'
|
||
|
DropOrKeep 1 `tmpmat' `"`value'"'
|
||
|
capt confirm matrix `tmpmat'
|
||
|
if _rc local temp
|
||
|
else {
|
||
|
QuotedRowNames `tmpmat'
|
||
|
MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"'
|
||
|
local temp: list temp & value
|
||
|
if "`unstack'"!="" {
|
||
|
local value: roweq `tmpmat', q
|
||
|
local value: list uniq value
|
||
|
local temp2: list temp2 & value
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if `"``v'`dash'drop'"'!="" {
|
||
|
capt mat `tmpmat' = `B'
|
||
|
ExpandEqVarlist `"``v'`dash'drop'"' `tmpmat'
|
||
|
DropOrKeep 0 `tmpmat' `"`value'"'
|
||
|
capt confirm matrix `tmpmat'
|
||
|
if _rc local temp
|
||
|
else {
|
||
|
QuotedRowNames `tmpmat'
|
||
|
MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"'
|
||
|
local temp: list temp & value
|
||
|
if "`unstack'"!="" {
|
||
|
local value: roweq `tmpmat', q
|
||
|
local value: list uniq value
|
||
|
local temp2: list temp2 & value
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
local `v'`dash'drop: list fullvarlist - temp
|
||
|
if "`unstack'"!="" {
|
||
|
local `v'`dash'eqdrop: list `v'`dash'eqdrop - temp2
|
||
|
}
|
||
|
local dash "_"
|
||
|
}
|
||
|
capt mat drop `tmpmat'
|
||
|
|
||
|
*Prepare unstack
|
||
|
if "`unstack'"!="" & `R'>0 {
|
||
|
local varlist: list uniq varlist
|
||
|
GetVarnamesFromOrder `"`order'"'
|
||
|
local temp: list value & varlist
|
||
|
local varlist: list temp | varlist
|
||
|
local cons _cons
|
||
|
if `:list cons in value'==0 {
|
||
|
if `:list cons in varlist' {
|
||
|
local varlist: list varlist - cons
|
||
|
local varlist: list varlist | cons
|
||
|
}
|
||
|
}
|
||
|
local R: word count `varlist'
|
||
|
local eqswide: list uniq eqs
|
||
|
forv i=1/`nindicate' {
|
||
|
ReorderEqsInIndicate `"`nmodels'"' `"`eqswide'"' ///
|
||
|
`"`indicate`i'eqs'"' `"`macval(indicate`i'lbls)'"'
|
||
|
local indicate`i'lbls `"`macval(value)'"'
|
||
|
}
|
||
|
}
|
||
|
else local eqswide "_"
|
||
|
|
||
|
*Prepare coefs for tabulation
|
||
|
if `R'>0 {
|
||
|
local i 0
|
||
|
foreach v of local values {
|
||
|
local ++i
|
||
|
tempname _`v'
|
||
|
forv j = 1/`nmodels' {
|
||
|
mat `_`v'' = nullmat(`_`v''), `B'[1..., (`j'-1)*`ccols'+`i']
|
||
|
}
|
||
|
mat coln `_`v'' = `models'
|
||
|
mat coleq `_`v'' = `models'
|
||
|
if inlist("``v'_'", "t", "z") {
|
||
|
if `"``v'_abs'"'!="" { // absolute t-values
|
||
|
forv r = 1/`R' {
|
||
|
forv j = 1/`nmodels' {
|
||
|
if `_`v''[`r',`j']>=. continue
|
||
|
mat `_`v''[`r',`j'] = abs(`_`v''[`r',`j'])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Model labels
|
||
|
if "`nomlabelstitles'"=="" & "`label'"!="" local mlabelstitles titles
|
||
|
local tmp: list sizeof mlabels
|
||
|
local i 0
|
||
|
foreach model of local models {
|
||
|
local ++i
|
||
|
if `i'<=`tmp' continue
|
||
|
local lab
|
||
|
if "`mlabelsdepvars'"!="" {
|
||
|
local var `"`return(m`i'_depname)'"'
|
||
|
if "`label'"!="" {
|
||
|
local temp = index(`"`var'"',".")
|
||
|
local temp2 = substr(`"`var'"',`temp'+1,.)
|
||
|
capture local lab: var l `temp2'
|
||
|
if _rc | `"`lab'"'=="" {
|
||
|
local lab `"`temp2'"'
|
||
|
}
|
||
|
local temp2 = substr(`"`var'"',1,`temp')
|
||
|
local lab `"`temp2'`macval(lab)'"'
|
||
|
}
|
||
|
else local lab `"`var'"'
|
||
|
}
|
||
|
else if "`mlabelstitles'"!="" {
|
||
|
local lab `"`return(m`i'_estimates_title)'"'
|
||
|
if `"`lab'"'=="" local lab "`model'"
|
||
|
}
|
||
|
else {
|
||
|
local lab "`model'"
|
||
|
}
|
||
|
local mlabels `"`macval(mlabels)' `"`macval(lab)'"'"'
|
||
|
}
|
||
|
if "`mlabelsnumbers'"!="" {
|
||
|
NumberMlabels `nmodels' `"`macval(mlabels)'"'
|
||
|
}
|
||
|
|
||
|
*Equations labels
|
||
|
local eqconssubok = (`"`macval(eqlabels)'"'!=`""""')
|
||
|
local numeqs: list sizeof eqs
|
||
|
local temp: list sizeof eqlabels
|
||
|
if `temp'<`numeqs' {
|
||
|
forv i = `=`temp'+1'/`numeqs' {
|
||
|
local eq: word `i' of `eqs'
|
||
|
local value
|
||
|
if "`label'"!="" {
|
||
|
capture confirm variable `eq'
|
||
|
if !_rc {
|
||
|
local value: var l `eq'
|
||
|
}
|
||
|
}
|
||
|
if `"`value'"'=="" local value "`eq'"
|
||
|
local eqlabels `"`macval(eqlabels)' `"`value'"'"'
|
||
|
}
|
||
|
}
|
||
|
if `eqconssubok' {
|
||
|
if "`eqlabelsnone'"!="" & `numeqs'>1 & "`unstack'"=="" {
|
||
|
EqReplaceCons `"`varlist'"' `"`eqlist'"' `"`eqlabels'"' `"`macval(varlabels)'"'
|
||
|
if `"`macval(value)'"'!="" {
|
||
|
local varlabels `"`macval(value)' `macval(varlabels)'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Column labels
|
||
|
if `"`macval(collabels)'"'=="" {
|
||
|
forv j = 1/`ncols' {
|
||
|
local temp
|
||
|
forv i = 1/`nrows' {
|
||
|
local v: word `i' of `cells'
|
||
|
local v: word `j' of `v'
|
||
|
local v: subinstr local v "&" " ", all
|
||
|
local v: subinstr local v "." "", all
|
||
|
local v: list retok v
|
||
|
foreach vi of local v {
|
||
|
if `"`macval(temp)'"'!="" {
|
||
|
local temp `"`macval(temp)'/"'
|
||
|
}
|
||
|
local temp `"`macval(temp)'`macval(`vi'_label)'"'
|
||
|
}
|
||
|
}
|
||
|
local collabels `"`macval(collabels)'`"`macval(temp)'"' "'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Prepare refcat()
|
||
|
if `"`macval(refcat)'"'!="" {
|
||
|
PrepareRefcat `"`macval(refcat)'"'
|
||
|
}
|
||
|
|
||
|
*Determine table layout
|
||
|
local m 1
|
||
|
local starcol 0
|
||
|
foreach model of local models {
|
||
|
local e 0
|
||
|
foreach eq of local eqswide {
|
||
|
local stc 0
|
||
|
local ++e
|
||
|
if "`unstack'"!="" & `R'>0 {
|
||
|
ModelEqCheck `B' `"`eq'"' `m' `ccols'
|
||
|
if !`value' continue
|
||
|
}
|
||
|
local eqsrow "`eqsrow'`e' "
|
||
|
local modelsrow "`modelsrow'`m' "
|
||
|
local k 0
|
||
|
local something 0
|
||
|
forv j = 1/`ncols' {
|
||
|
local col
|
||
|
local nocol 1
|
||
|
local colhasstats 0
|
||
|
forv i = 1/`nrows' {
|
||
|
local row: word `i' of `cells'
|
||
|
local v: word `j' of `row'
|
||
|
local v: subinstr local v "&" " ", all
|
||
|
foreach vi in `v' {
|
||
|
if "`vi'"=="." continue
|
||
|
local colhasstats 1
|
||
|
if "`unstack'"!="" {
|
||
|
if `:list eq in `vi'_eqdrop' continue
|
||
|
}
|
||
|
if "`:word `m' of ``vi'_pattern''"=="0" {
|
||
|
local v: subinstr local v "`vi'" ".`vi'", word
|
||
|
}
|
||
|
else {
|
||
|
local nocol 0
|
||
|
if `"``vi'_star'"'!="" local starcol 1
|
||
|
}
|
||
|
}
|
||
|
local v: subinstr local v " " "&", all
|
||
|
if "`v'"=="" local v "."
|
||
|
local col "`col'`v' "
|
||
|
}
|
||
|
if `colhasstats'==0 local nocol 0
|
||
|
if !`nocol' {
|
||
|
local colsrow "`colsrow'`j' "
|
||
|
if `++k'>1 {
|
||
|
local modelsrow "`modelsrow'`m' "
|
||
|
local eqsrow "`eqsrow'`e' "
|
||
|
}
|
||
|
if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1
|
||
|
local starsrow "`starsrow'`starcol' "
|
||
|
local starcol 0
|
||
|
Add2Vblock `"`vblock'"' "`col'"
|
||
|
local something 1
|
||
|
}
|
||
|
}
|
||
|
if !`something' {
|
||
|
local col
|
||
|
forv i = 1/`nrows' {
|
||
|
local col "`col'. "
|
||
|
}
|
||
|
Add2Vblock `"`vblock'"' "`col'"
|
||
|
local colsrow "`colsrow'1 "
|
||
|
if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1
|
||
|
local starsrow "`starsrow'`starcol' "
|
||
|
local starcol 0
|
||
|
}
|
||
|
}
|
||
|
local ++m
|
||
|
}
|
||
|
CountNofEqs "`modelsrow'" "`eqsrow'"
|
||
|
local neqs `value'
|
||
|
if `"`extracols'"'!="" {
|
||
|
foreach row in model eq col star {
|
||
|
InsertAtCols `"`extracols'"' `"``row'srow'"'
|
||
|
local `row'srow `"`value'"'
|
||
|
}
|
||
|
foreach row of local vblock {
|
||
|
InsertAtCols `"`extracols'"' `"`row'"'
|
||
|
local nvblock `"`nvblock' `"`value'"'"'
|
||
|
}
|
||
|
local vblock: list clean nvblock
|
||
|
}
|
||
|
local ncols = `: word count `starsrow'' + 1 + `haslabcol2'
|
||
|
|
||
|
*Modelwidth/varwidth/starwidth
|
||
|
if "`modelwidth'"=="" local modelwidth 0
|
||
|
if "`varwidth'"=="" local varwidth 0
|
||
|
local nmodelwidth: list sizeof modelwidth
|
||
|
local modelwidthzero: list uniq modelwidth
|
||
|
local modelwidthzero = ("`modelwidth'"=="0")
|
||
|
if "`labcol2width'"=="" local labcol2width `: word 1 of `modelwidth''
|
||
|
local starwidth 0
|
||
|
if `modelwidthzero'==0 {
|
||
|
if `tablehasstars' | `"`statsstar'"'!="" {
|
||
|
Starwidth `"`macval(starlevels)'"'
|
||
|
local starwidth `value'
|
||
|
}
|
||
|
}
|
||
|
if `varwidth'<2 local wrap
|
||
|
|
||
|
* totcharwidth / hline
|
||
|
local totcharwidth `varwidth'
|
||
|
capture {
|
||
|
local delwidth = length(`macval(delimiter)')
|
||
|
}
|
||
|
if _rc {
|
||
|
local delwidth = length(`"`macval(delimiter)'"')
|
||
|
}
|
||
|
if `haslabcol2' {
|
||
|
local totcharwidth = `totcharwidth' + `delwidth' + `labcol2width'
|
||
|
}
|
||
|
local j 0
|
||
|
foreach i of local starsrow {
|
||
|
local modelwidthj: word `=1 + mod(`j++',`nmodelwidth')' of `modelwidth'
|
||
|
local totcharwidth = `totcharwidth' + `delwidth' + `modelwidthj'
|
||
|
if `i' {
|
||
|
if "`stardetach'"!="" {
|
||
|
local ++ncols
|
||
|
local totcharwidth = `totcharwidth' + `delwidth'
|
||
|
}
|
||
|
local totcharwidth = `totcharwidth' + `starwidth'
|
||
|
}
|
||
|
}
|
||
|
IsInString "@hline" `"`0'"' // sets local strcount
|
||
|
if `strcount' {
|
||
|
local hline `totcharwidth'
|
||
|
if `hline'>400 local hline 400 // _dup(400) is limit
|
||
|
if `"`macval(hlinechar)'"'=="" local hlinechar "-"
|
||
|
local hline: di _dup(`hline') `"`macval(hlinechar)'"'
|
||
|
}
|
||
|
else local hline
|
||
|
|
||
|
* check begin, delimiter, end
|
||
|
tempfile tfile
|
||
|
tempname file
|
||
|
file open `file' using `"`tfile'"', write text
|
||
|
foreach opt in begin delimiter end {
|
||
|
capture file write `file' `macval(`opt')'
|
||
|
if _rc {
|
||
|
local `opt' `"`"`macval(`opt')'"'"'
|
||
|
}
|
||
|
}
|
||
|
file close `file'
|
||
|
|
||
|
* RTF support: set macros rtfrowdef, rtfrowdefbrdrt, rtfrowdefbrdrb, rtfemptyrow
|
||
|
local hasrtfbrdr 0
|
||
|
local rtfbrdron 0
|
||
|
IsInString "@rtfrowdef" `"`begin'"' // sets local strcount
|
||
|
local hasrtf = `strcount'
|
||
|
if `hasrtf' {
|
||
|
MakeRtfRowdefs `"`macval(begin)'"' `"`starsrow'"' "`stardetach'" ///
|
||
|
`varwidth' "`modelwidth'" `haslabcol2' `labcol2width'
|
||
|
local varwidth 0
|
||
|
local wrap
|
||
|
local modelwidth 0
|
||
|
local nmodelwidth 1
|
||
|
local modelwidthzero 1
|
||
|
local starwidth 0
|
||
|
local labcol2width 0
|
||
|
IsInString "@rtfrowdefbrdr" `"`begin'"' // sets local strcount
|
||
|
if `strcount' {
|
||
|
local hasrtfbrdr 1
|
||
|
local rtfbeginbak `"`macval(begin)'"'
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
else {
|
||
|
local begin: subinstr local begin "@rtfrowdef" `"`rtfrowdef'"'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
* set widths
|
||
|
if `starwidth'>0 local fmt_stw "%-`starwidth's"
|
||
|
if `varwidth'>0 local fmt_v "%-`varwidth's"
|
||
|
if `labcol2width'>0 local fmt_l2 "%~`labcol2width's"
|
||
|
if "`mgroupsspan'`mlabelsspan'`eqlabelsspan'`collabelsspan'"!="" {
|
||
|
if `modelwidthzero'==0 {
|
||
|
file open `file' using `"`tfile'"', write text replace
|
||
|
file write `file' `macval(delimiter)'
|
||
|
file close `file'
|
||
|
file open `file' using `"`tfile'"', read text
|
||
|
file read `file' delwidth
|
||
|
file close `file'
|
||
|
local delwidth = length(`"`macval(delwidth)'"')
|
||
|
}
|
||
|
else local delwidth 0
|
||
|
}
|
||
|
local stardetachon = ("`stardetach'"!="")
|
||
|
if `stardetachon' {
|
||
|
local stardetach `"`macval(delimiter)'"'
|
||
|
}
|
||
|
|
||
|
*Prepare @-Variables
|
||
|
local atvars2 `""`nmodels'" "`neqs'" "`totcharwidth'" `"`macval(hline)'"' `hasrtf' `"`rtfrowdefbrdrt'"' `"`rtfrowdefbrdrb'"' `"`rtfrowdef'"' `"`rtfemptyrow'"'"'
|
||
|
local atvars3 `"`"`macval(title)'"' `"`macval(note)'"' `"`macval(discrete)'`macval(discrete2)'"' `"`macval(starlegend)'"'"'
|
||
|
|
||
|
*Open output file
|
||
|
file open `file' using `"`tfile'"', write text replace
|
||
|
|
||
|
*Write prehead
|
||
|
if `"`macval(prehead)'"'!="" {
|
||
|
if index(`"`macval(prehead)'"',`"""')==0 {
|
||
|
local prehead `"`"`macval(prehead)'"'"'
|
||
|
}
|
||
|
}
|
||
|
foreach line of local prehead {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
|
||
|
file write `file' `"`macval(value)'"' _n
|
||
|
}
|
||
|
local hasheader 0
|
||
|
if "`smcltags'"!="" local thesmclrule "{txt}{hline `totcharwidth'}"
|
||
|
else local thesmclrule "{hline `totcharwidth'}"
|
||
|
if "`smclrules'"!="" {
|
||
|
file write `file' `"`thesmclrule'"' _n
|
||
|
}
|
||
|
|
||
|
*Labcol2 - title
|
||
|
if `haslabcol2' {
|
||
|
IsInString `"""' `"`macval(labcol2title)'"' // sets local strcount
|
||
|
if `strcount'==0 {
|
||
|
local labcol2chunk `"`macval(labcol2title)'"'
|
||
|
local labcol2rest ""
|
||
|
}
|
||
|
else {
|
||
|
gettoken labcol2chunk labcol2rest : labcol2title
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Write head: Models groups
|
||
|
if "`mgroupsnone'"=="" & `"`macval(mgroups)'"'!="" {
|
||
|
local hasheader 1
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
InsertAtVariables `"`macval(mgroupsbegin)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local mgroupsbegin `"`macval(value)'"'
|
||
|
InsertAtVariables `"`macval(mgroupsend)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local mgroupsend `"`macval(value)'"'
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`mgroupsreplace'"!="" {
|
||
|
if `"`macval(mgroupsbegin)'"'!="" local tmpbegin
|
||
|
if `"`macval(mgroupsend)'"'!="" local tmpend
|
||
|
}
|
||
|
MgroupsPattern "`modelsrow'" "`mgroupspattern'"
|
||
|
Abbrev `varwidth' `"`macval(mgroupslhs)'"' "`abbrev'"
|
||
|
WriteBegin `"`file'"' `"`macval(mgroupsbegin)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(value)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`mgroupspattern'" "`mgroupspattern'" ///
|
||
|
`"`macval(mgroups)'"' "`starsrow'" "`mgroupsspan'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'" ///
|
||
|
`"`macval(mgroupserepeat)'"' `"`macval(mgroupsprefix)'"' ///
|
||
|
`"`macval(mgroupssuffix)'"'
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mgroupsend)'"' ///
|
||
|
`"`"`macval(value)'"'"'
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
gettoken labcol2chunk labcol2rest : labcol2rest
|
||
|
}
|
||
|
|
||
|
*Write head: Models numbers
|
||
|
if `"`macval(numbers)'"'!="" {
|
||
|
local hasheader 1
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
if `"`macval(numbers)'"'=="numbers" local numbers "( )"
|
||
|
file write `file' `macval(begin)' `fmt_v' (`""')
|
||
|
if `haslabcol2' {
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
tokenize `"`macval(numbers)'"'
|
||
|
numlist `"1/`nmodels'"'
|
||
|
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" ///
|
||
|
"`r(numlist)'" "`starsrow'" "`mlabelsspan'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'" ///
|
||
|
`""' `"`macval(1)'"' `"`macval(2)'"'
|
||
|
file write `file' `macval(end)' _n
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
gettoken labcol2chunk labcol2rest : labcol2rest
|
||
|
}
|
||
|
|
||
|
*Write head: Models captions
|
||
|
if "`nomlabelsnone'"=="" & "`models'"=="." & `"`macval(mlabels)'"'=="." local mlabelsnone "none"
|
||
|
if "`mlabelsnone'"=="" {
|
||
|
local hasheader 1
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
InsertAtVariables `"`macval(mlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local mlabelsbegin `"`macval(value)'"'
|
||
|
InsertAtVariables `"`macval(mlabelsend)'"' 2 "`ncols'" `macval(atvars2)''
|
||
|
local mlabelsend `"`macval(value)'"'
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`mlabelsreplace'"!="" {
|
||
|
if `"`macval(mlabelsbegin)'"'!="" local tmpbegin
|
||
|
if `"`macval(mlabelsend)'"'!="" local tmpend
|
||
|
}
|
||
|
Abbrev `varwidth' `"`macval(mlabelslhs)'"' "`abbrev'"
|
||
|
WriteBegin `"`file'"' `"`macval(mlabelsbegin)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(value)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" ///
|
||
|
`"`macval(mlabels)'"' "`starsrow'" "`mlabelsspan'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'" ///
|
||
|
`"`macval(mlabelserepeat)'"' `"`macval(mlabelsprefix)'"' ///
|
||
|
`"`macval(mlabelssuffix)'"'
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mlabelsend)'"' ///
|
||
|
`"`"`macval(value)'"'"'
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
gettoken labcol2chunk labcol2rest : labcol2rest
|
||
|
}
|
||
|
|
||
|
*Write head: Equations captions
|
||
|
if "`eqlabelsnone'"=="" {
|
||
|
InsertAtVariables `"`macval(eqlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local eqlabelsbegin `"`macval(value)'"'
|
||
|
InsertAtVariables `"`macval(eqlabelsend)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local eqlabelsend `"`macval(value)'"'
|
||
|
}
|
||
|
if `"`eqswide'"'!="_" & "`eqlabelsnone'"=="" {
|
||
|
local hasheader 1
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`eqlabelsreplace'"!="" {
|
||
|
if `"`macval(eqlabelsbegin)'"'!="" local tmpbegin
|
||
|
if `"`macval(eqlabelsend)'"'!="" local tmpend
|
||
|
}
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
Abbrev `varwidth' `"`macval(eqlabelslhs)'"' "`abbrev'"
|
||
|
WriteBegin `"`file'"' `"`macval(eqlabelsbegin)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(value)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`eqsrow'" "`modelsrow'" ///
|
||
|
`"`macval(eqlabels)'"' "`starsrow'" "`eqlabelsspan'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'" ///
|
||
|
`"`macval(eqlabelserepeat)'"' `"`macval(eqlabelsprefix)'"' ///
|
||
|
`"`macval(eqlabelssuffix)'"'
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"' ///
|
||
|
`"`"`macval(value)'"'"'
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
gettoken labcol2chunk labcol2rest : labcol2rest
|
||
|
}
|
||
|
|
||
|
*Write head: Columns captions
|
||
|
if `"`macval(collabels)'"'!="" & "`collabelsnone'"=="" {
|
||
|
local hasheader 1
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
InsertAtVariables `"`macval(collabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local collabelsbegin `"`macval(value)'"'
|
||
|
InsertAtVariables `"`macval(collabelsend)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local collabelsend `"`macval(value)'"'
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`collabelsreplace'"!="" {
|
||
|
if `"`macval(collabelsbegin)'"'!="" local tmpbegin
|
||
|
if `"`macval(collabelsend)'"'!="" local tmpend
|
||
|
}
|
||
|
Abbrev `varwidth' `"`macval(collabelslhs)'"' "`abbrev'"
|
||
|
WriteBegin `"`file'"' `"`macval(collabelsbegin)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(value)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`colsrow'" "" `"`macval(collabels)'"' ///
|
||
|
"`starsrow'" "`collabelsspan'" "`abbrev'" "`modelwidth'" ///
|
||
|
"`delwidth'" "`starwidth'" `"`macval(collabelserepeat)'"' ///
|
||
|
`"`macval(collabelsprefix)'"' `"`macval(collabelssuffix)'"'
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(collabelsend)'"' ///
|
||
|
`"`"`macval(value)'"'"'
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
gettoken labcol2chunk labcol2rest : labcol2rest
|
||
|
}
|
||
|
|
||
|
*Write posthead
|
||
|
if `hasheader' & "`smclmidrules'"!="" {
|
||
|
file write `file' `"`thesmclrule'"' _n
|
||
|
}
|
||
|
if `"`macval(posthead)'"'!="" {
|
||
|
if index(`"`macval(posthead)'"',`"""')==0 {
|
||
|
local posthead `"`"`macval(posthead)'"'"'
|
||
|
}
|
||
|
}
|
||
|
foreach line of local posthead {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
|
||
|
file write `file' `"`macval(value)'"' _n
|
||
|
}
|
||
|
|
||
|
* Create mmd alignment/divider line
|
||
|
if `"`defaults'"'=="mmd" {
|
||
|
MakeMMDdef "`varwidth'" "`haslabcol2'" "`labcol2width'" ///
|
||
|
"`modelwidth'" "`starsrow'" "`stardetachon'" "`starwidth'"
|
||
|
file write `file' `"`macval(value)'"' _n
|
||
|
}
|
||
|
|
||
|
*Write body of table
|
||
|
*Loop over table rows
|
||
|
InsertAtVariables `"`macval(varlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local varlabelsbegin `"`macval(value)'"'
|
||
|
InsertAtVariables `"`macval(varlabelsend)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local varlabelsend `"`macval(value)'"'
|
||
|
tempname first
|
||
|
if `"`vblock'"'!="" {
|
||
|
local RI = `R' + `nindicate'
|
||
|
local e 0
|
||
|
local eqdim = `R' + `nindicate'
|
||
|
local weqcnt 0
|
||
|
local theeqlabel
|
||
|
if `hasrtfbrdr' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
local varlabelsbegin0 `"`macval(varlabelsbegin)'"'
|
||
|
local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"'
|
||
|
if "`eqlabelsfirst'"=="" local eqlabelsbegin0
|
||
|
forv r = 1/`R' {
|
||
|
local varlabelsend0 `"`macval(varlabelsend)'"'
|
||
|
local var: word `r' of `varlist'
|
||
|
|
||
|
*Write equation name/label
|
||
|
if "`unstack'"=="" {
|
||
|
local eqvar: word `r' of `fullvarlist'
|
||
|
if `"`eqs'"'!="_" {
|
||
|
local eqrlast `"`eqr'"'
|
||
|
local eqr: word `r' of `eqlist'
|
||
|
if `"`eqr'"'!=`"`eqrlast'"' & "`eqlabelsnone'"=="" {
|
||
|
local value: word `++e' of `macval(eqlabels)'
|
||
|
local eqdim: word `e' of `macval(eqsdims)'
|
||
|
local weqcnt 0
|
||
|
if `e'==`numeqs' {
|
||
|
if "`eqlabelslast'"=="" local eqlabelsend
|
||
|
local eqdim = `eqdim' + `nindicate'
|
||
|
}
|
||
|
if "`eqlabelsmerge'"!="" {
|
||
|
local theeqlabel `"`macval(eqlabelsprefix)'`macval(value)'`macval(eqlabelssuffix)'"'
|
||
|
}
|
||
|
else {
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`eqlabelsreplace'"!="" {
|
||
|
if `"`macval(eqlabelsbegin0)'"'!="" local tmpbegin
|
||
|
if `"`macval(eqlabelsend)'"'!="" local tmpend
|
||
|
}
|
||
|
if `e'>1 & "`smcleqrules'"!="" {
|
||
|
file write `file' `"`thesmclrule'"' _n
|
||
|
}
|
||
|
WriteBegin `"`file'"' `"`macval(eqlabelsbegin0)'"' `"`macval(tmpbegin)'"'
|
||
|
if "`smcltags'"!="" file write `file' "{res}"
|
||
|
WriteEqrow `"`file'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' `"`macval(value)'"' "`starsrow'" ///
|
||
|
"`eqlabelsspan'" "`varwidth'" "`fmt_v'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'" ///
|
||
|
`"`macval(eqlabelsprefix)'"' `"`macval(eqlabelssuffix)'"' ///
|
||
|
"`haslabcol2'" "`labcol2width'" "`fmt_l2'"
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"'
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
local ++weqcnt
|
||
|
if `weqcnt'==1 {
|
||
|
if "`varlabelsfirst'"=="" local varlabelsbegin0
|
||
|
}
|
||
|
|
||
|
*Determine rows to be written
|
||
|
local rvblock
|
||
|
foreach row of local vblock {
|
||
|
local c 0
|
||
|
local skiprow 1
|
||
|
local rowhasstats 0
|
||
|
foreach v of local row {
|
||
|
local ++c
|
||
|
if "`unstack'"!="" {
|
||
|
local eqr: word `:word `c' of `eqsrow'' of `eqs'
|
||
|
if `"`eqr'"'!="" local eqvar `"`eqr':`var'"'
|
||
|
else local eqvar "`var'"
|
||
|
}
|
||
|
local v: subinstr local v "&" " ", all
|
||
|
foreach vi of local v {
|
||
|
if "`vi'"=="." continue
|
||
|
if rownumb(`B',`"`eqvar'"')<. {
|
||
|
local rowhasstats 1
|
||
|
if index("`vi'",".")==1 continue
|
||
|
if `: list eqvar in `vi'_drop' continue
|
||
|
local skiprow 0
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
if `skiprow'==0 continue, break
|
||
|
}
|
||
|
if `rowhasstats'==0 local skiprow 0
|
||
|
if `"`ferest()'"'=="" & `"`rvblock'"'=="" local skiprow 0
|
||
|
if `skiprow' continue
|
||
|
local rvblock `"`rvblock'"`row'" "'
|
||
|
}
|
||
|
local nrvblock: list sizeof rvblock
|
||
|
|
||
|
*Insert refcat() (unless refcatbelow)
|
||
|
if `"`macval(refcat)'"'!="" {
|
||
|
local isref: list posof "`var'" in refcatcoefs
|
||
|
if `isref' {
|
||
|
if "`unstack'"=="" {
|
||
|
local temp `"`eqr'"'
|
||
|
if `"`temp'"'=="" local temp "_"
|
||
|
}
|
||
|
else local temp `"`eqswide'"'
|
||
|
GenerateRefcatRow `B' `ccols' "`var'" `"`temp'"' `"`macval(refcatlabel)'"'
|
||
|
local refcatrow `"`macval(value)'"'
|
||
|
}
|
||
|
}
|
||
|
else local isref 0
|
||
|
if `isref' & `"`refcatbelow'"'=="" {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`varlabelsreplace'"!="" {
|
||
|
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
|
||
|
if `"`macval(varlabelsend0)'"'!="" local tmpend
|
||
|
}
|
||
|
if "`varlabelsnone'"=="" {
|
||
|
local value: word `isref' of `macval(refcatnames)'
|
||
|
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
|
||
|
}
|
||
|
else local value
|
||
|
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
gettoken labcol2chunk labcol2 : labcol2
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
if "`smcltags'"!="" file write `file' "{res}"
|
||
|
WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' ///
|
||
|
`"`macval(refcatrow)'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`starsrow'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'"
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"'
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
local varlabelsbegin0 `"`macval(varlabelsbegin)'"'
|
||
|
}
|
||
|
|
||
|
*Write variable name/label
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
if "`varlabelsnone'"=="" {
|
||
|
VarInList `"`var'"' "`unstack'" `"`eqvar'"' ///
|
||
|
`"`eqr'"' `"`macval(varlabelsblist)'"'
|
||
|
if `"`macval(value)'"'!="" {
|
||
|
IsInString `"""' `"`value'"' // sets local strcount
|
||
|
if `strcount'==0 {
|
||
|
local value `"`"`macval(value)'"'"'
|
||
|
}
|
||
|
InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
WriteStrLines `"`file'"' `"`macval(value)'"'
|
||
|
if "`varlabelsreplace'"!="" {
|
||
|
local tmpbegin
|
||
|
local varlabelsbegin0
|
||
|
}
|
||
|
}
|
||
|
if "`label'"!="" {
|
||
|
local temp = index("`var'",".")
|
||
|
local temp2 = substr(`"`var'"',`temp'+1,.)
|
||
|
capture local varl: var l `temp2'
|
||
|
if _rc | `"`varl'"'=="" {
|
||
|
local varl `"`temp2'"'
|
||
|
}
|
||
|
local temp2 = substr(`"`var'"',1,`temp')
|
||
|
local varl `"`temp2'`macval(varl)'"'
|
||
|
}
|
||
|
else local varl `var'
|
||
|
VarInList `"`var'"' "`unstack'" `"`eqvar'"' ///
|
||
|
`"`eqr'"' `"`macval(varlabels)'"'
|
||
|
if `"`macval(value)'"'!="" {
|
||
|
local varl `"`macval(value)'"'
|
||
|
}
|
||
|
if `"`macval(discrete)'"'!="" {
|
||
|
local temp 0
|
||
|
if "`unstack'"=="" {
|
||
|
if `D'[`r',1]==1 local temp 1
|
||
|
}
|
||
|
else {
|
||
|
foreach eqr of local eqswide {
|
||
|
if `D'[rownumb(`D',`"`eqr':`var'"'),1]==1 local temp 1
|
||
|
}
|
||
|
}
|
||
|
if `temp'==1 & `temp'<. {
|
||
|
local varl `"`macval(varl)'`macval(discrete)'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else local varl
|
||
|
if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") {
|
||
|
if `nrvblock'==1 {
|
||
|
local tmpbegin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
}
|
||
|
if "`varlabelsreplace'"!="" {
|
||
|
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
|
||
|
}
|
||
|
if "`wrap'"!="" & `nrvblock'>1 {
|
||
|
local wrap_i 1
|
||
|
local value: piece `wrap_i' `varwidth' of `"`macval(theeqlabel)'`macval(varl)'"', nobreak
|
||
|
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
|
||
|
}
|
||
|
else {
|
||
|
Abbrev `varwidth' `"`macval(theeqlabel)'`macval(varl)'"' "`abbrev'"
|
||
|
}
|
||
|
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
gettoken labcol2chunk labcol2 : labcol2
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
local varlabelsbegin0 `"`macval(varlabelsbegin)'"'
|
||
|
|
||
|
*Write table cells
|
||
|
if "`smcltags'"!="" file write `file' "{res}"
|
||
|
local newrow 0
|
||
|
mat `first'=J(1,`nmodels',1)
|
||
|
foreach row of local rvblock {
|
||
|
if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") {
|
||
|
if `"`ferest()'"'=="" {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
}
|
||
|
local c 0
|
||
|
foreach v of local row {
|
||
|
local m: word `++c' of `modelsrow'
|
||
|
local unstackskipcoef 0
|
||
|
if "`unstack'"!="" {
|
||
|
capt local eqr: word `:word `c' of `eqsrow'' of `eqs'
|
||
|
local rr=rownumb(`B',`"`eqr':`var'"')
|
||
|
if `"`eqr'"'!="" local eqvar `"`eqr':`var'"'
|
||
|
else local eqvar "`var'"
|
||
|
if `rr'>=. local unstackskipcoef 1 // local v "."
|
||
|
}
|
||
|
else local rr `r'
|
||
|
if `newrow' & `c'==1 {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
if "`wrap'"!="" & `nrvblock'>1 {
|
||
|
local value
|
||
|
local space
|
||
|
while (1) {
|
||
|
local temp: piece `++wrap_i' `varwidth' of `"`macval(varl)'"', nobreak
|
||
|
if `"`macval(temp)'"'=="" continue, break
|
||
|
local value `"`macval(value)'`space'`macval(temp)'"'
|
||
|
if `wrap_i'<`nrvblock' continue, break
|
||
|
local space " "
|
||
|
}
|
||
|
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
|
||
|
local value `"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
|
||
|
}
|
||
|
else local value "_skip(`varwidth')"
|
||
|
file write `file' `macval(end)' _n `macval(begin)' `value'
|
||
|
if `haslabcol2' {
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' ("")
|
||
|
}
|
||
|
if "`smcltags'"!="" file write `file' "{res}"
|
||
|
}
|
||
|
local v: subinstr local v "&" " ", all
|
||
|
local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth'
|
||
|
if `modelwidthj'>0 local fmt_m "%`modelwidthj's"
|
||
|
else local fmt_m
|
||
|
local thevalue
|
||
|
foreach vi of local v {
|
||
|
if index("`vi'",".")!=1 {
|
||
|
if `: list eqvar in `vi'_drop' local vi "..`vi'"
|
||
|
else {
|
||
|
local vipar: subinstr local `vi'_par "@modelwidth" "`modelwidthj'", all
|
||
|
}
|
||
|
}
|
||
|
if index("`vi'",".")==1 {
|
||
|
local value
|
||
|
}
|
||
|
else if `unstackskipcoef' {
|
||
|
local value `"``vi'_vacant'"'
|
||
|
}
|
||
|
else if `B'[`rr',`m'*`droppedpos']==1 & `droppedison' {
|
||
|
if `first'[1,`m'] {
|
||
|
local value `"`macval(dropped)'"'
|
||
|
mat `first'[1,`m']=0
|
||
|
}
|
||
|
else local value
|
||
|
}
|
||
|
else if "``vi'_'"=="ci" {
|
||
|
if `_`vi'_l'[`rr',`m']>=.y local value `"``vi'_vacant'"'
|
||
|
else {
|
||
|
local format: word `r' of `ci_fmt'
|
||
|
if "`format'"=="" {
|
||
|
local format: word `:word count ``vi'_fmt'' of ``vi'_fmt'
|
||
|
}
|
||
|
local value = `_`vi'_l'[`rr',`m']
|
||
|
local vipar: subinstr local `vi'_l_par "@modelwidth" "`modelwidthj'", all
|
||
|
vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' ///
|
||
|
`"`macval(msign)'"' `"`macval(vipar)'"'
|
||
|
local temp "`macval(value)'"
|
||
|
local value = `_`vi'_u'[`rr',`m']
|
||
|
local vipar: subinstr local `vi'_u_par "@modelwidth" "`modelwidthj'", all
|
||
|
vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' ///
|
||
|
`"`macval(msign)'"' `"`macval(vipar)'"'
|
||
|
local value `"`macval(temp)'`macval(value)'"'
|
||
|
}
|
||
|
}
|
||
|
else if `_`vi''[`rr',`m']>=.y local value `"``vi'_vacant'"'
|
||
|
//else if `_`vi''[`rr',`m']>=. local value .
|
||
|
else if "``vi'_'"=="_star" {
|
||
|
CellStars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] `"`macval(vipar)'"'
|
||
|
}
|
||
|
else if "``vi'_'"=="_sign" {
|
||
|
MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"'
|
||
|
}
|
||
|
else if "``vi'_'"=="_sigsign" {
|
||
|
MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"' ///
|
||
|
`"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m']
|
||
|
}
|
||
|
else {
|
||
|
local format: word `r' of ``vi'_fmt'
|
||
|
if "`format'"=="" {
|
||
|
local format: word `:word count ``vi'_fmt'' of ``vi'_fmt'
|
||
|
}
|
||
|
local value = `_`vi''[`rr',`m']
|
||
|
vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' ///
|
||
|
`"`macval(msign)'"' `"`macval(vipar)'"'
|
||
|
}
|
||
|
local thevalue `"`macval(thevalue)'`macval(value)'"'
|
||
|
if !`stardetachon' & `:word `c' of `starsrow''==1 {
|
||
|
if `modelwidthj'>0 | `starwidth'>0 local fmt_m "%`=`modelwidthj'+`starwidth''s"
|
||
|
local value
|
||
|
if index("`vi'",".")!=1 & `"``vi'_star'"'!="" {
|
||
|
if !`: list eqvar in stardrop' {
|
||
|
Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m']
|
||
|
}
|
||
|
}
|
||
|
if "`ferest()'"=="" {
|
||
|
local value: di `fmt_stw' `"`macval(value)'"'
|
||
|
}
|
||
|
local thevalue `"`macval(thevalue)'`macval(value)'"'
|
||
|
}
|
||
|
if "`ferest()'"!="" & index("`vi'","..")!=1 {
|
||
|
local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"'
|
||
|
}
|
||
|
}
|
||
|
file write `file' `macval(delimiter)' `fmt_m' (`"`macval(thevalue)'"')
|
||
|
if `stardetachon' & `:word `c' of `starsrow''==1 {
|
||
|
local thevalue
|
||
|
foreach vi of local v {
|
||
|
if index("`vi'",".")!=1 {
|
||
|
if `: list eqvar in `vi'_drop' local vi "..`vi'"
|
||
|
}
|
||
|
if index("`vi'",".")!=1 & `"``vi'_star'"'!="" {
|
||
|
if `: list eqvar in stardrop' local value
|
||
|
else {
|
||
|
Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m']
|
||
|
}
|
||
|
local thevalue `"`macval(thevalue)'`macval(value)'"'
|
||
|
}
|
||
|
if "`ferest()'"!="" & index("`vi'","..")!=1 {
|
||
|
local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"'
|
||
|
}
|
||
|
}
|
||
|
file write `file' `macval(stardetach)' `fmt_stw' (`"`macval(thevalue)'"')
|
||
|
}
|
||
|
}
|
||
|
local newrow 1
|
||
|
}
|
||
|
|
||
|
*End of table row
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
if `weqcnt'==`eqdim' & "`varlabelslast'"=="" ///
|
||
|
& !(`isref' & `"`refcatbelow'"'!="") local varlabelsend0
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`varlabelsreplace'"!="" {
|
||
|
if `"`macval(varlabelsend0)'"'!="" local tmpend
|
||
|
}
|
||
|
VarInList `"`var'"' "`unstack'" `"`eqvar'"' `"`eqr'"' ///
|
||
|
`"`macval(varlabelselist)'"'
|
||
|
if `"`macval(value)'"'!="" {
|
||
|
IsInString `"""' `"`value'"' // sets local strcount
|
||
|
if `strcount'==0 {
|
||
|
local value `"`"`macval(value)'"'"'
|
||
|
}
|
||
|
InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
if "`varlabelsreplace'"!="" local varlabelsend0
|
||
|
}
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' ///
|
||
|
`"`macval(value)'"'
|
||
|
* insert refcat() (if refcatbelow)
|
||
|
if `isref' & `"`refcatbelow'"'!="" {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
if `hasrtfbrdr' & `r'==`RI' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
if `weqcnt'==`eqdim' & "`varlabelslast'"=="" local varlabelsend0
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`varlabelsreplace'"!="" {
|
||
|
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
|
||
|
if `"`macval(varlabelsend0)'"'!="" local tmpend
|
||
|
}
|
||
|
if "`varlabelsnone'"=="" {
|
||
|
local value: word `isref' of `macval(refcatnames)'
|
||
|
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
|
||
|
}
|
||
|
else local value
|
||
|
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
gettoken labcol2chunk labcol2 : labcol2
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
if "`smcltags'"!="" file write `file' "{res}"
|
||
|
WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' ///
|
||
|
`"`macval(refcatrow)'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`starsrow'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'"
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"'
|
||
|
}
|
||
|
* end insert refcat()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Write indicator sets
|
||
|
forv i=1/`nindicate' {
|
||
|
if `hasrtfbrdr' & `i'==`nindicate' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
if `i'==`nindicate' & "`varlabelslast'"=="" local varlabelsend
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`varlabelsreplace'"!="" {
|
||
|
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
|
||
|
if `"`macval(varlabelsend)'"'!="" local tmpend
|
||
|
}
|
||
|
if "`varlabelsnone'"=="" {
|
||
|
Abbrev `varwidth' `"`macval(indicate`i'name)'"' "`abbrev'"
|
||
|
}
|
||
|
else local value
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
|
||
|
if `haslabcol2' {
|
||
|
gettoken labcol2chunk labcol2 : labcol2
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
if "`smcltags'"!="" file write `file' "{res}"
|
||
|
WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' ///
|
||
|
`"`macval(indicate`i'lbls)'"' `"`macval(delimiter)'"' ///
|
||
|
`"`macval(stardetach)'"' "`starsrow'" "`abbrev'" ///
|
||
|
"`modelwidth'" "`delwidth'" "`starwidth'"
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend)'"'
|
||
|
}
|
||
|
|
||
|
*Write prefoot
|
||
|
if `"`macval(prefoot)'"'!="" {
|
||
|
if index(`"`macval(prefoot)'"',`"""')==0 {
|
||
|
local prefoot `"`"`macval(prefoot)'"'"'
|
||
|
}
|
||
|
}
|
||
|
foreach line of local prefoot {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
|
||
|
file write `file' `"`macval(value)'"' _n
|
||
|
}
|
||
|
if ((`"`vblock'"'!="" & `R'>0) | `nindicate'>0) & "`smclmidrules'"!="" {
|
||
|
if `"`macval(statsarray)'"'!="" {
|
||
|
file write `file' `"`thesmclrule'"' _n
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Write foot of table (statistics)
|
||
|
InsertAtVariables `"`macval(statslabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local statslabelsbegin `"`macval(value)'"'
|
||
|
InsertAtVariables `"`macval(statslabelsend)'"' 2 "`ncols'" `macval(atvars2)'
|
||
|
local statslabelsend `"`macval(value)'"'
|
||
|
local statslabelsbegin0 `"`macval(statslabelsbegin)'"'
|
||
|
local S: list sizeof statsarray
|
||
|
local eqr "_"
|
||
|
if `hasrtfbrdr' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
forv r = 1/`S' {
|
||
|
if `r'==`S' & `hasrtfbrdr' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
|
||
|
local rtfbrdron 1
|
||
|
}
|
||
|
local stat: word `r' of `macval(statslabels)'
|
||
|
if `"`stat'"'=="" local stat: word `r' of `statsrowlbls'
|
||
|
if "`statslabelsnone'"!="" local stat
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
if `r'==1 & "`statslabelsfirst'"=="" local statslabelsbegin0
|
||
|
local tmpbegin `"`macval(begin)'"'
|
||
|
if "`statslabelsreplace'"!="" {
|
||
|
if `"`macval(statslabelsbegin0)'"'!="" local tmpbegin
|
||
|
}
|
||
|
Abbrev `varwidth' `"`macval(stat)'"' "`abbrev'"
|
||
|
WriteBegin `"`file'"' `"`macval(statslabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
|
||
|
`"`fmt_v' (`"`macval(statslabelsprefix)'`macval(value)'`macval(statslabelssuffix)'"')"'
|
||
|
if `r'==1 & "`statslabelsfirst'"=="" {
|
||
|
local statslabelsbegin0 `"`macval(statslabelsbegin)'"'
|
||
|
}
|
||
|
if `haslabcol2' {
|
||
|
gettoken labcol2chunk labcol2 : labcol2
|
||
|
Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'"
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"')
|
||
|
}
|
||
|
if "`smcltags'"!="" file write `file' "{res}"
|
||
|
local strow: word `r' of `statsarray'
|
||
|
local strowlay: word `r' of `macval(statslayout)'
|
||
|
local strowfmt: word `r' of `statsrowfmt'
|
||
|
local strowstar: word `r' of `statsrowstar'
|
||
|
local lastm
|
||
|
local lasteq
|
||
|
local c 0
|
||
|
local mpos 0
|
||
|
foreach m of local modelsrow {
|
||
|
local ++c
|
||
|
local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth'
|
||
|
if `modelwidthj'>0 local fmt_m "%`modelwidthj's"
|
||
|
else local fmt_m
|
||
|
if "`m'"=="." {
|
||
|
file write `file' `macval(delimiter)' `fmt_m' (`""')
|
||
|
continue
|
||
|
}
|
||
|
local value
|
||
|
local eq: word `:word `c' of `eqsrow'' of `eqs'
|
||
|
if "`m'"!="`lastm'" {
|
||
|
local stc 0
|
||
|
local hasmestats 0
|
||
|
}
|
||
|
if "`m'"!="`lastm'" | `"`eq'"'!="`lasteq'" local stc_eq 0
|
||
|
local usemestats 0
|
||
|
local ++stc_eq
|
||
|
local stcell: word `++stc' of `strow'
|
||
|
local stcelllay: word `stc' of `macval(strowlay)'
|
||
|
local stcellfmt: word `stc' of `strowfmt'
|
||
|
local stcellstar: word `stc' of `strowstar'
|
||
|
local cellhasstat 0
|
||
|
foreach stat of local stcell {
|
||
|
gettoken format stcellfmt: stcellfmt
|
||
|
local rr = rownumb(`St',`"`stat'"')
|
||
|
local value = `St'[`rr',`m']
|
||
|
if `value'==.y {
|
||
|
local value `"`return(m`m'_`stat')'"'
|
||
|
if `"`value'"'!="" {
|
||
|
local cellhasstat 1
|
||
|
local stcelllay: subinstr local stcelllay `"`statspchar'"' ///
|
||
|
`"`value'"'
|
||
|
}
|
||
|
}
|
||
|
else if `value'==.x {
|
||
|
local hasmestats 1
|
||
|
}
|
||
|
else if `value'<.x {
|
||
|
local cellhasstat 1
|
||
|
vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' ///
|
||
|
`"`macval(msign)'"'
|
||
|
local stcelllay: subinstr local stcelllay `"`statspchar'"' ///
|
||
|
`"`macval(value)'"'
|
||
|
}
|
||
|
}
|
||
|
if `cellhasstat'==0 & `hasmestats' {
|
||
|
local stcell: word `stc_eq' of `strow'
|
||
|
local stcelllay: word `stc_eq' of `macval(strowlay)'
|
||
|
local stcellfmt: word `stc_eq' of `strowfmt'
|
||
|
local stcellstar: word `stc_eq' of `strowstar'
|
||
|
local cellhasstat 0
|
||
|
foreach stat of local stcell {
|
||
|
gettoken format stcellfmt: stcellfmt
|
||
|
local rr = rownumb(`St',`"`eq':`stat'"')
|
||
|
if `rr'>=. local value .z
|
||
|
else local value = `St'[`rr',`m']
|
||
|
if `value'!=.z {
|
||
|
local cellhasstat 1
|
||
|
vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' ///
|
||
|
`"`macval(msign)'"'
|
||
|
local stcelllay: subinstr local stcelllay `"`statspchar'"' `"`macval(value)'"'
|
||
|
}
|
||
|
}
|
||
|
if `cellhasstat' local usemestats 1
|
||
|
}
|
||
|
if `cellhasstat'==0 local stcelllay
|
||
|
file write `file' `macval(delimiter)' `fmt_m' (`"`macval(stcelllay)'"')
|
||
|
if `:word `c' of `starsrow''==1 {
|
||
|
if "`stcellstar'"=="1" & `cellhasstat' {
|
||
|
if `usemestats' {
|
||
|
local rr=rownumb(`St',`"`eq':p"')
|
||
|
}
|
||
|
else {
|
||
|
local rr=rownumb(`St',"p")
|
||
|
}
|
||
|
Stars `"`macval(starlevels)'"' `St'[`rr',`m']
|
||
|
file write `file' `macval(stardetach)' `fmt_stw' (`"`macval(value)'"')
|
||
|
}
|
||
|
else {
|
||
|
file write `file' `macval(stardetach)' _skip(`starwidth')
|
||
|
}
|
||
|
}
|
||
|
local lastm "`m'"
|
||
|
local lasteq `"`eq'"'
|
||
|
}
|
||
|
if `r'==`S' & "`statslabelslast'"=="" local statslabelsend
|
||
|
local tmpend `"`macval(end)'"'
|
||
|
if "`statslabelsreplace'"!="" {
|
||
|
if `"`macval(statslabelsend)'"'!="" local tmpend
|
||
|
}
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(statslabelsend)'"'
|
||
|
if `hasrtfbrdr' & `rtfbrdron' {
|
||
|
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
|
||
|
local rtfbrdron 0
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Write postfoot
|
||
|
if "`smclrules'"!="" {
|
||
|
file write `file' `"`thesmclrule'"' _n
|
||
|
}
|
||
|
local discrete: list retok discrete
|
||
|
if `"`macval(postfoot)'"'!="" {
|
||
|
if index(`"`macval(postfoot)'"',`"""')==0 {
|
||
|
local postfoot `"`"`macval(postfoot)'"'"'
|
||
|
}
|
||
|
}
|
||
|
foreach line of local postfoot {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
|
||
|
file write `file' `"`macval(value)'"' _n
|
||
|
}
|
||
|
|
||
|
*Write legend (starlevels, marginals)
|
||
|
if "`legend'"!="" {
|
||
|
if `"`macval(discrete2)'"'!="" {
|
||
|
mat `D' = `D''*`D'
|
||
|
if `D'[1,1]!=0 {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
file write `file' `"`macval(discrete)'`macval(discrete2)'"' _n
|
||
|
}
|
||
|
}
|
||
|
if `"`macval(starlegend)'"'!="" {
|
||
|
if "`smcltags'"!="" file write `file' "{txt}"
|
||
|
file write `file' `"`macval(starlegend)'"' _n
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*Finish: copy tempfile to user file / type to screen
|
||
|
file close `file'
|
||
|
local S: word count `macval(substitute)'
|
||
|
if `"`topfile'"'!="" {
|
||
|
confirm file `"`topfile'"'
|
||
|
}
|
||
|
if `"`bottomfile'"'!="" {
|
||
|
confirm file `"`bottomfile'"'
|
||
|
}
|
||
|
if `"`using'"'!="" {
|
||
|
tempname file2
|
||
|
file open `file2' `using', write text `replace' `append'
|
||
|
}
|
||
|
if "`type'"!="" di as res ""
|
||
|
if `"`topfile'"'!="" {
|
||
|
file open `file' using `"`topfile'"', read text
|
||
|
file read `file' temp
|
||
|
while r(eof)==0 {
|
||
|
if `"`using'"'!="" {
|
||
|
file write `file2' `"`macval(temp)'"' _n
|
||
|
}
|
||
|
if "`type'"!="" {
|
||
|
if "`showtabs'"!="" {
|
||
|
local temp: subinstr local temp "`=char(9)'" "<T>", all
|
||
|
}
|
||
|
di `asis' `"`macval(temp)'"'
|
||
|
}
|
||
|
file read `file' temp
|
||
|
}
|
||
|
file close `file'
|
||
|
}
|
||
|
file open `file' using `"`tfile'"', read text
|
||
|
file read `file' temp
|
||
|
while r(eof)==0 {
|
||
|
forv s = 1(2)`S' {
|
||
|
local from: word `s' of `macval(substitute)'
|
||
|
local to: word `=`s'+1' of `macval(substitute)'
|
||
|
if `"`macval(from)'`macval(to)'"'!="" {
|
||
|
local temp: subinstr local temp `"`macval(from)'"' `"`macval(to)'"', all
|
||
|
}
|
||
|
}
|
||
|
if `"`using'"'!="" {
|
||
|
file write `file2' `"`macval(temp)'"' _n
|
||
|
}
|
||
|
if "`type'"!="" {
|
||
|
if "`showtabs'"!="" {
|
||
|
local temp: subinstr local temp "`=char(9)'" "<T>", all
|
||
|
}
|
||
|
di `asis' `"`macval(temp)'"'
|
||
|
}
|
||
|
file read `file' temp
|
||
|
}
|
||
|
file close `file'
|
||
|
if `"`bottomfile'"'!="" {
|
||
|
file open `file' using `"`bottomfile'"', read text
|
||
|
file read `file' temp
|
||
|
while r(eof)==0 {
|
||
|
if `"`using'"'!="" {
|
||
|
file write `file2' `"`macval(temp)'"' _n
|
||
|
}
|
||
|
if "`type'"!="" {
|
||
|
if "`showtabs'"!="" {
|
||
|
local temp: subinstr local temp "`=char(9)'" "<T>", all
|
||
|
}
|
||
|
di `asis' `"`macval(temp)'"'
|
||
|
}
|
||
|
file read `file' temp
|
||
|
}
|
||
|
file close `file'
|
||
|
}
|
||
|
if `"`using'"'!="" {
|
||
|
file close `file2'
|
||
|
gettoken junk using0 : using
|
||
|
return local fn `using0'
|
||
|
if "`outfilenoteoff'"=="" {
|
||
|
di as txt `"(output written to {browse `using0'})"'
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program MoreOptions
|
||
|
// estout has more options than -syntax- can handle; a subroutine is used
|
||
|
// here (rather than a second syntax call) to preserve the 'using' macro
|
||
|
// from the first syntax call
|
||
|
// MoreOptions is intended for options without arguments only
|
||
|
local theoptions ///
|
||
|
NOReplace Replace ///
|
||
|
NOAppend Append ///
|
||
|
NOTYpe TYpe ///
|
||
|
NOSHOWTABS showtabs ///
|
||
|
NOASIS asis ///
|
||
|
NOWRAP wrap ///
|
||
|
NOSMCLTags SMCLTags ///
|
||
|
NOSMCLRules SMCLRules ///
|
||
|
NOSMCLMIDRules SMCLMIDRules ///
|
||
|
NOSMCLEQRules SMCLEQRules ///
|
||
|
NOOUTFILENOTEOFF outfilenoteoff
|
||
|
syntax [, `theoptions' ]
|
||
|
foreach opt of local theoptions {
|
||
|
local opt = lower("`opt'")
|
||
|
c_local `opt' "``opt''"
|
||
|
}
|
||
|
c_local options
|
||
|
end
|
||
|
|
||
|
program ParseValueSubopts
|
||
|
syntax anything [ , mrow(string asis) NOTranspose Transpose ///
|
||
|
NOStar Star PVALue(string) Fmt(string) Label(string) Vacant(string) ///
|
||
|
NOPAR par PAR2(string asis) Keep(string asis) Drop(string asis) ///
|
||
|
PATtern(string) NOABS abs ]
|
||
|
local el: word 1 of `anything'
|
||
|
local elname: word 2 of `anything'
|
||
|
CheckPattern `"`pattern'"' "`elname'"
|
||
|
if `"`macval(par2)'"'!="" {
|
||
|
local par `"`macval(par2)'"'
|
||
|
}
|
||
|
else if "`par'"!="" {
|
||
|
if "`elname'"=="ci" local par "[ , ]"
|
||
|
else if "`elname'"=="ci_l" local par `"[ """'
|
||
|
else if "`elname'"=="ci_u" local par `""" ]"'
|
||
|
else local par "( )"
|
||
|
}
|
||
|
if `"`mrow'"'!="" {
|
||
|
capt confirm integer number `mrow'
|
||
|
if _rc==0 {
|
||
|
if `mrow'>=1 {
|
||
|
if `"`macval(label)'"'=="" {
|
||
|
local label "`elname'[`mrow']"
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local mrow `""`mrow'""'
|
||
|
if `"`macval(label)'"'=="" {
|
||
|
local label `mrow'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
gettoken trash : mrow, qed(qed)
|
||
|
if `qed'==0 {
|
||
|
local mrow `"`"`mrow'"'"'
|
||
|
}
|
||
|
if `"`macval(label)'"'=="" {
|
||
|
local label `mrow'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
foreach opt in transpose star par abs {
|
||
|
if "`no`opt''"!="" c_local no`el'_`opt' 1
|
||
|
else c_local `el'_`opt' "``opt''"
|
||
|
}
|
||
|
foreach opt in mrow pvalue fmt label vacant keep drop pattern {
|
||
|
c_local `el'_`opt' `"`macval(`opt')'"'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program CheckPattern
|
||
|
args pattern option
|
||
|
foreach p of local pattern {
|
||
|
if !( "`p'"=="1" | "`p'"=="0" ) {
|
||
|
di as error `""`pattern'" invalid in `option'(... pattern())"'
|
||
|
exit 198
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program ParseStatsSubopts
|
||
|
syntax [anything] [ , Fmt(string) Labels(string asis) ///
|
||
|
NOStar Star Star2(string) LAYout(string asis) PChar(string) ]
|
||
|
foreach opt in fmt labels layout pchar {
|
||
|
c_local stats`opt' `"`macval(`opt')'"'
|
||
|
}
|
||
|
if "`nostar'"!="" c_local nostatsstar 1
|
||
|
else if "`star2'"!="" {
|
||
|
local anything: list anything | star2
|
||
|
c_local statsstar "`star2'"
|
||
|
}
|
||
|
else if "`star'"!="" {
|
||
|
local star2: word 1 of `anything'
|
||
|
c_local statsstar "`star2'"
|
||
|
}
|
||
|
c_local stats "`anything'"
|
||
|
c_local stats2
|
||
|
end
|
||
|
|
||
|
prog ProcessStatslayout // returns statsarray, -rowlbls, -rowfmt, -rowstar, -colstar, -layout
|
||
|
args stats statsfmt statsstar statslayout statspchar
|
||
|
local format "%9.0g"
|
||
|
if `"`statspchar'"'=="" {
|
||
|
local statspchar "@"
|
||
|
c_local statspchar "@"
|
||
|
}
|
||
|
local statsarray
|
||
|
local statsrowlbls
|
||
|
local statsrowfmt
|
||
|
local statsrowstar
|
||
|
local space1
|
||
|
local i 0
|
||
|
local wmax 0
|
||
|
foreach row of local statslayout {
|
||
|
local statsrow
|
||
|
local statsrowlbl
|
||
|
local statsrfmt
|
||
|
local statsrstar
|
||
|
local space2
|
||
|
local w = 0
|
||
|
foreach cell of local row {
|
||
|
local ++w
|
||
|
local statscell
|
||
|
local statsclbl `"`cell'"'
|
||
|
local statscfmt
|
||
|
local statscstar 0
|
||
|
local space3
|
||
|
local trash: subinstr local cell `"`statspchar'"' "", all count(local cnt)
|
||
|
forv j=1/`cnt' {
|
||
|
local stat: word `++i' of `stats'
|
||
|
local statscell `"`statscell'`space3'`stat'"'
|
||
|
local statsclbl: subinstr local statsclbl `"`statspchar'"' "`stat'"
|
||
|
local tmp: word `i' of `statsfmt'
|
||
|
if `"`tmp'"'!="" local format `"`tmp'"'
|
||
|
local statscfmt `"`statscfmt'`space3'`format'"'
|
||
|
if `:list stat in statsstar' {
|
||
|
local statscstar 1
|
||
|
local statscol_`w' 1
|
||
|
}
|
||
|
local space3 " "
|
||
|
}
|
||
|
local statsrow `"`statsrow'`space2'"`statscell'""'
|
||
|
local statsrowlbl `"`statsrowlbl'`space2'`statsclbl'"'
|
||
|
local statsrfmt `"`statsrfmt'`space2'"`statscfmt'""'
|
||
|
local statsrstar "`statsrstar'`space2'`statscstar'"
|
||
|
local space2 " "
|
||
|
}
|
||
|
local statsarray `"`statsarray'`space1'`"`statsrow'"'"'
|
||
|
local statsrowlbls `"`statsrowlbls'`space1'`"`statsrowlbl'"'"'
|
||
|
local statsrowfmt `"`statsrowfmt'`space1'`"`statsrfmt'"'"'
|
||
|
local statsrowstar `"`statsrowstar'`space1'`"`statsrstar'"'"'
|
||
|
local space1 " "
|
||
|
local wmax = max(`w',`wmax')
|
||
|
}
|
||
|
while (1) {
|
||
|
local stat: word `++i' of `stats'
|
||
|
if `"`stat'"'=="" continue, break
|
||
|
local tmp: word `i' of `statsfmt'
|
||
|
if `"`tmp'"'!="" local format `"`tmp'"'
|
||
|
local statscstar: list stat in statsstar
|
||
|
if `statscstar' local statscol_1 1
|
||
|
local statsarray `"`statsarray'`space1'`"`stat'"'"'
|
||
|
local statsrowlbls `"`statsrowlbls'`space1'`"`stat'"'"'
|
||
|
local statsrowfmt `"`statsrowfmt'`space1'`"`format'"'"'
|
||
|
local statsrowstar `"`statsrowstar'`space1'`"`statscstar'"'"'
|
||
|
local statslayout `"`statslayout'`space1'`statspchar'"'
|
||
|
local space1 " "
|
||
|
local wmax = max(1,`wmax')
|
||
|
}
|
||
|
local statscolstar
|
||
|
local space
|
||
|
forv w = 1/`wmax' {
|
||
|
if "`statscol_`w''"=="" local statscol_`w' 0
|
||
|
local statscolstar "`statscolstar'`space'`statscol_`w''"
|
||
|
local space " "
|
||
|
}
|
||
|
c_local statsarray `"`statsarray'"'
|
||
|
c_local statsrowlbls `"`statsrowlbls'"'
|
||
|
c_local statsrowfmt `"`statsrowfmt'"'
|
||
|
c_local statsrowstar `"`statsrowstar'"'
|
||
|
c_local statscolstar `"`statscolstar'"'
|
||
|
c_local statslayout `"`statslayout'"'
|
||
|
end
|
||
|
|
||
|
program ParseLabelsSubopts
|
||
|
gettoken type 0: 0
|
||
|
local lblsubopts
|
||
|
syntax [anything] [ , NONUMbers NUMbers NOTItles TItles NODEPvars DEPvars ///
|
||
|
NONONE NONE NOSPAN span Prefix(string) Suffix(string) Begin(string asis) ///
|
||
|
End(string asis) NOReplace Replace BList(string asis) EList(string asis) ///
|
||
|
ERepeat(string) NOFirst First NOLast Last lhs(string) PATtern(string) ///
|
||
|
NOMerge Merge ]
|
||
|
CheckPattern `"`pattern'"' "`type'"
|
||
|
if "`merge'"!="" & "`nomerge'`macval(suffix)'"=="" local suffix ":"
|
||
|
foreach opt in begin end {
|
||
|
if `"`macval(`opt')'"'!="" {
|
||
|
if index(`"`macval(`opt')'"', `"""')==0 {
|
||
|
local `opt' `"`"`macval(`opt')'"'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
foreach opt in prefix suffix begin end blist elist erepeat lhs pattern {
|
||
|
c_local `type'`opt' `"`macval(`opt')'"'
|
||
|
}
|
||
|
foreach opt in numbers titles depvars span replace none first last merge {
|
||
|
if "`no`opt''"!="" c_local no`type'`opt' 1
|
||
|
else c_local `type'`opt' "``opt''"
|
||
|
}
|
||
|
c_local `type' `"`macval(anything)'"'
|
||
|
end
|
||
|
|
||
|
program ReadLine
|
||
|
args max file
|
||
|
local end 0
|
||
|
file read `file' temp1
|
||
|
local temp1: subinstr local temp1 "`=char(9)'" " ", all
|
||
|
while r(eof)==0 {
|
||
|
local j 1
|
||
|
local temp2
|
||
|
local temp3: piece `j++' `max' of `"`macval(temp1)'"'
|
||
|
if `"`temp3'"'=="" | index(`"`temp3'"',"*")==1 ///
|
||
|
| index(`"`temp3'"',"//")==1 {
|
||
|
file read `file' temp1
|
||
|
local temp1: subinstr local temp1 "`=char(9)'" " ", all
|
||
|
continue
|
||
|
}
|
||
|
while `"`temp3'"'!="" {
|
||
|
local comment=index(`"`macval(temp3)'"'," ///")
|
||
|
if `comment' {
|
||
|
local temp3=substr(`"`macval(temp3)'"',1,`comment')
|
||
|
local temp2 `"`macval(temp2)'`macval(temp3)'"'
|
||
|
local end 0
|
||
|
continue, break
|
||
|
}
|
||
|
local comment=index(`"`macval(temp3)'"'," //")
|
||
|
if `comment' {
|
||
|
local temp3=substr(`"`macval(temp3)'"',1,`comment')
|
||
|
local temp2 `"`macval(temp2)'`macval(temp3)'"'
|
||
|
local end 1
|
||
|
continue, break
|
||
|
}
|
||
|
local temp2 `"`macval(temp2)'`macval(temp3)'"'
|
||
|
local temp3: piece `j++' `max' of `"`macval(temp1)'"'
|
||
|
local end 1
|
||
|
}
|
||
|
if `end' {
|
||
|
local line `"`macval(line)'`macval(temp2)'"'
|
||
|
continue, break
|
||
|
}
|
||
|
else {
|
||
|
local line `"`macval(line)'`macval(temp2)'"'
|
||
|
file read `file' temp1
|
||
|
local temp1: subinstr local temp1 "`=char(9)'" " ", all
|
||
|
}
|
||
|
}
|
||
|
c_local line `"`macval(line)'"'
|
||
|
end
|
||
|
|
||
|
program CellsCheck
|
||
|
args cells
|
||
|
local ncols 0
|
||
|
local nrows 0
|
||
|
local cells: subinstr local cells "& " "&", all
|
||
|
local cells: subinstr local cells " &" "&", all
|
||
|
local cells: subinstr local cells `"&""' `"& ""', all
|
||
|
local cells: subinstr local cells `""&"' `"" &"', all
|
||
|
foreach row of local cells {
|
||
|
local newrow
|
||
|
foreach col of local row {
|
||
|
local vals: subinstr local col "&" " ", all
|
||
|
//local vals: list vals - values
|
||
|
local values: list values | vals
|
||
|
local vals: list retok vals
|
||
|
local vals: subinstr local vals " " "&", all
|
||
|
//local newrow: list newrow | vals
|
||
|
local newrow `"`newrow'`vals' "'
|
||
|
}
|
||
|
local newrow: list retok newrow
|
||
|
if "`newrow'"!="" {
|
||
|
local ncols = max(`ncols',`:list sizeof newrow')
|
||
|
local newcells `"`newcells'"`newrow'" "'
|
||
|
local ++nrows
|
||
|
}
|
||
|
}
|
||
|
local newcells: list retok newcells
|
||
|
c_local cells `"`newcells'"'
|
||
|
c_local ncols `ncols'
|
||
|
c_local nrows `nrows'
|
||
|
local dot "."
|
||
|
c_local values: list values - dot
|
||
|
end
|
||
|
|
||
|
program Star2Cells
|
||
|
args cells star
|
||
|
local newcells
|
||
|
foreach row of local cells {
|
||
|
local newrow
|
||
|
foreach col of local row {
|
||
|
if "`col'"=="`star'" {
|
||
|
local col "`col'star"
|
||
|
}
|
||
|
local newrow: list newrow | col
|
||
|
}
|
||
|
local newcells `"`newcells'"`newrow'" "'
|
||
|
}
|
||
|
local newcells: list retok newcells
|
||
|
c_local cells `"`newcells'"'
|
||
|
end
|
||
|
|
||
|
prog ParseStarlevels
|
||
|
syntax [anything(equalok)] [ , Label(str) Delimiter(str) ]
|
||
|
c_local starlevels `"`macval(anything)'"'
|
||
|
c_local starlevelslabel `"`macval(label)'"'
|
||
|
c_local starlevelsdelimiter `"`macval(delimiter)'"'
|
||
|
end
|
||
|
|
||
|
program CheckStarvals
|
||
|
args starlevels label del
|
||
|
if `"`macval(label)'"'=="" local label " p<"
|
||
|
if `"`macval(del)'"'=="" local del ", "
|
||
|
local nstar: word count `macval(starlevels)'
|
||
|
local nstar = `nstar'/2
|
||
|
capture confirm integer number `nstar'
|
||
|
if _rc {
|
||
|
di as error "unmatched list of significance symbols and levels"
|
||
|
exit 198
|
||
|
}
|
||
|
local istar 1
|
||
|
forv i = 1/`nstar' {
|
||
|
local iistar: word `=`i'*2' of `macval(starlevels)'
|
||
|
confirm number `iistar'
|
||
|
if `iistar'>`istar' | `iistar'<=0 {
|
||
|
di as error "significance levels out of order or out of range (0,1]"
|
||
|
exit 198
|
||
|
}
|
||
|
local istar `iistar'
|
||
|
local isym: word `=`i'*2-1' of `macval(starlevels)'
|
||
|
if `"`macval(legend)'"'!="" {
|
||
|
local legend `"`macval(legend)'`macval(del)'"'
|
||
|
}
|
||
|
local ilabel: subinstr local label "@" "`istar'", count(local hasat)
|
||
|
if `hasat'==0 {
|
||
|
local ilabel `"`macval(label)'`istar'"'
|
||
|
}
|
||
|
local legend `"`macval(legend)'`macval(isym)'`macval(ilabel)'"'
|
||
|
}
|
||
|
c_local starlegend `"`macval(legend)'"'
|
||
|
end
|
||
|
|
||
|
program Starwidth
|
||
|
args starlevels
|
||
|
local nstar: word count `macval(starlevels)'
|
||
|
forv i = 2(2)`nstar' {
|
||
|
local istar: word `=`i'-1' of `macval(starlevels)'
|
||
|
local width = max(length("`width'"),length(`"`macval(istar)'"'))
|
||
|
}
|
||
|
c_local value `width'
|
||
|
end
|
||
|
|
||
|
// Loosely based on Mkemat from est_table.ado, but with heavy modifications
|
||
|
program _estout_getres, rclass
|
||
|
syntax, names(str) [ coefs(str asis) stats(str asis) equations(str) ///
|
||
|
rename(str asis) margin(str asis) meqs(str asis) ///
|
||
|
dropped(int 0) level(int 95) ///
|
||
|
transform(str asis) transformpattern(str asis) ]
|
||
|
// coefs: coef "coef O/1 #" `"coef O/1 "rowname""' etc...
|
||
|
|
||
|
tempname bc bbc bs bbs st
|
||
|
|
||
|
local nnames : word count `names'
|
||
|
local rename : subinstr local rename "," "", all
|
||
|
if `"`stats'"' != "" {
|
||
|
local stats : subinstr local stats "," "", all
|
||
|
confirm names `stats'
|
||
|
local stats : list uniq stats
|
||
|
local nstat : list sizeof stats
|
||
|
mat `bbs' = J(`nstat', `nnames', .z)
|
||
|
mat colnames `bbs' = `: subinstr local names "." "active", all word'
|
||
|
mat rownames `bbs' = `stats'
|
||
|
}
|
||
|
|
||
|
if "`equations'" != "" {
|
||
|
MatchNames "`equations'"
|
||
|
local eqspec `r(eqspec)'
|
||
|
local eqnames `r(eqnames)'
|
||
|
}
|
||
|
|
||
|
local ncoefs 0
|
||
|
foreach coefn of local coefs {
|
||
|
local ++ncoefs
|
||
|
gettoken coef : coefn
|
||
|
local coefnms `"`coefnms' `coef'"' // use more informative label? (coefn => error in Stata 8 and 10)
|
||
|
}
|
||
|
local bVs "b se var t z p ci_l ci_u _star _sign _sigsign"
|
||
|
local hasbVs = `"`: list coefnms & bVs'"'!=""
|
||
|
local hastransform = (`"`transform'"'!="") & `hasbVs'
|
||
|
local getbV = cond(`hasbVs' | `dropped', "b var ", "")
|
||
|
|
||
|
tempname hcurrent esample
|
||
|
local estcycle = ("`names'"!=".")
|
||
|
if `estcycle' {
|
||
|
_est hold `hcurrent', restore nullok estsystem
|
||
|
}
|
||
|
|
||
|
local ni 0
|
||
|
local hasbbc 0
|
||
|
local ccols = `ncoefs' + ("`margin'"!="") + `dropped'
|
||
|
foreach name of local names {
|
||
|
local ++ni
|
||
|
local hasbc 0
|
||
|
local hasmargin 0
|
||
|
nobreak {
|
||
|
if "`name'" != "." {
|
||
|
local eqname `name'
|
||
|
*est_unhold `name' `esample' // (why preserve missings in esample?)
|
||
|
capt confirm new var _est_`name' // fix e(sample) if obs have been added
|
||
|
if _rc qui replace _est_`name' = 0 if _est_`name' >=.
|
||
|
_est unhold `name'
|
||
|
}
|
||
|
else {
|
||
|
local eqname active
|
||
|
if `estcycle' {
|
||
|
_est unhold `hcurrent'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// get coefficients
|
||
|
capture noisily break {
|
||
|
CheckEqs `"`getbV'`coefs'"' // sets local seqmerge
|
||
|
GetCoefs `bc' `seqmerge' `"`getbV'`coefs'"' // sets local hasbc
|
||
|
if `hasbc' {
|
||
|
mat coln `bc' = `getbV'`coefnms'
|
||
|
}
|
||
|
}
|
||
|
local rc = _rc
|
||
|
|
||
|
// set equation names and get marginal effects
|
||
|
if `hasbc' & `rc'==0 {
|
||
|
capture noisily break {
|
||
|
if `dropped' {
|
||
|
DroppedCoefs `bc'
|
||
|
}
|
||
|
if "`equations'"!="" {
|
||
|
AdjustRowEq `bc' `ni' `nnames' "`eqspec'" "`eqnames'"
|
||
|
}
|
||
|
if "`margin'"!="" & `hasbVs' {
|
||
|
GetMarginals `bc' "`margin'" `"`meqs'"' // resets local hasmargin
|
||
|
}
|
||
|
if `hasbVs' {
|
||
|
ComputeCoefs `bc' `hasmargin' `"`coefnms'"' `level'
|
||
|
}
|
||
|
if `hastransform' & `hasbVs' {
|
||
|
if `"`transformpattern'"'!="" {
|
||
|
local transformthis: word `ni' of `transformpattern'
|
||
|
}
|
||
|
else local transformthis 1
|
||
|
if `"`transformthis'"'=="1" {
|
||
|
TransformCoefs `bc' `"`coefnms'"' `"`transform'"'
|
||
|
}
|
||
|
}
|
||
|
if "`getbV'"!="" {
|
||
|
mat `bc' = `bc'[1...,3...] // remove b and var
|
||
|
}
|
||
|
}
|
||
|
local rc = _rc
|
||
|
}
|
||
|
|
||
|
// get stats
|
||
|
if `rc'==0 {
|
||
|
capture noisily break {
|
||
|
if "`stats'" != "" {
|
||
|
GetStats "`stats'" `bbs' `ni'
|
||
|
if `hasbc'>0 & inlist(`"`e(cmd)'"', "reg3", "sureg", "mvreg") {
|
||
|
GetEQStats "`stats'" `bbs' `ni' `bc'
|
||
|
}
|
||
|
return add
|
||
|
}
|
||
|
}
|
||
|
local rc = _rc
|
||
|
}
|
||
|
|
||
|
local depname: word 1 of `e(depvar)'
|
||
|
return local m`ni'_depname "`depname'"
|
||
|
|
||
|
local title `"`e(estimates_title)'"'
|
||
|
if `"`title'"'=="" local title `"`e(_estimates_title)'"' // prior to Stata 10
|
||
|
return local m`ni'_estimates_title `"`title'"'
|
||
|
|
||
|
if "`name'" != "." {
|
||
|
*est_hold `name' `esample'
|
||
|
_est hold `name', estimates varname(_est_`name')
|
||
|
}
|
||
|
else {
|
||
|
if `estcycle' {
|
||
|
_est hold `hcurrent', restore nullok estsystem
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if `rc' {
|
||
|
exit `rc'
|
||
|
}
|
||
|
|
||
|
if `hasbc'>0 {
|
||
|
mat coleq `bc' = `eqname'
|
||
|
if `"`rename'"'!="" {
|
||
|
RenameCoefs `bc' `"`rename'"'
|
||
|
}
|
||
|
if `hasbbc' {
|
||
|
mat_capp `bbc' : `bbc' `bc', miss(.z) cons ts
|
||
|
}
|
||
|
else {
|
||
|
mat `bbc' = `bc'
|
||
|
if `ni'>1 { // add previous empty models
|
||
|
mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z))
|
||
|
mat `bc' = `bc'[2...,2...]
|
||
|
forv nj = 1/`ni' {
|
||
|
if `nj'==`ni' continue
|
||
|
local eqname: word `nj' of `names'
|
||
|
if `"`eqname'"'=="." {
|
||
|
local eqname active
|
||
|
}
|
||
|
mat coleq `bc' = `eqname'
|
||
|
mat `bbc' = `bc', `bbc'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
local hasbbc 1
|
||
|
}
|
||
|
else {
|
||
|
if `hasbbc' { // add empty model if bbc exists
|
||
|
mat `bc' = `bbc'[1...,1..`ccols']
|
||
|
mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z))
|
||
|
mat `bc' = `bc'[2...,2...]
|
||
|
mat coleq `bc' = `eqname'
|
||
|
mat `bbc' = `bbc', `bc'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if `hasbbc' {
|
||
|
return matrix coefs = `bbc'
|
||
|
return scalar ccols = `ccols'
|
||
|
}
|
||
|
else {
|
||
|
return scalar ccols = 0 // indicates that r(coefs) is missing
|
||
|
}
|
||
|
if "`stats'" != "" {
|
||
|
return matrix stats = `bbs'
|
||
|
}
|
||
|
return local names `names'
|
||
|
return scalar nmodels = `ni'
|
||
|
end
|
||
|
|
||
|
program DroppedCoefs // identify dropped coeffficients
|
||
|
args bc
|
||
|
tempname tmp
|
||
|
mat `tmp' = `bc'[1..., 1] * 0
|
||
|
mat coln `tmp' = "_dropped"
|
||
|
local r = rowsof(`bc')
|
||
|
forv i = 1/`r' {
|
||
|
if `bc'[`i',1]==0 & `bc'[`i',2]==0 { // b=0 and var=0
|
||
|
mat `tmp'[`i',1] = 1
|
||
|
}
|
||
|
}
|
||
|
mat `bc' = `bc', `tmp'
|
||
|
end
|
||
|
|
||
|
program RenameCoefs
|
||
|
args bc rename
|
||
|
local Stata11 = cond(c(stata_version)>=11, "version 11:", "")
|
||
|
tempname tmp
|
||
|
local eqs: roweq `bc', q
|
||
|
local eqs: list clean eqs
|
||
|
local eqs: list uniq eqs
|
||
|
local newnames
|
||
|
foreach eq of local eqs {
|
||
|
mat `tmp' = `bc'[`"`eq':"',1]
|
||
|
QuotedRowNames `tmp'
|
||
|
local vars `"`value'"'
|
||
|
gettoken from rest : rename
|
||
|
gettoken to rest : rest
|
||
|
while (`"`from'`to'"'!="") {
|
||
|
if index(`"`to'"',":") | `"`to'"'=="" {
|
||
|
di as err "invalid rename()"
|
||
|
exit 198
|
||
|
}
|
||
|
local hasfrom = rownumb(`tmp', `"`from'"')
|
||
|
if `hasfrom'<. {
|
||
|
local hasto = rownumb(`tmp', `"`to'"')
|
||
|
if `hasto'<. {
|
||
|
di as err `"`to' already exists in equation; cannot rename"'
|
||
|
exit 110
|
||
|
}
|
||
|
local colonpos = index(`"`from'"',":")
|
||
|
if index(`"`from'"',":") { // remove equation
|
||
|
gettoken chunk from : from, parse(":") // eq
|
||
|
gettoken chunk from : from, parse(":") // :
|
||
|
gettoken from : from
|
||
|
if `"`from'"'=="" {
|
||
|
di as err "invalid rename()"
|
||
|
exit 190
|
||
|
}
|
||
|
}
|
||
|
local vars: subinstr local vars `"`from'"' `"`"`to'"'"', word
|
||
|
`Stata11' mat rown `tmp' = `vars'
|
||
|
}
|
||
|
gettoken from rest : rest
|
||
|
gettoken to rest : rest
|
||
|
}
|
||
|
local newnames `"`newnames'`vars' "'
|
||
|
}
|
||
|
`Stata11' mat rown `bc' = `newnames'
|
||
|
end
|
||
|
|
||
|
// Source: est_table.ado version 1.1.4 09oct2008 (unmodified)
|
||
|
program MatchNames, rclass
|
||
|
args eqspec
|
||
|
|
||
|
local eqspec : subinstr local eqspec ":" " ", all
|
||
|
local eqspec0 : subinstr local eqspec "#" "" , all
|
||
|
|
||
|
local iterm 0
|
||
|
gettoken term eqspec : eqspec0 , parse(",")
|
||
|
while "`term'" != "" {
|
||
|
local ++iterm
|
||
|
|
||
|
// term = [name =] { # | #-list }
|
||
|
gettoken eqname oprest: term, parse("=")
|
||
|
gettoken op rest : oprest, parse("=")
|
||
|
if trim(`"`op'"') == "=" {
|
||
|
confirm name `eqname'
|
||
|
local term `rest'
|
||
|
}
|
||
|
else {
|
||
|
local eqname #`iterm'
|
||
|
}
|
||
|
local eqnames `eqnames' `eqname'
|
||
|
|
||
|
if "`eqspec'" == "" {
|
||
|
continue, break
|
||
|
}
|
||
|
gettoken term eqspec: eqspec , parse(",")
|
||
|
assert "`term'" == ","
|
||
|
gettoken term eqspec: eqspec , parse(",")
|
||
|
}
|
||
|
|
||
|
if `"`:list dups eqnames'"' != "" {
|
||
|
dis as err "duplicate matched equation names"
|
||
|
exit 198
|
||
|
}
|
||
|
|
||
|
return local eqspec `eqspec0'
|
||
|
return local eqnames `eqnames'
|
||
|
end
|
||
|
|
||
|
// Source: est_table.ado version 1.1.4 09oct2008 (unmodified)
|
||
|
program AdjustRowEq
|
||
|
args b ni nmodel eqspec eqnames
|
||
|
|
||
|
local beqn : roweq `b', quote
|
||
|
local beqn : list clean beqn
|
||
|
local beq : list uniq beqn
|
||
|
|
||
|
if `"`:list beq & eqnames'"' != "" {
|
||
|
dis as err "option equations() invalid"
|
||
|
dis as err "specified equation name already occurs in model `ni'"
|
||
|
exit 198
|
||
|
}
|
||
|
|
||
|
local iterm 0
|
||
|
gettoken term eqspec : eqspec , parse(",")
|
||
|
while "`term'" != "" {
|
||
|
// dis as txt "term:|`term'|"
|
||
|
local ++iterm
|
||
|
|
||
|
// term = [name =] { # | #-list }
|
||
|
gettoken eqname oprest: term, parse("=")
|
||
|
gettoken op rest : oprest, parse("=")
|
||
|
if trim(`"`op'"') == "=" {
|
||
|
local term `rest'
|
||
|
}
|
||
|
else {
|
||
|
local eqname #`iterm'
|
||
|
}
|
||
|
|
||
|
local nword : list sizeof term
|
||
|
if !inlist(`nword', 1, `nmodel') {
|
||
|
dis as err "option equations() invalid"
|
||
|
dis as err "a term should consist of either 1 or `nmodel' equation numbers"
|
||
|
exit 198
|
||
|
}
|
||
|
if `nword' > 1 {
|
||
|
local term : word `ni' of `term'
|
||
|
}
|
||
|
|
||
|
if trim("`term'") != "." {
|
||
|
capt confirm integer number `term'
|
||
|
if _rc {
|
||
|
dis as err "option equations() invalid"
|
||
|
dis as err "`term' was found, while an integer equation number was expected"
|
||
|
exit 198
|
||
|
}
|
||
|
if !inrange(`term',1,`:list sizeof beq') {
|
||
|
dis as err "option equations() invalid"
|
||
|
dis as err "equation number `term' for model `ni' out of range"
|
||
|
exit 198
|
||
|
}
|
||
|
if `:list posof "`eqname'" in beq' != 0 {
|
||
|
dis as err "impossible to name equation `eqname'"
|
||
|
dis as err "you should provide (another) equation name"
|
||
|
exit 198
|
||
|
}
|
||
|
|
||
|
local beqn : subinstr local beqn ///
|
||
|
`"`:word `term' of `beq''"' ///
|
||
|
"`eqname'" , word all
|
||
|
}
|
||
|
|
||
|
if "`eqspec'" == "" {
|
||
|
continue, break
|
||
|
}
|
||
|
gettoken term eqspec: eqspec , parse(",")
|
||
|
assert "`term'" == ","
|
||
|
gettoken term eqspec: eqspec , parse(",")
|
||
|
}
|
||
|
matrix roweq `b' = `beqn'
|
||
|
end
|
||
|
|
||
|
// Source: est_table.ado version 1.1.4 09oct2008 (modified)
|
||
|
// Modification: returns string scalars in r(m`ni'_name) (and sets `bbs' = .y)
|
||
|
program GetStats, rclass
|
||
|
args stats bbs ni
|
||
|
tempname rank st V
|
||
|
local escalars : e(scalars)
|
||
|
local emacros : e(macros)
|
||
|
local is 0
|
||
|
foreach stat of local stats {
|
||
|
local ++is
|
||
|
if inlist("`stat'", "aic", "bic", "rank") {
|
||
|
if "`hasrank'" == "" {
|
||
|
capt mat `V' = syminv(e(V))
|
||
|
local rc = _rc
|
||
|
if `rc' == 0 {
|
||
|
scalar `rank' = colsof(`V') - diag0cnt(`V')
|
||
|
}
|
||
|
else if `rc' == 111 {
|
||
|
scalar `rank' = 0
|
||
|
}
|
||
|
else {
|
||
|
// rc<>0; show error message
|
||
|
mat `V' = syminv(e(V))
|
||
|
}
|
||
|
local hasrank 1
|
||
|
}
|
||
|
if "`stat'" == "aic" {
|
||
|
scalar `st' = -2*e(ll) + 2*`rank'
|
||
|
}
|
||
|
else if "`stat'" == "bic" {
|
||
|
scalar `st' = -2*e(ll) + log(e(N)) * `rank'
|
||
|
}
|
||
|
else if "`stat'" == "rank" {
|
||
|
scalar `st' = `rank'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if `:list stat in escalars' > 0 {
|
||
|
scalar `st' = e(`stat')
|
||
|
}
|
||
|
else if "`stat'"=="p" {
|
||
|
if e(F)<. {
|
||
|
scalar `st' = Ftail(e(df_m), e(df_r), e(F))
|
||
|
}
|
||
|
else if e(chi2)<. {
|
||
|
scalar `st' = chi2tail(e(df_m), e(chi2))
|
||
|
}
|
||
|
}
|
||
|
else if `:list stat in emacros' > 0 {
|
||
|
scalar `st' = .y
|
||
|
capt return local m`ni'_`stat' `"`e(`stat')'"' // name might be too long
|
||
|
}
|
||
|
else {
|
||
|
scalar `st' = .z
|
||
|
}
|
||
|
}
|
||
|
mat `bbs'[`is',`ni'] = `st'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program GetEQStats, rclass // eq-specific stats for reg3, sureg, and mvreg (sets `bbs' = .x)
|
||
|
args stats bbs ni bc
|
||
|
return add
|
||
|
tempname addrow
|
||
|
local ic "aic bic rank"
|
||
|
local eqs: roweq `bc', q
|
||
|
local eqs: list clean eqs
|
||
|
local eqs: list uniq eqs
|
||
|
local s 0
|
||
|
foreach stat of local stats {
|
||
|
local ++s
|
||
|
if inlist(`"`stat'"', "aic", "bic", "rank") continue
|
||
|
if `bbs'[`s',`ni']<.y continue
|
||
|
local e 0
|
||
|
local found 0
|
||
|
foreach eq of local eqs {
|
||
|
local ++e
|
||
|
if e(cmd)=="mvreg" {
|
||
|
if "`stat'"=="p" local value: word `e' of `e(p_F)'
|
||
|
else local value: word `e' of `e(`stat')'
|
||
|
}
|
||
|
else if "`stat'"=="df_m" {
|
||
|
local value `"`e(`stat'`e')'"'
|
||
|
}
|
||
|
else {
|
||
|
local value `"`e(`stat'_`e')'"'
|
||
|
}
|
||
|
capture confirm number `value'
|
||
|
if _rc==0 {
|
||
|
local found 1
|
||
|
local r = rownumb(`bbs', `"`eq':`stat'"')
|
||
|
if `r'>=. {
|
||
|
mat `addrow' = J(1, colsof(`bbs'), .z)
|
||
|
mat rown `addrow' = `"`eq':`stat'"'
|
||
|
mat `bbs' = `bbs' \ `addrow'
|
||
|
local r = rownumb(`bbs', `"`eq':`stat'"')
|
||
|
}
|
||
|
mat `bbs'[`r',`ni'] = `value'
|
||
|
}
|
||
|
}
|
||
|
if `found' {
|
||
|
if `bbs'[`s',`ni']==.y {
|
||
|
capt return local m`ni'_`stat' ""
|
||
|
}
|
||
|
mat `bbs'[`s',`ni'] = .x
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program CheckEqs
|
||
|
args coefs
|
||
|
tempname tmp
|
||
|
local j 0
|
||
|
local bVs "b _star _sign _sigsign"
|
||
|
local seqmerge 0
|
||
|
local hasseqs 0
|
||
|
foreach coefn in `coefs' {
|
||
|
local ++j
|
||
|
gettoken coef row : coefn
|
||
|
gettoken transpose row : row
|
||
|
gettoken row : row, q
|
||
|
if `"`coef'"'=="b" & `j'==1 {
|
||
|
capt confirm mat e(`coef')
|
||
|
if _rc continue
|
||
|
mat `tmp' = e(`coef')
|
||
|
local eqs: coleq `tmp', q
|
||
|
if `:list posof "_" in eqs'==0 {
|
||
|
local seqmerge 1
|
||
|
}
|
||
|
else continue, break
|
||
|
}
|
||
|
if `:list coef in bVs' continue
|
||
|
capt confirm mat e(`coef')
|
||
|
if _rc continue
|
||
|
mat `tmp' = e(`coef')
|
||
|
if `transpose' {
|
||
|
mat `tmp' = `tmp''
|
||
|
}
|
||
|
if `"`row'"'=="" local row 1
|
||
|
capt confirm number `row'
|
||
|
if _rc {
|
||
|
local row = rownumb(`tmp',`row')
|
||
|
}
|
||
|
if `row'>rowsof(`tmp') continue
|
||
|
local eqs: coleq `tmp', q
|
||
|
if `:list posof "_" in eqs' {
|
||
|
local eqs: list uniq eqs
|
||
|
local eqs: list clean eqs
|
||
|
if `"`eqs'"'!="_" { // => contains "_" but also others
|
||
|
local local seqmerge 0
|
||
|
continue, break
|
||
|
}
|
||
|
else local hasseqs 1
|
||
|
}
|
||
|
else {
|
||
|
local seqmerge 1
|
||
|
}
|
||
|
}
|
||
|
if `hasseqs'==0 local seqmerge 0
|
||
|
c_local seqmerge `seqmerge'
|
||
|
end
|
||
|
|
||
|
program GetCoefs
|
||
|
args bc seqmerge coefs
|
||
|
tempname tmp
|
||
|
local hasbc 0
|
||
|
local j 0
|
||
|
local bVs "b _star _sign _sigsign"
|
||
|
foreach coefn of local coefs {
|
||
|
local ++j
|
||
|
gettoken coef row : coefn
|
||
|
gettoken transpose row : row
|
||
|
gettoken row : row, q
|
||
|
local isinbVs: list coef in bVs
|
||
|
if `isinbVs' & `j'>2 {
|
||
|
if `hasbc'==0 continue
|
||
|
mat `bc' = `bc', J(rowsof(`bc'),1, .y)
|
||
|
continue
|
||
|
}
|
||
|
if `j'==2 & `"`coef'"'=="var" {
|
||
|
local isinbVs 1
|
||
|
capt mat `tmp' = vecdiag(e(V))
|
||
|
if _rc {
|
||
|
capt confirm mat e(se)
|
||
|
if _rc==0 {
|
||
|
mat `tmp' = e(se)
|
||
|
forv i = 1/`=colsof(`tmp')' {
|
||
|
mat `tmp'[1, `i'] = `tmp'[1, `i']^2
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
capt confirm mat e(`coef')
|
||
|
if _rc==0 {
|
||
|
mat `tmp' = e(`coef')
|
||
|
}
|
||
|
}
|
||
|
if _rc {
|
||
|
if `hasbc'==0 continue
|
||
|
mat `bc' = `bc', J(rowsof(`bc'),1, .y)
|
||
|
continue
|
||
|
}
|
||
|
if `isinbVs'==0 { // => not b or var
|
||
|
if `transpose' {
|
||
|
mat `tmp' = `tmp''
|
||
|
}
|
||
|
if `"`row'"'=="" local row 1
|
||
|
capt confirm number `row'
|
||
|
if _rc {
|
||
|
local row = rownumb(`tmp',`row')
|
||
|
}
|
||
|
if `row'>rowsof(`tmp') {
|
||
|
if `hasbc'==0 continue
|
||
|
mat `bc' = `bc', J(rowsof(`bc'),1, .y)
|
||
|
continue
|
||
|
}
|
||
|
mat `tmp' = `tmp'[`row', 1...]
|
||
|
}
|
||
|
local bcols = colsof(`tmp')
|
||
|
if `bcols'==0 {
|
||
|
if `hasbc'==0 continue
|
||
|
mat `bc' = `bc', J(rowsof(`bc'),1, .y)
|
||
|
continue
|
||
|
}
|
||
|
mat `tmp' = `tmp''
|
||
|
if `seqmerge' & `isinbVs'==0 {
|
||
|
local eqs: roweq `tmp', q
|
||
|
local eqs: list uniq eqs
|
||
|
local eqs: list clean eqs
|
||
|
if `"`eqs'"'=="_" {
|
||
|
local seqmergejs `seqmergejs' `j'
|
||
|
local seqmergecoefs `"`seqmergecoefs'`"`coefn'"' "'
|
||
|
if `hasbc'==0 continue
|
||
|
mat `bc' = `bc', J(rowsof(`bc'),1, .y)
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
if `hasbc'==0 {
|
||
|
mat `bc' = `tmp'
|
||
|
local hasbc 1
|
||
|
if `j'>1 {
|
||
|
mat `bc' = `bc', J(`bcols',`j'-1, .y), `bc'
|
||
|
mat `bc' = `bc'[1...,2...]
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
mat_capp `bc' : `bc' `tmp', miss(.y) cons ts
|
||
|
}
|
||
|
}
|
||
|
foreach coefn of local seqmergecoefs {
|
||
|
gettoken j seqmergejs : seqmergejs
|
||
|
gettoken coef row : coefn
|
||
|
gettoken transpose row : row
|
||
|
gettoken row : row, q
|
||
|
mat `tmp' = e(`coef')
|
||
|
if `transpose' {
|
||
|
mat `tmp' = `tmp''
|
||
|
}
|
||
|
if `"`row'"'=="" local row 1
|
||
|
capt confirm number `row'
|
||
|
if _rc {
|
||
|
local row = rownumb(`tmp',`row')
|
||
|
}
|
||
|
mat `tmp' = `tmp'[`row', 1...]
|
||
|
SEQMerge `bc' `j' `tmp'
|
||
|
}
|
||
|
c_local hasbc `hasbc'
|
||
|
end
|
||
|
|
||
|
program SEQMerge
|
||
|
args bc j x
|
||
|
tempname tmp
|
||
|
local r = rowsof(`bc')
|
||
|
forv i = 1/`r' {
|
||
|
mat `tmp' = `bc'[`i',1...]
|
||
|
local v: rown `tmp'
|
||
|
local c = colnumb(`x', `"`v'"')
|
||
|
if `c'<. {
|
||
|
mat `bc'[`i',`j'] = `x'[1,`c']
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs
|
||
|
args bc hasmargin coefs level
|
||
|
local bVs1 "b _star _sign _sigsign"
|
||
|
local bVs2 "se var t z p ci_l ci_u"
|
||
|
local c = colsof(`bc')
|
||
|
forv j = 3/`c' {
|
||
|
gettoken v coefs : coefs
|
||
|
if `"`v'"'=="" continue, break
|
||
|
if `: list v in bVs1' {
|
||
|
ComputeCoefs_`v' `bc' `j' `level'
|
||
|
continue
|
||
|
}
|
||
|
if `: list v in bVs2' {
|
||
|
if `hasmargin' {
|
||
|
ComputeCoefs_`v' `bc' `j' `level'
|
||
|
continue
|
||
|
}
|
||
|
capt confirm matrix e(`v')
|
||
|
if _rc {
|
||
|
ComputeCoefs_`v' `bc' `j' `level'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program CopyColFromTo
|
||
|
args m from to cname
|
||
|
tempname tmp
|
||
|
mat `tmp' = `m'[1...,`from']
|
||
|
mat coln `tmp' = `cname'
|
||
|
local c = colsof(`m')
|
||
|
if `to'==`c' {
|
||
|
mat `m' = `m'[1...,1..`c'-1], `tmp'
|
||
|
exit
|
||
|
}
|
||
|
mat `m' = `m'[1...,1..`to'-1], `tmp', `m'[1...,`to'+1..`c']
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_b
|
||
|
args bc j
|
||
|
CopyColFromTo `bc' 1 `j' "b"
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_se
|
||
|
args bc j
|
||
|
local r = rowsof(`bc')
|
||
|
forv i = 1/`r' {
|
||
|
local var `bc'[`i',2]
|
||
|
local res `bc'[`i',`j']
|
||
|
if `var'>=. mat `res' = `var'
|
||
|
else if `var'==0 mat `res' = .
|
||
|
else mat `res' = sqrt(`var')
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_var
|
||
|
args bc j
|
||
|
CopyColFromTo `bc' 2 `j' "var"
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_t
|
||
|
args bc j
|
||
|
local r = rowsof(`bc')
|
||
|
forv i = 1/`r' {
|
||
|
local b `bc'[`i',1]
|
||
|
local var `bc'[`i',2]
|
||
|
local res `bc'[`i',`j']
|
||
|
if `b'>=. mat `res' = `b'
|
||
|
else if `var'>=. mat `res' = `var'
|
||
|
else mat `res' = `b'/sqrt(`var')
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_z
|
||
|
ComputeCoefs_t `0'
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_p
|
||
|
args bc j
|
||
|
local r = rowsof(`bc')
|
||
|
local df_r = e(df_r)
|
||
|
forv i = 1/`r' {
|
||
|
local b `bc'[`i',1]
|
||
|
local var `bc'[`i',2]
|
||
|
local res `bc'[`i',`j']
|
||
|
if `b'>=. mat `res' = `b'
|
||
|
else if `var'>=. mat `res' = `var'
|
||
|
else if `df_r'<. mat `res' = ttail(`df_r',abs(`b'/sqrt(`var'))) * 2
|
||
|
else mat `res' = (1 - norm(abs(`b'/sqrt(`var')))) * 2
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_ci_l
|
||
|
args bc j
|
||
|
ComputeCoefs_ci - `0'
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_ci_u
|
||
|
args bc j
|
||
|
ComputeCoefs_ci + `0'
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs_ci
|
||
|
args sign bc j level
|
||
|
local r = rowsof(`bc')
|
||
|
local df_r = e(df_r)
|
||
|
forv i = 1/`r' {
|
||
|
local b `bc'[`i',1]
|
||
|
local var `bc'[`i',2]
|
||
|
local res `bc'[`i',`j']
|
||
|
if `b'>=. mat `res' = `b'
|
||
|
else if `var'>=. mat `res' = `var'
|
||
|
else if `df_r'<. mat `res' = `b' `sign' ///
|
||
|
invttail(`df_r',(100-`level')/200) * sqrt(`var')
|
||
|
else mat `res' = `b' `sign' ///
|
||
|
invnorm(1-(100-`level')/200) * sqrt(`var')
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs__star
|
||
|
args bc j
|
||
|
CopyColFromTo `bc' 1 `j' "_star"
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs__sign
|
||
|
args bc j
|
||
|
CopyColFromTo `bc' 1 `j' "_sign"
|
||
|
end
|
||
|
|
||
|
program ComputeCoefs__sigsign
|
||
|
args bc j
|
||
|
CopyColFromTo `bc' 1 `j' "_sigsign"
|
||
|
end
|
||
|
|
||
|
program GetMarginals
|
||
|
args bc margin meqs
|
||
|
tempname D dfdx
|
||
|
mat `D' = `bc'[1...,1]*0
|
||
|
mat coln `D' = "_dummy"
|
||
|
local type `e(Xmfx_type)'
|
||
|
if "`type'"!="" {
|
||
|
mat `dfdx' = e(Xmfx_`type')
|
||
|
capture confirm matrix e(Xmfx_se_`type')
|
||
|
if _rc==0 {
|
||
|
mat `dfdx' = `dfdx' \ e(Xmfx_se_`type')
|
||
|
}
|
||
|
if "`e(Xmfx_discrete)'"=="discrete" local dummy `e(Xmfx_dummy)'
|
||
|
}
|
||
|
else if "`e(cmd)'"=="dprobit" {
|
||
|
mat `dfdx' = e(dfdx) \ e(se_dfdx)
|
||
|
local dummy `e(dummy)'
|
||
|
}
|
||
|
else if "`e(cmd)'"=="tobit" & inlist("`margin'","u","c","p") {
|
||
|
capture confirm matrix e(dfdx_`margin')
|
||
|
if _rc==0 {
|
||
|
mat `dfdx' = e(dfdx_`margin') \ e(se_`margin')
|
||
|
}
|
||
|
local dummy `e(dummy)'
|
||
|
}
|
||
|
else if "`e(cmd)'"=="truncreg" {
|
||
|
capture confirm matrix e(dfdx)
|
||
|
if _rc==0 {
|
||
|
tempname V se
|
||
|
mat `V' = e(V_dfdx)
|
||
|
forv k= 1/`=rowsof(`V')' {
|
||
|
mat `se' = nullmat(`se') , sqrt(`V'[`k',`k'])
|
||
|
}
|
||
|
mat `dfdx' = e(dfdx) \ `se'
|
||
|
}
|
||
|
}
|
||
|
capture confirm matrix `dfdx'
|
||
|
if _rc==0 {
|
||
|
QuotedRowNames `bc'
|
||
|
local rnames `"`value'"'
|
||
|
if `"`meqs'"'!="" local reqs: roweq `bc', q
|
||
|
local i 1
|
||
|
foreach row of loc rnames {
|
||
|
if `"`meqs'"'!="" {
|
||
|
local eq: word `i' of `reqs'
|
||
|
}
|
||
|
local col = colnumb(`dfdx',"`row'")
|
||
|
if `col'>=. | !`:list eq in meqs' {
|
||
|
mat `bc'[`i',1] = .y
|
||
|
mat `bc'[`i',2] = .y
|
||
|
}
|
||
|
else {
|
||
|
mat `bc'[`i',1] =`dfdx'[1,`col']
|
||
|
mat `bc'[`i',2] = (`dfdx'[2,`col'])^2
|
||
|
if "`:word `col' of `dummy''"=="1" mat `D'[`i',1] = 1
|
||
|
}
|
||
|
local ++i
|
||
|
}
|
||
|
c_local hasmargin 1
|
||
|
}
|
||
|
mat `bc' = `bc', `D'
|
||
|
end
|
||
|
|
||
|
program TransformCoefs
|
||
|
args bc coefs transform
|
||
|
local c = colsof(`bc')
|
||
|
forv j = 3/`c' {
|
||
|
gettoken v coefs : coefs
|
||
|
if inlist("`v'", "b", "ci_l", "ci_u") {
|
||
|
_TransformCoefs `bc' `j' 0 "" "" `"`transform'"'
|
||
|
}
|
||
|
else if "`v'"=="se" {
|
||
|
_TransformCoefs `bc' `j' 1 "abs" "" `"`transform'"'
|
||
|
}
|
||
|
else if "`v'"=="var" {
|
||
|
_TransformCoefs `bc' `j' 1 "" "^2" `"`transform'"'
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program _TransformCoefs
|
||
|
args bc j usedf abs sq transform
|
||
|
local r = rowsof(`bc')
|
||
|
gettoken coef rest : transform
|
||
|
gettoken f rest : rest
|
||
|
gettoken df rest : rest
|
||
|
while `"`coef'`f'`df'"'!="" {
|
||
|
if `"`df'`rest'"'=="" { // last element of list may be without coef
|
||
|
local df `"`f'"'
|
||
|
local f `"`coef'"'
|
||
|
local coef ""
|
||
|
}
|
||
|
local trcoefs `"`trcoefs'`"`coef'"' "'
|
||
|
if `usedf' {
|
||
|
local trs `"`trs'`"`df'"' "'
|
||
|
}
|
||
|
else {
|
||
|
local trs `"`trs'`"`f'"' "'
|
||
|
}
|
||
|
gettoken coef rest : rest
|
||
|
gettoken f rest : rest
|
||
|
gettoken df rest : rest
|
||
|
}
|
||
|
local trs : subinstr local trs "@" "\`b'", all
|
||
|
forv i = 1/`r' {
|
||
|
gettoken coef coefrest : trcoefs
|
||
|
gettoken tr trrest : trs
|
||
|
while `"`coef'`tr'"'!="" {
|
||
|
MatchCoef `"`coef'"' `bc' `i'
|
||
|
if `match' {
|
||
|
if `usedf' {
|
||
|
local b `bc'[`i',1]
|
||
|
local res `bc'[`i',`j']
|
||
|
if `res'<. {
|
||
|
mat `res' = `res' * `abs'(`tr')`sq'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local b `bc'[`i',`j']
|
||
|
if `b'<. {
|
||
|
mat `b' = (`tr')
|
||
|
}
|
||
|
}
|
||
|
continue, break
|
||
|
}
|
||
|
gettoken coef coefrest : coefrest
|
||
|
gettoken tr trrest : trrest
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program MatchCoef
|
||
|
args eqx b i
|
||
|
if inlist(trim(`"`eqx'"'),"","*") {
|
||
|
c_local match 1
|
||
|
exit
|
||
|
}
|
||
|
tempname tmp
|
||
|
mat `tmp' = `b'[`i',1...]
|
||
|
local eqi: roweq `tmp'
|
||
|
local xi: rown `tmp'
|
||
|
gettoken eq x : eqx, parse(:)
|
||
|
local eq: list clean eq
|
||
|
if `"`eq'"'==":" { // case 1: ":[varname]"
|
||
|
local eq
|
||
|
}
|
||
|
else if `"`x'"'=="" { // case 2: "varname"
|
||
|
local x `"`eq'"'
|
||
|
local eq
|
||
|
}
|
||
|
else { // case 3. "eqname:[varname]"
|
||
|
gettoken colon x : x, parse(:)
|
||
|
local x: list clean x
|
||
|
}
|
||
|
if `"`eq'"'=="" local eq "*"
|
||
|
if `"`x'"'=="" local x "*"
|
||
|
c_local match = match(`"`eqi'"', `"`eq'"') & match(`"`xi'"', `"`x'"')
|
||
|
end
|
||
|
|
||
|
program NumberMlabels
|
||
|
args M mlabels
|
||
|
forv m = 1/`M' {
|
||
|
local num "(`m')"
|
||
|
local lab: word `m' of `macval(mlabels)'
|
||
|
if `"`macval(lab)'"'!="" {
|
||
|
local lab `"`num' `macval(lab)'"'
|
||
|
}
|
||
|
else local lab `num'
|
||
|
local labels `"`macval(labels)'`"`macval(lab)'"' "'
|
||
|
}
|
||
|
c_local mlabels `"`macval(labels)'"'
|
||
|
end
|
||
|
|
||
|
program ModelEqCheck
|
||
|
args B eq m ccols
|
||
|
tempname Bsub
|
||
|
mat `Bsub' = `B'["`eq':",(`m'-1)*`ccols'+1]
|
||
|
local R = rowsof(`Bsub')
|
||
|
local value 0
|
||
|
forv r = 1/`R' {
|
||
|
if `Bsub'[`r',1]<. {
|
||
|
local value 1
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
c_local value `value'
|
||
|
end
|
||
|
|
||
|
program Add2Vblock
|
||
|
args block col
|
||
|
foreach v of local col {
|
||
|
gettoken row block: block
|
||
|
local row "`row' `v'"
|
||
|
local row: list retok row
|
||
|
local vblock `"`vblock'"`row'" "'
|
||
|
}
|
||
|
c_local vblock `"`vblock'"'
|
||
|
end
|
||
|
|
||
|
program CountNofEqs
|
||
|
args ms es
|
||
|
local m0 0
|
||
|
local e0 0
|
||
|
local i 0
|
||
|
local eqs 0
|
||
|
foreach m of local ms {
|
||
|
local ++i
|
||
|
local e: word `i' of `es'
|
||
|
if `m'!=`m0' | `e'!=`e0' {
|
||
|
local ++eqs
|
||
|
}
|
||
|
local m0 `m'
|
||
|
local e0 `e'
|
||
|
}
|
||
|
c_local value `eqs'
|
||
|
end
|
||
|
|
||
|
program InsertAtVariables
|
||
|
args value type span M E width hline rtf rtfrowdefbrdrt rtfrowdefbrdrb rtfrowdef rtfemptyrow ///
|
||
|
title note discrete starlegend
|
||
|
if `type'==1 local atvars span
|
||
|
else {
|
||
|
local atvars span M E width hline
|
||
|
if `rtf' local atvars `atvars' rtfrowdefbrdrt rtfrowdefbrdrb rtfrowdef rtfemptyrow
|
||
|
if `type'!=2 local atvars `atvars' title note discrete starlegend
|
||
|
}
|
||
|
foreach atvar of local atvars {
|
||
|
capt local value: subinstr local value "@`atvar'" `"`macval(`atvar')'"', all
|
||
|
// note: returns error if length of <to> is more than 502 characters
|
||
|
}
|
||
|
c_local value `"`macval(value)'"'
|
||
|
end
|
||
|
|
||
|
program Abbrev
|
||
|
args width value abbrev
|
||
|
if "`abbrev'"!="" {
|
||
|
if `width'>32 {
|
||
|
local value = substr(`"`macval(value)'"',1,`width')
|
||
|
}
|
||
|
else if `width'>0 {
|
||
|
if length(`"`macval(value)'"')>`width' {
|
||
|
local value = abbrev(`"`macval(value)'"',`width')
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
c_local value `"`macval(value)'"'
|
||
|
end
|
||
|
|
||
|
program MgroupsPattern
|
||
|
args mrow pattern
|
||
|
local i 0
|
||
|
local m0 0
|
||
|
local j 0
|
||
|
foreach m of local mrow {
|
||
|
if `m'>=. {
|
||
|
local newpattern `newpattern' .
|
||
|
continue
|
||
|
}
|
||
|
if `m'!=`m0' {
|
||
|
local p: word `++i' of `pattern'
|
||
|
if `i'==1 local p 1
|
||
|
if "`p'"=="1" local j = `j' + 1
|
||
|
}
|
||
|
local newpattern `newpattern' `j'
|
||
|
local m0 `m'
|
||
|
}
|
||
|
c_local mgroupspattern `newpattern'
|
||
|
end
|
||
|
|
||
|
program WriteCaption
|
||
|
args file delimiter stardetach row rowtwo labels starsrow span ///
|
||
|
abbrev colwidth delwidth starwidth repeat prefix suffix
|
||
|
local c 0
|
||
|
local nspan 0
|
||
|
local c0 2
|
||
|
local spanwidth -`delwidth'
|
||
|
local spanfmt
|
||
|
local ncolwidth: list sizeof colwidth
|
||
|
foreach r of local row {
|
||
|
local rtwo: word `++c' of `rowtwo'
|
||
|
local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth'
|
||
|
if `colwidthj'>0 local colfmt "%`colwidthj's"
|
||
|
else local colfmt
|
||
|
if "`r'"=="." {
|
||
|
local ++c0
|
||
|
file write `file' `macval(delimiter)' `colfmt' (`""')
|
||
|
}
|
||
|
else if `"`span'"'=="" {
|
||
|
if ( "`r'"!="`lastr'" | "`rtwo'"!="`lastrtwo'" | `"`rowtwo'"'=="" ) {
|
||
|
local value: word `r' of `macval(labels)'
|
||
|
Abbrev `colwidthj' `"`macval(value)'"' "`abbrev'"
|
||
|
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
|
||
|
InsertAtVariables `"`macval(value)'"' 1 "1"
|
||
|
}
|
||
|
else local value
|
||
|
file write `file' `macval(delimiter)' `colfmt' (`"`macval(value)'"')
|
||
|
if `:word `c' of `starsrow''==1 {
|
||
|
file write `file' `macval(stardetach)' _skip(`starwidth')
|
||
|
}
|
||
|
local lastr "`r'"
|
||
|
local lastrtwo "`rtwo'"
|
||
|
}
|
||
|
else {
|
||
|
local ++nspan
|
||
|
local spanwidth=`spanwidth'+`colwidthj'+`delwidth'
|
||
|
if `:word `c' of `starsrow''==1 {
|
||
|
local spanwidth = `spanwidth' + `starwidth'
|
||
|
if `"`macval(stardetach)'"'!="" {
|
||
|
local ++nspan
|
||
|
local spanwidth = `spanwidth' + `delwidth'
|
||
|
}
|
||
|
}
|
||
|
local nextrtwo: word `=`c'+1' of `rowtwo'
|
||
|
local nextr: word `=`c'+1' of `row'
|
||
|
if "`r'"!="." & ///
|
||
|
("`r'"!="`nextr'" | "`rtwo'"!="`nextrtwo'" | `"`rowtwo'"'=="") {
|
||
|
local value: word `r' of `macval(labels)'
|
||
|
Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'"
|
||
|
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
|
||
|
InsertAtVariables `"`macval(value)'"' 1 "`nspan'"
|
||
|
if `spanwidth'>0 local spanfmt "%-`spanwidth's"
|
||
|
file write `file' `macval(delimiter)' `spanfmt' (`"`macval(value)'"')
|
||
|
InsertAtVariables `"`macval(repeat)'"' 1 "`c0'-`=`c0'+`nspan'-1'"
|
||
|
local repeatlist `"`macval(repeatlist)'`macval(value)'"'
|
||
|
local c0 = `c0' + `nspan'
|
||
|
local nspan 0
|
||
|
local spanwidth -`delwidth'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
c_local value `"`macval(repeatlist)'"'
|
||
|
end
|
||
|
|
||
|
program WriteBegin
|
||
|
args file pre begin post
|
||
|
foreach line of local pre {
|
||
|
file write `file' `newline' `"`macval(line)'"'
|
||
|
local newline _n
|
||
|
}
|
||
|
file write `file' `macval(begin)' `macval(post)'
|
||
|
end
|
||
|
|
||
|
program WriteEnd
|
||
|
args file end post post2
|
||
|
file write `file' `macval(end)'
|
||
|
WriteStrLines `"`file'"' `"`macval(post)'"'
|
||
|
WriteStrLines `"`file'"' `"`macval(post2)'"'
|
||
|
file write `file' _n
|
||
|
end
|
||
|
|
||
|
program WriteStrLines
|
||
|
args file lines
|
||
|
foreach line of local lines {
|
||
|
file write `file' `newline' `"`macval(line)'"'
|
||
|
local newline _n
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program WriteEqrow
|
||
|
args file delimiter stardetach value row span vwidth fmt_v ///
|
||
|
abbrev mwidth delwidth starwidth prefix suffix ///
|
||
|
haslabcol2 labcolwidth fmt_l2
|
||
|
local nspan 1
|
||
|
local spanwidth `vwidth'
|
||
|
local spanfmt
|
||
|
local c 0
|
||
|
local nmwidth: list sizeof mwidth
|
||
|
if `"`span'"'=="" {
|
||
|
Abbrev `vwidth' `"`macval(value)'"' "`abbrev'"
|
||
|
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
|
||
|
InsertAtVariables `"`macval(value)'"' 1 "1"
|
||
|
file write `file' `fmt_v' (`"`macval(value)'"')
|
||
|
if `haslabcol2' {
|
||
|
file write `file' `macval(delimiter)' `fmt_l2' ("")
|
||
|
}
|
||
|
foreach r of local row {
|
||
|
local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth'
|
||
|
if `mwidthj'>0 local fmt_m "%`mwidthj's"
|
||
|
else local fmt_m
|
||
|
file write `file' `macval(delimiter)' `fmt_m' ("")
|
||
|
if `r'==1 {
|
||
|
file write `file' `macval(stardetach)' _skip(`starwidth')
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if `haslabcol2' {
|
||
|
local ++nspan
|
||
|
local spanwidth = `spanwidth' + `delwidth' + `labcolwidth'
|
||
|
}
|
||
|
foreach r of local row {
|
||
|
local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth'
|
||
|
local ++nspan
|
||
|
local spanwidth = `spanwidth' + `delwidth' + `mwidthj'
|
||
|
if `r'==1 {
|
||
|
local spanwidth = `spanwidth' + `starwidth'
|
||
|
if `"`macval(stardetach)'"'!="" {
|
||
|
local ++nspan
|
||
|
local spanwidth = `spanwidth' + `delwidth'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'"
|
||
|
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
|
||
|
InsertAtVariables `"`macval(value)'"' 1 "`nspan'"
|
||
|
if `spanwidth'>0 local spanfmt "%-`spanwidth's"
|
||
|
file write `file' `spanfmt' (`"`macval(value)'"')
|
||
|
}
|
||
|
end
|
||
|
|
||
|
prog WriteStrRow
|
||
|
args file mrow eqrow neq labels delimiter stardetach starsrow ///
|
||
|
abbrev colwidth delwidth starwidth
|
||
|
local c 0
|
||
|
local ncolwidth: list sizeof colwidth
|
||
|
foreach mnum of local mrow {
|
||
|
local eqnum: word `++c' of `eqrow'
|
||
|
local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth'
|
||
|
if `colwidthj'>0 local colfmt "%`colwidthj's"
|
||
|
else local colfmt
|
||
|
if "`mnum'"=="." {
|
||
|
file write `file' `macval(delimiter)' `colfmt' (`""')
|
||
|
continue
|
||
|
}
|
||
|
if ( "`mnum'"!="`lastmnum'" | "`eqnum'"!="`lasteqnum'" ) {
|
||
|
local value: word `=(`mnum'-1)*`neq'+`eqnum'' of `macval(labels)'
|
||
|
Abbrev `colwidthj' `"`macval(value)'"' "`abbrev'"
|
||
|
}
|
||
|
else local value
|
||
|
file write `file' `macval(delimiter)' `colfmt' (`"`macval(value)'"')
|
||
|
if `:word `c' of `starsrow''==1 {
|
||
|
file write `file' `macval(stardetach)' _skip(`starwidth')
|
||
|
}
|
||
|
local lastmnum "`mnum'"
|
||
|
local lasteqnum "`eqnum'"
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program VarInList
|
||
|
args var unstack eqvar eq list
|
||
|
local value
|
||
|
local L: word count `macval(list)'
|
||
|
forv l = 1(2)`L' {
|
||
|
local lvar: word `l' of `macval(list)'
|
||
|
local lab: word `=`l'+1' of `macval(list)'
|
||
|
if "`unstack'"!="" {
|
||
|
if `"`var'"'==`"`lvar'"' {
|
||
|
local value `"`macval(lab)'"'
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
if inlist(`"`lvar'"',`"`var'"',`"`eqvar'"',`"`eq':"') {
|
||
|
local value `"`macval(lab)'"'
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
c_local value `"`macval(value)'"'
|
||
|
end
|
||
|
|
||
|
program vFormat
|
||
|
args value fmt lz dmarker msign par
|
||
|
if substr(`"`fmt'"',1,1)=="a" {
|
||
|
SignificantDigits `fmt' `value'
|
||
|
}
|
||
|
else {
|
||
|
capt confirm integer number `fmt'
|
||
|
if !_rc {
|
||
|
local fmt %`=`fmt'+9'.`fmt'f
|
||
|
}
|
||
|
}
|
||
|
else if `"`fmt'"'=="%g" | `"`fmt'"'=="g" local fmt "%9.0g"
|
||
|
else if substr(`"`fmt'"',1,1)!="%" {
|
||
|
di as err `"`fmt': invalid format"'
|
||
|
exit 198
|
||
|
}
|
||
|
local value: di `fmt' `value'
|
||
|
local value: list retok value
|
||
|
if "`lz'"=="" {
|
||
|
if index("`value'","0.")==1 | index("`value'","-0.") {
|
||
|
local value: subinstr local value "0." "."
|
||
|
}
|
||
|
}
|
||
|
if `"`macval(dmarker)'"'!="" {
|
||
|
if "`: set dp'"=="comma" local dp ,
|
||
|
else local dp .
|
||
|
local val: subinstr local value "`dp'" `"`macval(dmarker)'"'
|
||
|
}
|
||
|
else local val `"`value'"'
|
||
|
if `"`msign'"'!="" {
|
||
|
if index("`value'","-")==1 {
|
||
|
local val: subinstr local val "-" `"`macval(msign)'"'
|
||
|
}
|
||
|
}
|
||
|
if `"`par'"'!="" {
|
||
|
tokenize `"`macval(par)'"'
|
||
|
local val `"`macval(1)'`macval(val)'`macval(2)'"'
|
||
|
}
|
||
|
c_local value `"`macval(val)'"'
|
||
|
end
|
||
|
|
||
|
program SignificantDigits // idea stolen from outreg2.ado
|
||
|
args fmt value
|
||
|
local d = substr("`fmt'", 2, .)
|
||
|
if `"`d'"'=="" local d 3
|
||
|
capt confirm integer number `d'
|
||
|
if _rc {
|
||
|
di as err `"`fmt': invalid format"'
|
||
|
exit 198
|
||
|
}
|
||
|
// missing: format does not matter
|
||
|
if `value'>=. local fmt "%9.0g"
|
||
|
// integer: print no decimal places
|
||
|
else if (`value'-int(`value'))==0 {
|
||
|
local fmt "%12.0f"
|
||
|
}
|
||
|
// value in (-1,1): display up to 9 decimal places with d significant
|
||
|
// digits, then switch to e-format with d-1 decimal places
|
||
|
else if abs(`value')<1 {
|
||
|
local right = -int(log10(abs(`value'-int(`value')))) // zeros after dp
|
||
|
local dec = max(1,`d' + `right')
|
||
|
if `dec'<=9 {
|
||
|
local fmt "%12.`dec'f"
|
||
|
}
|
||
|
else {
|
||
|
local fmt "%12.`=min(9,`d'-1)'e"
|
||
|
}
|
||
|
}
|
||
|
// |values|>=1: display d+1 significant digits or more with at least one
|
||
|
// decimal place and up to nine digits before the decimal point, then
|
||
|
// switch to e-format
|
||
|
else {
|
||
|
local left = int(log10(abs(`value'))+1) // digits before dp
|
||
|
if `left'<=9 {
|
||
|
local fmt "%12.`=max(1,`d' - `left' + 1)'f"
|
||
|
}
|
||
|
else {
|
||
|
local fmt "%12.0e" // alternatively: "%12.`=min(9,`d'-1)'e"
|
||
|
}
|
||
|
}
|
||
|
c_local fmt "`fmt'"
|
||
|
end
|
||
|
|
||
|
program Stars
|
||
|
args starlevels P
|
||
|
if inrange(`P',0,1) {
|
||
|
local nstar: word count `macval(starlevels)'
|
||
|
forv i=1(2)`nstar' {
|
||
|
local istarsym: word `i' of `macval(starlevels)'
|
||
|
local istar: word `=`i'+1' of `macval(starlevels)'
|
||
|
if `istar'<=`P' continue, break
|
||
|
local value "`macval(istarsym)'"
|
||
|
}
|
||
|
}
|
||
|
c_local value `"`macval(value)'"'
|
||
|
end
|
||
|
|
||
|
program CellStars
|
||
|
args starlevels P par
|
||
|
Stars `"`macval(starlevels)'"' `P'
|
||
|
if `"`par'"'!="" {
|
||
|
tokenize `"`macval(par)'"'
|
||
|
local value `"`macval(1)'`macval(value)'`macval(2)'"'
|
||
|
}
|
||
|
c_local value `"`macval(value)'"'
|
||
|
end
|
||
|
|
||
|
prog MakeSign
|
||
|
args value msign par starlevels P
|
||
|
if "`P'"!="" {
|
||
|
local factor = 0
|
||
|
while 1 {
|
||
|
gettoken istar starlevels : starlevels
|
||
|
gettoken istar starlevels : starlevels
|
||
|
if `"`istar'"'=="" continue, break
|
||
|
if `P'<`istar' local factor = `factor' + 1
|
||
|
else if `istar'==1 local factor = 1
|
||
|
}
|
||
|
}
|
||
|
else local factor 1
|
||
|
if `"`macval(msign)'"'=="" local msign "-"
|
||
|
if `value'<0 {
|
||
|
local val: di _dup(`factor') `"`macval(msign)'"'
|
||
|
}
|
||
|
else if `value'==0 local val: di _dup(`factor') "0"
|
||
|
else if `value'>0 & `value'<. local val: di _dup(`factor') "+"
|
||
|
else local val `value'
|
||
|
if `"`par'"'!="" {
|
||
|
tokenize `"`macval(par)'"'
|
||
|
local val `"`macval(1)'`macval(val)'`macval(2)'"'
|
||
|
}
|
||
|
c_local value `"`macval(val)'"'
|
||
|
end
|
||
|
|
||
|
program DropOrKeep
|
||
|
args type b spec // type=0: drop; type=1: keep
|
||
|
capt confirm matrix `b'
|
||
|
if _rc {
|
||
|
exit
|
||
|
}
|
||
|
tempname res bt
|
||
|
local R = rowsof(`b')
|
||
|
forv i=1/`R' {
|
||
|
local hit 0
|
||
|
mat `bt' = `b'[`i',1...]
|
||
|
foreach sp of local spec {
|
||
|
if rownumb(`bt', `"`sp'"')==1 {
|
||
|
local hit 1
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
if `hit'==`type' mat `res' = nullmat(`res') \ `bt'
|
||
|
}
|
||
|
capt mat drop `b'
|
||
|
capt mat rename `res' `b'
|
||
|
end
|
||
|
|
||
|
program Order
|
||
|
args b spec
|
||
|
capt confirm matrix `b'
|
||
|
if _rc {
|
||
|
exit
|
||
|
}
|
||
|
tempname bt res
|
||
|
local eqlist: roweq `b', q
|
||
|
local eqlist: list uniq eqlist
|
||
|
mat `bt' = `b'
|
||
|
gettoken spi rest : spec
|
||
|
while `"`spi'"'!="" {
|
||
|
gettoken spinext rest : rest
|
||
|
if !index(`"`spi'"',":") {
|
||
|
local vars `"`vars'`"`spi'"' "'
|
||
|
if `"`spinext'"'!="" & !index(`"`spinext'"',":") {
|
||
|
local spi `"`spinext'"'
|
||
|
continue
|
||
|
}
|
||
|
foreach eq of local eqlist {
|
||
|
foreach var of local vars {
|
||
|
local splist `"`splist'`"`eq':`var'"' "'
|
||
|
}
|
||
|
local splist `"`splist'`"`eq':"' "' // rest
|
||
|
}
|
||
|
local vars
|
||
|
}
|
||
|
else local splist `"`spi'"'
|
||
|
gettoken sp splist : splist
|
||
|
while `"`sp'"'!="" {
|
||
|
local isp = rownumb(`bt', "`sp'")
|
||
|
if `isp' >= . {
|
||
|
gettoken sp splist : splist
|
||
|
continue
|
||
|
}
|
||
|
while `isp' < . {
|
||
|
mat `res' = nullmat(`res') \ `bt'[`isp',1...]
|
||
|
local nb = rowsof(`bt')
|
||
|
if `nb' == 1 { // no rows left in `bt'
|
||
|
capt mat drop `b'
|
||
|
capt mat rename `res' `b'
|
||
|
exit
|
||
|
}
|
||
|
if `isp' == 1 {
|
||
|
mat `bt' = `bt'[2...,1...]
|
||
|
}
|
||
|
else if `isp' == `nb' {
|
||
|
mat `bt' = `bt'[1..`=`nb'-1',1...]
|
||
|
}
|
||
|
else {
|
||
|
mat `bt' = `bt'[1..`=`isp'-1',1...] \ `bt'[`=`isp'+1'...,1...]
|
||
|
}
|
||
|
local isp = rownumb(`bt', "`sp'")
|
||
|
}
|
||
|
gettoken sp splist : splist
|
||
|
}
|
||
|
local spi `"`spinext'"'
|
||
|
}
|
||
|
capt mat `res' = nullmat(`res') \ `bt'
|
||
|
capt mat drop `b'
|
||
|
capt mat rename `res' `b'
|
||
|
end
|
||
|
|
||
|
prog MakeQuotedFullnames
|
||
|
args names eqs
|
||
|
foreach name of local names {
|
||
|
gettoken eq eqs : eqs
|
||
|
local value `"`value'`"`eq':`name'"' "'
|
||
|
}
|
||
|
c_local value: list clean value
|
||
|
end
|
||
|
|
||
|
program define QuotedRowNames
|
||
|
args matrix
|
||
|
capt confirm matrix `matrix'
|
||
|
if _rc {
|
||
|
c_local value ""
|
||
|
exit
|
||
|
}
|
||
|
tempname extract
|
||
|
if substr(`"`matrix'"',1,2)=="r(" {
|
||
|
local matrix0 `"`matrix'"'
|
||
|
tempname matrix
|
||
|
mat `matrix' = `matrix0'
|
||
|
}
|
||
|
local R = rowsof(`matrix')
|
||
|
forv r = 1/`R' {
|
||
|
mat `extract' = `matrix'[`r',1...]
|
||
|
local name: rownames `extract'
|
||
|
local value `"`value'`"`name'"' "'
|
||
|
}
|
||
|
c_local value: list clean value
|
||
|
end
|
||
|
|
||
|
prog EqReplaceCons
|
||
|
args names eqlist eqlabels varlabels
|
||
|
local skip 0
|
||
|
foreach v of local varlabels {
|
||
|
if `skip' {
|
||
|
local skip 0
|
||
|
continue
|
||
|
}
|
||
|
local vlabv `"`vlabv'`"`v'"' "'
|
||
|
local skip 1
|
||
|
}
|
||
|
local deqs: list dups eqlist
|
||
|
local deqs: list uniq deqs
|
||
|
local i 0
|
||
|
foreach eq of local eqlist {
|
||
|
local ++i
|
||
|
if `"`eq'"'!=`"`last'"' {
|
||
|
gettoken eqlab eqlabels : eqlabels
|
||
|
}
|
||
|
local last `"`eq'"'
|
||
|
if `:list eq in deqs' | `"`eq'"'=="_" continue
|
||
|
local name: word `i' of `names'
|
||
|
local isinvlabv: list posof `"`eq':`name'"' in vlabv
|
||
|
if `"`name'"'=="_cons" & `isinvlabv'==0 {
|
||
|
local value `"`value'`space'`"`eq':`name'"' `"`eqlab'"'"'
|
||
|
local space " "
|
||
|
}
|
||
|
}
|
||
|
c_local value `"`value'"'
|
||
|
end
|
||
|
|
||
|
prog UniqEqsAndDims
|
||
|
local n 0
|
||
|
foreach el of local 1 {
|
||
|
if `"`macval(el)'"'!=`"`macval(last)'"' {
|
||
|
if `n'>0 local eqsdims "`eqsdims' `n'"
|
||
|
local eqs `"`macval(eqs)' `"`macval(el)'"'"'
|
||
|
local n 0
|
||
|
}
|
||
|
local ++n
|
||
|
local last `"`macval(el)'"'
|
||
|
}
|
||
|
local eqsdims "`eqsdims' `n'"
|
||
|
c_local eqsdims: list clean eqsdims
|
||
|
c_local eqs: list clean eqs
|
||
|
end
|
||
|
|
||
|
prog InsertAtCols
|
||
|
args colnums row symb
|
||
|
if `"`symb'"'=="" local symb .
|
||
|
gettoken c rest : colnums
|
||
|
local i 0
|
||
|
foreach r of local row {
|
||
|
local ++i
|
||
|
while `"`c'"'!="" {
|
||
|
if `c'<=`i' {
|
||
|
local value `"`value' `symb'"'
|
||
|
gettoken c rest : rest
|
||
|
}
|
||
|
else continue, break
|
||
|
}
|
||
|
local value `"`value' `"`r'"'"'
|
||
|
}
|
||
|
while `"`c'"'!="" {
|
||
|
local value `"`value' `symb'"'
|
||
|
gettoken c rest : rest
|
||
|
}
|
||
|
c_local value: list clean value
|
||
|
end
|
||
|
|
||
|
prog GetVarnamesFromOrder
|
||
|
foreach sp of local 1 {
|
||
|
if index(`"`sp'"', ":") {
|
||
|
gettoken trash sp: sp, parse(:)
|
||
|
if `"`trash'"'!=":" {
|
||
|
gettoken trash sp: sp, parse(:)
|
||
|
}
|
||
|
}
|
||
|
local value `"`value'`space'`sp'"'
|
||
|
local space " "
|
||
|
}
|
||
|
c_local value `"`value'"'
|
||
|
end
|
||
|
|
||
|
prog ParseIndicateOpts
|
||
|
syntax [anything(equalok)] [, Labels(str asis) ]
|
||
|
gettoken tok rest : anything, parse(" =")
|
||
|
while `"`macval(tok)'"'!="" {
|
||
|
if `"`macval(tok)'"'=="=" {
|
||
|
local anything `"`"`macval(anything)'"'"'
|
||
|
continue, break
|
||
|
}
|
||
|
gettoken tok rest : rest, parse(" =")
|
||
|
}
|
||
|
c_local indicate `"`macval(anything)'"'
|
||
|
c_local indicatelabels `"`macval(labels)'"'
|
||
|
end
|
||
|
|
||
|
prog ProcessIndicateGrp
|
||
|
args i B nmodels unstack yesno indicate
|
||
|
gettoken yes no : yesno
|
||
|
gettoken no : no
|
||
|
gettoken tok rest : indicate, parse(=)
|
||
|
while `"`macval(tok)'"'!="" {
|
||
|
if `"`macval(rest)'"'=="" {
|
||
|
local vars `"`indicate'"'
|
||
|
continue, break
|
||
|
}
|
||
|
if `"`macval(tok)'"'=="=" {
|
||
|
local vars `"`rest'"'
|
||
|
continue, break
|
||
|
}
|
||
|
local name `"`macval(name)'`space'`macval(tok)'"'
|
||
|
local space " "
|
||
|
gettoken tok rest : rest, parse(=)
|
||
|
}
|
||
|
if `"`macval(name)'"'=="" {
|
||
|
local name: word 1 of `"`vars'"'
|
||
|
}
|
||
|
ExpandEqVarlist `"`vars'"' `B'
|
||
|
local evars `"`value'"'
|
||
|
IsInModels `B' `nmodels' "`unstack'" `"`macval(yes)'"' `"`macval(no)'"' `"`evars'"'
|
||
|
local lbls `"`macval(value)'"'
|
||
|
DropOrKeep 0 `B' `"`evars'"'
|
||
|
c_local indicate`i'name `"`macval(name)'"'
|
||
|
c_local indicate`i'lbls `"`macval(lbls)'"'
|
||
|
c_local indicate`i'eqs `"`eqs'"'
|
||
|
end
|
||
|
|
||
|
prog IsInModels
|
||
|
args B nmodels unstack yes no vars
|
||
|
capt confirm matrix `B'
|
||
|
if _rc {
|
||
|
forv i = 1/`nmodels' {
|
||
|
local lbls `"`macval(lbls)' `"`macval(no)'"'"'
|
||
|
}
|
||
|
c_local value `"`macval(lbls)'"'
|
||
|
if `"`unstack'"'!="" {
|
||
|
c_local eqs "_"
|
||
|
}
|
||
|
exit
|
||
|
}
|
||
|
local models: coleq `B', q
|
||
|
local models: list uniq models
|
||
|
local eqs: roweq `B', q
|
||
|
local eqs: list uniq eqs
|
||
|
tempname Bt Btt Bttt
|
||
|
foreach model of local models {
|
||
|
local stop 0
|
||
|
mat `Bt' = `B'[1...,"`model':"]
|
||
|
foreach eq of local eqs {
|
||
|
mat `Btt' = `Bt'[`"`eq':"',1]
|
||
|
if `"`unstack'"'!="" local stop 0
|
||
|
foreach var of local vars {
|
||
|
if !index(`"`var'"',":") {
|
||
|
local var `"`eq':`var'"'
|
||
|
}
|
||
|
capt mat `Bttt' = `Btt'["`var'",1]
|
||
|
if _rc continue
|
||
|
forv i = 1/`= rowsof(`Bttt')' {
|
||
|
if `Bttt'[`i',1]<.z {
|
||
|
local lbls `"`macval(lbls)' `"`macval(yes)'"'"'
|
||
|
local stop 1
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
if `stop' continue, break
|
||
|
}
|
||
|
if `"`unstack'"'!="" {
|
||
|
if `stop'==0 {
|
||
|
local lbls `"`macval(lbls)' `"`macval(no)'"'"'
|
||
|
}
|
||
|
}
|
||
|
else if `stop' continue, break
|
||
|
}
|
||
|
if `"`unstack'"'=="" & `stop'==0 {
|
||
|
local lbls `"`macval(lbls)' `"`macval(no)'"'"'
|
||
|
}
|
||
|
}
|
||
|
c_local value `"`macval(lbls)'"'
|
||
|
if `"`unstack'"'!="" {
|
||
|
c_local eqs `"`eqs'"'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
prog ReorderEqsInIndicate
|
||
|
args nmodels eqs ieqs lbls
|
||
|
local neq: list sizeof ieqs
|
||
|
foreach eq of local eqs {
|
||
|
local i: list posof `"`eq'"' in ieqs
|
||
|
if `i' {
|
||
|
local pos `pos' `i'
|
||
|
}
|
||
|
}
|
||
|
forv m=1/`nmodels' {
|
||
|
foreach i of local pos {
|
||
|
local mi = (`m'-1)*`neq' + `i'
|
||
|
local lbl: word `mi' of `macval(lbls)'
|
||
|
local value `"`macval(value)'`"`macval(lbl)'"' "'
|
||
|
}
|
||
|
}
|
||
|
c_local value `"`macval(value)'"'
|
||
|
end
|
||
|
|
||
|
prog ParseRefcatOpts
|
||
|
syntax [anything(equalok)] [, NOLabel Label(str) Below ]
|
||
|
c_local refcatbelow "`below'"
|
||
|
c_local norefcatlabel "`nolabel'"
|
||
|
c_local refcatlabel `"`macval(label)'"'
|
||
|
c_local refcat `"`macval(anything)'"'
|
||
|
end
|
||
|
|
||
|
prog PrepareRefcat
|
||
|
gettoken coef rest : 1
|
||
|
gettoken name rest : rest
|
||
|
while `"`macval(coef)'"'!="" {
|
||
|
local coefs `"`coefs'`coef' "'
|
||
|
local names `"`macval(names)'`"`macval(name)'"' "'
|
||
|
gettoken coef rest : rest
|
||
|
gettoken name rest : rest
|
||
|
}
|
||
|
c_local refcatcoefs `"`coefs'"'
|
||
|
c_local refcatnames `"`macval(names)'"'
|
||
|
end
|
||
|
|
||
|
prog GenerateRefcatRow
|
||
|
args B ccols var eqs label
|
||
|
local models: coleq `B', q
|
||
|
local models: list uniq models
|
||
|
local col 1
|
||
|
foreach model of local models {
|
||
|
foreach eq of local eqs {
|
||
|
local eqvar `"`eq':`var'"'
|
||
|
local row = rownumb(`B',"`eqvar'")
|
||
|
if `B'[`row', `col']<.z {
|
||
|
local value `"`macval(value)'`"`macval(label)'"' "'
|
||
|
}
|
||
|
else {
|
||
|
local value `"`macval(value)'`""' "'
|
||
|
}
|
||
|
}
|
||
|
local col = `col' + `ccols'
|
||
|
}
|
||
|
c_local value `"`macval(value)'"'
|
||
|
end
|
||
|
|
||
|
prog ParseTransformSubopts
|
||
|
syntax anything(equalok) [, Pattern(string) ]
|
||
|
c_local transform `"`anything'"'
|
||
|
c_local transformpattern "`pattern'"
|
||
|
end
|
||
|
|
||
|
prog MakeTransformList
|
||
|
args B transform
|
||
|
local R = rowsof(`B')
|
||
|
if `:list sizeof transform'<=2 {
|
||
|
gettoken f rest : transform
|
||
|
gettoken df : rest
|
||
|
forv i = 1/`R' {
|
||
|
local valuef `"`valuef'`f' "'
|
||
|
local valuedf `"`valuedf'`df' "'
|
||
|
}
|
||
|
c_local valuef: list retok valuef
|
||
|
c_local valuedf: list retok valuedf
|
||
|
exit
|
||
|
}
|
||
|
gettoken coef rest : transform
|
||
|
gettoken f rest : rest
|
||
|
gettoken df rest : rest
|
||
|
while (`"`coef'"'!="") {
|
||
|
if (`"`df'`rest'"'!="") { // last element of list may be without coef
|
||
|
ExpandEqVarlist `"`coef'"' `B'
|
||
|
local coef `"`value'"'
|
||
|
}
|
||
|
local coefs `"`coefs'`"`coef'"' "'
|
||
|
local fs `"`fs'`"`f'"' "'
|
||
|
local dfs `"`dfs'`"`df'"' "'
|
||
|
gettoken coef rest : rest
|
||
|
gettoken f rest : rest
|
||
|
gettoken df rest : rest
|
||
|
}
|
||
|
tempname b
|
||
|
local value
|
||
|
forv i = 1/`R' {
|
||
|
mat `b' = `B'[`i',1...]
|
||
|
local i 0
|
||
|
local hit 0
|
||
|
foreach coef of local coefs {
|
||
|
local f: word `++i' of `fs'
|
||
|
local df: word `i' of `dfs'
|
||
|
if (`"`df'`rest'"'=="") {
|
||
|
local valuef `"`valuef'`"`coef'"' "' // sic! (see above)
|
||
|
local valuedf `"`valuedf'`"`f'"' "'
|
||
|
local hit 1
|
||
|
continue, break
|
||
|
}
|
||
|
foreach c of local coef {
|
||
|
if rownumb(`b', `"`c'"')==1 {
|
||
|
local valuef `"`valuef'`"`f'"' "'
|
||
|
local valuedf `"`valuedf'`"`df'"' "'
|
||
|
local hit 1
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
if `hit' continue, break
|
||
|
}
|
||
|
if `hit'==0 {
|
||
|
local valuef `"`valuef'"" "'
|
||
|
local valuedf `"`valuedf'"" "'
|
||
|
}
|
||
|
}
|
||
|
c_local valuef: list retok valuef
|
||
|
c_local valuedf: list retok valuedf
|
||
|
end
|
||
|
|
||
|
prog TableIsAMess
|
||
|
local ccols = r(ccols)
|
||
|
local eq: roweq r(coefs), q
|
||
|
local eq: list uniq eq
|
||
|
if `: list sizeof eq'<=1 {
|
||
|
c_local value 0
|
||
|
exit
|
||
|
}
|
||
|
tempname b bt
|
||
|
mat `b' = r(coefs)
|
||
|
gettoken eq : eq
|
||
|
mat `b' = `b'[`"`eq':"', 1...]
|
||
|
local R = rowsof(`b')
|
||
|
local models: coleq `b', q
|
||
|
local models: list uniq models
|
||
|
local value 0
|
||
|
local i = 1 - `ccols'
|
||
|
foreach model of local models {
|
||
|
local i = `i' + `ccols'
|
||
|
if `i'==1 continue // skip first model
|
||
|
mat `bt' = `b'[1...,`i']
|
||
|
local allz 1
|
||
|
forv r = 1/`R' {
|
||
|
if `bt'[`r',1]<.z {
|
||
|
local allz 0
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
if `allz' {
|
||
|
local value 1
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
c_local value `value'
|
||
|
end
|
||
|
|
||
|
prog ExpandEqVarlist
|
||
|
args list B append
|
||
|
ParseEqVarlistRelax `list'
|
||
|
QuotedRowNames `B'
|
||
|
local coefs `"`value'"'
|
||
|
local value
|
||
|
local ucoefs: list uniq coefs
|
||
|
capt confirm matrix `B'
|
||
|
if _rc==0 {
|
||
|
local eqs: roweq `B', q
|
||
|
}
|
||
|
else local eqs "_"
|
||
|
local ueqs: list uniq eqs
|
||
|
while `"`list'"'!="" {
|
||
|
// get next element
|
||
|
gettoken eqx list : list
|
||
|
// separate eq and x
|
||
|
gettoken eq x : eqx, parse(:)
|
||
|
local eq: list clean eq
|
||
|
if `"`eq'"'==":" { // case 1: ":[varname]"
|
||
|
local eq
|
||
|
}
|
||
|
else if `"`x'"'=="" { // case 2: "varname"
|
||
|
local x `"`eq'"'
|
||
|
local eq
|
||
|
}
|
||
|
else { // case 3. "eqname:[varname]"
|
||
|
gettoken colon x : x, parse(:)
|
||
|
local x: list clean x
|
||
|
}
|
||
|
// match equations
|
||
|
local eqmatch
|
||
|
if `:list eq in ueqs' { // (note: evaluates to 1 if eq empty)
|
||
|
local eqmatch `"`eq'"'
|
||
|
}
|
||
|
else {
|
||
|
foreach e of local ueqs {
|
||
|
if match(`"`e'"', `"`eq'"') {
|
||
|
local eqmatch `"`eqmatch' `"`e'"'"'
|
||
|
}
|
||
|
}
|
||
|
if `"`eqmatch'"'=="" & "`relax'"=="" {
|
||
|
if !("`append'"!="" & `"`x'"'!="") {
|
||
|
di as err `"equation `eq' not found"'
|
||
|
exit 111
|
||
|
}
|
||
|
}
|
||
|
local eqmatch: list clean eqmatch
|
||
|
}
|
||
|
if `"`x'"'=="" {
|
||
|
foreach e of local eqmatch {
|
||
|
local value `"`value' `"`e':"'"'
|
||
|
}
|
||
|
continue
|
||
|
}
|
||
|
// match coefficients
|
||
|
local vlist
|
||
|
// - without equation
|
||
|
if `"`eq'"'=="" {
|
||
|
if `:list x in ucoefs' {
|
||
|
local value `"`value' `"`x'"'"'
|
||
|
continue
|
||
|
}
|
||
|
foreach coef of local ucoefs {
|
||
|
if match(`"`coef'"', `"`x'"') {
|
||
|
local vlist `"`vlist' `"`coef'"'"'
|
||
|
}
|
||
|
}
|
||
|
if `"`vlist'"'=="" {
|
||
|
if "`append'"!="" {
|
||
|
local appendlist `"`appendlist' `"`x'"'"'
|
||
|
local value `"`value' `"`x'"'"'
|
||
|
}
|
||
|
else if "`relax'"=="" {
|
||
|
di as err `"coefficient `x' not found"'
|
||
|
exit 111
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local value `"`value' `vlist'"'
|
||
|
}
|
||
|
continue
|
||
|
}
|
||
|
// - within equations
|
||
|
local rest `"`eqs'"'
|
||
|
foreach coef of local coefs {
|
||
|
gettoken e rest : rest
|
||
|
if !`:list e in eqmatch' {
|
||
|
continue
|
||
|
}
|
||
|
if match(`"`coef'"', `"`x'"') {
|
||
|
local vlist `"`vlist' `"`e':`coef'"'"'
|
||
|
}
|
||
|
}
|
||
|
if `"`vlist'"'=="" {
|
||
|
if "`append'"!="" {
|
||
|
local appendlist `"`appendlist' `"`eq':`x'"'"'
|
||
|
local value `"`value' `"`eq':`x'"'"'
|
||
|
}
|
||
|
else if "`relax'"=="" {
|
||
|
di as err `"coefficient `eq':`x' not found"'
|
||
|
exit 111
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local value `"`value' `vlist'"'
|
||
|
}
|
||
|
}
|
||
|
if "`append'"!="" {
|
||
|
local nappend : list sizeof appendlist
|
||
|
if `nappend'>0 {
|
||
|
capt confirm matrix `B'
|
||
|
if _rc==0 {
|
||
|
tempname tmp
|
||
|
mat `tmp' = J(`nappend', colsof(`B'), .z)
|
||
|
mat rown `tmp' = `appendlist'
|
||
|
matrix `B' = `B' \ `tmp'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
c_local value: list clean value
|
||
|
end
|
||
|
|
||
|
program ParseEqVarlistRelax
|
||
|
syntax [anything] [, Relax ]
|
||
|
c_local list `"`anything'"'
|
||
|
c_local relax `relax'
|
||
|
end
|
||
|
|
||
|
program IsInString //, rclass
|
||
|
args needle haystack
|
||
|
local trash: subinstr local haystack `"`needle'"' "", count(local count)
|
||
|
c_local strcount = `count'
|
||
|
end
|
||
|
|
||
|
program MakeRtfRowdefs
|
||
|
args str srow sdetach vwidth mwidth haslc2 lc2width
|
||
|
local factor 120
|
||
|
ParseRtfcmdNum `"`str'"' "trgaph" 0
|
||
|
ParseRtfcmdNum `"`str'"' "trleft" 0
|
||
|
if `vwidth'<=0 local vwidth 12
|
||
|
if real(`"`trgaph'"')>=. local trgaph 0
|
||
|
if real(`"`trleft'"')>=. local trleft 0
|
||
|
local swidth = 3
|
||
|
local vtwips = `vwidth'*`factor'
|
||
|
local stwips = `swidth'*`factor'
|
||
|
local ipos = `vtwips' + 2*`trgaph' + (`trleft')
|
||
|
local brdrt "\clbrdrt\brdrw10\brdrs"
|
||
|
local brdrb "\clbrdrb\brdrw10\brdrs"
|
||
|
local emptycell "\pard\intbl\ql\cell"
|
||
|
local rtfdef "\cellx`ipos'"
|
||
|
local rtfdefbrdrt "`brdrt'\cellx`ipos'"
|
||
|
local rtfdefbrdrb "`brdrb'\cellx`ipos'"
|
||
|
local rtfrow "`emptycell'"
|
||
|
if `haslc2' {
|
||
|
if `lc2width'<=0 local lc2width 12
|
||
|
local lc2twips = `lc2width'*`factor'
|
||
|
local ipos = `ipos' + `lc2twips' + 2*`trgaph'
|
||
|
local rtfdef "`rtfdef'\cellx`ipos'"
|
||
|
local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'"
|
||
|
local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'"
|
||
|
local rtfrow "`rtfrow'`emptycell'"
|
||
|
}
|
||
|
local j 0
|
||
|
local nmwidth: list sizeof mwidth
|
||
|
foreach i of local srow {
|
||
|
local mwidthj: word `=1 + mod(`j++',`nmwidth')' of `mwidth'
|
||
|
if `mwidthj'<=0 local mwidthj 12
|
||
|
local mtwips = `mwidthj'*`factor'
|
||
|
local ipos = `ipos' + `mtwips' + 2*`trgaph'
|
||
|
if `i' & "`sdetach'"=="" local ipos = `ipos' + `stwips'
|
||
|
local rtfdef "`rtfdef'\cellx`ipos'"
|
||
|
local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'"
|
||
|
local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'"
|
||
|
local rtfrow "`rtfrow'`emptycell'"
|
||
|
if `i' & "`sdetach'"!="" {
|
||
|
local ipos = `ipos' + `stwips' + 2*`trgaph'
|
||
|
local rtfdef "`rtfdef'\cellx`ipos'"
|
||
|
local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'"
|
||
|
local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'"
|
||
|
local rtfrow "`rtfrow'`emptycell'"
|
||
|
}
|
||
|
}
|
||
|
c_local rtfrowdef "`rtfdef'"
|
||
|
c_local rtfrowdefbrdrt "`rtfdefbrdrt'"
|
||
|
c_local rtfrowdefbrdrb "`rtfdefbrdrb'"
|
||
|
c_local rtfemptyrow "`rtfdef'`rtfrow'"
|
||
|
end
|
||
|
|
||
|
prog ParseRtfcmdNum
|
||
|
args str cmd default
|
||
|
local pos = index(`"`str'"', `"\\`cmd'"')
|
||
|
if `pos' {
|
||
|
local pos = `pos' + strlen(`"`cmd'"') + 1
|
||
|
local digit = substr(`"`str'"',`pos',1)
|
||
|
if `"`digit'"'=="-" {
|
||
|
local value "`digit'"
|
||
|
local digit = substr(`"`str'"',`++pos',1)
|
||
|
}
|
||
|
while real(`"`digit'"')<. {
|
||
|
local value "`value'`digit'"
|
||
|
local digit = substr(`"`str'"',`++pos',1)
|
||
|
}
|
||
|
}
|
||
|
local value = real(`"`value'"')
|
||
|
if `value'>=. local value = `default'
|
||
|
c_local `cmd' `"`value'"'
|
||
|
end
|
||
|
|
||
|
prog ParseLabCol2
|
||
|
syntax [anything(equalok)] [ , Title(str asis) Width(numlist max=1 int >=0) ]
|
||
|
c_local labcol2 `"`macval(anything)'"'
|
||
|
c_local labcol2title `"`macval(title)'"'
|
||
|
c_local labcol2width `"`width'"'
|
||
|
end
|
||
|
|
||
|
prog MakeMMDdef
|
||
|
args varw labcol2 labcol2w modelw starsrow stardetachon starw
|
||
|
if "`varw'"=="0" | "`varw'"=="" local varw 1
|
||
|
if "`labcol2w'"=="0" | "`labcol2w'"=="" local labcol2w 1
|
||
|
if "`modelw'"=="0" | "`modelw'"=="" local modelw 1
|
||
|
if "`starw'"=="0" | "`starw'"=="" local starw 1
|
||
|
local varw = max(1,`varw')
|
||
|
local labcol2w = max(1,`labcol2w'-2)
|
||
|
if "`stardetachon'"=="1" local starw = max(1,`starw'-2)
|
||
|
else local starw = max(1,`starw')
|
||
|
|
||
|
local mmddef `"| `:di _dup(`varw') "-"'"'
|
||
|
if "`labcol2'"=="1" {
|
||
|
local mmddef `"`mmddef' | :`:di _dup(`labcol2w') "-"':"'
|
||
|
}
|
||
|
local nmodelw: list sizeof modelw
|
||
|
local c 0
|
||
|
foreach col of local starsrow {
|
||
|
local modelwj: word `=1+mod(`c++',`nmodelw')' of `modelw'
|
||
|
local modelwj = max(1,`modelwj'-2)
|
||
|
local mmddef `"`mmddef' | :`:di _dup(`modelwj') "-"'"'
|
||
|
if "`col'"=="1" {
|
||
|
if "`stardetachon'"=="1" {
|
||
|
local mmddef `"`mmddef': | :"'
|
||
|
}
|
||
|
local mmddef `"`mmddef'`:di _dup(`starw') "-"'"'
|
||
|
}
|
||
|
local mmddef `"`mmddef':"'
|
||
|
}
|
||
|
c_local value `"`mmddef' |"'
|
||
|
end
|
||
|
|
||
|
program MatrixMode, rclass
|
||
|
capt syntax [, Matrix(str asis) e(str asis) r(str asis) rename(str asis) ]
|
||
|
if _rc | `"`matrix'`e'`r'"'=="" {
|
||
|
c_local matrixmode 0
|
||
|
exit
|
||
|
}
|
||
|
if ((`"`matrix'"'!="") + (`"`e'"'!="") + (`"`r'"'!=""))>1 {
|
||
|
di as err "only one of matrix(), e(), or r() allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
ParseMatrixOpt `matrix'`e'`r'
|
||
|
if `"`e'"'!="" {
|
||
|
local name "e(`name')"
|
||
|
}
|
||
|
else if `"`r'"'!="" {
|
||
|
local name "r(`name')"
|
||
|
}
|
||
|
confirm matrix `name'
|
||
|
tempname bc
|
||
|
if "`transpose'"=="" {
|
||
|
mat `bc' = `name''
|
||
|
}
|
||
|
else {
|
||
|
mat `bc' = `name'
|
||
|
}
|
||
|
QuotedRowNames `bc'
|
||
|
local rnames `"`value'"'
|
||
|
local eqs: roweq `bc', q
|
||
|
mat `bc' = `bc''
|
||
|
local cols = colsof(`bc')
|
||
|
local cells
|
||
|
local space
|
||
|
gettoken fmti fmtrest : fmt, match(par)
|
||
|
gettoken rname rnames : rnames
|
||
|
gettoken eq eqs : eqs
|
||
|
forv i = 1/`cols' {
|
||
|
if `"`fmti'"'!="" {
|
||
|
local fmtopt `"f(`fmti') "'
|
||
|
gettoken fmti fmtrest : fmtrest, match(par)
|
||
|
if `"`fmti'"'=="" & `"`fmtrest'"'=="" { // recycle
|
||
|
gettoken fmti fmtrest : fmt, match(par)
|
||
|
}
|
||
|
}
|
||
|
else local fmtopt
|
||
|
if `"`eq'"'=="_" {
|
||
|
local lbl `"l(`"`rname'"')"'
|
||
|
}
|
||
|
else {
|
||
|
local lbl `"l(`"`eq':`rname'"')"'
|
||
|
}
|
||
|
local cells `"`cells'`space'c`i'(`fmtopt'`lbl')"'
|
||
|
local space " "
|
||
|
gettoken rname rnames : rnames
|
||
|
gettoken eq eqs : eqs
|
||
|
}
|
||
|
if `"`rename'"'!="" {
|
||
|
local rename : subinstr local rename "," "", all
|
||
|
RenameCoefs `bc' `"`rename'"'
|
||
|
}
|
||
|
return local names "`name'"
|
||
|
return scalar nmodels = 1
|
||
|
return scalar ccols = `cols'
|
||
|
return matrix coefs = `bc'
|
||
|
c_local matrixmode 1
|
||
|
c_local cells (`cells')
|
||
|
end
|
||
|
|
||
|
program ParseMatrixOpt
|
||
|
syntax name [, Fmt(str asis) Transpose ]
|
||
|
c_local name `"`namelist'"'
|
||
|
c_local fmt `"`fmt'"'
|
||
|
c_local transpose `"`transpose'"'
|
||
|
end
|