Skip to content
All library documents

Restricting Cointegrating Vectors in a Johansen VECM

Article Quant Q&A · Author: london

Summary

This example explains how to impose linear restrictions on the cointegrating vectors of a Johansen vector error correction model. It begins with simulated series sharing a common stochastic trend, estimates a model with four cointegrating relationships, and asks how to normalize one vector while leaving selected coefficients free. The accepted response constructs a restriction matrix from the estimated vectors, then sets specified entries to zero or one before applying the urca likelihood ratio test procedure.

The reported test output indicates that the proposed restrictions are not rejected in this simulated example. That result is not general evidence that the restriction scheme is appropriate: the data were generated to contain a shared trend, and the matrix is derived from the estimated vectors themselves. A later response cautions that the described test applies the same restrictions across all cointegrating vectors, which may not identify the distinct coefficients the original question seeks. The example is useful for understanding the R workflow, but users should verify the restriction structure and identification for their own model.

Key ideas

  • Johansen VECMs can be estimated subject to linear restrictions on their cointegrating vectors.
  • A restriction matrix can encode fixed zeros and ones while leaving selected coefficients free.
  • The example uses simulated series with one common stochastic trend to demonstrate four cointegrating relations.
  • A likelihood ratio test evaluates the restricted model, but the reported result applies only to this setup.
  • Restrictions applied uniformly across vectors may fail to identify the distinct relationships a researcher intends.

Tags

Full text
# Imposing Restrictions on Cointegrating Vectors, R example


# Imposing Restrictions on Cointegrating Vectors, R example












The code given below estimates a VEC model with 4 cointegrating vectors. It is a reproducible code, so just copy and paste into your R console (or script editor).

```
nobs = 200
e = rmvnorm(n=nobs,sigma=diag(c(.5,.5,.5,.5,.5)))
e1.ar1 = arima.sim(model=list(ar=.75),nobs,innov=e[,1])
e2.ar1 = arima.sim(model=list(ar=.75),nobs,innov=e[,2])
e3.ar1 = arima.sim(model=list(ar=.75),nobs,innov=e[,3])
e4.ar1 = arima.sim(model=list(ar=.75),nobs,innov=e[,4])
y5 = cumsum(e[,5])
y1 = y5 + e1.ar1
y2 = y5 + e2.ar1
y3 = y5 + e3.ar1
y4 = y5 + e4.ar1
data = cbind(y1,y2,y3,y4,y5)

jcointt = ca.jo(data,ecdet="const",type="trace",K=2,spec="transitory")
summary(jcointt)
```

I went ahead with four cointegrating vectors and estimated a VECM:

```
vecm <- cajorls(jcointt,r=4)
summary(vecm$rlm)
print(vecm)
```

Here are the estimated cointegrating vectors:

```
$beta

           ect1    ect2    ect3    ect4
y1.l1       1        0       0      0
y2.l1       0        1       0      0
y3.l1       0        0       1      0
y4.l1       0        0       0      1
y5.l1      -1.07    -1.05   -0.985 -1.05
constant   -0.16    0.505   -0.05   0.116
```

Now, I would like to impose restrictions on the first cointegrating vector (on `ect1` parameters) so that I can analyse the long run relationship between the variables. Here is what I want to obtain after imposing and reparameterising the cointegrating vectors:

```
            ect1   ect2  ect3   ect4
y1.l1        1      0      0     0
y2.l1      b1.1     1      0     0
y3.l1      b2.1     0      1     0
y4.l1      b3.1     0      0     1
y5.l1      b4.1    b4.2   b4.3   b4.4
constant   b0.1    b0.2   b0.3   b0.4
```

here, b1.1 through to b0.1 are the coefficients ($\beta_1,\beta_2,\beta_3,\beta_4$) of the first cointegrating vector labelled as `ect1`, which could now be written as $y_{1,t-1}=\beta_0-\beta_1y_{2,t-1}-\beta_2y_{3,t-1}-\beta_3y_{4,t-1}-\beta_4y_{5,t-1}$. Similarly, b4.2 and b0.2 are coefficients of the second cointegrating equation etc.

I was wondering if you could help proceed further in imposing the restrictions and re-estimating the VECM with the restrictions. `urca` package has a `bltest()`, `bh6lrtest()`, and `bh5lrtest()` functions to test restrictions on cointegrating vectors, though, I need some guidance on how to construct my `H` matrix (restrictions matrix) Thanks.

## Answer by Cameron Pfiffer (score 6)

https://quant.stackexchange.com/a/35865

I know this was asked almost two years ago, but I thought I'd answer the question.

It appears that the H that you want to estimate is identical to the values you received from the Johansen test, with the exception of rows 1:4 and columns 2:4. You only need to set those values to zeroes and ones, which is fairly easy considering that the diagonal is (very nearly) one and the other values are small enough that they can be rounded to where they need to be.

Code for that:

```
# Set H to found cointegrating vectors
H <- vecm$beta 

# Replace needed rows with rounded values
H[1:4, 2:4] <- round(H[1:4, 2:4])
```

This has the effect of creating the intended restriction matrix, which looks like this:

```
                  ect1        ect2        ect3      ect4
y1.l1     1.000000e+00  0.00000000  0.00000000  0.000000
y2.l1     6.001737e-17  1.00000000  0.00000000  0.000000
y3.l1    -2.103352e-17  0.00000000  1.00000000  0.000000
y4.l1     3.744563e-17  0.00000000  0.00000000  1.000000
y5.l1    -9.857458e-01 -1.00335472 -1.01229025 -1.066448
constant  5.632217e-02  0.02311308  0.07969588 -0.519249
```

Now, running the `blrtest` function:

```
blrresult <- blrtest(jcointt, H, 4)
```

And it's result:

```
> summary(blrresult)

###################### 
# Johansen-Procedure # 
###################### 

Estimation and testing under linear restrictions on beta 

The VECM has been estimated subject to: 
beta=H*phi and/or alpha=A*psi

                  ect1        ect2        ect3      ect4
y1.l1     1.000000e+00  0.00000000  0.00000000  0.000000
y2.l1     6.001737e-17  1.00000000  0.00000000  0.000000
y3.l1    -2.103352e-17  0.00000000  1.00000000  0.000000
y4.l1     3.744563e-17  0.00000000  0.00000000  1.000000
y5.l1    -9.857458e-01 -1.00335472 -1.01229025 -1.066448
constant  5.632217e-02  0.02311308  0.07969588 -0.519249

Eigenvalues of restricted VAR (lambda):
[1] 0.2009 0.1479 0.1410 0.0963

The value of the likelihood ratio test statistic:
0 distributed as chi square with 8 df.
The p-value of the test statistic is: 1 

Eigenvectors, normalised to first column
of the restricted VAR:

            [,1]    [,2]    [,3]    [,4]
y1.l1     1.0000  1.0000  1.0000  1.0000
y2.l1    -0.7020  1.1557 -0.2307 -3.3582
y3.l1     0.5135 -0.3613 -0.2651 -6.0261
y4.l1    -0.2599  0.1480  2.9151 -1.5204
y5.l1    -0.5241 -1.9374 -3.5946 10.1052
constant  0.2160 -0.0226 -1.4838  0.2879

Weights W of the restricted VAR:

        [,1]    [,2]    [,3]   [,4]
y1.d -0.2594 -0.1574  0.0141 0.0035
y2.d  0.1290 -0.1118  0.0467 0.0214
y3.d -0.1813  0.0618  0.0085 0.0302
y4.d  0.0270  0.0014 -0.0560 0.0097
y5.d -0.0629 -0.0009  0.0254 0.0065
```

Hopefully this helps you or someone else.

## Answer by J&#225;nos (score 0)

https://quant.stackexchange.com/a/40081

Even though it's two years, this might be helping. So, as far as I know, blrtest tests the same restrictions on every cointegrating vector. For example, here, it can be used to test for the exclusion of the constant from all of the 4 cointegrating vector.

Because of this, it is not identifying as well (since it is the same restriction on every vector).

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.