*! version 1.1 02june2021 Matteo Pinna, matteo.pinna@gess.ethz.ch * version 1.1 adds diagnostics for the perturbationtest, modifies/adds the display and command options, introduces the first option and sets regressions to run quietly by default for tests. * Any feedback on issues and possible new features is very welcome. cap program drop multicoefplot program define multicoefplot, rclass sortpreserve version 15.1 syntax namelist(min=1 max=1) [if] [in], /// /* mandatory options */ window(string) TREATMENT1(string) [ /// /* regression */ noCONStant savetables(string) savetex(string) level(string) first /// /* treatment */ treatment2(string) treatment3(string) /// /* FE's */ ABSORB1(string) absorb2(string) absorb3(string) /// /* controls */ CONTROLS1(varlist) controls2(varlist) controls3(varlist) /// /* time controls */ TIMECONTROLS1(string) timecontrols2(string) timecontrols3(string) /// /* time absorb */ TIMEABSORB1(string) timeabsorb2(string) timeabsorb3(string) /// /* standard errors */ CLUSTER1(varname) VCE1(string) cluster2(varname) vce2(string) cluster3(varname) vce3(string) /// /* weights */ AWEIGHT1(varname) FWEIGHT1(varname) aweight2(varname) fweight2(varname) aweight3(varname) fweight3(varname) /// /* fstatistic tuplestest multitest leaveoneouttest and perturbationtest */ fstat tuplestest(varlist) multitest(string) perturbationtest(varname) leaveoneouttest(string) testcicolor(string) testcoefcolor(string) /// /* graph options */ time(string) SPECCOLOR1(string) speccolor2(string) speccolor3(string) offset(string) legend(string) symbols COMmand DIsplay /// SYMBOL1(string) symbol2(string) symbol3(string) ytitle(string) xtitle(string) yline(string) xline(string) ysize(string) xsize(string) xlabel(string) ylabel(string) /// ] set more off * check programs * addplot check capt which coefplot if _rc !=0 { di as error "Multicoefplot requires coefplot to be installed. Coefplot can be installed by typing ssc install coefplot" } capt which reghdfe if _rc !=0 { di as error "Multicoefplot requires reghdfe to be installed. Reghdfe can be installed by typing ssc install reghdfe" } capt which ivreghdfe if _rc !=0 { di as error "Multicoefplot requires ivreghdfe to be installed. Ivreghdfe can be installed by typing ssc install ivreghdfe" } capt which tuples if _rc !=0 { di as error "Multicoefplot requires tuples to be installed. Tuples can be installed by typing ssc install tuples" } * Parse varlist into y-vars and x-var local y_vars=regexr("`namelist'"," `x_var'$","") local ynum=wordcount("`y_vars'") * Quiet for tests if ("`display'"=="") local display "qui" if ("`display'"=="display") local display "" * level perturbation if ("`level'"!="") local level_pt=`level' if ("`level'"=="") local level_pt=0.05 * window parsing /* wip local forv_win1=strpos("`window'","(") local forv_win2=strpos("`window'","/") local forv_win3=strpos("`window'","to") local forv_win4=strpos("`window'",":") local forv_win=forv_win1+forv_win2+forv_win3+forv_win4 */ local win_iter_counter=0 forvalues win_iteration = `window' { local win_iter_counter=`win_iter_counter'+1 if (`win_iter_counter'==1) local start=`win_iteration' if (`win_iter_counter'==2) local second=`win_iteration' local end=`win_iteration' } local window_rhs=subinstr("`window'","`start'","",1) * to think about ---- if ("`second'"=="") local second=`start' * OLD local start `: word 1 of `window'' * OLD local end `: word 2 of `window'' * errors and warnings * balanced outcome forvalues interval=`window'{ capture confirm variable `y_vars'`interval' if _rc { di as error "`y_vars'`interval' does not exist - please include a balanced outcome variable" exit } } * balanced and time controls if ("`timecontrols1'"!="")|("`timecontrols2'"!="")|("`timecontrols3'"!="") { di as text "WARNING: timecontrols should always be checked to be balanced over the time of analysis" } if ("`treatment1'"=="") { di as error "Treatment1 must be specified" exit } * TESTS if ("`tuplestest'"!="")&(("`multitest'"!="")|("`leaveoneouttest'"!="")|("`perturbationtest'"!="")) { di as error "Only one test at the time can be performed" exit } if ("`multitest'"!="")&(("`leaveoneouttest'"!="")|("`perturbationtest'"!="")) { di as error "Only one test at the time can be performed" exit } if ("`leaveoneouttest'"!="")&("`perturbationtest'"!="") { di as error "Only one test at the time can be performed" exit } if ("`multitest'"!="") { di as text "WARNING: global names for the multitest should be as short as possible e.g. var1 or v1" } if ("`tuplestest'"!="")|("`multitest'"!="")|("`perturbationtest'"!="")|("`leaveoneouttest'"!="") { forvalues num=2/3{ if ("`treatment`num''"!="")|("`absorb`num''"!="")|("`timecontrols`num''"!="")|("`controls`num''"!="")|("`cluster`num''"!="")|("`vce`num''"!="")|("`aweight`num''"!="")|("`fweight`num''"!="")|("`speccolor`num''"!=""){ di as error "Only options for specification 1 can be specified when running a test" exit } } } if ("`time'"!="") { if ("`time'"!="year")&("`time'"!="month")&("`time'"!="week")&("`time'"!="day") { di as error "WARNING: time can be either year, month, week or day" } } * which specs have to be run (SPECIFICATION 1 has to be run to run 2 and/or 3)) forvalues spec = 1/3{ if "`treatment`spec''"!="" | "`aweight`spec''"!="" | "`fweight`spec''"!="" | "`absorb`spec''"!="" | "`timecontrols`spec''"!="" | "`controls`spec''"!="" | "`vce`spec''"!="" | "`cluster`spec''"!="" { local spec_num`spec'="1" } } if "`spec_num1'"=="1" & "`spec_num2'"=="" & "`spec_num3'"==""{ local spec_to_run="1/1" } if "`spec_num1'"=="1" & "`spec_num2'"=="1" & "`spec_num3'"==""{ local spec_to_run="1/2" } if "`spec_num1'"=="1" & "`spec_num2'"=="" & "`spec_num3'"=="1"{ local spec_to_run="1(2)3" } if "`spec_num1'"=="1" & "`spec_num2'"=="1" & "`spec_num3'"=="1"{ local spec_to_run="1/3" } * length of window forvalues spec = `spec_to_run' { local win_length`spec'=wordcount("`treatment`spec''") } * If the specification is created, non-specified necessary elements (treatment) from specs 2 and 3 are replaced with those of the first spec forvalues num=2/3{ if "`spec_num`num''"=="1"{ if "`treatment`num''"=="" & "`treatment1'"!=""{ local treatment`num'="`treatment1'" } } } * which regtype to run based on the string in the treatment and makes modification depending on 2sls or ols and whether the treatment (or iv are time-varying) forvalues spec = `spec_to_run' { local timepos`spec'=strpos("`treatment`spec''","varying(") * time option not specified if ("`timepos`spec''"=="0") { local equal`spec'= strpos("`treatment`spec''","=") local equalm1`spec'= `equal`spec''-1 * 2sls if ("`equal`spec''"!="0") { local regtype`spec'="ivreghdfe" local treatmentstring`spec'="(`treatment`spec'')" local treatmentbeta`spec'=substr("`treatment`spec''",1,`equalm1`spec'') } * no 2sls if ("`equal`spec''"=="0") { local regtype`spec'="reghdfe" local treatmentstring`spec'="`treatment`spec''" local treatmentbeta`spec'="`treatment`spec''" } } * time option specified if ("`timepos`spec''"!="0") { local starttimetreatments`spec'=`timepos`spec''+8 local endtimetreatments`spec'=length("`treatment`spec''")-`starttimetreatments`spec'' local equal`spec'= strpos("`treatment`spec''","=") local equalm1`spec'= `equal`spec''-1 local equalp1`spec'= `equal`spec''+1 local stringtimetreatments`spec'=substr("`treatment`spec''",`starttimetreatments`spec'',`endtimetreatments`spec'') * 2sls if ("`equal`spec''"!="0") { local regtype`spec'="ivreghdfe" local endivlist`spec'=strpos("`treatment`spec''",",") local treatmentbeta`spec'=substr("`treatment`spec''",1,`equalm1`spec'') * if the instrumented var is time varying local treatmentinlist`spec'=0 foreach var in `stringtimetreatments`spec''{ if ("`var'"=="`treatmentbeta`spec''") local treatmentinlist`spec'=1 } if `treatmentinlist`spec''==1 { local treatmentbeta`spec'="`treatmentbeta`spec''"+"`"+`"interval"'+"'" } * if the instruments are time varying local ivlistlength`spec'=`endivlist`spec''-`equalp1`spec'' local ivlist`spec'=substr("`treatment`spec''",`equalp1`spec'',`ivlistlength`spec'') local intersection`spec':list stringtimetreatments`spec' & ivlist`spec' local notime`spec':list ivlist`spec'-stringtimetreatments`spec' local intersectionnumber: word count `intersection`spec'' tokenize `intersection`spec'' if `treatmentinlist`spec''==1 { if ("`intersectionnumber'"=="0") local treatmentstring`spec'="(`treatmentbeta`spec''" +"`"+`"interval"'+"'" + "=`notime`spec''" + ")" if ("`intersectionnumber'"=="1") local treatmentstring`spec'="(`treatmentbeta`spec''" +"`"+`"interval"'+"'" + "=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + ")" if ("`intersectionnumber'"=="2") local treatmentstring`spec'="(`treatmentbeta`spec''" +"`"+`"interval"'+"'" + "=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + ")" if ("`intersectionnumber'"=="3") local treatmentstring`spec'="(`treatmentbeta`spec''" +"`"+`"interval"'+"'" + "=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + " " + "`3'" +"`"+`"interval"'+"'"+ ")" if ("`intersectionnumber'"=="4") local treatmentstring`spec'="(`treatmentbeta`spec''" +"`"+`"interval"'+"'" + "=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + " " + "`3'" +"`"+`"interval"'+"'" + " " + "`4'" +"`"+`"interval"'+"'" + ")" if ("`intersectionnumber'"=="5") local treatmentstring`spec'="(`treatmentbeta`spec''" +"`"+`"interval"'+"'" + "=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + " " + "`3'" +"`"+`"interval"'+"'" + " " + "`4'" +"`"+`"interval"'+"'" + " " + "`5'" +"`"+`"interval"'+"'"+ ")" } if `treatmentinlist`spec''==0 { if ("`intersectionnumber'"=="1") local treatmentstring`spec'="(`treatmentbeta`spec''=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + ")" if ("`intersectionnumber'"=="2") local treatmentstring`spec'="(`treatmentbeta`spec''=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + ")" if ("`intersectionnumber'"=="3") local treatmentstring`spec'="(`treatmentbeta`spec''=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + " " + "`3'" +"`"+`"interval"'+"'"+ ")" if ("`intersectionnumber'"=="4") local treatmentstring`spec'="(`treatmentbeta`spec''=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + " " + "`3'" +"`"+`"interval"'+"'" + " " + "`4'" +"`"+`"interval"'+"'" + ")" if ("`intersectionnumber'"=="5") local treatmentstring`spec'="(`treatmentbeta`spec''=`notime`spec''" + " " + "`1'" +"`"+`"interval"'+"'" + " " + "`2'" +"`"+`"interval"'+"'" + " " + "`3'" +"`"+`"interval"'+"'" + " " + "`4'" +"`"+`"interval"'+"'" + " " + "`5'" +"`"+`"interval"'+"'"+ ")" } } * no 2sls if ("`equal`spec''"=="0") { local endlist`spec'=strpos("`treatment`spec''",",")-1 local regtype`spec'="reghdfe" local treatmentstring`spec'=substr("`treatment`spec''",1,`endlist`spec'')+"`"+`"interval"'+"'" local treatmentbeta`spec'=substr("`treatment`spec''",1,`endlist`spec'')+"`"+`"interval"'+"'" } } } * idee * create local with string before equal and string after, creating the local of strings after adding the interval *if ("`timetreatment`spec''"!=""){ *local addinterval`spec'="`"+`"interval"'+"'" *} /* ATTEMPT to make time ivs iteratively, problem in keeping local non-substituted after multiple loops local intersection_counter`spec'=0 foreach var in `intersection`spec'' { local intersection_counter`spec'=`intersection_counter`spec''+1 if `intersection_counter`spec''==1 { *local ivlist_withinterval`spec'="`var'"+"`"+`"interval"'+"'" local ivlist_withinterval`spec'="`var'"+"`"+"`"+"'+`"interval"'+`"+"'+"'"" /* PROBLEM need to add the addinterval local to the list - might have to define it in the regression */ di "`ivlist_withinterval`spec'''" } if `intersection_counter`spec''>1 { local ivlist_withinterval`spec'="`ivlist_withinterval`spec''"+" "+"`var'"+`""`"`"interval"'"'""' } } */ * PERTURBATION TEST if ("`perturbationtest'"!="") { levelsof `perturbationtest', local(vals_perturbation_test) local max_pt_iter: word count `vals_perturbation_test' local additeration "`"+"pt_iteration"+"'" if ("`if'"=="") local ifperturbationtest="if `perturbationtest'!=`additeration'" if ("`if'"!="") local ifperturbationtest="& `perturbationtest'!=`additeration'" } * TUPLES TEST if ("`tuplestest'"!="") { tuples `tuplestest' local tuplesvarnumber: word count `tuplestest' local tuplesnumber=(2^`tuplesvarnumber')-1 * the controls in controls that are inserted in tuplestest are dropped from controls local controls1: list controls1-tuplestest } * LEAVE ONE OUT TEST if ("`leaveoneouttest'"!="") { local leaveoneoutvarnumber: word count `leaveoneouttest' local leave_counter=0 foreach var in `leaveoneouttest'{ local leave_counter=`leave_counter'+1 local leave`leave_counter': list leaveoneouttest-var } } /** Parse timecontrols OLD VERSION, WORKING ONLY WITH 2 VARS forvalues spec = `spec_to_run' { if ("`timecontrols`spec''"!="") { local counter_tvcontrols`spec'=0 foreach timevaryingcontrol in `timecontrols`spec''{ local counter_tvcontrols`spec'=`counter_tvcontrols`spec''+1 if "`counter_tvcontrols`spec''"=="1"{ local timecontrols`spec'= "`timevaryingcontrol'"+"`"+`"interval"'+"'" } if (`counter_tvcontrols`spec''>1){ local timecontrols`spec'= "`timecontrols`spec''"+"`"+`"interval"'+"'"+" "+"`timevaryingcontrol'"+"`"+`"interval"'+"'" } } } } */ * Add interval to time controls forvalues spec = `spec_to_run' { if ("`timecontrols`spec''"!=""){ local timecontrolsnumber`spec'=wordcount("`timecontrols`spec''") local timecontrols_clean`spec'="`: word 1 of `timecontrols`spec'''"+" " forvalues order=2/`timecontrolsnumber`spec''{ cap local timecontrols_clean`spec'="`timecontrols_clean`spec''"+"`: word `order' of `timecontrols`spec'''"+" " } forvalues interval=`window'{ local timecontrols`spec'_`interval'=subinstr("`timecontrols_clean`spec''"," ","`interval' ",.) } } } * Add interval to time absorb if ("`timeabsorb1'"!="")|("`timeabsorb2'"!="")|("`timeabsorb3'"!=""){ forvalues spec = `spec_to_run' { local timeabsorbnumber`spec'=wordcount("`timeabsorb`spec''") local timeabsorb_clean`spec'="`: word 1 of `timeabsorb`spec'''"+" " forvalues order=2/`timeabsorbnumber`spec''{ cap local timeabsorb_clean`spec'="`timeabsorb_clean`spec''"+"`: word `order' of `timeabsorb`spec'''"+" " } forvalues interval=`window'{ local timeabsorb`spec'_`interval'=subinstr("`timeabsorb_clean`spec''"," ","`interval' ",.) } } } * Creates strings to add as option to regressions to run ****** forvalues spec = `spec_to_run' { * weights, either one can be specified if ("`aweight`spec''"!=""){ local wt`spec' "[aweight=`aweight`spec'']" } if ("`fweight`spec''"!=""){ local wt`spec' "[fweight=`fweight`spec'']" } * absorb if ("`absorb`spec''"!="") | ("`timeabsorb`spec''"!="") { local regabsorb`spec'="absorb(" + "`absorb`spec''" + " " + "`" + "timeabsorb`spec'_"+"`"+`"interval"'+"'"+"'"+")" } if ("`absorb`spec''"=="") & ("`timeabsorb`spec''"=="") { if "`regtype`spec''"=="reghdfe" { local regabsorb`spec'="noabsorb" } if "`regtype`spec''"=="ivreghdfe" { local regabsorb`spec'="" } } * s.e., either one can be specified if ("`cluster`spec''"!=""){ local addcluster`spec'="cluster(`cluster`spec'')" } if ("`vce`spec''"!=""){ local addvce`spec'="vce(`vce`spec'')" if "`regtype`spec''"=="ivreghdfe" { local addvce`spec'="robust" } } } * levels if ("`level'"!=""){ local level="level(`level')" } ****** Estimation foreach interval and treatment ****** * PERTURBATION TEST if "`perturbationtest'"!=""{ if ("`if'"!="") local ifperturbation=substr("`if'",3,.) if ("`if'"!="") local ifperturbation="if (`ifperturbation')" local counter_saving=0 foreach pt_iteration in `vals_perturbation_test' { local counter_saving=`counter_saving'+1 eststo clear forvalues spec = 1/1 { if "`command'"!=""{ di "`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `wt`spec'' `ifperturbation' `ifperturbationtest' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first'" } forvalues interval=`window'{ if "`savetables'"!=""{ `display' eststo:`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `wt`spec'' `ifperturbation' `ifperturbationtest' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } if "`savetables'"==""{ `display' `regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `wt`spec'' `ifperturbation' `ifperturbationtest' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } qui lincom _b[`treatmentbeta`spec''] local coef_`pt_iteration'_`spec'_`interval'=r(estimate) local lb_`pt_iteration'_`spec'_`interval'=r(lb) local ub_`pt_iteration'_`spec'_`interval'=r(ub) local pi_`pt_iteration'_`spec'_`interval'=r(p) } matrix esample_`pt_iteration'_`spec'=e(N) } * Generate strings for matrixes and matrixes - based on number of coefficients plotted and iterated forvalues spec = 1/1 { * coefficients and rownames local coefmatrixstring_`pt_iteration'_`spec'="`coef_`pt_iteration'_`spec'_`start''" local rownamesstring_`pt_iteration'_`spec'="_`start'" forvalues interval=`second'`window_rhs' { local coefmatrixstring_`pt_iteration'_`spec'="`coefmatrixstring_`pt_iteration'_`spec''"+"\"+"`coef_`pt_iteration'_`spec'_`interval''" local rownamesstring_`pt_iteration'_`spec'="`rownamesstring_`pt_iteration'_`spec''"+" "+"_`interval'" } * pvalue local pimatrixstring_`pt_iteration'_`spec'="`pi_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local pimatrixstring_`pt_iteration'_`spec'="`pimatrixstring_`pt_iteration'_`spec''"+"\"+"`pi_`pt_iteration'_`spec'_`interval''" } * confidence interval local cimatrixstring_`pt_iteration'_`spec'="`lb_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`lb_`pt_iteration'_`spec'_`interval''" } local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+"\"+"`ub_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`ub_`pt_iteration'_`spec'_`interval''" } matrix define matrix_coef_`pt_iteration'_`spec'=(`coefmatrixstring_`pt_iteration'_`spec'') matrix rownames matrix_coef_`pt_iteration'_`spec'=`rownamesstring_`pt_iteration'_`spec'' matrix colnames matrix_coef_`pt_iteration'_`spec'=b matrix matrix_coef_`pt_iteration'_`spec'=matrix_coef_`pt_iteration'_`spec'' matrix define matrix_ci_`pt_iteration'_`spec'=(`cimatrixstring_`pt_iteration'_`spec'') matrix define matrix_pi_`pt_iteration'_`spec'=(`pimatrixstring_`pt_iteration'_`spec'') matrix matrix_pi_`pt_iteration'_`spec'=matrix_pi_`pt_iteration'_`spec'' } if "`savetables'"!=""{ if `counter_saving'==1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) } if `counter_saving'>1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) append } } } * Generate diagnostics if "do"=="do" { forvalues spec = 1/1 { forvalues interval=`window'{ qui `regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' qui lincom _b[`treatmentbeta`spec''] local m_coef_`spec'_`interval'=r(estimate) local m_lb_`spec'_`interval'=r(lb) local m_ub_`spec'_`interval'=r(ub) local m_pi_`spec'_`interval'=r(p) } matrix esample_1=e(N) } forvalues spec = 1/1 { * coefficients and rownames local m_coefmatrixstring_`spec'="`m_coef_`spec'_`start''" local m_rownamesstring_`spec'="_`start'" forvalues interval=`second'`window_rhs' { local m_coefmatrixstring_`spec'="`m_coefmatrixstring_`spec''"+"\"+"`m_coef_`spec'_`interval''" local m_rownamesstring_`spec'="`m_rownamesstring_`spec''"+" "+"_`interval'" } * pvalue local m_pimatrixstring_`spec'="`m_pi_`spec'_`start''" forvalues interval=`second'`window_rhs' { local m_pimatrixstring_`spec'="`m_pimatrixstring_`spec''"+"\"+"`m_pi_`spec'_`interval''" } matrix define m_matrix_coef_`spec'=(`m_coefmatrixstring_`spec'') matrix rownames m_matrix_coef_`spec'=`m_rownamesstring_`spec'' matrix colnames m_matrix_coef_`spec'=b matrix m_matrix_coef_`spec'=m_matrix_coef_`spec'' matrix define m_matrix_pi_`spec'=(`m_pimatrixstring_`spec'') matrix m_matrix_pi_`spec'=m_matrix_pi_`spec'' } * create matrix foreach pt_iteration in `vals_perturbation_test' { matrix m_matrix_coef_1=m_matrix_coef_1\matrix_coef_`pt_iteration'_1 matrix m_matrix_pi_1=m_matrix_pi_1\matrix_pi_`pt_iteration'_1 matrix esample_1=esample_1\esample_`pt_iteration'_1 } * Bulding data and run checks preserve cap drop *coef_pt* cap drop *pi_pt* cap drop sample_pt* svmat double m_matrix_coef_1, name(coef_pt) svmat double m_matrix_pi_1, name(pi_pt) svmat double esample_1, name(sample_pt) qui keep *coef_pt* *pi_pt* sample_pt1 qui dropmiss, obs force qui gen it=_n forvalues interval=1/`win_iter_counter'{ qui replace pi_pt`interval'=pi_pt`interval'<=`level_pt' } forvalues interval=1/`win_iter_counter'{ qui replace coef_pt`interval'=. if pi_pt`interval'==0 & it>1 } forvalues interval=1/`win_iter_counter'{ qui replace coef_pt`interval'=coef_pt`interval'>0 if coef_pt`interval'!=. } forvalues interval=1/`win_iter_counter'{ qui gen change_coef_pt`interval'=coef_pt`interval' if change_coef_pt`interval'[1]==1{ qui replace change_coef_pt`interval'=1 if coef_pt`interval'!=1 & coef_pt`interval'!=. & it>1 qui replace change_coef_pt`interval'=0 if coef_pt`interval'==1 | coef_pt`interval'==. & it>1 } if change_coef_pt`interval'[1]==0{ qui replace change_coef_pt`interval'=0 if coef_pt`interval'==. & it>1 } } forvalues interval=1/`win_iter_counter'{ qui gen change_pi_pt`interval'=pi_pt`interval' if change_pi_pt`interval'[1]==1{ qui replace change_pi_pt`interval'=1 if pi_pt`interval'!=1 & pi_pt`interval'!=. & it>1 qui replace change_pi_pt`interval'=0 if pi_pt`interval'==1 & pi_pt`interval'!=. & it>1 } } foreach element in coef pi{ qui gen tot_estim_change_`element'=0 if it>1 forvalues interval=1/`win_iter_counter'{ qui egen tot_iter_change_`element'_pt`interval'=total(change_`element'_pt`interval') if it>1 & change_`element'_pt`interval'!=. /* column total */ qui replace tot_estim_change_`element'=tot_estim_change_`element'+change_`element'_pt`interval' if it>1 /* row total */ } } foreach element in coef pi{ forvalues interval=1/`win_iter_counter'{ if `interval'==1{ local total_`element'_changing=tot_iter_change_`element'_pt`interval'[2] } if `interval'>1{ local total_`element'_changing=`total_`element'_changing'+tot_iter_change_`element'_pt`interval'[2] /* colums total is always the same, above line 1, so sum across intervals for tot num */ } } if (`total_`element'_changing'==.) local total_`element'_changing=0 } foreach element in coef pi{ forvalues interval=1/`win_iter_counter'{ qui gen tot_iter_change_`element'_pt`interval'_b1=tot_iter_change_`element'_pt`interval'>0 if tot_iter_change_`element'_pt`interval'!=. & it>1 /* columns if column>1, to track if there's at least 1 change for a single estimate different samples */ } } foreach element in coef pi{ local est_1pert_`element'_changing=0 forvalues interval=1/`win_iter_counter'{ local est_1pert_`element'_changing= `est_1pert_`element'_changing' + tot_iter_change_`element'_pt`interval'_b1[2] /* how many estimates have issues in the samples */ if (`est_1pert_`element'_changing'==.) local est_1pert_`element'_changing=0 } } local max_sample_size=sample_pt1[1] foreach element in coef pi{ qui egen max_tot_estim_change_`element'=max(tot_estim_change_`element') if it>1 /* max number of estimates changed by a sample (or more than one) */ local max_tot_estim_change_`element'=max_tot_estim_change_`element'[2] qui count if tot_estim_change_`element'>0 & it>1 /* how many samples are changing at least one estimate */ local iter_1est_`element'_changing=r(N) qui egen val_min_perturbation_`element'=min(sample_pt1) if tot_estim_change_`element'>0 & tot_estim_change_`element'!=. & it>1 qui ereplace val_min_perturbation_`element'=max(val_min_perturbation_`element') if it>1 local val_min_perturbation_`element'=val_min_perturbation_`element'[2] local val_min_perturbation_`element'=`max_sample_size'-`val_min_perturbation_`element'' if (`val_min_perturbation_`element''==.) local val_min_perturbation_`element'=0 qui egen val_max_perturbation_`element'=min(sample_pt1) if tot_estim_change_`element'==max_tot_estim_change_`element' & max_tot_estim_change_`element'!=0 & max_tot_estim_change_`element'!=. & it>1 qui ereplace val_max_perturbation_`element'=max(val_max_perturbation_`element') if it>1 local val_max_perturbation_`element'=val_max_perturbation_`element'[2] local val_max_perturbation_`element'=`max_sample_size'-`val_max_perturbation_`element'' if (`val_max_perturbation_`element''==.) local val_max_perturbation_`element'=0 } ********** foreach element in coef pi{ local min_perturbation_`element' = `val_min_perturbation_`element''*100/`max_sample_size' local max_perturbation_`element' = `val_max_perturbation_`element''*100/`max_sample_size' local overall_stability_`element' = `total_`element'_changing'*100/(`max_pt_iter'*`win_iter_counter') local total_estimations = `max_pt_iter'*`win_iter_counter' local estimates_stability_`element' = `est_1pert_`element'_changing'*100/`win_iter_counter' local samples_stability_`element' = `iter_1est_`element'_changing'*100/`max_pt_iter' local min_perturbation_`element' = round(`min_perturbation_`element'',0.01) local max_perturbation_`element' = round(`max_perturbation_`element'',0.01) local overall_stability_`element' = round(`overall_stability_`element'',0.01) local estimates_stability_`element' = round(`estimates_stability_`element'',0.01) local samples_stability_`element' = round(`samples_stability_`element'',0.01) } di "****************************************************************************************" di " Sample Diagnostics | Significance | Sign " di " -------------------------------------------------------------------------------------- " di " Minimum Perturbation | `val_min_perturbation_pi'/`max_sample_size'=`min_perturbation_pi'% | `val_min_perturbation_coef'/`max_sample_size'= `min_perturbation_coef'% " di " Maximum Perturbation | `val_max_perturbation_pi'/`max_sample_size'=`max_perturbation_pi'% | `val_max_perturbation_coef'/`max_sample_size'= `max_perturbation_coef'% " di " ---------------------------" di " Overall Stability | `total_pi_changing'/`total_estimations'=`overall_stability_pi'% | `total_coef_changing'/`total_estimations'=`overall_stability_coef'% " di " Estimates Stability | `est_1pert_pi_changing'/`win_iter_counter'=`estimates_stability_pi'% | `est_1pert_coef_changing'/`win_iter_counter'=`estimates_stability_coef'% " di " Samples Stability | `iter_1est_pi_changing'/`max_pt_iter'=`samples_stability_pi'% | `iter_1est_coef_changing'/`max_pt_iter'=`samples_stability_coef'% " di "****************************************************************************************" di " " di " The Sample Diagnostics table offers some key statistics on the stability of the estimates in the main sample, throughout the subsamples." di " The significance column shows changes in significance, while the sign column shows changes of sign, given that estimates are significant at the chosen threshold." di " Minimum Perturbation: smallest sample drop causing a change of at least 1 estimate's significance/sign." di " Maximum Perturbation: smallest sample drop causing a change of the highest number of estimates' significance/sign." di " Overall Stability: number of estimates showing a change in significance/sign, summed across all subsamples, over the total number of estimatesXsubsamples." di " Estimates Stability: number of estimates showing a change in significance/sign in at least 1 of the subsamples, over the total number estimates." di " Samples Stability: number of subsamples showing a change in significance/sign for at least 1 of the estimates, over the total number of subsamples." di " For more details, see Ash, Elliott and Pinna, Matteo, Automated checks for specification and sample sensitivity in panel data designs (2021) - soon to be available." restore } * } * TUPLES TEST if "`tuplestest'"!=""{ forvalues pt_iteration=1/`tuplesnumber'{ eststo clear forvalues spec = 1/1 { if "`command'"!=""{ di "`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `tuple`pt_iteration'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first'" } forvalues interval=`window'{ if "`savetables'"!=""{ `display' eststo:`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `tuple`pt_iteration'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } if "`savetables'"==""{ `display' `regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `tuple`pt_iteration'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } qui lincom _b[`treatmentbeta`spec''] local coef_`pt_iteration'_`spec'_`interval'=r(estimate) local lb_`pt_iteration'_`spec'_`interval'=r(lb) local ub_`pt_iteration'_`spec'_`interval'=r(ub) } } * Generate strings for matrixes and matrixes - based on number of coefficients plotted and iterated forvalues spec = 1/1 { * coefficients and rownames local coefmatrixstring_`pt_iteration'_`spec'="`coef_`pt_iteration'_`spec'_`start''" local rownamesstring_`pt_iteration'_`spec'="_`start'" forvalues interval=`second'`window_rhs' { local coefmatrixstring_`pt_iteration'_`spec'="`coefmatrixstring_`pt_iteration'_`spec''"+"\"+"`coef_`pt_iteration'_`spec'_`interval''" local rownamesstring_`pt_iteration'_`spec'="`rownamesstring_`pt_iteration'_`spec''"+" "+"_`interval'" } * confidence interval local cimatrixstring_`pt_iteration'_`spec'="`lb_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`lb_`pt_iteration'_`spec'_`interval''" } local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+"\"+"`ub_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`ub_`pt_iteration'_`spec'_`interval''" } matrix define matrix_coef_`pt_iteration'_`spec'=(`coefmatrixstring_`pt_iteration'_`spec'') matrix rownames matrix_coef_`pt_iteration'_`spec'=`rownamesstring_`pt_iteration'_`spec'' matrix colnames matrix_coef_`pt_iteration'_`spec'=b matrix matrix_coef_`pt_iteration'_`spec'=matrix_coef_`pt_iteration'_`spec'' matrix define matrix_ci_`pt_iteration'_`spec'=(`cimatrixstring_`pt_iteration'_`spec'') } if "`savetables'"!=""{ if `pt_iteration'==1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) } if `pt_iteration'>1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) append } } } } * Leave-one-out test if "`leaveoneouttest'"!=""{ forvalues pt_iteration=1/`leaveoneoutvarnumber'{ eststo clear forvalues spec = 1/1 { if "`command'"!=""{ di "`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `leave`pt_iteration'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first'" } forvalues interval=`window'{ if "`savetables'"!=""{ `display' eststo:`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `leave`pt_iteration'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } if "`savetables'"==""{ `display' `regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `leave`pt_iteration'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } qui lincom _b[`treatmentbeta`spec''] local coef_`pt_iteration'_`spec'_`interval'=r(estimate) local lb_`pt_iteration'_`spec'_`interval'=r(lb) local ub_`pt_iteration'_`spec'_`interval'=r(ub) } } * Generate strings for matrixes and matrixes - based on number of coefficients plotted and iterated forvalues spec = 1/1 { * coefficients and rownames local coefmatrixstring_`pt_iteration'_`spec'="`coef_`pt_iteration'_`spec'_`start''" local rownamesstring_`pt_iteration'_`spec'="_`start'" forvalues interval=`second'`window_rhs' { local coefmatrixstring_`pt_iteration'_`spec'="`coefmatrixstring_`pt_iteration'_`spec''"+"\"+"`coef_`pt_iteration'_`spec'_`interval''" local rownamesstring_`pt_iteration'_`spec'="`rownamesstring_`pt_iteration'_`spec''"+" "+"_`interval'" } * confidence interval local cimatrixstring_`pt_iteration'_`spec'="`lb_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`lb_`pt_iteration'_`spec'_`interval''" } local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+"\"+"`ub_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`ub_`pt_iteration'_`spec'_`interval''" } matrix define matrix_coef_`pt_iteration'_`spec'=(`coefmatrixstring_`pt_iteration'_`spec'') matrix rownames matrix_coef_`pt_iteration'_`spec'=`rownamesstring_`pt_iteration'_`spec'' matrix colnames matrix_coef_`pt_iteration'_`spec'=b matrix matrix_coef_`pt_iteration'_`spec'=matrix_coef_`pt_iteration'_`spec'' matrix define matrix_ci_`pt_iteration'_`spec'=(`cimatrixstring_`pt_iteration'_`spec'') } if "`savetables'"!=""{ if `pt_iteration'==1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) } if `pt_iteration'>1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) append } } } } * MULTI TEST if "`multitest'"!=""{ local counter_saving=0 foreach pt_iteration in `multitest'{ local counter_saving=`counter_saving'+1 eststo clear * the controls in controls that are inserted in multitest are dropped from controls local vars_multitest ${`pt_iteration'} local controls`pt_iteration': list controls1-vars_multitest forvalues spec = 1/1 { if "`command'"!=""{ di "`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`pt_iteration'' ${`pt_iteration'} `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first'" } forvalues interval=`window'{ if "`savetables'"!=""{ `display' eststo:`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`pt_iteration'' ${`pt_iteration'} `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } if "`savetables'"==""{ `display' `regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`pt_iteration'' ${`pt_iteration'} `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } qui lincom _b[`treatmentbeta`spec''] local coef_`pt_iteration'_`spec'_`interval'=r(estimate) local lb_`pt_iteration'_`spec'_`interval'=r(lb) local ub_`pt_iteration'_`spec'_`interval'=r(ub) } } * Generate strings for matrixes and matrixes - based on number of coefficients plotted and iterated forvalues spec = 1/1 { * coefficients and rownames local coefmatrixstring_`pt_iteration'_`spec'="`coef_`pt_iteration'_`spec'_`start''" local rownamesstring_`pt_iteration'_`spec'="_`start'" forvalues interval=`second'`window_rhs' { local coefmatrixstring_`pt_iteration'_`spec'="`coefmatrixstring_`pt_iteration'_`spec''"+"\"+"`coef_`pt_iteration'_`spec'_`interval''" local rownamesstring_`pt_iteration'_`spec'="`rownamesstring_`pt_iteration'_`spec''"+" "+"_`interval'" } * confidence interval local cimatrixstring_`pt_iteration'_`spec'="`lb_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`lb_`pt_iteration'_`spec'_`interval''" } local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+"\"+"`ub_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`ub_`pt_iteration'_`spec'_`interval''" } matrix define matrix_coef_`pt_iteration'_`spec'=(`coefmatrixstring_`pt_iteration'_`spec'') matrix rownames matrix_coef_`pt_iteration'_`spec'=`rownamesstring_`pt_iteration'_`spec'' matrix colnames matrix_coef_`pt_iteration'_`spec'=b matrix matrix_coef_`pt_iteration'_`spec'=matrix_coef_`pt_iteration'_`spec'' matrix define matrix_ci_`pt_iteration'_`spec'=(`cimatrixstring_`pt_iteration'_`spec'') } if "`savetables'"!=""{ if `counter_saving'==1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) } if `counter_saving'>1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) append } } } } * NORMAL REGS if "`perturbationtest'"=="" & "`tuplestest'"=="" & "`multitest'"=="" & "`leaveoneouttest'"=="" { forvalues spec = `spec_to_run' { if "`command'"!=""{ di "`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first'" } eststo clear forvalues interval=`window'{ if "`savetables'"!="" | "`savetex'"!=""{ eststo:`regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } if "`savetables'"=="" & "`savetex'"==""{ `regtype`spec'' `y_vars'`interval' `treatmentstring`spec'' `timecontrols`spec'_`interval'' `controls`spec'' `wt`spec'' `if' `in', `regabsorb`spec'' `addvce`spec'' `addcluster`spec'' `constant' `level' `first' } if "`fstat'"==""{ qui lincom _b[`treatmentbeta`spec''] local coef_`pt_iteration'_`spec'_`interval'=r(estimate) local lb_`pt_iteration'_`spec'_`interval'=r(lb) local ub_`pt_iteration'_`spec'_`interval'=r(ub) } if "`fstat'"!=""{ local coef_`pt_iteration'_`spec'_`interval'=e(rkf) } } if "`savetex'"!=""{ esttab using `savetex'`spec'.tex, replace keep(`treatmentstring`spec''*) label order() collabels(, none) ml(,none) cells(b(star fmt (%9.3f)) se(par)) stats(r2 N, fmt(%9.3f %9.0g) labels("R$^2$" "N observations")) star(+ 0.10 * 0.05 ** 0.01 *** 0.001) } if "`savetables'"!=""{ if `spec'==1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) } if `spec'>1{ esttab using `savetables', star(+ 0.10 * 0.05 ** 0.01 *** 0.001) append } } } * Generate strings for matrixes and matrixes - based on number of coefficients plotted and iterated if "`fstat'"==""{ forvalues spec = `spec_to_run' { * coefficients and rownames local coefmatrixstring_`pt_iteration'_`spec'="`coef_`pt_iteration'_`spec'_`start''" local rownamesstring_`pt_iteration'_`spec'="_`start'" forvalues interval=`second'`window_rhs' { local coefmatrixstring_`pt_iteration'_`spec'="`coefmatrixstring_`pt_iteration'_`spec''"+"\"+"`coef_`pt_iteration'_`spec'_`interval''" local rownamesstring_`pt_iteration'_`spec'="`rownamesstring_`pt_iteration'_`spec''"+" "+"_`interval'" } * confidence interval local cimatrixstring_`pt_iteration'_`spec'="`lb_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`lb_`pt_iteration'_`spec'_`interval''" } local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+"\"+"`ub_`pt_iteration'_`spec'_`start''" forvalues interval=`second'`window_rhs' { local cimatrixstring_`pt_iteration'_`spec'="`cimatrixstring_`pt_iteration'_`spec''"+","+"`ub_`pt_iteration'_`spec'_`interval''" } matrix define matrix_coef_`pt_iteration'_`spec'=(`coefmatrixstring_`pt_iteration'_`spec'') matrix rownames matrix_coef_`pt_iteration'_`spec'=`rownamesstring_`pt_iteration'_`spec'' matrix colnames matrix_coef_`pt_iteration'_`spec'=b matrix matrix_coef_`pt_iteration'_`spec'=matrix_coef_`pt_iteration'_`spec'' matrix define matrix_ci_`pt_iteration'_`spec'=(`cimatrixstring_`pt_iteration'_`spec'') } } if "`fstat'"!=""{ forvalues spec = `spec_to_run' { * coefficients and rownames local coefmatrixstring_`pt_iteration'_`spec'="`coef_`pt_iteration'_`spec'_`start''" local rownamesstring_`pt_iteration'_`spec'="_`start'" forvalues interval=`second'`window_rhs' { local coefmatrixstring_`pt_iteration'_`spec'="`coefmatrixstring_`pt_iteration'_`spec''"+"\"+"`coef_`pt_iteration'_`spec'_`interval''" local rownamesstring_`pt_iteration'_`spec'="`rownamesstring_`pt_iteration'_`spec''"+" "+"_`interval'" } matrix define matrix_coef_`pt_iteration'_`spec'=(`coefmatrixstring_`pt_iteration'_`spec'') matrix rownames matrix_coef_`pt_iteration'_`spec'=`rownamesstring_`pt_iteration'_`spec'' matrix colnames matrix_coef_`pt_iteration'_`spec'=b matrix matrix_coef_`pt_iteration'_`spec'=matrix_coef_`pt_iteration'_`spec'' } } } **** Coefplot **** * Set default settings * Titles if ("`ytitle'"=="") & ("`fstat'"=="") local ytitle "`y_vars'" if ("`ytitle'"=="") & ("`fstat'"!="") local ytitle "`y_vars' (F-stat)" if ("`time'"=="") & ("`xtitle'"=="") local xtitle "" if ("`time'"=="day") & ("`xtitle'"=="") local xtitle "Date" if ("`time'"=="week") & ("`xtitle'"=="") local xtitle "Date" if ("`time'"=="month") & ("`xtitle'"=="") local xtitle "Month" if ("`time'"=="year") & ("`xtitle'"=="") local xtitle "Year" * Spec color if ("`speccolor1'"=="") local speccolor1 "navy" if ("`speccolor2'"=="") local speccolor2 "maroon" if ("`speccolor3'"=="") local speccolor3 "teal" * Tests color if ("`testcicolor'"=="") local testcicolor "teal" if ("`testcoefcolor'"=="") local testcoefcolor "maroon" * Offset if("`offset'"=="") local offset=0.1 * Legend if ("`legend'"=="off") { local addlegend "off" } if ("`legend'"!="off") { if "`fstat'"==""{ if ("`legend'"=="") { if ("`perturbationtest'"=="") & ("`multitest'"=="") & ("`tuplestest'"=="") & ("`leaveoneouttest'"==""){ if "`spec_num1'"=="1" & "`spec_num2'"=="1" & "`spec_num3'"=="1"{ local addlegend "order(7 "Specification 1" 8 "Specification 2" 9 "Specification 3")" } if "`spec_num1'"=="1" & "`spec_num2'"=="" & "`spec_num3'"==""{ local addlegend "order(3 "Specification 1")" } if "`spec_num1'"=="1" & "`spec_num2'"=="1" & "`spec_num3'"==""{ local addlegend "order(5 "Specification 1" 6 "Specification 2")" } if "`spec_num1'"=="1" & "`spec_num2'"=="" & "`spec_num3'"=="1"{ local addlegend "order(5 "Specification 1" 6 "Specification 3")" } } if ("`perturbationtest'"!="") | ("`multitest'"!="") | ("`tuplestest'"!="")|("`leaveoneouttest'"!="") { local addlegend "off" } } if ("`legend'"!="") { tokenize `"`legend'"', parse("123") if ("`4'"=="")&("`6'"=="") { local addlegend=`"order(3"' + `"""' + `"`2'"' + `"""')"' } if ("`4'"!="") & ("`6'"=="") { local addlegend=`"order(5 "`2'" 6 "`4'")"' } if ("`4'"!="") & ("`6'"!="") { local addlegend=`"order(7 "`2'" 8 "`4'" 9 "`6'")"' } } } if "`fstat'"!=""{ if ("`legend'"=="") { if ("`perturbationtest'"=="") & ("`multitest'"=="") & ("`tuplestest'"=="") & ("`leaveoneouttest'"==""){ if "`spec_num1'"=="1" & "`spec_num2'"=="1" & "`spec_num3'"=="1"{ local addlegend "order(1 "Specification 1" 2 "Specification 2" 3 "Specification 3")" } if "`spec_num1'"=="1" & "`spec_num2'"=="" & "`spec_num3'"==""{ local addlegend "order(1 "Specification 1")" } if "`spec_num1'"=="1" & "`spec_num2'"=="1" & "`spec_num3'"==""{ local addlegend "order(1 "Specification 1" 2 "Specification 2")" } if "`spec_num1'"=="1" & "`spec_num2'"=="" & "`spec_num3'"=="1"{ local addlegend "order(1 "Specification 1" 3 "Specification 3")" } } if ("`perturbationtest'"!="") | ("`multitest'"!="") | ("`tuplestest'"!="")|("`leaveoneouttest'"!="") { local addlegend "off" } } if ("`legend'"!="") { tokenize `"`legend'"', parse("123") if ("`4'"=="")&("`6'"=="") { local addlegend=`"order(1"' + `"""' + `"`2'"' + `"""')"' } if ("`4'"!="") & ("`6'"=="") { local addlegend=`"order(1 "`2'" 2 "`4'")"' } if ("`4'"!="") & ("`6'"!="") { local addlegend=`"order(1 "`2'" 2 "`4'" 3 "`6'")"' } } } } * Symbols of graph of different shape if (("`symbols'"=="") & ("`symbol1'"=="") & ("`symbol2'"=="") & ("`symbol3'"=="")) local addsymbols "msize(medsmall) symbol(circle)" if ("`symbols'"=="") & (("`symbol1'"!="") | ("`symbol2'"!="") | ("`symbol3'"!="")){ local addsymbols "" if ("`symbol1'"=="") local addsymbol1="symbol(circle)" if ("`symbol2'"=="") local addsymbol2="symbol(circle)" if ("`symbol3'"=="") local addsymbol3="symbol(circle)" if ("`symbol1'"!="") local addsymbol1="symbol(`symbol1')" if ("`symbol2'"!="") local addsymbol2="symbol(`symbol2')" if ("`symbol3'"!="") local addsymbol3="symbol(`symbol3')" } if ("`symbols'"!="") | (("`symbols'"!="") & (("`symbol1'"!="") | ("`symbol2'"!="") | ("`symbol3'"!=""))) { local addsymbols "" if ("`symbol1'"=="") local addsymbol1="symbol(square)" if ("`symbol2'"=="") local addsymbol2="symbol(X)" if ("`symbol3'"=="") local addsymbol3="symbol(circle)" if ("`symbol1'"!="") local addsymbol1="symbol(`symbol1')" if ("`symbol2'"!="") local addsymbol2="symbol(`symbol2')" if ("`symbol3'"!="") local addsymbol3="symbol(`symbol3')" } * Size if ("`xsize'"=="") local xsize "8" if ("`ysize'"=="") local ysize "" * Lines and labels if ("`yline'"=="") & ("`fstat'"=="") local yline "0, lpattern(dash) lcolor(gray)" if ("`yline'"=="") & ("`fstat'"!="") local yline "10, lpattern(dash) lcolor(gray)" * Locals with the date format for the xline local span=`win_iter_counter' local startp6=`end'+6 local endp6=`end'+6 local startday : di %tdMonth_dd `start' local endday : di %tdMonth_dd `end' local startmonth : di %tdMonth_YYYY `start' local endmonth : di %tdMonth_YYYY `end' local startweek : di %tdMon_dd `start' local endweek : di %tdMon_dd `end' local startweekp6 : di %tdMon_dd `startp6' local endweekp6: di %tdMon_dd `endp6' local startweek="`startweek'"+"_"+"-"+"`startweekp6'" local endweek="`endweek'"+"_"+"-"+"`endweekp6'" if ("`xline'"=="") & ("`xline'"!="off") local addxline "xline(1 `span', lpattern(dash) lcolor(gray%60) lwidth(thin))" if ("`xline'"!="") & ("`xline'"!="off") local addxline "xline(`xline')" * xlabel if not specified (xlabel not specified and from user have to be in this order) if ("`xlabel'"==""){ if ("`time'"=="") local xlabel "1 "`start'" `span' "`end'"" if ("`time'"=="year") local xlabel "1 "`start'" `span' "`end'"" if ("`time'"=="month") local xlabel "1 "`startmonth'" `span' "`endmonth'"" if ("`time'"=="week") local xlabel "1 "`startweek'" `span' "`endweek'"" if ("`time'"=="day") local xlabel "1 "`startday'" `span' "`endday'"" } * xlabel from user if ("`xlabel'"!="") { local counter_xlabel=0 foreach element in `xlabel' { local counter_xlabel=`counter_xlabel'+1 if `counter_xlabel'==1 { local xlabel ="`element'"+"§" } if `counter_xlabel'>1 { if mod(`counter_xlabel',2)==0{ local xlabel ="`xlabel'"+"`element'"+"§§" } if mod(`counter_xlabel',2)==1 { local xlabel ="`xlabel'"+"`element'"+"§" } } } local xlabel=subinstr(`"`xlabel'"',"§§",`"" "',.) local xlabel=subinstr(`"`xlabel'"',"§",`" ""',.) } if ("`perturbationtest'"=="") & ("`multitest'"=="") & ("`tuplestest'"=="") & ("`leaveoneouttest'"=="") { if "`fstat'"==""{ * fix offset in case only specs 1 and 2 are run (to match the labels) local addoffset="offset(-`offset')" if ("`spec_num2'"=="") & ("`spec_num3'"=="") local addoffset="offset(0)" local coefplot_string_ci="(matrix(matrix_coef_`pt_iteration'_1), `addoffset' ci(matrix_ci_`pt_iteration'_1) ciopts(color(`speccolor1'%50)) color(maroon%0))" forvalues spec = 2/3 { if "`spec_num`spec''"=="1"{ if "`spec'"== "2"{ if ("`spec_num2'"!="") & ("`spec_num3'"!="") local spacing="" if ("`spec_num2'"!="") & ("`spec_num3'"=="") local spacing="offset(+`offset')" local color="`speccolor2'%70" } if "`spec'"== "3"{ local color="`speccolor3'%90" local spacing="offset(+`offset')" } local coefplot_string_ci="`coefplot_string_ci'"+"(matrix(matrix_coef_`pt_iteration'_`spec'), `spacing' ci(matrix_ci_`pt_iteration'_`spec') ciopts(color(`color')) color(maroon%0))" } } local coefplot_string_coef="(matrix(matrix_coef_`pt_iteration'_1), `addoffset' noci color(`speccolor1'%40) `addsymbol1' mlwidth(vthin))" forvalues spec = 2/3 { if "`spec_num`spec''"=="1"{ if "`spec'"== "2"{ if ("`spec_num2'"!="") & ("`spec_num3'"!="") local spacing="" if ("`spec_num2'"!="") & ("`spec_num3'"=="") local spacing="offset(+`offset')" local color="`speccolor2'%60" } if "`spec'"== "3"{ local color="`speccolor3'%70" local spacing="offset(+`offset')" } local coefplot_string_coef="`coefplot_string_coef'"+"(matrix(matrix_coef_`pt_iteration'_`spec'), `spacing' noci `addsymbol`spec'' color(`color') mlwidth(vthin))" } } } if "`fstat'"!=""{ * fix offset in case only specs 1 and 2 are run (to match the labels) local addoffset="offset(-`offset')" if ("`spec_num2'"=="") & ("`spec_num3'"=="") local addoffset="offset(0)" local coefplot_string_coef="(matrix(matrix_coef_`pt_iteration'_1), `addoffset' noci color(`speccolor1'%40) `addsymbol1' mlwidth(vthin))" forvalues spec = 2/3 { if "`spec_num`spec''"=="1"{ if "`spec'"== "2"{ if ("`spec_num2'"!="") & ("`spec_num3'"!="") local spacing="" if ("`spec_num2'"!="") & ("`spec_num3'"=="") local spacing="offset(+`offset')" local color="`speccolor2'%60" } if "`spec'"== "3"{ local color="`speccolor3'%70" local spacing="offset(+`offset')" } local coefplot_string_coef="`coefplot_string_coef'"+"(matrix(matrix_coef_`pt_iteration'_`spec'), `spacing' noci `addsymbol`spec'' color(`color') mlwidth(vthin))" } } } } if ("`perturbationtest'"!="") { local first_element `: word 1 of `vals_perturbation_test'' local coefplot_string_ci="(matrix(matrix_coef_`first_element'_1), ci(matrix_ci_`first_element'_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" local counter1=0 foreach pt_iteration in `vals_perturbation_test' { local counter1=`counter1'+1 if `counter1'>1 { local coefplot_string_ci="`coefplot_string_ci'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" } } local coefplot_string_ci2="(matrix(matrix_coef_`first_element'_1), ci(matrix_ci_`first_element'_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" local counter2=0 foreach pt_iteration in `vals_perturbation_test' { local counter2=`counter2'+1 if `counter2'>1 { local coefplot_string_ci2="`coefplot_string_ci2'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" } } local coefplot_string_coef="(matrix(matrix_coef_`first_element'_1), noci color(`testcoefcolor') mlwidth(thin))" local counter3=0 foreach pt_iteration in `vals_perturbation_test' { local counter3=`counter3'+1 if `counter3'>1 { local coefplot_string_coef="`coefplot_string_coef'"+"(matrix(matrix_coef_`pt_iteration'_1), noci color(`testcoefcolor') mlwidth(thin))" } } } if ("`tuplestest'"!="") { local coefplot_string_ci="(matrix(matrix_coef_1_1), ci(matrix_ci_1_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" forvalues pt_iteration=2/`tuplesnumber'{ local coefplot_string_ci="`coefplot_string_ci'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" } local coefplot_string_ci2="(matrix(matrix_coef_1_1), ci(matrix_ci_1_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" forvalues pt_iteration=2/`tuplesnumber'{ local coefplot_string_ci2="`coefplot_string_ci2'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" } local coefplot_string_coef="(matrix(matrix_coef_1_1), noci color(`testcoefcolor') mlwidth(thin))" forvalues pt_iteration=2/`tuplesnumber'{ local coefplot_string_coef="`coefplot_string_coef'"+"(matrix(matrix_coef_`pt_iteration'_1), noci color(`testcoefcolor') mlwidth(thin))" } } if ("`leaveoneouttest'"!="") { local coefplot_string_ci="(matrix(matrix_coef_1_1), ci(matrix_ci_1_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" forvalues pt_iteration=2/`leaveoneoutvarnumber'{ local coefplot_string_ci="`coefplot_string_ci'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" } local coefplot_string_ci2="(matrix(matrix_coef_1_1), ci(matrix_ci_1_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" forvalues pt_iteration=2/`leaveoneoutvarnumber'{ local coefplot_string_ci2="`coefplot_string_ci2'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" } local coefplot_string_coef="(matrix(matrix_coef_1_1), noci color(`testcoefcolor') mlwidth(thin))" forvalues pt_iteration=2/`leaveoneoutvarnumber'{ local coefplot_string_coef="`coefplot_string_coef'"+"(matrix(matrix_coef_`pt_iteration'_1), noci color(`testcoefcolor') mlwidth(thin))" } } if ("`multitest'"!="") { local first_element `: word 1 of `multitest'' local coefplot_string_ci="(matrix(matrix_coef_`first_element'_1), ci(matrix_ci_`first_element'_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" local counter1=0 foreach pt_iteration in `multitest' { local counter1=`counter1'+1 if `counter1'>1 { local coefplot_string_ci="`coefplot_string_ci'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rarea) ciopts(color(`testcicolor'%7)) color(maroon%0))" } } local coefplot_string_ci2="(matrix(matrix_coef_`first_element'_1), ci(matrix_ci_`first_element'_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" local counter2=0 foreach pt_iteration in `multitest' { local counter2=`counter2'+1 if `counter2'>1 { local coefplot_string_ci2="`coefplot_string_ci2'"+"(matrix(matrix_coef_`pt_iteration'_1), ci(matrix_ci_`pt_iteration'_1) cirecast(rline) ciopts(color(`testcicolor') lwidth(vthin)) color(navy%0))" } } local coefplot_string_coef="(matrix(matrix_coef_`first_element'_1), noci color(`testcoefcolor') mlwidth(thin))" local counter3=0 foreach pt_iteration in `multitest' { local counter3=`counter3'+1 if `counter3'>1 { local coefplot_string_coef="`coefplot_string_coef'"+"(matrix(matrix_coef_`pt_iteration'_1), noci color(`testcoefcolor') mlwidth(thin))" } } } coefplot `coefplot_string_ci' `coefplot_string_ci2' `coefplot_string_coef' , nooffsets graphregion(margin(3 8 3 3)) graphregion(fcolor(white)) vertical yline(`yline') `addxline' ysize(`ysize') xsize(`xsize') ytitle(`ytitle') xtitle(`xtitle') ylabel(`ylabel') xlabel(`xlabel') legend(`addlegend') `addsymbols' end