ECM.EngleGran  R Documentation 
I(1)
–variablesEstimates a bidimensional errorcorrection model of
order–(K
, L
), as proposed by Engle–Granger
(Two step–approach; 1987), with bivariate normal errors
by maximum likelihood estimation using Fisher scoring.
ECM.EngleGran(ecm.order = c(1, 1),
zero = c("var", "cov"),
resids.pattern = c("intercept", "trend",
"neither", "both")[1],
lag.res = 1,
lmean = "identitylink",
lvar = "loglink",
lcov = "identitylink",
ordtsDyn = 0)
ecm.order 
Length–2 (positive) integer vector. The order of the ECM model. 
zero 
Integer or character–string vector.
Details at 
resids.pattern 
Character. How the static linear regression

lag.res 
Numeric, single positive integer. The error
term for the long–run equilibrium path is
lagged up to order 
lmean, lvar, lcov 
Same as 
ordtsDyn 
Positive integer. Allows to compare the estimated coefficients with those provided by the package 'tsDyn'. See below for further details. 
This is an implementation of the two–step approach as
proposed by Engle–Granger [1987] to estimate an
order–(K
, L
) bidimensional error correction
model (ECM) with bivariate normal errors.
This ECM class models the dynamic behaviour of two
cointegrated I(1)
variables,
say y_{1, t}
and y_{2, t}
with,
probably, y_{2, t}
a function of
y_{1, t}
.
Note, the response must be a two–column matrix,
where the first entry is the regressor,
i.e, y_{1, t}
above, and the regressand in the
second colum. See Example 2 below.
The general specification of the ECM class described by this family function is
\Delta y_{1, t} \Phi_{t  1} =
~\phi_{0, 1} + \gamma_1 \widehat{z}_{t  k} +
\sum_{i = 1}^K \phi_{1, i} \Delta y_{2, t  i} +
\sum_{j = 1}^L \phi_{2, j} \Delta y_{1, t  j} +
\varepsilon_{1, t},
\Delta y_{2, t} \Phi_{t  1}=
~\psi_{0, 1} + \gamma_2 \widehat{z}_{t  k} +
\sum_{i = 1}^K \psi_{1, i} \Delta y_{1, t  i} +
\sum_{j = 1}^L \psi_{2, j} \Delta y_{2, t  j} +
\varepsilon_{2, t}.
Under the binormality assumption on the errors
(\varepsilon_{1, t}, \varepsilon_{2, t})^T
with covariance matrix \boldsymbol{\textrm{V}}
,
model above can be seen as a
VGLM fitting linear models over the conditional means,
\mu_{\Delta y_{1, t} } = E(\Delta y_{1, t}  \Phi_{t  1})
and
\mu_{\Delta y_{2, t} } = E(\Delta y_{2, t}  \Phi_{t  1} )
,
producing
(\Delta y_{1, t} \Phi_{t  1} ,
\Delta y_{2, t} \Phi_{t  1} )^T \sim N_{2}(\mu_{\Delta y_{1, t}} ,
\mu_{\Delta y_{2, t}}, \boldsymbol{\textrm{V}})
The covariance matrix is assumed
to have elements
\sigma_1^2, \sigma_2^2,
and
\textrm{Cov}_{12}.
Hence, the parameter vector is
\boldsymbol{\theta} =
(\phi_{0, 1}, \gamma_1, \phi_{1, i}, \phi_{2, j},
\psi_{0, 1}, \gamma_2, \psi_{1, i}, \psi_{2, j},
\sigma_1^2, \sigma_2^2, \textrm{Cov}_{12})^T,
for i = 1, \ldots, K
and j = 1, \ldots, L
.
The linear predictor is
\boldsymbol{\eta} = (\mu_{\Delta y_{1, t} },
\mu_{\Delta y_{2, t} },
{\color{blue}\texttt{loglink}}~\sigma_1^2,
{\color{blue}\texttt{loglink}}~\sigma_2^2,
\textrm{Cov}_{12})^T.
The estimated cointegrated vector,
\boldsymbol{\widehat{\beta^{\star}}}
= (1, \boldsymbol{\widehat{\beta})}^T
is obtained by linear regression
depending upon resids.pattern
,
as follows:
1) y_{2, t} = \beta_0 + \beta_1 y_{1, t} + z_t
,
if resids.pattern = "intercept"
,
2) y_{2, t} = \beta_1 y_{1, t} + \beta_2 t + z_t
,
if resids.pattern = "trend"
,
3) y_{2, t} = \beta_1 y_{1, t} + z_t
,
if resids.pattern = "neither"
, or else,
4) y_{2, t} = \beta_0 + \beta_1 y_{1, t} + \beta_2 t + z_t
,
if resids.pattern = "both"
,
where \boldsymbol{\widehat{\beta}} =
(\widehat{\beta_0}, \widehat{\beta_1}, \widehat{\beta_2})^T,
and z_t
assigns the error term.
Note, the estimated residuals,
\widehat{z_t}
are (internally) computed
from any of the linear models 1) – 4) selected, and then lagged
up to order alg.res
,
and embedded as explanatories in models
\Delta y_{1, t} \Phi_{t  1}
and
\Delta y_{3, t} \Phi_{t  1}
above.
By default, \widehat{z}_{t  1}
are considered (as lag.res
= 1), although it may be any lag
\widehat{z}_{t  k}
, for k > 0
.
Change this through argument lag.res
.
An object of class "vglmff"
(see vglmffclass
) to be
used by VGLM/VGAM modelling functions, e.g.,
vglm
or vgam
.
Reduced–Rank VGLMs (RRVGLMs) can be utilized to aid the increasing
number of parameters as K
and L
grows.
See rrvglm
.
By default, \sigma_1^2, \sigma_2^2
and \textrm{Cov}_{12}
are intercept–only. Set argument zero
accordingly to change this.
Package tsDyn also has routines to fit ECMs.
However, the bivariate–ECM handled (similar to that one
above) differs in their parametrization:
tsDyn considers the current estimated residual,
\widehat{z}_t
instead of
\widehat{z}_{t  1}
in models
\Delta y_{1, t} \Phi_{t  1}
and
\Delta y_{2, t} \Phi_{t  1}
.
See Example 3 below which compares ECMs fitted with VGAMextra and tsDyn.
Victor Miranda
Engle, R.F. and Granger C.W.J. (1987) Cointegration and error correction: Representation, estimation and testing. Econometrica, 55(2), 251–276.
Pfaff, B. (2011)
Analysis of Integrated and Cointegrated Time Series with R
.
Seattle, Washington, USA: Springer.
MVNcov
,
rrvglm
,
CommonVGAMffArguments
,
Links
,
vglm
.
## Example 1. Comparing the Engle  Granger procedure carried oud by two procedures.
## ECM.EngleGran() makes easier the fitting process.
## Here, we will use:
## A) The R code 4.2, in Chapter 4, Pfaff (2011).
## This code 1) generates artificial data and 2) fits an ECM, following
## the Engle Granger procedure.
## B) The ECM.EngleGran() family function to fit the same model assuming
## bivariate normal innovations.
## The downside in the R code 4.2 is the assumption of nocorrelation among
## the errors. These are generated indenpendently.
## A)
## STEP 1. Set up the data (R code as in Pfaff (2011)).
nn < 100
set.seed(123456)
e1 < rnorm(nn) # Independent of e2
e2 < rnorm(nn)
y1 < cumsum(e1)
y2 < 0.6 * y1 + e2
lr.reg < lm(y2 ~ y1)
error < residuals(lr.reg)
error.lagged < error[c(nn  1, nn)]
dy1 < diff(y1)
dy2 < diff(y2)
diff.dat < data.frame(embed(cbind(dy1, dy2), 2))
colnames(diff.dat) < c('dy1', 'dy2', 'dy1.1', 'dy2.1')
## STEP 2. Fit the ECM model, using lm(), R code as in Pfaff (2011).
ecm.reg < lm(dy2 ~ error.lagged + dy1.1 + dy2.1, data = diff.dat)
summary(ecm.reg)
## B) Now, using ECM.EngleGran() and VGLMs, the steps at A) can be skipped.
## Enter the I(1)variables in the response vector only, putting down the
## the dependent variable from the I(1) set, i.e. y2, in the second column.
coint.data < data.frame(y1 = y1, y2 = y2)
fit.ECM < vglm(cbind(y1, y2) ~ 1, ECM.EngleGran, data = coint.data, trace = TRUE)
## Check coefficients ##
coef(fit.ECM, matrix = TRUE) ## Compare 'Diff2' with summary(ecm.reg)
coef(summary(ecm.reg))
head(depvar(fit.ECM)) # The estimated differences (first order)
vcov(fit.ECM)
constraints(fit.ECM, matrix = TRUE)
## Not run:
### Example 2. Here, we compare ECM.EngleGran() from VGAMextra with VECM() from
## package "tsDyn" when fitting an ECM(1, 1). We will make use of
## the argument 'ordtsDyn' so that the outcomes can be compared.
library("tsDyn") # Need to be installed first.
fit.tsDyn1 < with(coint.data, VECM(cbind(y2, y1), lag = 1, estim = "2OLS")) # MODEL 1
summary(fit.tsDyn1)
### Fit same model using ECM.EngleGran(). NOTE: Set ordtsDyn = 1 !! # MODEL 2
fit.ECM.2 < vglm(cbind(y1, y2) ~ 1, ECM.EngleGran(ecm.order = c(1, 1),
resids.pattern = "neither", ordtsDyn = 1),
data = coint.data, trace = TRUE)
coef.ECM.2 < coef(fit.ECM.2, matrix = TRUE)
fit.tsDyn1$coefficients ## From pakage 'tsDyn'.
t(coef.ECM.2[, 1:2][c(2, 1, 4, 3), ][, 2:1]) ## FROM VGAMextra
### Example 3. An ECM(2, 2), with residuals estimated by OLS, with NO intercept
### and NO trend term. The data set is 'zeroyld', from package tsDyn.
### ECM.EngleGran() and with VECM() willbe compared again.
data(zeroyld, package = "tsDyn")
# Fit a VECM with EngleGranger 2OLS estimator:
vecm.eg < VECM(zeroyld, lag=2, estim = "2OLS")
summary(vecm.eg)
# For the same data, fit a VECM with ECM.EngleGran(), from VGAMextra.
# Set ordtsDyn = 1 for compatibility!
fit.ECM.3 < vglm(cbind(long.run, short.run) ~ 1, ECM.EngleGran(ecm.order = c(2, 2),
resids.pattern = "neither", ordtsDyn = 1),
data = zeroyld, trace = TRUE)
coef.ECM.3 < coef(fit.ECM.3, matrix = TRUE)
#### Compare results
vecm.eg$coefficients # From tsDyn
t(coef.ECM.3[, 1:2][c(2, 1, 5, 3, 6, 4 ),][, 2:1]) # FROM VGAMextra
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.