*! eventdd_estat: Estimate panel event study models and generate plots *! Version 2.0.0 October 08, 2023 @ 11:15:11 *! Author: Damian Clarke & Kathya Tapia-Schythe cap program drop eventdd_estat program eventdd_estat, eclass vers 13.0 preserve if ("`e(cmd)'"=="eventdd")+("`e(cmd)'"=="eventdd_estat")==0{ error 321 } local over `e(over)' local baseline = e(baseline) gettoken subcmd rest : 0, parse(" ,") local opts=subinword("`rest'","wboot","",.) local opts=subinword("`opts'","dropdummies","",.) local opts=subinword("`opts'",",","",.) if ("`over'"=="") { local jitter } if ("`over'"!="") { cap confirm string variable `over' if !_rc { local over_var `over' qui levelsof `over', local(str_groups) encode `over', gen(ov_num) drop `over' rename ov_num `over' } else { local over_var `over' qui levelsof `over', local(str_groups) } } if ("`over'"=="") { local estat_wboot `e(estat_wboot)' mat nleads = e(leads) mat nlags = e(lags) if strmatch(`"`rest'"', "*wboot*")==1 { qui `estat_wboot' } if "`subcmd'"=="leads" { mat n_leads = nleads[.,"Lead"] *preserve svmat n_leads, names(n_leads) qui drop if -n_leads1==`baseline' qui levelsof n_leads, local(n_leads) *restore local list_leads foreach n of local n_leads { local list_leads `list_leads' lead`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui boottest `list_leads', `opts' } else{ qui test `list_leads', `opts' } local F_leads = r(F) local p_leads = r(p) local df_leads = r(df) local df_r_leads = r(df_r) if strmatch(`"`rest'"', "*wboot*")==1{ dis "{col 40}" } dis "{col 40}" dis _col(5)"Joint significance test for leads" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_leads' dis "P-value:{col 25}" %9.4f `p_leads' dis "{hline 40}" dis "Degrees of freedom" "{col 27}(`df_leads',`df_r_leads')" dis "{hline 40}" } else if "`subcmd'"=="lags" { mat n_lags = nlags[.,"Lag"] *preserve svmat n_lags, names(n_lags) qui drop if n_lags1==`baseline' qui levelsof n_lags, local(n_lags) *restore local list_lags foreach n of local n_lags{ local list_lags `list_lags' lag`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui boottest `list_lags', `opts' } else{ qui test `list_lags', `opts' } local F_lags = r(F) local p_lags = r(p) local df_lags = r(df) local df_r_lags = r(df_r) if strmatch(`"`rest'"', "*wboot*")==1{ dis "{col 40}" } dis "{col 40}" dis _col(5)"Joint significance test for lags" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_lags' dis "P-value:{col 25}" %9.4f `p_lags' dis "{hline 40}" dis "Degrees of freedom" "{col 27}(`df_lags',`df_r_lags')" dis "{hline 40}" } else if "`subcmd'"=="eventdd" { ***LEADS*** mat n_leads = nleads[.,"Lead"] *preserve svmat n_leads, names(n_leads) qui drop if -n_leads1==`baseline' qui levelsof n_leads, local(n_leads) *restore local list_leads foreach n of local n_leads { local list_leads `list_leads' lead`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui boottest `list_leads', `opts' } else{ qui test `list_leads', `opts' } local F_leads = r(F) local p_leads = r(p) local df_leads = r(df) local df_r_leads = r(df_r) ***LAGS*** mat n_lags = nlags[.,"Lag"] *preserve svmat n_lags, names(n_lags) qui drop if n_lags1==`baseline' qui levelsof n_lags, local(n_lags) *restore local list_lags foreach n of local n_lags{ local list_lags `list_lags' lag`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui boottest `list_lags', `opts' } else{ qui test `list_lags', `opts' } local F_lags = r(F) local p_lags = r(p) local df_lags = r(df) local df_r_lags = r(df_r) if strmatch(`"`rest'"', "*wboot*")==1{ dis "{col 40}" } dis "{col 40}" dis _col(7)"Joint significance test for" dis _col(12)"leads and lags" dis "{hline 40}" dis _col(17)"LEADS" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_leads' dis "P-value:{col 25}" %9.4f `p_leads' dis "Degrees of freedom" "{col 27}(`df_leads',`df_r_leads')" dis "{hline 40}" dis _col(18)"LAGS" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_lags' dis "P-value:{col 25}" %9.4f `p_lags' dis "Degrees of freedom" "{col 27}(`df_lags',`df_r_lags')" dis "{hline 40}" } } else if ("`over'"!="") { qui levelsof `over', local(groups) local j = 1 foreach g of local groups{ local estat_wboot_g`g' `e(estat_wboot_g`g')' mat nleads_g`g' = e(leads_g`j') mat nlags_g`g' = e(lags_g`j') local ++j } _Na_Me_Gr `str_groups', over(`over') local k = 1 foreach g of local groups{ local name_g`g' "`s(name_g`k')'" local ++k } foreach g of local groups{ if "`subcmd'"=="leads" { mat n_leads_g`g' = nleads_g`g'[.,"Lead"] *preserve svmat n_leads_g`g', names(n_leads_g`g') qui drop if -n_leads_g`g'1==`baseline' qui levelsof n_leads_g`g', local(n_leads_g`g') *restore local list_leads_g`g' foreach n of local n_leads_g`g' { local list_leads_g`g' `list_leads_g`g'' lead`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui `estat_wboot_g`g'' qui boottest `list_leads_g`g'', `opts' } else{ qui estimates restore est_g`g' qui test `list_leads_g`g'', `opts' } local F_leads_g`g' = r(F) local p_leads_g`g' = r(p) local df_leads_g`g' = r(df) local df_r_leads_g`g' = r(df_r) if strmatch(`"`rest'"', "*wboot*")==1{ dis "{col 40}" } dis "{col 40}" dis "Joint significance test for leads - `over_var'=`name_g`g''" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_leads_g`g'' dis "P-value:{col 25}" %9.4f `p_leads_g`g'' dis "{hline 40}" dis "Degrees of freedom" "{col 27}(`df_leads_g`g'',`df_r_leads_g`g'')" dis "{hline 40}" } else if "`subcmd'"=="lags" { mat n_lags_g`g' = nlags_g`g'[.,"Lag"] *preserve svmat n_lags_g`g', names(n_lags_g`g') qui drop if n_lags_g`g'1==`baseline' qui levelsof n_lags_g`g', local(n_lags_g`g') *restore local list_lags_g`g' foreach n of local n_lags_g`g' { local list_lags_g`g' `list_lags_g`g'' lag`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui `estat_wboot_g`g'' qui boottest `list_lags_g`g'', `opts' } else{ qui estimates restore est_g`g' qui test `list_lags_g`g'', `opts' } local F_lags_g`g' = r(F) local p_lags_g`g' = r(p) local df_lags_g`g' = r(df) local df_r_lags_g`g' = r(df_r) if strmatch(`"`rest'"', "*wboot*")==1{ dis "{col 40}" } dis "{col 40}" dis "Joint significance test for lags - `over_var'=`name_g`g''" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_lags_g`g'' dis "P-value:{col 25}" %9.4f `p_lags_g`g'' dis "{hline 40}" dis "Degrees of freedom" "{col 27}(`df_lags_g`g'',`df_r_lags_g`g'')" dis "{hline 40}" } else if "`subcmd'"=="eventdd" { ***LEADS*** mat n_leads_g`g' = nleads_g`g'[.,"Lead"] *preserve svmat n_leads_g`g', names(n_leads_g`g') qui drop if -n_leads_g`g'1==`baseline' qui levelsof n_leads_g`g', local(n_leads_g`g') *restore local list_leads_g`g' foreach n of local n_leads_g`g' { local list_leads_g`g' `list_leads_g`g'' lead`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui `estat_wboot_g`g'' qui boottest `list_leads_g`g'', `opts' } else{ qui estimates restore est_g`g' qui test `list_leads_g`g'', `opts' } local F_leads_g`g' = r(F) local p_leads_g`g' = r(p) local df_leads_g`g' = r(df) local df_r_leads_g`g' = r(df_r) ***LAGS*** mat n_lags_g`g' = nlags_g`g'[.,"Lag"] *preserve svmat n_lags_g`g', names(n_lags_g`g') qui drop if n_lags_g`g'1==`baseline' qui levelsof n_lags_g`g', local(n_lags_g`g') *restore local list_lags_g`g' foreach n of local n_lags_g`g' { local list_lags_g`g' `list_lags_g`g'' lag`n' } if strmatch(`"`rest'"', "*wboot*")==1{ qui `estat_wboot_g`g'' qui boottest `list_lags_g`g'', `opts' } else{ qui estimates restore est_g`g' qui test `list_lags_g`g'', `opts' } local F_lags_g`g' = r(F) local p_lags_g`g' = r(p) local df_lags_g`g' = r(df) local df_r_lags_g`g' = r(df_r) if strmatch(`"`rest'"', "*wboot*")==1{ dis "{col 40}" } dis "{col 40}" dis _col(7)"Joint significance test for" dis _col(7)"leads and lags - `over_var'=`name_g`g''" dis "{hline 40}" dis _col(17)"LEADS" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_leads_g`g'' dis "P-value:{col 25}" %9.4f `p_leads_g`g'' dis "Degrees of freedom" "{col 27}(`df_leads_g`g'',`df_r_leads_g`g'')" dis "{hline 40}" dis _col(18)"LAGS" dis "{hline 40}" dis "F-stat:{col 25}" %9.4f `F_lags_g`g'' dis "P-value:{col 25}" %9.4f `p_lags_g`g'' dis "Degrees of freedom" "{col 27}(`df_lags_g`g'',`df_r_lags_g`g'')" dis "{hline 40}" } } } ereturn local cmd "eventdd_estat" ereturn local estat_cmd "eventdd_estat" if strmatch(`"`rest'"', "*wboot*")==1 { ereturn local keepdummies "keepdummies" } ereturn scalar baseline=`baseline' if ("`over'"=="") { ereturn local estat_wboot "`estat_wboot'" ereturn matrix lags nlags ereturn matrix leads nleads } else if ("`over'"!="") { ereturn local over "`over_var'" local i = 1 foreach g of local groups{ ereturn local estat_wboot_g`g' "`estat_wboot_g`g''" ereturn matrix lags_g`i' nlags_g`g' ereturn matrix leads_g`i' nleads_g`g' local ++i } } restore end *------------------------------------------------------------------------------- *--- Subroutines *------------------------------------------------------------------------------- cap program drop _Na_Me_Gr program define _Na_Me_Gr, sclass vers 13.0 syntax [anything], over(varlist max=1) qui levelsof `over', local(groups) local G = r(r) tokenize `"`anything'"' foreach g of numlist 1/`G'{ sreturn local name_g`g' ``g'' } end