*! version 1.0.1 12aug98 STB-46 sg97 * * syntax: outreg [varlist] using filename [, SE noLabel Bdec(int 3) Tdec(int 2) * noPAren noASter noCONs noNOBs noNI noR2 ADjr2 noNOTes * COMma APpend REPLACE] * program define outreg version 5.0 * write formatted regression output to file local varlist "opt ex none" local using "req noprefix" local options "SE noLabel Bdec(int 3) Tdec(int 2) noPAren noASter noCONs noNOBs noNI noR2 ADjr2 noNOTes COMma APpend REPLACE" parse "`*'" tempname regobs n_k rsq adjrsq numi scalar `n_k' = . scalar `rsq' = . scalar `adjrsq' = . scalar `numi' = . local depvar $S_E_depv local robust = lower("$S_E_vce") local ivar "." local univar = 1 /* univariate (single equation) regression */ /* linear regression models */ if ("$S_E_cmd"=="regress" | "$S_E_cmd"=="anova" | "$S_E_cmd"=="corc" /* */| "$S_E_cmd"=="fit" | "$S_E_cmd"=="glogit"| "$S_E_cmd"=="gprobit" /* */| "$S_E_cmd"=="regdw") { scalar `regobs' = _result(1) scalar `n_k' = _result(5) scalar `rsq' = _result(7) scalar `adjrsq' = _result(8) } /* panel data models */ else if "$S_E_cmd"=="xtreg" | "$S_E_cmd"=="xtgee" | "$S_E_cmd"=="xtgls" /* */ | "$S_E_cmd"=="xtpois" | "$S_E_cmd"=="xtprobit" { if ("$S_E_cmd"=="xtreg" & ("$S_E_cmd2"=="xtreg_fe" | /* */ "$S_E_cmd2"=="xtreg_be" | "$S_E_cmd2"=="xtreg_re")) { scalar `regobs' = scalar(S_E_nobs) scalar `numi' = scalar(S_E_n) local ivar $S_E_ivar if ("$S_E_cmd2"=="xtreg_fe" | "$S_E_cmd2"=="xtreg_be") { scalar `n_k' = $S_E_tdf } } else { scalar `regobs' = $S_E_nobs if "$S_E_cmd2"~="xtreg_ml" { local ivar $S_E_ivar if "$S_E_cmd"=="xtgls" {scalar `numi' = $S_E_ng} else {scalar `numi' = $S_E_ncl} } } } /* multi-equation models */ else if "$S_E_cmd"=="sureg" | "$S_E_cmd"=="mvreg" | "$S_E_cmd"=="reg3" { if "`varlist'"~="" { di in red "varlist not allowed after multivariate regression" exit 101 } else { local univar = 0 /* multivariate (multiple equation) regression */ local neq $S_E_neq if "$S_E_cmd"=="reg3" { local eqlist $S_E_eqns local r2 "nor2" /* R2 not yet in compatible form in reg3 macros */ } else { local eqlist $S_E_elis scalar `n_k' = $S_E_tdf } scalar `regobs' = $S_E_nobs local r2list $S_E_r2 } } /* models reporting nobs etc. with S_E macros */ else if "$S_E_cmd"=="areg" | "$S_E_cmd"=="bsqreg" | "$S_E_cmd"=="cnsreg" /* */| "$S_E_cmd"=="eivreg" | "$S_E_cmd"=="ereg" | "$S_E_cmd"=="gnbreg" /* */| "$S_E_cmd"=="heckman"| "$S_E_cmd"=="hlu" | "$S_E_cmd"=="intreg" /* */| "$S_E_cmd"=="nbreg" | "$S_E_cmd"=="newey" | "$S_E_cmd"=="nl" /* */| "$S_E_cmd"=="poisson"| "$S_E_cmd"=="prais" | "$S_E_cmd"=="qreg" /* */| "$S_E_cmd"=="stereg" | "$S_E_cmd"=="stweib" |"$S_E_cmd"=="svylogit" /* */|"$S_E_cmd"=="svyprobt"| "$S_E_cmd"=="svyreg" | "$S_E_cmd"=="vwls" /* */| "$S_E_cmd"=="weibull" { scalar `regobs' = $S_E_nobs if "$S_E_cmd"~="poisson" & "$S_E_cmd"~="svylogit"&"$S_E_cmd"=="svyprobt"/* */& "$S_E_cmd"~="svyreg" & "$S_E_cmd"~="vwls" { scalar `n_k' = $S_E_tdf } if "$S_E_cmd"=="nl" { scalar `rsq' = $S_E_rsq scalar `adjrsq' = $S_E_rsqa } } /* models using Stata internal [R]maximize */ else if "$S_E_cmd"=="blogit" | "$S_E_cmd"=="bprobit"|"$S_E_cmd"=="clogit" /* */| "$S_E_cmd"=="cnreg" | "$S_E_cmd"=="cox" |"$S_E_cmd"=="dprobit" /* */| "$S_E_cmd"=="glm" | "$S_E_cmd"=="logistic"|"$S_E_cmd"=="logit" /* */| "$S_E_cmd"=="mlogit" | "$S_E_cmd"=="ologit" |"$S_E_cmd"=="oprobit" /* */| "$S_E_cmd"=="probit" | "$S_E_cmd"=="rreg" |"$S_E_cmd"=="stcox" /* */| "$S_E_cmd"=="tobit" { scalar `regobs' = _result(1) } quietly { preserve tempname b vc coefcol varname tempfile bcopy mat `b' = get(_b) mat `b' = `b'' mat `vc' = get(VCE) mat `vc' = vecdiag(`vc') mat `vc' = `vc'' if `univar' { if "$S_E_cmd2"=="xtreg_ml" { /* get rid of sigmas incl. in _b */ mat `b' = `b'["`depvar':",.] mat `vc' = `vc'["`depvar':",.] } coeftxt `varlist', `se' `label' bdec(`bdec') tdec(`tdec') `paren' `aster' `cons' `nobs' `ni' `r2' `adjr2' `notes' `comma' `append' regobs(`regobs') n_k(`n_k') rsq(`rsq') adjrsq(`adjrsq') numi(`numi') ivar(`ivar') depvar(`depvar') `robust' b(`b') vc(`vc') bcopy(`bcopy') coefcol(`coefcol') varname(`varname') if "`append'"=="append" { appfile using `using', coefcol(`coefcol') varname(`varname') outsheet v* `coefcol' using "`using'", nonames noquote `comma' replace drop v* } else { noi outsheet `varname' `coefcol' using "`using'", nonames noquote `comma' `replace' } } else { /* multiple equation regression */ tempname b_eq vc_eq local eq = 1 while `eq' <= `neq' { restore, preserve /* to access variable labels after first equation */ local eqname: word `eq' of `eqlist' eq ? `eqname' local depvar: word 1 of $S_1 local r2str: word `eq' of `r2list' scalar `rsq' = real("`r2str'") mat `b_eq' = `b'["`eqname':",.] mat `vc_eq' = `vc'["`eqname':",.] if `eq' == 1 & "`append'"~="append" {local apptmp ""} else {local apptmp "append"} coeftxt, `se' `label' bdec(`bdec') tdec(`tdec') `paren' `aster' `cons' `nobs' `ni' `r2' `adjr2' `notes' `comma' `apptmp' regobs(`regobs') n_k(`n_k') rsq(`rsq') adjrsq(`adjrsq') numi(`numi') depvar(`depvar') `robust' b(`b_eq') vc(`vc_eq') bcopy(`bcopy') coefcol(`coefcol') varname(`varname') if `eq' == 1 & "`append'"~="append" { noi outsheet `varname' `coefcol' using "`using'", nonames noquote `comma' `replace' } else { appfile using `using', coefcol(`coefcol') varname(`varname') outsheet v* `coefcol' using "`using'", nonames noquote `comma' replace drop v* } local eq = `eq' + 1 } } } /* for quietly */ end program define coeftxt version 5.0 * convert vectors b and vc into coefficient and t-statistics text + variable name text local varlist "opt ex none" local options "SE noLabel BDEC(int 3) TDEC(int 2) noPAren noASter noCONs noNOBs noNI noR2 ADjr2 noNOTes APpend regobs(string) n_k(string) rsq(string) adjrsq(string) numi(string) ivar(string) depvar(string) robust b(string) vc(string) bcopy(string) coefcol(string) varname(string)" parse "`*'" tempvar beta st_err tstat dotloc lead0 astrix mrgrow local bdecno = 10^(-`bdec') local tdecno = 10^(-`tdec') local zeros "00000000000000000000000" local maxdec = max(`bdec', `tdec') local zeros = substr("`zeros'",1,`maxdec') if ("`label'"=="" & "`depvar'"~="") {local depname : var label `depvar'} if "`depname'"=="" {local depname "`depvar'"} if (`numi'~=. & "`ni'"~="noni") { if ("`label'"=="" & "`ivar'"~=".") {local iname : var label `ivar'} if "`iname'"=="" {local iname "`ivar'"} if "`iname'"=="." {local iname "groups"} } /* in case varlist is specified: */ tempname arow newb newvc local vname : word 1 of `varlist' local i=1 while "`vname'"~="" { local j = rownumb(`b',"`vname'") if `j'==. { di in red "`vname' not found in regression coefficients" exit 111 } matrix `arow' = `b'[`j',.] matrix `newb' = `newb'\ `arow' matrix `arow' = `vc'[`j',.] matrix `newvc' = `newvc'\ `arow' local i = `i'+1 local vname : word `i' of `varlist' } if "`varlist'"~="" { if "`cons'"~="nocons" { /* add the constant unless "nocons" is chosen */ local j = rownumb(`b',"_cons") matrix `arow' = `b'[`j',.] matrix `newb' = `newb'\ `arow' matrix `arow' = `vc'[`j',.] matrix `newvc' = `newvc'\ `arow' } matrix `b' = `newb' matrix `vc' = `newvc' } else if "`cons'"=="nocons" { /* delete the constant if "nocons" is chosen */ local j_1 = rownumb(`b',"_cons")-1 matrix `b' = `b'[1..`j_1',.] matrix `vc' = `vc'[1..`j_1',.] } local brows = rowsof(`b') gen double `beta' = matrix(`b'[_n, 1]) in 1/`brows' keep if `beta'~=. gen double `st_err' = matrix(`vc'[_n, 1]) in 1/`brows' replace `st_err' = sqrt(`st_err') gen double `tstat' = abs(`beta'/`st_err') gen str31 `varname' = "" local bnames : rownames(`b') local bname : word 1 of `bnames' local i 1 while "`bname'"~="" { if "`bname'"~="_cons" { if "`label'"=="" {local blabel : var label `bname'} else {local blabel ""} } else { local blabel "Constant" } if "`blabel'"=="" { local blabel "`bname'" } replace `varname' = "`blabel'" if `i'==_n local i = `i'+1 local bname : word `i' of `bnames' } /* get rid of original data since labels accessed */ keep `varname' `beta' `tstat' `st_err' gen `mrgrow' = 2*_n + 1 + ("`append'"=="append") if "`aster'"~="noaster" { if `n_k'==. { scalar Tcrit1 = invnorm(0.99) scalar Tcrit5 = invnorm(0.95) } else { scalar Tcrit1 = invt(`n_k',0.99) scalar Tcrit5 = invt(`n_k',0.95) } gen str2 `astrix' = "*" if `tstat'>=Tcrit5 replace `astrix' = "**" if `tstat'>=Tcrit1 } else { gen str2 `astrix' = "" } if "`paren'"~="noparen" { local lparen "(" local rparen ")" } else { local lparen "" local rparen "" } if "`se'"~="se" { gen str9 `coefcol' = string(round(`tstat',`tdecno')) local t_bdec `tdec' } else { gen str9 `coefcol' = string(round(`st_err',`bdecno')) local t_bdec `bdec' } gen `dotloc' = index(`coefcol', ".") replace `coefcol' = substr(`coefcol'+"`zeros'", 1, `dotloc'+`t_bdec') if `dotloc' > 0 replace `coefcol' = `coefcol'+"."+substr("`zeros'",1,`t_bdec') if `dotloc' == 0 replace `coefcol' = "0" + `coefcol' if `dotloc'==1 replace `coefcol' = "-0" + substr(`coefcol',2,length(`coefcol')) /* */ if index(`coefcol', "-")==1 & `dotloc'==2 replace `coefcol' = "`lparen'" + `coefcol' + "`rparen'" + `astrix' sort `mrgrow' save `bcopy', replace replace `mrgrow' = `mrgrow'-1 replace `coefcol' = string(round(`beta',`bdecno')) replace `dotloc' = index(`coefcol', ".") replace `coefcol' = substr(`coefcol'+"`zeros'", 1, `dotloc'+`bdec') if `dotloc' > 0 replace `coefcol' = `coefcol'+"."+substr("`zeros'",1,`bdec') if `dotloc' == 0 replace `coefcol' = "0" + `coefcol' if `dotloc'==1 replace `coefcol' = "-0" + substr(`coefcol',2,length(`coefcol')) /* */ if index(`coefcol', "-")==1 & `dotloc'==2 sort `mrgrow' merge `mrgrow' using `bcopy' replace `varname' = " " if _merge==2 drop `beta' `st_err' `tstat' `astrix' `dotloc' _merge sort `mrgrow' save `bcopy', replace drop `varname' `coefcol' local coefrow = 2*`brows'+1+("`append'"=="append") local totrows = `coefrow' + ("`nobs'"~="nonobs") + /* */(`numi'~=.) + ("`r2'"~="nor2"&`rsq'~=.) + /* */("`notes'"~="nonotes"&"`append'"~="append")*(1+("`aster'"~="noaster")) local minobs = max(1000,`brows') set obs `minobs' /* obs must be set to >= 100 (depending on matsize?) */ keep if _n <= `totrows' replace `mrgrow' = _n sort `mrgrow' merge `mrgrow' using `bcopy' sort `mrgrow' drop _merge replace `coefcol' = "`depname'" if _n==1 & ("`append'"~="append") replace `coefcol' = "`depname'" if _n==2 & ("`append'"=="append") if "`nobs'"~="nonobs" { local coefrow = `coefrow'+1 replace `varname' = "Observations" if _n==`coefrow' replace `coefcol' = string(`regobs') if _n==`coefrow' } if (`numi'~=. & "`ni'"~="noni") { local coefrow = `coefrow'+1 replace `varname' = "Number of `iname'" if _n==`coefrow' replace `coefcol' = string(`numi') if _n==`coefrow' } if "`r2'"~="nor2" & `rsq'~=. { local coefrow = `coefrow'+1 if "`adjr2'"~="adjr2" { replace `varname' = "R-squared" if _n==`coefrow' replace `coefcol' = string(round(`rsq',`tdecno')) if _n==`coefrow' /* same decimal places for rsq as for tstats */ } else { replace `varname' = "Adjusted R-squared" if _n==`coefrow' replace `coefcol' = string(round(`adjrsq',`tdecno')) if _n==`coefrow' } gen `dotloc' = index(`coefcol', ".") if _n==`coefrow' replace `coefcol' = substr(`coefcol'+"`zeros'", 1, `dotloc'+`tdec') if _n==`coefrow' & `dotloc' > 0 replace `coefcol' = `coefcol'+"."+substr("`zeros'",1,`tdec') if _n==`coefrow' & `dotloc' == 0 replace `coefcol' = "0"+`coefcol' if _n==`coefrow' & `dotloc' == 1 } if "`notes'"~="nonotes" & "`append'"~="append" { local coefrow = `coefrow'+1 if "`se'"~="se" { if `n_k'~=. { local t_or_z "t" } else { local t_or_z "z" } if "`robust'"=="robust" { replace `varname' = "Robust `t_or_z'-statistics in parentheses" if _n==`coefrow' } else{ replace `varname' = "Absolute value of `t_or_z'-statistics in parentheses" if _n==`coefrow' } } else { if "`robust'"=="robust" { replace `varname' = "Robust standard errors in parentheses" if _n==`coefrow' } else{ replace `varname' = "Standard errors in parentheses" if _n==`coefrow' } } if "`aster'"~="noaster" { local coefrow = `coefrow'+1 replace `varname' = "* significant at 5% level; ** significant at 1% level" if _n==`coefrow' } } end /* coeftxt */ program define appfile version 5.0 * append regression results to pre-existing file local using "req noprefix" local options "varname(string) coefcol(string)" parse "`*'" tempname vorder vartmp varsml tempfile tmpf1 gen str80 `vartmp' = `varname' replace `vartmp' = "0" if _n==1 replace `vartmp' = `vartmp'[_n-1]+"1" if trim(`vartmp')=="" keep `varname' `coefcol' `vartmp' sort `vartmp' save `tmpf1', replace if index("`using'", ".")==0 {local using = "`using'"+".out"} insheet using "`using'", nonames clear gen str80 `vartmp' = v1 replace `vartmp' = "01" if _n==1 & v2~="(1)" replace `vartmp' = "0" if _n==1 & v2=="(1)" replace `vartmp' = `vartmp'[_n-1]+"1" if `vartmp'=="" gen `vorder' = _n+(1*(v2[1]~="(1)")) sort `vartmp' merge `vartmp' using `tmpf1' gen str10 `varsml' = `vartmp' count if (`varsml'=="Constant" | `varsml'=="Constant1" /* */| `varsml'=="Observatio" | `varsml'=="R-squared" /* */| `varsml'=="Adjusted R" | `varsml'=="Robust t-s" /* */| `varsml'=="Robust z-s" | `varsml'=="Absolute v" /* */| `varsml'=="Robust sta" | `varsml'=="Standard e" /* */| `varsml'=="* signific" | `varsml'=="Number of ") local noncoef = _result(1) count if _merge==2 local newcoef = _result(1) count if v2=="(1)" local endcoef = _N + 1*(_result(1)==0) - `noncoef' - `newcoef' replace `vorder' = `vorder'+_N-`endcoef' if `vorder'>`endcoef' & `vorder'~=. replace `vorder' = _n if `vorder'==. replace `vorder' = 1 if `vartmp'=="0" sort `vorder' replace v1 = `varname' if v1=="" & `varname'~="" drop `vorder' `varname' `vartmp' `varsml' _merge describe local numcol = _result(2)-1 if (`numcol'==2) { replace v2 = "(1)" if _n==1 replace `coefcol' = "(2)" if _n==1 } else { replace `coefcol' = "(" + string(`numcol') + ")" if _n==1 } end /* appfile */