******************************************************************************************************************************** ** STACKED REGRESSION ANALYSIS for MULTIPLE TESTING (Michael Oberfichtner & Harald Tauchmann) ********************************** ******************************************************************************************************************************** *! version 1.3.2 2020-04-18 /* minimal editing to zero of varaiance-covariance matrix */ *! version 1.3.1 2020-02-20 /* fix for matrix-functions under Stata < 16 */ *! version 1.3 2020-01-27 /* constrained estimation */ *! version 1.2.4 2020-01-16 /* option sreshape */ *! version 1.2.3 2019-11-12 /* renaming equations for more than 10 depvars fixed */ *! version 1.2.2 2019-11-05 /* revised option df() */ *! version 1.2.1 2019-11-03 /* revised degrees-of-freedom correction */ *! version 1.2 2019-10-18 /* option fe: within-transformation */ *! version 1.1.1 2019-10-17 /* degrees-of-freedom correction */ *! version 1.1 2019-10-09 /* cgmreg as alt. to regress */ *! version 1.0 2019-09-17 cap program drop stackreg program stackreg, eclass ** CHECK VERSION (For Handling Unicode Variables) ** if `c(stata_version)' < 14 { local subinstr "subinstr" local strlen "strlen" local strpos "strpos" local strrpos "strrpos" version 12 } else { local subinstr "subinstr" local strlen "ustrlen" local strpos "ustrpos" local strrpos "ustrrpos" version 14 } if !replay() { quietly { ** STORE COMMANDLINE ENTRY ** local cmd "stackreg" local cmdline "`cmd' `*'" ** DISPLAY-FORMAT for WARNINGS ** local ls = c(linesize)-7 ** SYNTAX ** syntax anything(equalok) [if/] [in] [pweight fweight aweight iweight/], [CLUster(varlist)] [DEPName(string asis)] [noCONStant] [noCOMmon] [FE] [DF(string asis)] [Wald] [SReshape] [FAVORSpace(integer 0)] [Constraints(numlist integer)] [EDITtozero(real 1)] /* */ [LEVel(real `c(level)')] [noci] [noPValues] [OMITted] [EMPTYcells] [VSQUISH] [BASElevels] [ALLBASElevels] [noFVLABel] [fvwrap(passthru)] [fvwrapon(passthru)] [CFORMAT(passthru)] [PFORMAT(passthru)] [SFORMAT(passthru)] [nolstretch] ** TEMPORARY VARIABLES ** tempvar _one _tempw _depname _exp _tempid _esamp _clust ** TEMPORARY OBJECTS ** tempname _bb _VV _dofeq _rank _VVk _Cns _Mcns _tVV _tbb _tdfc ** TEMPFILES ** tempfile _esampfile if "`fe'" == "fe" { tempfile _nowitrans _witrans _witransk tempvar _tag } ** PARSE ANYTHING ** tokenize `anything', parse("=") if "`4'" != "" | ("`2'" != "=" & "`2'" != "==") | "`1'" == "" | "`3'" == "" { noi di as error "{p 0 2 2 `ls'}invalid syntax, check how '{bf:=}' enters command{p_end}" exit 198 } local lhsvars "`1'" local rhsvars "`3'" ** CHECK THAT lhsvars AND rhsvars ARE MUTUALLY EXCLUSIVE ** local exclul : list lhsvars & rhsvars if "`exclul'" != "" { noi di as error "{p 0 2 2 `ls'}{bf:`exclul'} element of depvars and indepvars, must be mutually exclusive{p_end}" exit 198 } ** HANDLE OPTION DF() ** if "`df'" == "" { local df "adjust" } if "`df'" != "adjust" & "`df'" != "raw" & "`df'" != "areg" { noi di as error "{p 0 2 2 `ls'}dftype {bf:`df'} not allowed{p_end}" exit 198 } ** HANDLE OPTION DEPNAME ** if "`depname'" == "" { local depname "__x" } ** CONFIRM THAT POTENTIAL VARIABLE NAMES DO NOT CAUSE PROBLEMS ** local _varabbrev = c(varabbrev) set varabbrev on capture unab varnew: `depname'* if _rc == 0 { noi di as error "{p 0 2 2 `ls'}data must not contain variables starting with prefix `depname'. Please specify alternative prefix using the option depname.{p_end}" exit 198 } set varabbrev `_varabbrev' ** HANDLE OPTION NOCONSTANT ** if "`constant'" != "noconstant" { local consn "_cons" local consv "_one" local consr "c." } ** HANDLE OPTIONS EMPTYCELLS OMITTED ** if "`emptycells'" == "" { local emptycells "noemptycells" } if "`omitted'" == "" { local omitted "noomitted" } ** HANDLE OPTION FAVORSPACE ** if "`sreshape'" == "sreshape" { if `favorspace' < 0 | `favorspace' > 4 { local favorspace = 0 } } ** SAVE TEMPORARY ID-VARIABLE ** gen double `_tempid' = _n ** STORE ORIGINAL DATA ** preserve ** MANAGE OPTION if if "`if'" != "" { local iff "if `if'" } else { local iff "" } ** MANAGE OPTION in if "`in'" != "" { local inn "in `in'" } else { local inn "" } ** MANAGE WEIGHT ** if "`exp'" != "" { gen `_tempw' = `exp' local wvar "`_tempw'" local wexp "[`weight' = `_tempw']" } ** CHECK PANEL-DATA DECLARATION if OPTION FE is SPECIFIED ** if "`fe'" == "fe" { _xt local ivar "`r(ivar)'" local tvar "`r(tvar)'" if "`cluster'" == "" & "`df'" != "areg" { local cluster "`ivar'" } } ** MANAGE OPTION CLUSTER ** if "`cluster'" == "" { local cluster "`_tempid'" } confirm variable `cluster' local kclust : list sizeof local(cluster) if `kclust' == 1 { local estimator "regress" local max "" } else { cap which cgmreg if _rc != 0 { noi display as error "{p 0 2 2 `ls'}multi-way clustering reqires cgmreg.ado to be installed{p_end}" exit 198 } else { local estimator "cgmreg" } } ** CHECK OPTION FOR OPTION-CLASH: CONSTRAINTS vs. CLUSTER ** if "`constraints'" != "" { if "`estimator'" == "cgmreg" { noi display as error "{p 0 2 2 `ls'}option constraints() cannot be combined with multi-way clustering{p_end}" exit 198 } else { local estimator "cnsreg" } } else { local dropconst "noconstant" } ** CHECK IF lhs-VARIABLES ARE SPECIFIED ** if "`lhsvars'" == "" { noi di as error "{p 0 2 2 `ls'}at least one x variable must be specified{p_end}" exit 102 } ** GENERATE CONSTANT ** cap gen byte `_one' = 1 ** CHECK IF LHSVARS INCLUDES TS or FV VARIABLES ** fvrevar `lhsvars' `iff' `inn', list local blhsvars "`r(varlist)'" local fv : list local(lhsvars) === local(blhsvars) ** IF VARLIST does NOT INCLUDE FACTOR-VARIABLES ** if `fv' == 1 { local cnl "`lhsvars'" local cnl : list retokenize cnl local cc 0 local xkeep "" foreach vv of varlist `lhsvars' { local cc = `cc'+1 rename `vv' `_depname'`cc' local xkeep "`xkeep' `_depname'`cc'" } } ** IF FACTOR-VARIABLES INCLUDED in LHSVARS ** if `fv' == 0 { ** HANDLE FACTORVARIABLES ** fvexpand `lhsvars' `iff' `inn' local cnl "`r(varlist)'" local cnl : list retokenize cnl fvrevar `lhsvars' `iff' `inn' local tlhsvars "`r(varlist)'" local cc 0 local xkeep "" foreach vv of varlist `tlhsvars' { local cc = `cc'+1 rename `vv' `_depname'`cc' local xkeep "`xkeep' `_depname'`cc'" } } ** NUMBER of LHS-VARIABLES ** local kk: list sizeof local(cnl) ** CHECK IF RHS-VARS INCLUDES TS or FV VARIABLES ** fvrevar `rhsvars' `iff' `inn', list local brhsvars "`r(varlist)'" local fv : list local(rhsvars) === local(brhsvars) if `fv' == 1 { local cnr "`rhsvars' `consn'" local cnr : list retokenize cnr local rhskeep "`rhsvars'" } else { fvexpand `rhsvars' `iff' `inn' local cnr "`r(varlist)' `consn'" local cnr : list retokenize cnr fvrevar `rhsvars' `iff' `inn', list local rhskeep "`r(varlist)'" } ** NUMBER of RHS-VARIABLES ** local jj : list sizeof local(cnr) ** KEEP ONLY REQUIRED OBSERVATIONS ** if "`if'" != "" | "`in'" != "" { keep `iff' `inn' } ** KEEP ONLY REQUIRED VARIABLES ** if "`fe'" != "fe" { keep `_tempid' `xkeep' `rhskeep' `wvar' `_one' `cluster' } else { keep `_tempid' `xkeep' `rhskeep' `wvar' `_one' `cluster' `ivar' `tvar' } ** DROP OBS. WITH ANY MISSINGS in RHS (WEIGHT, CLUSTER and PANEL) VARIABLES ** foreach vv of varlist `rhskeep' `wvar' `cluster' `_one' `r(ivar)' { local rhscom "`rhscom' & `vv' <." } keep if `_tempid' <. `rhscom' ** DROP OBS WITH ANY MISSINGS in LHS VARIBALES IF OPT. COMMON and DETERMINE ORG. SAMPLE-SIZE ** if "`common'" != "nocommon" { local bool "&" } else { local bool "|" } foreach vv of varlist `xkeep' { local lhscom "`lhscom' `bool' `vv' <." } if "`common'" != "nocommon" { keep if `_tempid' <. `lhscom' local norg = _N } else { count if `_tempid' >. `lhscom' local norg = r(N) } ** EXPAND ESTIMATION-SAMPLE using RESHAPE or SRESHAPE and KEEPING ONLY OBS. WITH NON-MISSING INOERMATION IN DEPVAR ** if "`sreshape'" == "sreshape" { cap which sreshape if _rc == 0 & `c(stata_version)' >= 13 { sreshape long `_depname', i(`_tempid') j(`_exp') missing(drop all) nopreserve favorspace(`favorspace') } else { if _rc != 0 { noi display as error "{p 0 2 2 `ls'}option sreshape reqires sreshape.ado to be installed; option sreshape ignored{p_end}" } if `c(stata_version)' < 13 { noi display as error "{p 0 2 2 `ls'}sreshape.ado reqires stata version 13 or higher; option sreshape ignored{p_end}" } reshape long `_depname', i(`_tempid') j(`_exp') keep if `_depname' <. } else { sreshape long `_depname', i(`_tempid') j(`_exp') missing(drop all) nopreserve favorspace(`favorspace') } } else { reshape long `_depname', i(`_tempid') j(`_exp') keep if `_depname' <. } ** COMPRESS WORKING-DATA ** compress if "`fe'" == "fe" { ** SORT (FOR LATER MERGE) IF WITHIN-TRANSORMATION IS APPLIED ** sort `_exp' `_tempid' } ** FVVAR-SYNTAX FOR ESTIMATION ** forvalues ss = `kk'(-1)1 { fvexpand i(`ss')`_exp'#c.(`rhsvars' `consr'``consv'') local regnamesk "`r(varlist)'" fvrevar i(`ss')`_exp'#c.(`rhsvars' `consr'``consv'') local reglistk "`r(varlist)'" ** EUQATION-SPECIFIC OBSERVATION NUMBERS ** if "`common'" == "nocommon" { count if `_exp' == `ss' local n_`ss' = r(N) if "`estimator'" != "cgmreg" { egen `_clust' = tag(`cluster') if `_exp' == `ss' count if `_clust' local m_`ss' = r(N) cap drop `_clust' } else { local m_`ss' =. foreach vv of varlist `cluster' { egen `_clust' = tag(`cluster') if `_exp' == `ss' count if `_clust' local m_`ss' = min(`m_`ss'',r(N)) cap drop `_clust' } } if `ss' != `kk' & "`hetn'" != "1" { local ssp = `ss'+1 if `n_`ss'' != `n_`ssp'' { local hetn = 1 } } } ** WITHIN-TRANSFORMATION ** if "`fe'" == "fe" { save `_nowitrans', replace keep if `_exp' == `ss' egen `_tag' = tag(`ivar') count if `_tag' local dffen = r(N) if "`common'" == "nocommon" { local i_`ss' = r(N) } local maxg = `dffen' xtdata `_depname' `reglistk', fe clear if `ss' == `kk' { local dffe = `dffen' save `_witrans', replace } else { local dffe = `dffe'+ `dffen' local maxg = max(`dffen',`maxg') append using `_witrans' save `_witrans', replace } use `_nowitrans', clear } tokenize `reglistk' local reglistk "" local vv = 0 foreach ww in `regnamesk' { local vv = `vv'+1 **if (`strpos'("`ww'","b.") > 0 | `strpos'("`ww'","o.") > 0 | `strpos'("`ww'","bo.") > 0) & (`strpos'("`ww'","#") > 0 & `strpos'("`ww'","#") == `strrpos'("`ww'","#")) { local zz "`ww'" foreach gg in b. o. bo. { local zz : `subinstr' local zz "`gg'" " ", all } local uu : `subinstr' local ww "#" " ", all if wordcount("`zz'") >= wordcount("`uu'") { local reglistk "`reglistk' o.``vv''" } else { local reglistk "`reglistk' ``vv''" } } local regnames "`regnamesk' `regnames'" local reglist "`reglistk' `reglist'" } ** REPLACE EXPANDED VARS. BY WITHIN-TRANSFORMED COUNTERPARTs ** if "`fe'" == "fe" { merge 1:1 _n using `_witrans', replace update nogenerate } ** TRANSLATE CONSTRAINTS if SPECIFIED ** if "`constraints'" != "" { foreach cc in `constraints' { constraint get `cc' if `r(defined)' == 0 { continue } local cnss "`r(contents)'" ** SET SPACES ** foreach char in = + - * / ( ) { local cnss : `subinstr' local cnss "`char'" " `char' ", all } local cnss : list retokenize cnss local cnss : `subinstr' local cnss "[ " "[", all local cnss : `subinstr' local cnss " ]" "]", all tokenize `cnl' local tvns "`reglist'" foreach mm in `regnames' { gettoken tvs tvns : tvns local tvns : list local(tvns) - local(tvs) gettoken eqnc regc: mm, parse(".") local eqnm "``eqnc''" gettoken hash regc: regc, parse("#") gettoken hash regc: regc, parse("#") local regc : `subinstr' local regc "c." "", all local vcns "[`eqnm']`regc'" local cnss : `subinstr' local cnss "`vcns'" "`tvs'", word } constraint free constraint `r(free)' `cnss' local cnstrans "`cnstrans' `r(free)'" } if "`constant'" != "noconstant" { local reglist : list local(reglist) - local(tvs) } else { local dropconst "noconstant" } local cnssyntax "constraints(`cnstrans')" } ** RUN STACKED REGRESSION with CLUSTER-ROBUST STANDARD-ERRORS ** cap `estimator' `_depname' `reglist' `wexp', cluster(`cluster') level(`level') `dropconst' `max' `cnssyntax' if _rc != 0 { if "`estimator'" == "cnsreg" { noi di as error "{p 0 2 2 `ls'}constrained estimation failed; check specified constraints{p_end}" ereturn clear exit 111 } else { noi di as error "{p 0 2 2 `ls'}stacked regression failed{p_end}" ereturn clear exit 198 } } ** STORE e(V) AND e(b) AS TMP-MATRICES (required for stata versions < 16) matrix `_tbb' = e(b) matrix `_tVV' = e(V) local df_m_hand = colsof(`_tbb')-diag0cnt(`_tVV') ** DETERMINE EQUATION-SPECIFIC NUMBER OF CONSTRAINTS & EQUATION-SPECIFIC RANKS ** if "`estimator'" == "cnsreg" { mata : st_numscalar("`_rank'",rank(st_matrix("`_tVV'"))) local df_m = `_rank' local step = colsof(`_tbb')/`kk' local fi = 1 local la = `step' matrix `_Cns' = e(Cns) forvalues mm = 1(1)`kk' { matrix `_Mcns' = (`_Cns'[1...,`fi'..`la'])*(`_Cns'[1...,`fi'..`la'])' local rank_`mm' = `step'- (colsof(`_Mcns')- diag0cnt(`_Mcns')) local fi = `fi'+ `step' local la = `la'+ `step' } } ** DEGREES-OF-FREEDOM ADJUSTMENT ** if "`df'" == "raw" { **matrix `_VV' = `_tVV' mata : st_matrix("`_VV'",edittozero(st_matrix("`_tVV'"),`edittozero')) } else { ** HOMOGENEOUS NUMBERS OF OBSERVATIONS & NO CONSTRAINTS ** if ("`common'" != "nocommon" | ("`hetn'" != "1" & "`n_1'" == "`e(N)'")) & ("`cnssyntax'" == "") { ** EXPANSION DEGREES-OF-FREEDOM ADJUSTMENT ** local dofcor = (`norg'-1)/(`norg' -1/`kk') ** WITHIN-TRANSFORMATION DEGREES-OF-FREEDOM ADJUSTMENT ** if "`fe'" == "fe" { local doffecor = (`norg' -(`df_m_hand')/`kk')/(`norg' -`dffe'/`kk' -(`df_m_hand')/`kk'+1) } else { local doffecor = 1 } ** XTREG ANALOGUE DEGREES-OF-FREEDOM ADJUSTMENT ** if "`fe'" == "fe" & "`df'" != "areg" { local dofxtcor = (`norg' -`dffe'/`kk' -(`df_m_hand')/`kk' +1)/(`norg' -(`df_m_hand')/`kk') } else { local dofxtcor = 1 } scalar `_tdfc' = `dofxtcor'*`doffecor'*`dofcor' mata : st_matrix("`_VV'",edittozero(st_numscalar("`_tdfc'")*st_matrix("`_tVV'"),`edittozero')) } ** HETEROGENEOUS NUMBERS OF OBSERVATIONS or CONSTRAINTS ** else { if "`estimator'" != "cgmreg" { local N_clust = e(N_clust) } else { local N_clust =. foreach vv of varlist `cluster' { local N_clust = min(`N_clust',e(N_clus_`vv'),e(N_`vv')) } } if "`estimator'" != "cnsreg" { local df_m = e(df_m) if ("`fe'" != "fe" ) | ("`cluster'" == "`_tempid'") { forvalues ss = 1(1)`kk' { local gdf_`ss' = e(df_m)/`kk' } } else { forvalues ss = 1(1)`kk' { local gdf_`ss' = (`df_m_hand')/`kk' } } } else { forvalues ss = 1(1)`kk' { local gdf_`ss' = `rank_`ss'' } if "`common'" != "nocommon" { forvalues ss = 1(1)`kk' { local n_`ss' = e(N)/`kk' if "`cluster'" != "`_tempid'" { local m_`ss' = e(N_clust) } } } } matrix `_dofeq' = J(1,`kk',.) forvalues ss = 1(1)`kk' { ** EXPANSION DEGREES-OF-FREEDOM ADJUSTMENT ** if "`fe'" != "fe" { if "`cluster'" == "`_tempid'" { local dofcor = ((e(N)-`df_m')/(e(N)-1))*((`N_clust'-1)/`N_clust')*(`n_`ss''/(`n_`ss'' -`gdf_`ss'')) } else { local dofcor = ((e(N)-`df_m')/(e(N)-1))*((`N_clust'-1)/`N_clust')*(((`n_`ss''-1)/(`n_`ss'' -`gdf_`ss''))*(`m_`ss'')/(`m_`ss''-1)) } } else { ** XTREG ANALOGUE DEGREES-OF-FREEDOM ADJUSTMENT ** if "`cluster'" == "`_tempid'" { local dofcor = ((e(N)-`df_m')/(e(N)-1))*((`N_clust'-1)/`N_clust')*(`n_`ss''/(`n_`ss'' -`i_`ss'' -`gdf_`ss'' +1)) if "`df'" != "areg" { local dofcor = (`n_`ss'' -`i_`ss'' -`gdf_`ss''+1)/(`n_`ss'' -`gdf_`ss'')*`dofcor' } } else { local dofcor = ((e(N)-(`df_m_hand'))/(e(N)-1))*((`N_clust'-1)/`N_clust')*((`n_`ss''-1)/(`n_`ss'' -`i_`ss'' -`gdf_`ss''+1))*(`m_`ss''/(`m_`ss''-1)) if "`df'" != "areg" { local dofcor = (`n_`ss'' -`i_`ss'' -`gdf_`ss''+1)/(`n_`ss'' -`gdf_`ss'')*`dofcor' } } } matrix `_dofeq'[1,`ss'] = `dofcor' } matrix `_dofeq' = (vecdiag(diag(`_dofeq')#I(colsof(`_tbb')/`kk')))'*vecdiag(diag(`_dofeq')#I(colsof(`_tbb')/`kk')) mata : st_matrix("`_VV'",edittozero((st_matrix("`_dofeq'"):^0.5):*st_matrix("`_tVV'"),`edittozero')) } } matrix `_bb' = `_tbb' tokenize `cnl' ** RENAME COLUMNS of e(b): EQUATIONNAMES ** forvalues mm = `kk'(-1)1 { foreach vv in `mm' `mm'b `mm'bn `mm'o `mm'bo `mm'bno { local regnames : `subinstr' local regnames "`vv'.`_exp'#" "``mm'':", all } } if "`constant'" != "noconstant" { local regnames : `subinstr' local regnames "``consv''" "`consn'", all if "`constraints'" != "" { local regnames : `subinstr' local regnames "``kk'':c._cons" "_cons", word } } matrix colnames `_bb' = `regnames' matrix rownames `_bb' = `_depname' matrix colnames `_VV' = `regnames' matrix rownames `_VV' = `regnames' ** MANAGE CONSTRAINTS ** if "`constraints'" != "" { matrix colnames `_Cns' = `regnames' r local ecns "`_Cns'" constraint drop `cnstrans' } ** SCALARS TO BE STORED ** local N_clust = e(N_clust) local N_stack = e(N) ** RESTORE ORG. SAMPLE and MERGE WITH e(sample) INDICATOR ** gen `_esamp' = 1 if e(sample) keep `_tempid' `_esamp' sort `_tempid' keep if `_tempid' != `_tempid'[_n-1] | _n == 1 save `_esampfile' restore merge 1:1 `_tempid' using `_esampfile', nogenerate update replace force replace `_esamp' = 0 if `_esamp' != 1 ** POST RESULTS ** ereturn post `_bb' `_VV' `ecns', properties(b V) obs(`norg') esample(`_esamp') findomitted ** MACROS ** ereturn local cmd `cmd' ereturn local cmdline `cmdline' ereturn local title "Stacked Regression" ereturn local predict "reg3_p" ereturn local marginsok "default XB E(passthru)" ereturn local depvar "`cnl'" ereturn local eqnames "`cnl'" foreach eq in `cnl' { local marginsdefault "`marginsdefault'predict(xb equation(`eq')) " } ereturn local marginsdefault "`marginsdefault'" if "`cluster'" != "`_tempid'" { ereturn local clustvar "`cluster'" if "`estimator'" == "cgmreg" { ereturn local clusvar "`cluster'" } } ereturn local vcetype "Clust. Robust" if "`weight'" != "" { ereturn local wexp "=`exp'" ereturn local wtype "`weight'" } ereturn local estimator "`estimator'" if "`fe'" == "fe" { ereturn local model "fe" } else { ereturn local model "ols" } if "`hetn'" == "1" & "`n_1'" != "`norg'" { ereturn local common "nocommon" } else { ereturn local common "common" } ** SCALARS ** mata : st_numscalar("`_rank'",rank(st_matrix("e(V)"))) ereturn scalar N = `norg' ereturn scalar k_eq = `kk' if "`fe'" == "fe" { ereturn scalar N_g = `maxg' } ereturn scalar rank = `_rank' if "`estimator'" != "cgmreg" { ereturn scalar N_clust = `N_clust' } ereturn scalar N_stack = `N_stack' ** EQUATION-SPECIFIC e(N), e(rank), e(df_r), and e(df_m) ** matrix `_VV' = e(V) local grank = 0 forvalues gg = 1(1)`kk' { if "`estimator'" != "cnsreg" { local rf = (`gg'-1)*(colsof(`_VV')/`kk')+1 local rl = `gg'*(colsof(`_VV')/`kk') matrix `_VVk' = `_VV'[`rf'..`rl',`rf'..`rl'] mata : st_numscalar("`_rank'",rank(st_matrix("`_VVk'"))) local rank_`gg' = `_rank' } if ("`hetn'" == "1" & "`n_1'" != "`norg'") | ("`estimator'" == "cnsreg") { if ("`hetn'" == "1" & "`n_1'" != "`norg'") { ereturn scalar N_`gg' = `n_`gg'' } ereturn scalar rank_`gg' = `rank_`gg'' if ("`wald'" != "wald") & ("`hetn'" == "1" & "`n_1'" != "`norg'") { ereturn scalar df_r_`gg' = `m_`gg'' -1 } if "`constant'" == "noconstant" { ereturn scalar df_m_`gg' = `rank_`gg'' } else { ereturn scalar df_m_`gg' = `rank_`gg'' -1 } } local grank = max(`grank',`_rank') } ** OVERALL e(df_r), and e(df_m) ** if ("`common'" != "nocommon" | ("`hetn'" != "1" & "`n_1'" == "`norg'")) & ("`estimator'" != "cnsreg") { if "`wald'" != "wald" & "`estimator'" != "cgmreg" { ereturn scalar df_r = `N_clust'-1 } if "`constant'" == "noconstant" { ereturn scalar df_m = `grank' } else { ereturn scalar df_m = `grank' -1 } } ereturn scalar level = `level' } } ** DISPLAY RESULTS ** if "`e(estimator)'" != "cnsreg" { local name "Stacked" local name2 "regression" } else { local name "Constrained stacked" if "`e(model)'" != "fe" { local name2 "regression" } else { local name2 "reg." } } local skip2 = 52 local skip3 = floor(`e(N)') local skip3 = `strlen'("`skip3'")-1 if "`e(model)'" == "fe" { di _newline as text "`name' within-transformed linear `name2'" _column(`skip2') "Number of obs = " _column(`skip3') as result as result %8.0fc `e(N)' di as text _column(`skip2') "Number of groups = " _column(`skip3') as result as result %8.0fc `e(N_g)' _newline } else { di _newline as text "`name' linear `name2'" _column(`skip2') "Number of obs = " _column(`skip3') as result as result %8.0fc `e(N)' _newline } ** di _skip as text "(Std. Err. adjusted for " as result `e(N_clust)' as text " clusters in `e(clustvar)')" if replay() { syntax, [LEVel(real `e(level)')] [noci] [noPValues] [OMITted] [EMPTYcells] [VSQUISH] [BASElevels] [ALLBASElevels] [noFVLABel] [fvwrap(passthru)] [fvwrapon(passthru)] [CFORMAT(passthru)] [PFORMAT(passthru)] [SFORMAT(passthru)] [nolstretch] ** HANDLE OPTIONS EMPTYCELLS OMITTED for REPLAY ** if "`emptycells'" == "" { local emptycells "noemptycells" } if "`omitted'" == "" { local omitted "noomitted" } } ereturn display, level(`level') `ci' `pvalues' `omitted' `vsquish' `emptycells' `baselevels' `allbaselevels' `fvlabel' `fvwrap' `fvwrapon' `fvdisp' `cformat' `pformat' `sformat' `lstretch' end