*! version 3.35 17Oct2007 M. Lokshin, Z. Sajaia /* small change by A. Araar */ # delimit ; cap program drop xml_tab; program define xml_tab; version 8; syntax [anything] [, STYle(string) EXcelpath(passthru) CAlcpath(passthru) updateopts Noisily *]; capture confirm matrix `anything'; // do we have a list of matrices? local rc = _rc; updateopts `style', ver(3.26) `updateopts' `excelpath' `calcpath' isest(`rc'); local 0 ", `options'"; syntax , [replace append newappend WIde LOng sd TStat Pvalue Right Below noBRackets sd2 NOADJust ADJust *]; local options : subinstr local 0 "," ""; if ~missing("`replace'`append'`newappend'") {; opts_excl1 styles `"`styles'"' replace; opts_excl1 styles `"`styles'"' append; opts_excl1 styles `"`styles'"' newappend; }; if ~missing("`long'`wide'") {; opts_excl1 styles `"`styles'"' long; opts_excl1 styles `"`styles'"' wide; }; if ~missing("`below'`right'`sd2'") {; opts_excl1 styles `"`styles'"' below; opts_excl1 styles `"`styles'"' right; opts_excl1 styles `"`styles'"' sd2; }; if ~missing("`sd'`tstat'`pvalue'") {; opts_excl1 styles `"`styles'"' sd; opts_excl1 styles `"`styles'"' tstat; opts_excl1 styles `"`styles'"' pvalue; }; if ~missing("`adjust'`noadjust'") {; opts_excl1 styles `"`styles'"' adjust; opts_excl1 styles `"`styles'"' noadjust; }; local 0 ", `styles' `options'"; foreach opt in Format Lines FONt LOng WIde STARs NOLabel SHOWeq save SHeet STATS sd TStat Pvalue Right Below NOBRackets sd2 EQuations RBlanks TBlanks CBlanks Title NOADJust ADJust RNames CEq CNames NOTEs SAVEMat Constant CWidth SAVEPath {; _parse combop 0 : 0, option(`opt') rightmost; }; //_parse combop 0 : 0, option(CWidth); quietly `noisily' {; display as text "note: options were expended to"; display as result `" `0'"'; }; display _n; tempname M; if `rc'==0 {; gettoken first rest : anything; // syntax for the matrix list syntax [, Format(passthru) Lines(string asis) FONt(string asis) LOng WIde STARs(passthru) SHOWeq SAVEPath(name) save(string) SHeet(string) replace append newappend drop(passthru) keep(passthru) EQuations(passthru) RBlanks(string asis) TBlanks(numlist max=1 >0 integer) CBlanks(numlist >=0) CWidth(string) Title(string) RNames(passthru) CEq(passthru) CNames(passthru) NOTEs(string asis) ]; matrix `M' = `first'; foreach mat of local rest {; Mat_Capp `M' : `M' `mat', miss(.z) cons ts; }; keepdrop `M', `keep' `drop'; capture confirm matrix `first'_STARS; if ~_rc {; if rowsof(`first')!=rowsof(`first'_STARS) | colsof(`first')!=colsof(`first'_STARS) {; display as error "matrices `first' and `first'_STARS must have same dimensions"; exit 503; }; matrix `M'_STARS = `first'_STARS; }; getstarchars , `stars'; }; else {; syntax [, Format(passthru) Lines(string asis) FONt(string asis) STYle(string) LOng WIde STARs(passthru) NOLabel SHOWeq SAVEPath(name) save(string) SHeet(string) replace append newappend SAVEMat(string) STATS(passthru) sd TStat Pvalue Right Below noBRackets sd2 NOADJust ADJust drop(passthru) keep(passthru) EQuations(passthru) RBlanks(string asis) TBlanks(numlist max=1 >0 integer) CBlanks(numlist >=0) CWidth(string) Title(string) CEq(passthru) CNames(passthru) NOTEs(string asis) Constant(string) * ]; _get_eformopts , eformopts(`options') allowed(__all__); local eform `"`s(str)'"'; opts_Exclusive "`sd' `tstat' `pvalue'"; opts_Exclusive "`right' `below'"; opts_Exclusive "`long' `wide'"; opts_Exclusive "`adjust' `noadjust'"; if missing("`right'") local sd2 "sd2"; // will need to change later if ~missing("`tstat'") {; local cap "t"; }; else {; if ~missing("`pvalue'") {; local cap "p-value"; }; else {; local cap "se"; // used to be sd }; }; Mkemat `anything', `stats' `stars' `long' `sd2' cap(`cap') `keep' `drop' `equations' `noadjust' eform(`eform'); matrix `M' = r(coef); matrix `M'_STARS = r(n_stars); }; // else if ~missing("`savemat'") {; local rpl `replace'; // save the -replace- option if missing("`long'") matrix roweq `M'=:; else {; local req : roweq `M'; local req : subinstr local req "_easytofind3" "", all; matrix roweq `M' = `req'; }; local rn : rownames `M'; local rn : subinstr local rn "_easytofind0" "", all; matrix rownames `M' = `rn'; local 0 `savemat'; syntax name , [replace exit]; if missing("`replace'") {; matrix `namelist'= nullmat(`namelist') \ `M'; matrix `namelist'_STARS = nullmat(`namelist'_STARS) \ `M'_STARS; }; else {; matrix `namelist'= `M'; matrix `namelist'_STARS = `M'_STARS; }; `exit'; local replace `rpl'; // restore the option }; tempfile tmpstyles; opts_Exclusive "`append' `replace' `newappend'"; // get sheet options local 0 `sheet'; syntax [anything(name=sheet)] [, COlor(integer -1) noGridlines]; // check if sheet name is valid gettoken a b : sheet, parse(":\/?*[]"); if ~missing("`b'") | length("`sheet'")>31 {; display as error "not a valid Excel sheet name"; exit 198; }; if missing("`sheet'") local sheet "Sheet1"; _getfilename "`save'"; if `"`r(filename)'"'==`"`save'"' {; local save "`c(pwd)'/`save'"; }; else {; if index(`"`r(filename)'"', ".")==0 {; local save `"`save'.xml"'; }; }; local filename = cond(strpos("`save'", "\") + strpos("`save'", "/") > 0, "`save'", "`c(pwd)'/`save'"); display as text "note: results saved to `filename'"; if ~missing("`newappend'") {; capture confirm file "`save'"; if _rc {; local replace "replace"; }; else {; local append "append"; }; }; if missing("`append'`replace'") {; capture confirm file "`save'"; if ~_rc {; display as error "file `save' already exists"; exit 602; }; else {; local replace "replace"; }; }; preserve; drop _all; quietly {; savetodataset `M' `M'_STARS, `format' `sd2' `rnames' `cnames' `ceq' etitle(`"`etitle'"'); local starnote "note: "; forvalues s = 1/`: list sizeof stars' {; local starnote "`starnote' `: word `s' of `stars'' - `: word `s' of `starchars'';"; }; capture confirm matrix `M'_STARS; if _rc local starnote; sort id; if ~missing(`"`rblanks'"') {; local add = 0; while (~missing(`"`rblanks'"')) {; _parse comma 1 rblanks : rblanks; gettoken num 1 : 1, qed(qt); gettoken txt 1 : 1; local num = trim("`num'"); if "`num'"=="LAST_ROW" local num = _N-3; capture confirm integer number `num'; local isname = _rc; if ~(`isname' | `qt') {; local s "`s' `num'"; numlist "`s'", sort; local s `r(numlist)'; local add : list posof "`num'" in s; if `add'>0 local add=`add'-1; local cond "_n==`=`num'+`add'+3'"; }; else {; local cond = cond(missing("`sd2'"), `"d_0=="`num'""', `"d_0=="`num'_easytofind1""'); }; summarize id if `cond', meanonly; local rm = r(min); if ~missing(`rm') {; replace id = id+0.01 if abs(id-`rm')<0.001; local N = _N+1; set obs `N'; replace id = `rm' + 5 in `N'; local txt `txt'; replace d_0 = trim(`"`txt'"') in `N'; foreach var of varlist f_* {; replace `var' = cond(missing("`1'"),`var'[int(r(min)/10)+3], "0_" + trim("`1'")) in `N'; }; if `isname' local s "`s' `=`rm'/10'"; }; local rblanks : subinstr local rblanks "," ""; sort id; }; }; // rblanks if ~missing("`cblanks'") {; foreach cb of numlist `cblanks' {; tempname nn; capture confirm variable d_`cb'; if ~_rc {; generate d_`nn' = ""; generate f_`nn' = ""; //f_`1'; local next = `cb' + 1; capture move d_`nn' d_`next'; }; //if }; // cb }; // cblanks if ~missing("`lines'") {; local lines : subinstr local lines "," "", all; while ~missing(`"`lines'"') {; gettoken txt lines : lines; gettoken 1 lines : lines; confirm integer number `1'; local txt = trim("`txt'"); if "`txt'"=="LAST_ROW" local txt = _N-3; capture confirm integer number `txt'; if ~_rc {; if `txt'==-3 {; local title_line ""; break, continue; }; local cond "_n==`=`txt'+3'"; }; else {; local cond = cond(missing("`sd2'"), `"d_0=="`txt'""', `"d_0=="`txt'_easytofind1""'); }; foreach var of varlist f_* {; replace `var'=substr(`var',1,7)+cond(`cond' ,trim("`1'"), "") if substr(`var',8,2)=="" & `var'!=""; }; // foreach }; // while }; // lines if ~missing("`sd2'") {; summarize id if strpos(d_0, "easytofind3"), meanonly; local stm = r(mean); drop if strmatch(d_0, "*_easytofind0") & id > `stm'; replace d_0 = substr(d_0, 1, length(d_0)-1) + "0" if id > `stm'; if missing("`brackets'") {; foreach var of varlist f_* {; replace `var' = "9_"+substr(`var',3,7) if strmatch(d_0, "*_easytofind1"); }; // end foreach }; // if }; // if replace l_0 = "" if strmatch(d_0, "*_easytofind1"); replace d_0 = "" if strmatch(d_0, "*_easytofind1"); replace l_0 = "" in 1/3; replace d_0 = "" in 1/3; replace d_0 = subinstr(d_0, "_easytofind0" ,"", .); drop if strmatch(d_0, "easytofind*"); if missing("`nolabel'") {; replace d_0 = l_0 if (l_0 != ""); }; if ~missing(`"`constant'"') {; replace d_0 = `"`constant'"' if d_0=="_cons"; }; if ~`rc' {; // it's a matrix list drop if id==-20; }; if missing("`showeq0'`showeq'") {; drop if id==-10; }; }; //quietly unab vlist : d_*; local rc : word count `vlist'; local --rc; // d_0 was included tempfile tmpfile; tempname ofile outfile; local lsheet "`sheet'"; if ~missing("`replace'") {; local fno "01"; _styles " " `"`fno' `font'"' `"`starchars'"'; local xmlheader " "; file open `outfile' using "`tmpfile'", write; file write `outfile' `"`xmlheader'"' _n; gettoken font size : font; local font "`font' `size'"; local font : list retokenize font; file write `outfile' `"`fno' `font'"' _n; file write `outfile' `"`styles'"' _n; file write `outfile' ""; file write `outfile' "created using xml_tab"; file write `outfile' `"?`lsheet'?"' _n; }; //if else {; // append file open `ofile' using "`save'", read; local lines=1; file read `ofile' line; // header file read `ofile' line; // font list file read `ofile' line; // styles file read `ofile' line; // Description, sheet names if strpos(`"`line'"',"xml_tab")==0 {; display as error "cannot append, existing file was created or changed by some other program"; exit 603; }; while r(eof)==0 {; local ++lines; file read `ofile' line; }; //while local --lines; file close `ofile'; file open `ofile' using "`save'", read; file open `outfile' using "`tmpfile'", write; file read `ofile' line; // header file write `outfile' `"`line'"' _n; file read `ofile' line; // font list findfont `"`line'"' `"`fno' `font'"'; file write `outfile' `"`line'"' _n; file read `ofile' line; // styles _styles `"`line'"' `"`fno' `font'"' `"`starchars'"'; file write `outfile' `"`styles'"' _n; file read `ofile' line; // sheetnames local sheetID=0; local sheet "`lsheet'"; local dfdfdf : subinstr local line "?`lsheet'?" "", all count(local c); while `c'>0 {; local ++sheetID; local lsheet "`sheet' (`sheetID')"; local dfdfdf : subinstr local line "?`lsheet'?" "", all count(local c); }; //while local line : subinstr local line "" "`lsheet'?"; file write `outfile' `"`line'"' _n; forvalues i=3/`lines' {; file read `ofile' line; file write `outfile' `"`line'"' _n; }; //for }; //else file write `outfile' `""'; if `color'>=0 | ~missing("`gridlines'") {; file write `outfile' ""; if `color'>=0 file write `outfile' "`color'"; if ~missing("`gridlines'") file write `outfile' ""; file write `outfile' ""; }; file write `outfile' ""; if ~missing("`cwidth'") {; while ~missing("`cwidth'") {; _parse comma curr cwidth : cwidth; local cwidth : subinstr local cwidth "," ""; gettoken ind wdt : curr; capture confirm integer number `ind'; if _rc continue; if `: list ind in inds' | `ind'>256 | `ind'<0 continue; if missing("`wdt'") local wdt = 0; capture numlist `wdt', range(>=0 <=1000); if _rc continue; file write `outfile' ""; local inds "`inds' `ind'"; }; }; if ~missing("`tblanks'") local addindex =1+`tblanks'; else local addindex =1; if ~missing("`title'") {; local title : subinstr local title "<" "<", all; local title : subinstr local title ">" ">", all; local ltitle " `title'"; file write `outfile' `"`ltitle'"'; }; forvalues i = 1/`=_N' {; local mrg = 0; foreach var of local vlist {; local datum = `var'[`i']; local datum : subinstr local datum "<" "<", all; local datum : subinstr local datum ">" ">", all; if (`"`datum'"'==".x") {; local ++ mrg; continue; }; local fvar = "f" + substr("`var'",2,.); local f = `fvar'[`i']; if ~missing("`f'") local f "`fno'_`f'"; local dtype = cond(upper(substr("`f'", 6, 1))=="N" & real(`"`datum'"')!=., "Number", "String"); if (`mrg'>0) {; local mrgstr "ss:MergeAcross='`mrg''"; }; else {; local mrgstr; }; local xmlrow "`xmlrow' `datum'"; local mrg = 0; }; // var local xmlrow "`xmlrow'"; file write `outfile' `"`xmlrow'"' _n; local xmlrow ""; }; // i file write `outfile' "`starnote'"; if ~missing(`"`notes'"') {; local notes : subinstr local notes "<" "<", all; local notes : subinstr local notes ">" ">", all; local --addindex; while (~missing(`"`notes'"')) {; _parse comma 1 notes : notes; gettoken num txt : 1; capture confirm integer number `num'; if _rc {; local txt "`num' `txt'"; local num=0; }; local ++num; local addindex = `addindex'+`num'; file write `outfile' `"`txt'"'; local notes : subinstr local notes "," ""; }; }; file write `outfile' "
" _n; file write `outfile' "
"; file close _all; capture copy "`tmpfile'" "`save'", replace; if _rc {; display as error "file cannot be saved at this location"; exit 603; }; if "`c(os)'"=="Windows" & missing("`c(mode)'"){; if ~missing(`"`excelpath'"') {; display `"{ stata `"winexec "`excelpath'" "`filename'" "': click here}"' _c; display as text " to open with Excel"; if ~missing("`savepath'") global `savepath' "`excelpath'"; }; if ~missing(`"`calcpath'"') {; display `"{ stata `"winexec "`calcpath'" "`filename'" "': click here}"' _c; display as text " to open with Calc"; }; }; restore; end; /*******************************************************************************/ /*******************************************************************************/ program define Keep, rclass; //adopted from est_table.ado args b spec; tempname RES bt tmp; foreach sp of local spec {; matrix `bt' = `b'; local row = rownumb(`bt', "`sp'"); if `row' == . {; display as error "coefficient `sp' does not occur in any of the models"; exit 198; }; while `row' != . {; if index("`sp'",":") > 0 {; // complete equation spec. matrix `tmp' = `bt'["`sp'",1...]; }; else {; matrix `tmp' = `bt'[`row',1...]; }; matrix `RES' = nullmat(`RES') \ `tmp'; if `row'+rowsof(`tmp')>`=rowsof(`bt')' continue, break; matrix `bt' = `bt'[`=`row'+rowsof(`tmp')'...,1...]; local row = rownumb(`bt', "`sp'"); }; }; capture confirm matrix `RES'; if _rc {; display as error "all variables dropped, nothing to output"; exit 999; }; return matrix result `RES'; end; // Keep program define Drop, rclass; //borrowed from est_table.ado args b spec; tempname bt; matrix `bt' = `b'; foreach sp of local spec {; local isp = rownumb(`bt', "`sp'"); if `isp' == . {; display as error "coefficient `sp' does not occur in any of the models"; exit 198; }; while `isp' != . {; local nb = rowsof(`bt'); if `isp' == 1 {; if (`nb' == 1) {; display as error "all variables dropped, nothing to output"; exit 999; }; matrix `bt' = `bt'[2...,1...]; }; else if `isp' == `nb' {; matrix `bt' = `bt'[1..`=`nb'-1',1...]; }; else {; local im1 = `isp'-1; local ip1 = `isp'+1; matrix `bt' = `bt'[1..`im1',1...] \ `bt'[`ip1'...,1...]; }; local isp = rownumb(`bt', "`sp'"); }; }; return matrix result `bt'; end; // Drop program define keepdrop; syntax anything(name=bbc) [, keep(string) drop(string)]; if ~missing("`keep'") {; if (index("`keep'", "*") + index("`keep'", "?") > 0) expandspec keep `bbc' `"`keep'"'; Keep `bbc' `"`keep'"'; matrix `bbc' = r(result); local reqs : roweq `bbc'; local reqs : list uniq reqs; tempname tmp; foreach req of local reqs {; Keep `bbc' `"`req':"'; matrix `tmp' = nullmat(`tmp') \ r(result); }; matrix `bbc' =`tmp'; }; if ~missing("`drop'") {; if (index("`drop'", "*") + index("`drop'", "?") > 0) expandspec drop `bbc' `"`drop'"'; Drop `bbc' `"`drop'"'; matrix `bbc' = r(result); }; end; // program keepdrop program define GetStats; //borrowed from est_table.ado args stats bs; local r2_a "r2_a"; local r2_p "r2_p"; tempname rank st V; local escalars : e(scalars); local is 1; foreach stat of local stats {; local sr "`stat'"; if inlist("`stat'", "aic", "bic", "rank") {; if missing("`hasrank'") {; capture matrix `V' = syminv(e(V)); local rc = _rc; if `rc' == 0 {; scalar `rank' = colsof(`V') - diag0cnt(`V'); }; else {; if `rc' == 111 {; scalar `rank' = 0; }; else {; matrix `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 "`stat'" == "r2_a" {; if `:list posof "r2_a" in escalars' > 0 {; scalar `st' = e(r2_a); global R2_ : list global(R2_) | r2_a; }; else {; if `:list posof "r2_p" in escalars' > 0 {; scalar `st' = e(r2_p); global R2_ : list global(R2_) | r2_p; }; else {; scalar `st' = .z; }; }; }; else {; if `:list posof "`stat'" in escalars' > 0 {; scalar `st' = e(`stat'); }; else {; scalar `st' = .z; }; }; }; matrix `bs'[`is++',1] = `st'; matrix rownames `bs' =`stats'; }; end; // GetStats program define Mkemat, rclass; syntax [anything] [, STATS(string) STARs(passthru) LOng sd2 cap(string) keep(passthru) drop(passthru) EQuations(string) NOADJust eform(string)]; if missing("`anything'") {; local anything "."; }; gettoken name rest : anything, bind; local nnames = 0; while ~missing("`name'") {; if index("`name'", "(") {; local ++nnames; // just one estimator with nonstandard matrices }; else {; quietly estimates dir `name'; local name "`r(names)'"; local nnames = `nnames'+`: word count `name''; }; local names "`names' `name'"; gettoken name rest : rest, bind; }; tempname bbc bc bbs bs df; matrix `df' = J(`nnames', 1, .z); if ~missing("`stats'") {; local stats : subinstr local stats "," "", all; confirm names `stats'; if (`:list posof "r2_p" in stats' > 0 | `:list posof "r2_a" in stats' > 0) {; local r2_a "r2_a"; local r2_p "r2_p"; local stats : list stats | r2_a; local stats : list stats - r2_p; }; local stats : list uniq stats; local nstat : list sizeof stats; matrix `bs' = J(`nstat', 1, .z); global R2_ ; }; tempname hcurrent esample; _estimates hold `hcurrent', restore nullok estsystem; local ni 0; if missing("`sd2'") {; local x ".x"; }; gettoken first rest : names, bind; while ~missing("`first'") {; local ++ni; gettoken name opts : first, parse("(") bind; nobreak {; if ("`name'" != ".") {; quietly estimates dir `name'; est_unhold `name' `esample'; }; else {; _est unhold `hcurrent'; }; if missing("`opts'") {; // extract options local eb "b"; local eV "V"; local noadj; local leform; }; else {; gettoken 0 : opts, match(par); syntax [anything] [, *]; _get_eformopts , eformopts(`options') allowed(__all__) soptions; local leform `"`s(str)'"'; local udiparm `"`s(options)'"'; // not used yet gettoken eb eV : anything; if missing("`eb'") {; local eb "b"; local eV "V"; local noadj; }; else local noadj `noadjust'; }; capture confirm matrix e(`eb') e(`eV'); if _rc {; display as error "`name' estimation result does not have e(`eb') and/or e(`=trim("`eV'")')"; if ("`name'" != ".") est_hold `name' `esample'; else _est hold `hcurrent', restore nullok estsystem; exit 111; }; tempname B V VV SC tB tV tSTat; matrix `B' = e(`eb'); matrix `V' = e(`eV'); if ~missing("`noadj'") {; capture confirm matrix e(b) e(V); if _rc {; display as error "`name' estimation result does not have e(b) and/or e(V)"; display as error "cannot report unadjasted t-statistics"; if ("`name'" != ".") est_hold `name' `esample'; else _est hold `hcurrent', restore nullok estsystem; exit 111; }; matrix `tB'=e(b); matrix `tV'=e(V); }; matrix `df'[`ni',1] = e(df_r); if ~missing("`stats'") {; GetStats "`stats'" `bs'; matrix `bbs' = J(rowsof(`bs'), 1,.x),`bs', `bs', J(rowsof(`bs'), 1,.x); matrix rownames `bbs' = `: rownames `bs''; matrix roweq `bbs' = easytofind3; if (missing("`long'") & `: word count $R2_'>1) {; global R2_ "r2_a/r2_p"; }; }; local eqname = cond("`name'" != ".", "`name'", `"`e(title)'"'); local ttle`ni' "`e(_estimates_title)'"; if missing("`ttle`ni''") local ttle`ni' "`eqname'"; if "`name'" != "." est_hold `name' `esample'; else _est hold `hcurrent', restore nullok estsystem; }; // nobreak formateqnames `B' `V' "`name'|`ni'"; if ~missing("`noadj'") formateqnames `tB' `tV' "`name'|`ni'"; if issymmetric(`V') {; forvalues v = 1/`=colsof(`B')' {; if (`V'[`v',`v'] > 0) {; matrix `VV' = nullmat(`VV'), sqrt(`V'[`v',`v']); }; else {; if (`B'[1,`v'] == 0) {; matrix `B'[1,`v'] = .d; }; matrix `VV' = nullmat(`VV'), .z; }; }; }; else matrix `VV' =`V'; matrix `bc' = (`B' \ `VV')'; if ~missing(`"`eform'"') local leform `"`eform'"'; if ~missing(`"`leform'"') {; local coef : subinstr local leform "." "", all; capture Drop `bc' "_cons"; if ~_rc matrix `bc' = r(result); }; else local coef "coef"; forvalues i = 1/`=rowsof(`bc')' {; if ~missing("`noadj'") {; matrix `tSTat' = nullmat(`tSTat') \ (`tB'[1, `i']/sqrt(`tV'[`i', `i']), .z);; }; else {; matrix `tSTat' = nullmat(`tSTat') \ (`bc'[`i', 1]/`bc'[`i', 2], .z); }; if ~missing(`"`leform'"') {; matrix `bc'[`i', 1] = exp(`bc'[`i', 1]); matrix `bc'[`i', 2] = `bc'[`i', 1]*`bc'[`i', 2]; }; }; matrix `bc' = `bc', `tSTat'; matrix coleq `bc' = `name'|`ni'; matrix colnames `bc' = "`coef'" `cap' tstat mis; if ~missing("`equations'") & ~missing("`long'") {; AdjustRowEq `bc' `ni' `nnames' "`equations'"; }; matrix `bc' = `bc' \ nullmat(`bbs'); if (`ni' > 1) {; Mat_Capp `bbc' : `bbc' `bc', miss(.z) cons ts; }; else {; matrix `bbc' = `bc'; }; local etitle "`etitle' `x' "`ttle`ni''""; gettoken first rest : rest, match(par) bind; }; // while // move scalars to the end tempname tmpsc tmpst; capture matrix `tmpsc' = `bbc'["easytofind2:",....]; // model scalars if ~_rc {; Drop `bbc' "easytofind2:"; matrix `bbc' = r(result); }; capture matrix `tmpst' = `bbc'["easytofind3:",....]; if ~_rc {; Drop `bbc' "easytofind3:"; matrix `bbc' = r(result); }; keepdrop `bbc', `keep' `drop'; matrix `bbc' = `bbc' \ nullmat(`tmpsc'); matrix `bbc' = `bbc' \ nullmat(`tmpst'); if missing("`long'") {; local etitle; local ceq : coleq `bbc'; local cequ : list uniq ceq; local req : roweq `bbc'; local requ : list uniq req; local rsc "easytofind2"; // model scalars local rst "easytofind3"; // statistics local requ : list requ - rsc; local requ : list requ - rst; tempname wbc wbbc wbbbc J tsc tst tmp ttst ttsc; local nii = 0; foreach col of local cequ {; capture matrix drop `wbbc'; matrix `tmp' = `bbc'[....,"`col':"]; local ni = 0; foreach row of local requ {; matrix `wbc' = `tmp'["`row':",....]; matrix roweq `wbc' =:; matrix `J' =J(`=rowsof(`wbc')', `=colsof(`wbc')', .z); if mreldif(`wbc', `J')>0 {; matrix coleq `wbc'=`row'; if `++ni' > 1 {; Mat_Capp `wbbc' : `wbbc' `wbc', miss(.z) cons ts; local etitle "`etitle' `x' .x"; }; else {; matrix `wbbc' = `wbc'; }; }; }; capture matrix `tsc' = `tmp'["`rsc':",....]; if ~_rc & `ni'>1 {; matrix `tsc' = `tsc', J(rowsof(`tsc'), (`ni'-1)*4, .z); }; capture matrix `tst' = `tmp'["`rst':",....]; if ~_rc & `ni'>1 {; local rownames : rowfullnames `tst'; matrix `tst' = J(rowsof(`tst'), (`ni'-1)*4, .x), `tst'; matrix rowname `tst' =`rownames'; }; if `ni'>1 {; local showeq=1; }; if `ni' {; if `++nii' > 1 {; capture Mat_Capp `wbbbc' : `wbbbc' `wbbc', miss(.z) cons ts; capture matrix `ttsc' = `ttsc', `tsc'; capture matrix `ttst' = `ttst', `tst'; }; else {; matrix `wbbbc' = `wbbc'; capture matrix `ttsc' = `tsc'; capture matrix `ttst' = `tst'; }; local etitle "`etitle' `x' "`ttle`nii''""; }; }; matrix `bbc' =`wbbbc' \ nullmat(`ttsc'); matrix `bbc' =`bbc' \ nullmat(`ttst'); }; if ~missing("`sd2'") {; tempname tmpA; forvalues i = 1/`= rowsof(`bbc')' {; tempname tmpB tmpC; forvalues j = 1/`= colsof(`bbc') / 2' {; local c1 = `j' * 2 - 1; local c2 = `j' * 2; matrix `tmpC' = `bbc'[`i',`c1'..`c2']'; local cnames : colfullnames `tmpC'; matrix colnames `tmpC' = `: word 1 of `: roweq `tmpC'''; matrix `tmpB' = nullmat(`tmpB'), `tmpC'; }; // j matrix rownames `tmpB' = `cnames'_easytofind0 `cnames'_easytofind1; matrix `tmpA' = nullmat(`tmpA') \ `tmpB'; }; // i matrix coleq `tmpA' =`: colnames `tmpB''; matrix colnames `tmpA' =coef/`cap'; matrix `bbc' = `tmpA'; }; if `: word count $R2_'>1 {; global R2_ "r2_a/r2_p"; }; local rnames : rownames `bbc'; local rnames : subinstr local rnames "r2_a" "$R2_"; matrix rownames `bbc' = `rnames'; // get variable labels if available local rnames; tempname tmp; forvalues i = 1/`= rowsof(`bbc')' {; matrix `tmp' =`bbc'[`i',....]; local rn : rownames `tmp'; local rn : subinstr local rn "_easytofind0" ""; local rn : subinstr local rn "_easytofind1" ""; capture local lbl : variable label `rn'; if ("`lbl'"!="" & _rc==0) {; local rn "`lbl'"; }; local rnames "`rnames' "`rn'""; }; tempname n_stars D; getstarchars , `stars'; local rr = rowsof(`bbc'); local rc = colsof(`bbc') / 2; // extra cols of tstats; matrix `n_stars' = J(`rr', `rc', 0); matrix `D' = J(`rr', `rc', .); if missing("`sd2'") {; local base = 2; local sdc = 1; local sdr = 0; }; else {; local base = 1; local sdc = 0; local sdr = 1; }; local cnames_old : colnames `bbc', quoted; local cnames; forvalues j = 1/`rc' {; local jC = int((`j'-0.1)/(1+`sdc'))*(1+`sdc')+`j'; local cnames `"`cnames' `: word `jC' of `cnames_old''"'; forvalues i = 1/`rr'{; matrix `D'[`i',`j']=`bbc'[`i',`jC']; if mod(`j',`sdc'+1)==`sdc' & mod(`i', `sdr'+1)==`sdr' {; local d_tstat = `bbc'[`i',`jC'+`base']; local p = 2*cond(`df'[(`j'+`sdc')/`base',1]==.,1-norm(abs(`d_tstat')), ttail(`df'[(`j'+`sdc')/`base',1],abs(`d_tstat'))); forvalues s =1/`: list sizeof stars' {; if `p'<=`: word `s' of `stars'' {; matrix `n_stars'[`i', `j'] = `s'; continue, break; }; }; if ~missing("`tstat'") {; matrix `D'[`i',`j']=`d_tstat'; }; else {; if ~missing("`pvalue'") {; matrix `D'[`i',`j']=cond(missing(`p'), .z, `p'); }; }; }; }; }; matrix rownames `D' = `: rownames `bbc''; matrix roweq `D' = `: roweq `bbc''; matrix colnames `D' = `cnames'; return matrix coef = `D'; return matrix n_stars = `n_stars'; c_local rnames `"rnames(`rnames')"'; c_local etitle `"`etitle'"'; c_local showeq0 `showeq'; c_local stars `"`stars'"'; c_local starchars `"`starchars'"'; end; // Mkemat program define formateqnames; args B V; local eq : coleq `B'; local eq : subinstr local eq "." "dot", all; // mlogit problem matrix coleq `B' =`eq'; local eq : subinstr local eq "_" "", all word; if missing(trim("`eq'")) {; matrix coleq `B' = `: word 1 of `e(depvar)''; }; else {; local cnames : colfullnames `B'; local ueq : list uniq eq; foreach eqname of local ueq {; local eq : subinstr local eq "`eqname'" "`eqname'", all count(local c); if (`c' == 1) {; local cnames : subinstr local cnames "`eqname':_cons" "easytofind2:/`eqname'", all; }; }; matrix colnames `B' = `cnames'; matrix colnames `V' = `cnames'; //matrix rownames `V' = `cnames'; }; end; // program formateqnames program define AdjustRowEq; // borrowed from est_table.ado args b ni nmodel eqspec; local eqspec : subinstr local eqspec ":" " ", all; local eqspec : subinstr local eqspec "#" "" , all; local beqn : roweq `b'; local beq : list uniq beqn; local iterm 0; gettoken term eqspec : eqspec , parse(","); while ~missing("`term'") {; local ++iterm; gettoken eqname oprest: term, parse("="); gettoken op rest : oprest, parse("="); if trim(`"`op'"') == "=" {; confirm name `eqname'; if ~missing(`"`:list beq & eqname'"') {; display as error "option equations() invalid"; display as error "specified equation name already occurs in model `ni'"; exit 198; }; local term `rest'; }; else {; local eqname #`iterm'; }; local nword : list sizeof term; if ~inlist(`nword', 1, `nmodel') {; display as error "option equations() invalid"; display as error "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'") != "." {; capture confirm integer number `term'; if _rc {; display as error "option equations() invalid"; display as error "`term' was found, while an integer equation number was expected"; exit 198; }; if ~inrange(`term',1,`:list sizeof beq') {; display as error "option equations() invalid"; display as error "equation number `term' for model `ni' out of range"; exit 198; }; if `:list posof "`eqname'" in beq' != 0 {; display as error "impossible to name equation `eqname'"; display as error "you should provide (another) equation name"; exit 198; }; local beqn : subinstr local beqn "`:word `term' of `beq''" "`eqname'" , word all; }; if missing("`eqspec'") {; continue, break; }; gettoken term eqspec: eqspec , parse(","); assert "`term'" == ","; gettoken term eqspec: eqspec , parse(","); }; matrix roweq `b' = `beqn'; end; program define savetodataset; syntax anything [, format(string asis) sd2 RNames(string asis) CEq(string asis) CNames(string asis) etitle(string)]; tokenize `anything'; local D `1'; local rr = rowsof(`D'); local rc = colsof(`D'); capture confirm matrix `2'; if _rc {; tempname D_STARS; matrix `D_STARS' = J(`rr', `rc', 0); }; else local D_STARS `2'; local obs = `rr'+3; set obs `obs'; tempname tmp; readformats `rc' `"`format'"'; generate int id = (_n - 3)*10; generate str d_0 = ""; generate str l_0 = ""; if ~missing("`sd2'") local eas "_easytofind1"; replace d_0 = "EST_NAMES`eas'" in 1; replace d_0 = "SCOL_NAMES`eas'" in 2; replace d_0 = "COL_NAMES`eas'" in 3; forvalues i = 1/`rr' {; matrix `tmp' = `D'[`i',....]; replace d_0 = "`: rownames `tmp''" in `=`i'+3'; local aa : word `i' of `rnames'; replace l_0 = `"`aa'"' in `=`i'+3'; if ("`: roweq `tmp''"!="`roweq'" & "`: roweq `tmp''"!="_") {; set obs `++obs'; replace d_0 = "`: roweq `tmp''" in `obs'; replace id = `i'*10 - 4 in `obs'; local roweq "`: roweq `tmp''"; }; }; forvalues j = 1/`rc' {; matrix `tmp' = `D'[....,`j']; generate str d_`j' = "`: word `j' of `etitle''" in 1; local coleq : word `j' of `ceq'; if missing(`"`coleq'"') local coleq : coleq `tmp'; replace d_`j' = `"`coleq'"' in 2; if `j'>1 replace d_`=`j'-1' = cond(d_`j' == d_`=`j'-1', ".x", `"`coleq1'"') in 2; local coleq1 `"`coleq'"'; local cn : word `j' of `cnames'; if missing("`cn'") local cn : colnames `tmp'; replace d_`j' = "`cn'" in 3; forvalues i = 1/`rr'{; replace d_`j' = cond(`D'[`i',`j']==.z,"",string(`D'[`i',`j'],"%25.0g")) in `=`i'+3'; replace f_`j' = "`= `D_STARS'[`i', `j']'_" + upper(substr(trim(f_`j'),3,5)) in `=`i'+3'; }; // forvalues i summarize id if strpos(d_0, "easytofind3"), meanonly; local stm = r(mean); replace f_`j' = "0_N2200" if inlist(l_0,"N","df_r", "df_m") & id > `stm'; replace f_`j' = "0_N2203" if inlist(l_0,"r2","r2_a", "r2_p", "r2_a/r2_p") & id > `stm'; replace f_`j' = "0_N2202" if l_0=="ll" & id > `stm'; replace f_`j' = "0_N2200" if f_`j'=="" & id > `stm'; replace d_`j' ="" if(d_`j'==".z"); replace d_`j' ="(dropped)" if(d_`j'==".d"); }; // forvalues j replace l_0 = "Number of observations" if l_0=="N" & id > `stm'; replace l_0 = "Log-Likelihood" if l_0=="ll" & id > `stm'; replace l_0 = "R2" if l_0=="r2" & id > `stm'; replace l_0 = "Adjusted R2" if l_0=="r2_a" & id > `stm'; replace l_0 = "Pseudo R2" if l_0=="r2_p" & id > `stm'; replace l_0 = "Adjusted/Pseudo R2" if l_0=="r2_a/r2_p" & id > `stm'; replace l_0 = d_0 if l_0==""; replace f_0 = "0_S2110" if f_0==""; end; program define readformats; args ni format; local format : subinstr local format "," "", all; gettoken first rest : format, bind; if missing("`rest'") {; local rest "`format'"; }; else {; local format "`rest'"; }; local first : subinstr local first "(" "", all; local first : subinstr local first ")" "", all; tokenize "`first'"; generate str f_0 = "0_`=substr("`1'", 1, 5)'"; if ~missing("`2'") {; local j=2; local i=4; while `i'<=_N {; if missing("``j''") local j=2; else {; replace f_0="0_`=substr("``j''", 1, 5)'" in `i'; local ++j; local ++i; }; }; }; local i=1; while `i'<=`ni' {; gettoken first rest : rest, match(p) bind; local first : subinstr local first "(" "", all; local first : subinstr local first ")" "", all; tokenize "`first'"; generate str f_`i' = "0_`=substr("`1'", 1, 5)'"; if ~missing("`2'") {; local j=2; local k=4; while `k'<=_N {; if missing("``j''") local j=2; else {; replace f_`i'="0_`=substr("``j''", 1, 5)'" in `k'; local ++j; local ++k; }; }; }; local ++i; if missing("`rest'") {; local rest "`format'"; }; }; end; program define _styles; args styles font starchars; gettoken fno font : font; gettoken font size : font; local font = proper("`font'"); if ~missing("`size'") {; capture confirm number `size'; if _rc {; display as error "'`size'' found where font size expected"; exit 7; }; local size "ss:Size='`=trim("`size'")''"; }; local flist; foreach var of varlist f_* {; forvalues i=1/`=_N' {; local f=`var'[`i']; local flist "`flist' `f'"; }; }; local flist : list uniq flist; local styles : subinstr local styles ""; local styles "`styles'"; }; //if local 0 = 0; local 1 = 1; local 2 = 2; local 3 = 3; local 4 = 4; foreach f in `flist' {; local styles : subinstr local styles "'s`fno'_`f''" "'s`fno'_`f''", all count(local cc); if `cc' continue; local lwrap = cond(upper(substr(`"`f'"', 3, 1))=="N", "", "ss:WrapText='1'"); local vert=upper(substr(`"`f'"', 4, 1)); local T = 1; local C = 2; local B = 3; if "``vert''"=="1" local V "ss:Vertical='Top'"; else if "``vert''"=="2" local V "ss:Vertical='Center'"; else if "``vert''"=="3" local V "ss:Vertical='Bottom'"; else local V ""; local hori=upper(substr(`"`f'"', 5, 1)); local L = 1; local R = 3; if "``hori''"=="1" local H "ss:Horizontal='Left'"; else if "``hori''"=="2" local H "ss:Horizontal='Center'"; else if "``hori''"=="3" local H "ss:Horizontal='Right'"; else local H ""; local face=upper(substr(`"`f'"', 6, 1)); local R = 0; local B = 1; local I = 2; local O = 3; local U = 4; if "``face''"=="1" local B "ss:Bold='1'"; else if "``face''"=="2" local B "ss:Italic='1'"; else if "``face''"=="3" local B "ss:Bold='1' ss:Italic='1'"; else if "``face''"=="4" local B "ss:Underline='Single'"; else local B ""; local digt=substr(`"`f'"', 7, 1); if ("`digt'" == "8") local digt ="0.00000000"; else if ("`digt'" == "9") local digt ="0.000000000"; else local digt =string(0,"%9.`digt'f"); local bline=substr(`"`f'"', 8, 2); if "`bline'"=="1" {; local BR ""; }; else if "`bline'"=="2" {; local BR ""; }; else if "`bline'"=="3" {; local BR " "; }; else if "`bline'"=="4" {; local BR " "; }; else if "`bline'"=="5" {; local BR " "; }; else if "`bline'"=="6" {; local BR " "; }; else if "`bline'"=="7" {; local BR " "; }; else if "`bline'"=="8" {; local BR " "; }; else if "`bline'"=="9" {; local BR " "; }; else if "`bline'"=="10" {; local BR " "; }; else if "`bline'"=="11" {; local BR " "; }; else if "`bline'"=="12" {; local BR " "; }; else if "`bline'"=="13" {; local BR " "; }; else local BR; local nstars=substr(`"`f'"', 1, 1); if (`nstars' == 9) local fmt "(#,##`digt');(-#,##`digt')"; else {; if (`nstars'>0 ) {; local char : word `nstars' of `starchars'; }; else local char; local fmt "#,##`digt'"`char'";-#,##`digt'"`char'""; }; local styles "`styles'"'; }; c_local styles "