Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
177 views

Program Code

This document describes an Stata program called xtvar that estimates vector autoregressions for panel data. The program allows for lagged dependent variables, fixed effects, and the estimation of impulse response functions and forecast error variance decompositions. It provides output including coefficients, standard errors, test statistics, and allows saving results to matrices and generating graphs of impulse responses and forecast error variance decompositions.

Uploaded by

ecobalas7
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
177 views

Program Code

This document describes an Stata program called xtvar that estimates vector autoregressions for panel data. The program allows for lagged dependent variables, fixed effects, and the estimation of impulse response functions and forecast error variance decompositions. It provides output including coefficients, standard errors, test statistics, and allows saving results to matrices and generating graphs of impulse responses and forecast error variance decompositions.

Uploaded by

ecobalas7
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 23

*! xtvar.ado v1.0.

2 Cagala & Glogowsky 01apr2015


*! Friedrich-Alexander Universitt Erlangen-Nuremberg
*! For an application see Cagala et al. (2014): Cooperation and Trustworthiness
in Repeated Interaction
*! For Stata 12.0+
* Version history
* 1.0.1
* 1.0.2
capture program drop xtvar
program xtvar, eclass
version 12.0 //program is for STATA 12.0+
eret clear
syntax varlist [if] [,
LAGs(integer 2)
Reps(integer 200)
STep(integer 8)
Level(integer 95)
SSAving(string)
POoled
bsn
dbsn
bsp
mc
STIrf
norm
nodraw
]

///
///
///
///
///
///
///
///
///
///
///
///
///
///

/*set standard method for ci*/


if "`bsn'`dbsn'`bsp'`mc'" == "" {
local bsn = "bsn"
}
if length("`bsn'`dbsn'`bsp'`mc'") > 4 {
di "{err}please select only one method for computing confidence
intervals"
exit `rc'
}
/*ERROR section*/
*confirm variable names*
while "`1'" != "" {
if length("'1'") >= 3 {
if strmatch("`1'", "cons") == 1{
di "{err}input variables are not allowed to be n
amed 'cons'"
exit `rc'
}
if substr("`1'", 1, 3) == "l1_"{
di "{err}input variables are not allowed to begi
n with 'l1_'"
exit `rc'
}
}
mac shift
}
*check if unbalanced panel*
qui xtset

if r(balanced) != "strongly balanced"{


di "{err}panel is not strongly balanced"
exit `rc'
}
*check if there are gaps in time variable"
qui tsreport, panel
if r(N_gaps) != 0{
di "{err}there are gaps in the time variable"
exit `rc'
}
tempname depvar b V V_s txt1 txt2 txt3 ///
panelvar timevar d cresv resv CI2 CI3 MSR
preserve
capture noisily {
/*allow for if statements*/
if "`if'" != "" {
quietly keep `if'
}
/*sort*/
qui xtset
sort `r(panelvar)' `r(timevar)'
/*new xtset*/
local ivar "`r(panelvar)'"
egen `panelvar' = group(`ivar')
by `ivar': gen `timevar' = _n
qui xtset `panelvar' `timevar'
/*generate local macros*/
local cmdline "`0'"
local tmax `r(tmax)'
local imax `r(imax)'
local depvars = wordcount("`varlist'")
local rep 0
local step = `step' + 1
if missing("`rm'") {
local cit "p"
}
else {
local cit "n"
}
/*generate lagged variables & dummies*/
genlagdum `varlist' ,
///
d(`d')
///
timevar(`timevar')
///
panelvar(`panelvar')
///
`pooled'
///
lags(`lags')
local obs = _N //number of observations
/*generate lists*/
lists `varlist' ,
d(`d')
`pooled'

///
///
///

lags(`lags')
imax(`imax')
rep(`rep')

///
///

local indepvarlist "`r(indepvarlist)'"


local constants "`r(constants)'"
/*estimation*/
estimation `varlist' ,
resv(`resv')
cresv(`cresv')
panelvar(`panelvar')
ci(`bsn' `dbsn' `bsp' `mc')
depvars(`depvars')
lags(`lags')
rep(`rep')
indepvarlist(`indepvarlist')
constants(`constants')

///
///
///
///
///
///
///
///
///

local res`rep' "`r(res`rep')'"


if (!missing("`bsn'") | !missing("`dbsn'")) & `rep' == 0 {
local cres "`r(cres)'"
}
/*covariance matrix*/
covariance ,
`pooled'
depvars(`depvars')
lags(`lags')
imax(`imax')
obs(`obs')
rep(`rep')
res(`res`rep'')

///
///
///
///
///
///
///

/*contemporary effects*/
contemporary , ///
rep(`rep')
/*variance coefficients*/
varianceb `varlist' ,
rep(`rep')
indepvarlist(`indepvarlist')
constants(`constants')
ci(`bsn' `dbsn' `bsp' `mc')
/*irf*/
irf ,
`stirf'
lags(`lags')
step(`step')
rep(`rep')
depvars(`depvars')

///
///
///
///

///
///
///
///
///

mat drop COL`rep'


tempfile boot
/*generate variables/dataset*/
if missing("`mc'") {
keep `cres' `timevar' `panelvar'
qui save "`boot'" //save dataset for bootestrap

}
/*fevd*/
fevd ,
step(`step')
rep(`rep')
depvars(`depvars')

///
///
///

local fevd "`r(fevd)'"


/*prepare monte carlo*/
if !missing("`mc'") {
preparemc ,
`pooled'
obs(`obs')
reps(`reps')
rep(`rep')
depvars(`depvars')
constants(`constants')
indepvarlist(`indepvarlist')
depvarlist(`varlist')
lags(`lags')
imax(`imax')

///
///
///
///
///
///
///
///
///
///

local betau "`r(betau)'"


}
/*confidence intervals*/
ci ,
resv(`resv')
timevar(`timevar')
panelvar(`panelvar')
`stirf'
`pooled'
ci(`bsn' `dbsn' `bsp' `mc')
step(`step')
reps(`reps')
obs(`obs')
lags(`lags')
imax(`imax')
tmax(`tmax')
level(`level')
cres(`cres')
depvars(`depvars')
res0(`res0')
constants(`constants')
indepvarlist(`indepvarlist')
betau(`betau')
boot(`boot')

///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///

/*results: matrices*/
if missing("`pooled'") {
mat `b'=vec(B_s0)'
local i = 1 //drop rows with dummies
while `i' <= (`depvars' * `lags' + `imax') * `depvars' {
mat `V_s' = nullmat(`V_s') \
///
V0[`i'..`i' + `depvars' * `lags' - 1, 1...]
local i = `i' + `depvars' * `lags' + `imax'
}

local i = 1 //drop columns with dummies


while `i' <= (`depvars' * `lags' + `imax') * `depvars' {
mat `V' = nullmat(`V') ,
///
`V_s'[1...,`i'..`i' + `depvars' * `lags' - 1]
local i = `i' + `depvars' * `lags' + `imax'
}
}
else {
mat colnames B0 = `varlist'
mat `b' = vec(B0)'
mat `V' = V0
}
mat drop V0 B0 B_s0
ereturn post `b' `V'
eret mat Sigma = Sigma0, copy
/*results: scalars*/
eret scalar N = `obs'
eret scalar neqs = `depvars'
if missing("`pooled'") {
forvalues i = 1/`depvars' {
eret scalar k_`i' = `lags' * `depvars' + `imax'
eret scalar df_m = `lags' * `depvars'
eret scalar df_m`i' = e(df_m)
eret scalar df_r = `obs' - e(df_m) - `imax'
eret scalar df_r`i' = e(df_r)
}
}
else {
forvalues i = 1/`depvars' {
eret scalar k_`i'= `lags' * `depvars' + 1
eret scalar df_m = `lags' * `depvars'
eret scalar df_m`i' = e(df_m)
eret scalar df_r = `obs' - e(df_m) - 1
eret scalar df_r`i' = e(df_r)
}
}
mat `MSR' = vecdiag(Sigma0)
mat drop Sigma0
local i=1
foreach var of local varlist {
eret scalar r2_`i' = r2_`i'
eret scalar tss_`i' = tss_`i'
eret scalar rss_`i' = rss_`i'
eret scalar mss_`i' = mss_`i'
scalar MSR`var' = `MSR'[1,`i']
eret scalar rmse_`i' = MSR`var'^(1/2)
eret scalar F_`i' = F_`i'
eret scalar F_panel_`i' = F_panel_`i'
eret scalar p_panel_`i' = p_panel_`i'
scalar drop r2_`i' tss_`i' rss_`i' mss_`i'
F_`i' F_`i' F_panel_`i' p_panel_`i' MSR`var'
local i = `i' + 1
}

///

eret scalar N_g = `imax'


eret scalar g = `obs'/`imax'
/*results:
eret local
eret local
eret local
eret local

macros*/
ivar "`ivar'"
eqnames "`varlist'"
cmd "xtvar"
cmdline `"`e(cmd)' `cmdline'"'

/*display results*/
if missing("`pooled'") {
local txt1="Panel (LSDV) vector autoregression"
local txt2="Group variable: "
local txt3="`e(ivar)'"
}
else {
local txt1="Pooled vector autoregression"
local txt2=""
local txt3=""
}
#delimit ;
di _n in gr "`txt1'"
_col(49) in gr "Number of obs" _col(68) "="
_col(70) in ye %9.0f e(N) ;
di in gr "`txt2'" in ye abbrev("`txt3'",12) in gr
_col(49) "Number of groups" _col(68) "="
_col(70) in ye %9.0g e(N_g) _n ;
di in gr
_col(49) in gr "Obs per group" _col(68) "="
_col(70) in ye %9.0f e(g) ;
#delimit cr
di
_vardisprmse , est(var) small
if missing("`pooled'") {
di "F statistic for F("e(df_m) ","e(df_r) ")"
}
else {
di "F statistic is for F("e(df_m) ","e(df_r) ")"
}
eret display, level(`level')
di
di
mat rownames A0 = `varlist'
mat colnames A0 = `varlist'
di "Contemporary coefficients"
mat list A0, noheader
eret mat A = A0
/*tables & graphs: lists*/
order D* F* step
qui ds
tokenize "`r(varlist)'"

while "`1'" != "" & "`1'" != "step" {


local list "`1'_ll `1'_ul"
foreach c of local list {
local CIn "`CIn' n`c'"
local CIp "`CIp' p`c'"
}
macro shift
}
local cilist "p n"
foreach c of local cilist {
mat `CI2'`c' = CI`c'
forvalues i = 1/`step' {
mat `CI3'`c'= nullmat(`CI3'`c') \
///
vec(`CI2'`c'[1..2 * `depvars' * `depvars', 1...]')'
capture mat `CI2'`c' = ///
`CI2'`c'[2 * `depvars' * `depvars' + 1..., 1...]
}
mat colnames `CI3'`c' = `CI`c''
svmat `CI3'`c', names(col)
mat drop CI`c'
}
/*tables & graphs: names for ci*/
foreach var of varlist *_ul {
char `var'[varname] "Upper"
}
foreach var of varlist *_ll {
char `var'[varname] "Lower"
}
foreach var of varlist D* {
char `var'[varname] "IRF"
}
foreach var of varlist FEVD* {
char `var'[varname] "FEVD"
}
foreach var1 of local varlist {
foreach var2 of local varlist {
local shock "`shock' `var1' `var2'"
}
}
/*save datset*/
if !missing("`ssaving'") {
save `ssaving'
}
/*display tables & prepare graphs */
local s = 1
local r = 2
local t = `depvars' * `depvars'
tokenize `shock'
forvalues i = 1/`t' {
local IRF`i' "D0`i'"
local IRF`i' "`IRF`i'' `cit'D0`i'_ll `cit'D0`i'_ul"

/* *to show both confidence bands


local IRF`i' "`IRF`i'' pD0`i'_ll pD0`i'_ul"
local IRF`i' "`IRF`i'' nD0`i'_ll nD0`i'_ul"
*/
local IRFFE`i' "`IRF`i'' FEVD0`i'"
/* *to show both confidence bands
local IRFFE`i' "`IRFFE`i'' pFEVD0`i'_ll pFEVD0`i'_ul"
local IRFFE`i' "`IRFFE`i'' nFEVD0`i'_ll nFEVD0`i'_ul"
*/
local IRFFE`i' "`IRFFE`i'' `cit'FEVD0`i'_ll `cit'FEVD0`i'_ul"
local table_IRF`i' "s `IRFFE`i''"
di
di "Response of " in ye "``r''" in gr " to shock in " in ye "``
s''"
local sep = round(`step'/2,1)
list `table_IRF`i'', noob subvarname separator(`sep')
local k = `k' + 1
twoway line `IRF`i'' step,
///
name(IRF`i', replace) yline(0, lcolor(gs10) lwidth(mediu
m))

///
legend(off) subtitle(Response: ``r'', position(11)) nodr

aw
local i = `i' + 1
local s = `s' + 2
local r = `r' + 2
}
if "`cit'" == "p" {
di
di in ye `level' "% lower and upper bounds reported; percentile
ci"
}
else {
di
di in ye `level' "% lower and upper bounds reported; standard no
rmal ci"
}
local i = 1
local j = 1
local k = 1
forvalues i = 1/`t' {
local GIRF`j' "`GIRF`j'' IRF`i'"
if `k' == `depvars' {
local j = `j' + 1
local k = 0
}
local k = `k' + 1
}
/*display graphs*/
if missing("`draw'") {
local i = 1

while `i' <= `depvars' {


foreach var of local varlist {
if "`cit'" == "p" {
gr combine `GIRF`i'',
///
xcom imargin(0 0 0 0)
///
subtitle(Impulse: `var', position(11))
///
name(IRF_`var', replace)
///
note("`level'% lower and upper bounds re
ported; percentile ci")
}
else {
gr combine `GIRF`i'',
///
xcom imargin(0 0 0 0)
///
subtitle(Impulse: `var', position(11))
///
name(IRF_`var', replace)
///
note("`level'% lower and upper bounds re
ported; standard normal ci")
}
local i = `i' + 1
}
}
tokenize `fevd'
local k = 1
foreach var of local varlist {
local legend `" `legend' label(`k' "`var'") "'
local k = `k' + 1
}
local j = 1
while `j' <= `depvars' {
foreach var of local varlist {
forvalues i = 1/`depvars' {
local FEVD`j' "`FEVD`j'' `1'"
macro shift
}
graph bar (sum) `FEVD`j'' if step >0,
///
perc over(step) stack subtitle(FEVD: `va
r', position(11))

///
name(FEVD_`var', replace) legend(`legen

d')
local j = `j' + 1
}
}
}
}
if _rc != 0
{
di
di "{err}the program produced an error or was stopped"
di "for information type: search rc " _rc
di "clear matrix before running xtvar again"

}
restore
end
//GENERATE LAGGED VARIABLES AND GROUP DUMMIES
capture program drop genlagdum
program define genlagdum
syntax varlist [ ,
///
d(string)
///
timevar(string)
///
panelvar(string)
///
pooled
///
lags(integer 2)
///
]
keep `varlist' `panelvar' `timevar'
/*generate lagged variables*/
foreach var of local varlist {
forvalues i = 1 / `lags' {
qui gen l`i'_`var' = l`i'.`var'
}
}
/*generate group dummies/ constant*/
if missing("`pooled'") {
qui tab `panelvar', gen(`d')
}
else {
gen cons = 1
}
/*drop missings*/
foreach v of var * {
qui drop if missing(`v')
}
end
//LISTS
capture program drop lists
program define lists, rclass
syntax varlist [,
d(string)
pooled
lags(integer 2)
imax(integer 1)
rep(string)
]

///
///
///
///
///
///

/*lists of dependent and independent variables*/


forvalues i = 1/`lags' {
foreach var of local varlist {
local indepvarlist "`indepvarlist' l`i'_`var'"
}
}
return local indepvarlist "`indepvarlist'"

/*list of dummies/ constant*/


if missing("`pooled'") & `rep' == 0 {
forvalues i = 1/`imax' {
local constants "`constants' `d'`i'"
}
}
if !missing("`pooled'") & `rep' == 0 {
local constants "cons"
}
return local constants "`constants'"
end
//ESTIMATION
capture program drop estimation
program define estimation, rclass
syntax varlist [,
resv(string)
cresv(string)
panelvar(string)
ci(string)
lags(integer 2)
indepvarlist(string)
constants(string)
depvars(integer 1)
rep(string)
]
tempname TSS

///
///
///
///
///
///
///
///
///
///

if `rep' == 0 & "`ci'" != "mc" {


mkmat `indepvarlist' `constants', mat(INDEPVARLIST_CONS)
}
local i = 1
foreach var of local varlist {
qui regress `var' `indepvarlist' `constants', nocons
mat B`rep' = nullmat(B`rep') , e(b)'
qui predict `resv'`i'`rep', res
local res`rep' "`res`rep'' `resv'`i'`rep'"
/*centered residuals for bootstrapping (always around group mean
)*/
tempvar mres`i' mean_`var' demean_`var'
if `rep' == 0 {
if "`ci'" == "bsn" | "`ci'" == "dbsn" {
by `panelvar': egen `mres`i'' = mean(`resv'`i')
qui gen `cresv'`i' = `resv'`i' - `mres`i''
local cres "`cres' `cresv'`i'"
}
qui egen `mean_`var'' = mean(`var')
qui gen `demean_`var'' = `var' - `mean_`var''
qui mat accum `TSS' = `demean_`var'' `demean_`var'', noc
ons
scalar
scalar
scalar
scalar

r2_`i' = 1 - e(rss) / `TSS'[1,1]


tss_`i' = `TSS'[1,1]
rss_`i' = e(rss)
mss_`i' = `TSS'[1,1] - e(rss)

qui test `indepvarlist'


scalar F_`i' = r(F)
qui test `constants'
scalar F_panel_`i' = r(F)
scalar p_panel_`i' = r(p)
}
local i = `i' + 1
}
return local res`rep' "`res`rep''"
if ("`ci'" == "bsn" | "`ci'" == "dbsn") & `rep' == 0 {
return local cres "`cres'"
}
mat colnames B`rep' = `varlist'
mat B_s`rep' = B`rep'[1..`lags' * `depvars', 1...] //without dummies/con
stant
if `rep' != 0 {
mat drop B`rep'
}
end
//COVARIANCE & CHOLESKY
capture program drop covariance
program define covariance
syntax [,
pooled
obs(integer 1)
depvars(integer 1)
lags(integer 2)
imax(integer 1)
res(string)
rep(string)
]

///
///
///
///
///
///
///
///

/*covariance*/
qui mat accum Sigma`rep' = `res', nocons
if missing("`pooled'") {
mat Sigma`rep' = Sigma`rep'/(`obs' - `depvars'*`lags' - `imax')
}
else {
mat Sigma`rep' = Sigma`rep'/(`obs' - `depvars'*`lags' - 1)
}
/*cholesky*/
mat COL`rep' = cholesky(Sigma`rep')
end
//CONTEMPORARY COEFFICIENTS
capture program drop contemporary
program define contemporary
syntax [ ,
///
rep(string)
///
]

mat A`rep' = COL`rep' * inv(diag(vecdiag(COL`rep')))


end
//COVARIANCE OF COEFFICIENTS
capture program drop varianceb
program define varianceb
syntax [varlist] [ ,
indepvarlist(string)
constants(string)
rep(string)
ci(string)
]

///
///
///
///
///

mat colnames Sigma`rep' = `varlist'


mat rownames Sigma`rep' = `varlist'
if `rep' == 0 {
qui mat accum XpX = `indepvarlist' `constants', nocons
qui mat XpX = syminv(XpX)
}
mat V`rep' = Sigma`rep' # XpX
end
//IRF
capture program drop irf
program define irf
syntax [,
stirf
lags(integer 2)
depvars(integer 1)
step(integer 8)
rep(integer 1)
]

///
///
///
///
///
///

tempname DS AS J C TEMP
/*J matrix for extraction of elements*/
if `lags' > 1 {
mat `J' = I(`depvars'), J(`depvars', `lags' * `depvars' - `depva
rs',0)
}
else {
mat `J' = I(`depvars')
}
/*companion matrix C*/
if `lags' > 1 {
mat `TEMP' = I(`lags' * `depvars' - `depvars'), ///
J(`lags' * `depvars' - `depvars', `depvars', 0)
mat `C' = B_s`rep'' \ `TEMP'
}
else {
mat `C' = B_s`rep''
}
/*response matrix*/

mat `AS' = I(`lags' * `depvars')


/*IRF*/
forvalues i = 1 / `step' {
if missing("`stirf'") {
mat `DS' = `J' * `AS' * `J'' * COL`rep'
}
else {
mat `DS' = `J' * `AS' * `J'' * A`rep'
}
mat `DS' = vec(`DS')
mat D`rep' = nullmat(D`rep') \ `DS''
mat `AS' = `AS' * `C'
}
end
//FEVD
capture program drop fevd
program fevd, rclass
syntax [ ,
step(integer 8)
depvars(integer 1)
rep(string)
ci(string)
]
tempname FEVD

///
///
///
///
///

/*generate dataset*/
qui svmat D`rep'
qui keep if _n <= `step'
keep D*
gen step = _n - 1
/*generate MSE*/
local i = 1
while `i' <= `depvars' {
tempname MSE`rep'`i'
qui gen double `MSE`rep'`i'' = 0
local j = `i'
while `j' <= `depvars' * `depvars' {
qui replace `MSE`rep'`i'' = `MSE`rep'`i'' + sum(D`rep'`j
'^2)
local j = `j' + `depvars'
}
local i = `i' + 1
}
/*FEVD*/
local i = 1
while `i' <= `depvars' {
local j = `i'
while `j' <= `depvars' * `depvars' {
tempname H`j'
qui gen `H`j'' = sum(D`rep'`j'^2) / `MSE`rep'`i''
qui gen FEVD`rep'`j' = `H`j''[_n - 1]
qui replace FEVD`rep'`j' = 0 if FEVD`rep'`j' == .
local fevd "`fevd' FEVD`rep'`j'"
local j = `j' + `depvars'

}
local i = `i' + 1
}
return local fevd "`fevd'"
if `rep' == 0 {
mkmat `fevd', mat(`FEVD') //bs residual matrix
mat D0FEVD = D`rep', `FEVD'
mat D0FEVD = vec(D0FEVD')' //input vector for bstat
}
mat drop D`rep'
end
//PREPARE MC
capture program drop preparemc
program preparemc, rclass
syntax [,
pooled
depvars(integer 1)
obs(integer 1)
reps(integer 200)
indepvarlist(string)
depvarlist(string)
constants(string)
rep(integer 1)
lags(integer 2)
imax(integer 1)
]

///
///
///
///
///
///
///
///
///
///
///

tempname sigma_vec sigma_dnp Sigma_V Dnp


/*Asymptotic Variance of Cov Matrix*/
mata: st_matrix("Dn", Dmatrix(`depvars'))
mat `Dnp' = (inv(Dn' * Dn)) * Dn'
mat `sigma_vec' = vec(Sigma`rep')
mat `sigma_dnp' = `Dnp' * `sigma_vec'
if missing("`pooled'") {
mat `Sigma_V' = 1 / (`obs' - `depvars' * `lags' - `imax') *
///
2 * `Dnp' * (Sigma`rep' # Sigma`rep') * `Dnp''
}
else {
mat `Sigma_V' = 1 / (`obs' - `depvars' * `lags' - 1) * ///
2 * `Dnp' * (Sigma`rep' # Sigma`rep') * `Dnp''
}
/*draw cov-matrices*/
local j=rowsof(`sigma_dnp')
forvalues i = 1 / `j' {
local sigma "`sigma' res`i'"
}
preserve
clear
*mata: st_matrix("Sigma_V", makesymmetric(st_matrix("Sigma_V")))

local repetitions = ceil(`reps' / 2)


qui drawnorm `sigma', cov(`Sigma_V') mean(`sigma_dnp') n(`repetitions')
mkmat `sigma', mat(SIGMA)
restore
/*draw coefficients: preparation*/
foreach depvar of local depvarlist {
foreach indepvar of local indepvarlist {
local betau "`betau' `depvar'_`indepvar'"
}
foreach constant of local constants {
local betau "`betau' `depvar'_`constant'"
}
}
return local betau "`betau'"
end
//CI
capture program drop ci
program define ci
syntax [,
timevar(string)
panelvar(string)
resv(string)
stirf
pooled
ci(string)
res0(string)
step(integer 8)
depvars(integer 1)
reps(integer 200)
obs(integer 1)
lags(integer 2)
imax(integer 1)
tmax(integer 1)
rep(string)
level(integer 95)
cres(string)
constants(string)
indepvarlist(string)
betau(string)
boot(string)
]

///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///

tempname sim
tempvar ireshape
tempfile simulate
preserve
/*dataset for ci*/
local j = 2 * `step' * `depvars' * `depvars'
forvalues i = 1 / `j' {
local l1 "`l1' IRF`i'"
}
qui postfile `sim' `l1' using "`simulate'", replace

/*display progress*/
di ".", _continue
forvalues i = 1 / `reps' {
local rep = `rep' + 1
if mod(`i',4) == 0 {
if mod(`i',100) == 0 {
di " `i'", _continue
di
}
di ".", _continue
}
/*Monte Carlo loops*/
if "`ci'"=="mc" {
mc ,
`stirf'
`pooled'
lags(`lags')
imax(`imax')
step(`step')
rep(`rep')
depvars(`depvars')
betau(`betau')
reps(`reps')
qui clear
}
/*bootstrapping*/
else {
bootstrapping ,
///
timevar(`timevar')
///
panelvar(`panelvar')
///
resv(`resv')
///
`stirf'
///
`pooled'
///
`ci'
///
rep(`rep')
///
reps(`reps')
///
imax(`imax')
///
tmax(`tmax')
///
obs(`obs')
///
lags(`lags')
///
step(`step')
///
depvars(`depvars')
///

///
///
///
///
///
///
///
///
///

res0(`res0')
///
cres(`cres')
///
constants(`constants')
///
indepvarlist(`indepvarlist')
///
boot(`boot')
}
/*call fevd*/
fevd,
depvars(`depvars')
step(`step')
rep(`rep')

///
///
///

qui replace step = step+100000


gen `ireshape' = 1
qui reshape wide D* FEVD* , i(`ireshape') j(step)
drop `ireshape'
qui ds
local vars "`r(varlist)'"
foreach var of local vars {
local l2`rep' "`l2`rep'' (`var')"
}
/*expand data set*/
quietly post `sim' `l2`rep''
}
postclose `sim'
/*confidence bands*/
qui bstat using "`simulate'", stat(D0FEVD) level(`level')
mat drop D0FEVD
mat CIp = e(ci_percentile)'
mat CIn = e(ci_normal)'
restore
end
//MONTE CARLO
capture program drop mc
program mc, rclass
syntax [,
stirf
pooled
depvars(integer 1)
lags(integer 2)
imax(integer 1)
rep(integer 1)
betau(string)
step(integer 8)
reps(integer 200)
]
tempname sigma_vec b_vec odd
scalar `odd' = mod(`rep',2)
if `odd' == 1 {

///
///
///
///
///
///
///
///
///
///

local repetition = ceil(`rep'/2)


/*covariance matrix*/
mat `sigma_vec' = Dn * SIGMA[`repetition',1...]'
vctomtx
`depvars'
`depvars'+1
`depvars'
`sigma_vec'
Sigma`rep'

///
///
///
///
///

preserve
clear
/*draw coefficients*/
varianceb, ///
rep(`rep')
*mata: st_matrix("V`rep'", makesymmetric(st_matrix("V`rep'")))
qui drawnorm `betau', cov(V`rep') n(1)
mkmat `betau', mat(betau)
mat `b_vec' = vec(B0) + betau'
mat drop V`rep'
restore
/*contemporary effects*/
mat COL`rep' = cholesky(Sigma`rep')
if !missing("`stirf'") {
contemporary , ///
rep(`rep')
}
mat drop Sigma`rep'
}
else {
local rep_1 = `rep' - 1
if !missing("`stirf'") {
mat A`rep' = A`rep_1'
}
else {
mat COL`rep' = COL`rep_1'
}
mat `b_vec' = vec(B0) - betau'
mat drop betau
mat drop COL`rep_1'
}
/*coefficients matrix*/
if missing("`pooled'") {
vctomtx
`lags'*`depvars'
`lags'*`depvars'+`imax'+1
`depvars'
`b_vec'
B_s`rep'

///
///
///
///
///

}
else {
vctomtx

///
///
///
///
///

`lags'*`depvars'
`lags'*`depvars'+1+1
`depvars'
`b_vec'
B_s`rep'
}
/*IRF*/
irf,
`stirf'
step(`step')
rep(`rep')
lags(`lags')
depvars(`depvars')

///
///
///
///
///

if `rep' == `reps' {
capt mat drop betau
capt mat drop COL`rep'
mat drop SIGMA Dn
mat drop XpX
}
capt mat drop B_s`rep'
if `odd' == 0 {
capt mat drop A`rep'
capt mat drop COL`rep'
}
end
//BOOTSTRAP
capture program drop bootstrapping
program define bootstrapping
syntax [,
timevar(string)
panelvar(string)
resv(string)
stirf
pooled
bsn
dbsn
bsp
imax(integer 1)
tmax(integer 1)
depvars(integer 1)
res0(string)
obs(integer 1)
rep(integer 1)
lags(integer 2)
cres(string)
constants(string)
reps(integer 200)
indepvarlist(string)
step(integer 8)
boot(string)
]

///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///
///

tempfile boot2
tempname nn nn2 H1 H2 INDEPVARLIST VARLIST
local obs_b = `tmax' - `lags'
/*parametric bootstrap*/
if !missing("`bsp'") {
clear
qui drawnorm `res0', cov(Sigma0) n(`obs')
mkmat `res0', mat(RES`rep')
}
/*temporal bootstrap*/
else {
clear
qui set obs `obs_b'
generate long `timevar' = ///
floor((`obs_b') * runiform() + (`lags' + 1)) //random draw of pe
riods
generate `nn' = _n //ordering
joinby `timevar' using "`boot'" //create residual dataset
sort `panelvar' `nn' //same order for all groups
mkmat `cres', mat(RES`rep')
}
mat `VARLIST' = J(`obs', `depvars', .)
if missing("`pooled'") {
mat `H2' = I(`depvars' * `lags') \
///
J(`depvars' + `imax', `depvars' * `lags', 0) //to extract portio
n of H3
mat `INDEPVARLIST' = J(`obs',`lags' * `depvars' + `imax', .)
}
else {
mat `H2' = I(`depvars' * `lags') \
///
J(`depvars' + 1, `depvars' * `lags', 0)
mat `INDEPVARLIST' = J(`obs', `depvars' * `lags' + 1, .)
}
/*generate bootstrap dataset recursively*/
local n = 1
forvalues i = 1(`obs_b')`obs' {
mat `H1' = INDEPVARLIST_CONS[`n',1...]
forvalues j = 1 / `obs_b' {
mat `INDEPVARLIST'[`n',1] = `H1'
mat `VARLIST'[`n',1] = `H1' * B0 + RES`rep'[`n',1...]
mat `H1' = (`VARLIST'[`n',1...], `H1') * `H2' //cut off
old lags and dummies
mat `H1' = (`H1', `INDEPVARLIST'[`n',`depvars' * `lags'
+ 1...]) //add dummies
local n = `n' + 1
}
}
mat drop RES`rep'
svmat `VARLIST'
forvalues i = 1 / `depvars' {
local varlist "`varlist' `VARLIST'`i'"

}
/*lists for estimation*/
lists `varlist' ,
///
`pooled'
///
lags(`lags')
///
imax(`imax')
///
rep(`rep')
local indepvarlist "`r(indepvarlist)'"
mat colnames `INDEPVARLIST' = `indepvarlist' `constants'
svmat `INDEPVARLIST', names(col)
/*double resampling*/
if !missing("`dbsn'") & missing("`bsp'") {
qui save "`boot2'", replace
clear
local obs_b = `imax'
qui set obs `obs_b'
generate long `panelvar' = floor(`imax' * runiform() + 1) //rand
om draw of groups
generate `nn2' = _n //ordering
joinby `panelvar' using "`boot2'" //create residual dataset
sort `nn2' `nn'
}
//estimation
estimation `varlist',
resv(`resv')
depvars(`depvars')
lags(`lags')
rep(`rep')
indepvarlist(`indepvarlist')
constants(`constants')
local res`rep' "`r(res`rep')'"
//covariance matrix
covariance ,
`pooled'
depvars(`depvars')
lags(`lags')
imax(`imax')
obs(`obs')
rep(`rep')
res(`res`rep'')

///
///
///
///
///
///
///

mat drop Sigma`rep'


//contemporary effects
if !missing("`stirf'") {
contemporary , ///
rep(`rep')
}
//irf
irf ,

///

///
///
///
///
///
///

`stirf'
lags(`lags')
step(`step')
rep(`rep')
depvars(`depvars')

///
///
///
///

mat drop B_s`rep'


capt mat drop COL`rep'
capt mat drop A`rep'
if `rep' == `reps' {
mat drop INDEPVARLIST_CONS
}
end
//TURN VECTOR INTO MATRIX
capture program drop vctomtx
program define vctomtx
//`1' rows of matrix; `2' is cut off value; `3' is number of columns;
// `4' is name of vector ; `5' name of matrix
tempname column
forvalues i = 1 / `3' {
mat `column'`i' = `4'[1..`1',1] //extract first column matrix fr
om vector
capt mat `4' = `4'[`2'...,1] //cut elements off vector
mat `5' = nullmat(`5') , `column'`i' //stack culumn vectors
}
end

You might also like