| pid.cvm | R Documentation |
Given an estimated panel of VAR models, this function applies independence-based identification for
the structural impact matrix B_i of the corresponding SVAR model
y_{it} = c_{it} + A_{i1} y_{i,t-1} + ... + A_{i,p_i} y_{i,t-p_i} + u_{it}
= c_{it} + A_{i1} y_{i,t-1} + ... + A_{i,p_i} y_{i,t-p_i} + B_i \epsilon_{it}.
Matrix B_i corresponds to the unique decomposition of the least squares covariance matrix \Sigma_{u,i} = B_i B_i'
if the vector of structural shocks \epsilon_{it} contains at most one Gaussian shock (Comon, 1994).
A nonparametric dependence measure, the Cramer-von Mises distance (Genest and Remillard, 2004),
determines least dependent structural shocks. The minimum is obtained by a two step optimization algorithm
similar to the technique described in Herwartz and Ploedt (2016).
pid.cvm(
x,
combine = c("group", "pool", "indiv"),
n.factors = NULL,
dd = NULL,
itermax = 500,
steptol = 100,
iter2 = 75
)
x |
An object of class ' |
combine |
Character. The combination of the individual reduced-form residuals
via ' |
n.factors |
Integer. Number of common structural shocks across all individuals if the group ICA is selected. |
dd |
Object of class ' |
itermax |
Integer. Maximum number of iterations for DEoptim. |
steptol |
Numeric. Tolerance for steps without improvement for DEoptim. |
iter2 |
Integer. Number of iterations for the second optimization. |
List of class 'pid' with elements:
A |
Matrix. The lined-up coefficient matrices |
B |
Matrix. Mean group of the estimated structural impact matrices |
L.varx |
List of ' |
eps0 |
Matrix. The combined whitened residuals |
ICA |
List of objects resulting from the underlying ICA procedure.
|
rotation_angles |
Numeric vector. The rotation angles
suggested by the combined identification procedure.
|
args_pid |
List of characters and integers indicating the identification methods and specifications that have been used. |
args_pvarx |
List of characters and integers indicating the estimator and specifications that have been used. |
Comon, P. (1994): "Independent Component Analysis: A new Concept?", Signal Processing, 36, pp. 287-314.
Genest, C., and Remillard, B. (2004): "Tests of Independence and Randomness based on the Empirical Copula Process", Test, 13, pp. 335-370.
Herwartz, H., and Wang, S. (2024): "Statistical Identification in Panel Structural Vector Autoregressive Models based on Independence Criteria", Journal of Applied Econometrics, 39 (4), pp. 620-639.
Herwartz, H. (2018): "Hodges Lehmann detection of structural shocks - An Analysis of macroeconomic Dynamics in the Euro Area", Oxford Bulletin of Economics and Statistics, 80, pp. 736-754.
Herwartz, H., and Ploedt, M. (2016): "The Macroeconomic Effects of Oil Price Shocks: Evidence from a Statistical Identification Approach", Journal of International Money and Finance, 61, pp. 30-44.
... the individual id.cvm by Lange et al. (2021) in svars.
Note that pid.cvm relies on a modification of their procedure and
thus performs ICA on the pre-whitened shocks 'eps0' directly.
Other panel identification functions:
pid.chol(),
pid.dc(),
pid.grt(),
pid.iv()
# select minimal or full example #
is_min = TRUE
idx_i = ifelse(is_min, 1, 1:14)
# load and prepare data #
data("EURO")
data("EU_w")
names_i = names(EURO[idx_i+1]) # country names (#1 is EA-wide aggregated data)
idx_k = 1:4 # endogenous variables in individual data matrices
idx_t = 1:76 # periods from 2001Q1 to 2019Q4
trend2 = idx_t^2
# individual VARX models with common lag-order p=2 #
L.data = lapply(EURO[idx_i+1], FUN=function(x) x[idx_t, idx_k])
L.exog = lapply(EURO[idx_i+1], FUN=function(x) cbind(trend2, x[idx_t, 5:10]))
L.vars = sapply(names_i, FUN=function(i)
vars::VAR(L.data[[i]], p=2, type="both", exogen=L.exog[[i]]),
simplify=FALSE)
# identify under common orthogonal matrix (with pooled sample size (T-p)*N) #
S.pind = copula::indepTestSim(n=(76-2)*length(names_i), p=length(idx_k), N=100)
R.pcvm = pid.cvm(L.vars, dd=S.pind, combine="pool")
R.irf = irf(R.pcvm, n.ahead=50, w=EU_w)
plot(R.irf, selection=list(1:2, 3:4))
# identify individually (with same sample size T-p for all 'i') #
S.pind = copula::indepTestSim(n=(76-2), p=length(idx_k), N=100)
R.pcvm = pid.cvm(L.vars, dd=S.pind, combine="indiv")
R.irf = irf(R.pcvm, n.ahead=50, w=EU_w)
plot(R.irf, selection=list(1:2, 3:4))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.