Skip to content
All library documents

Interpreting Johansen Cointegration Output and VECM Representations

Article Quant Q&A · Author: user2084063

Summary

The document clarifies how to read output from the Johansen cointegration procedure for two time series. It explains that candidate cointegrating vectors are ordered by maximum likelihood, while the associated loading weights describe their role in a vector error correction model. The example’s test statistics do not support rejecting the null hypotheses, so the reader’s conclusion of no detected cointegration is consistent with the reported results.

It also distinguishes VECM output from a levels representation: the R function discussed for converting a fitted Johansen model returns a level VAR form, while restricted or unrestricted least-squares procedures can produce VECM parameters. With the example’s lag specification, the differenced VECM has the expected number of lag matrices. The exchange is a focused interpretation of software output, not a full treatment of test assumptions, lag selection, or evidence that the series are cointegrated in other samples.

Key ideas

  • Johansen eigenvectors are ranked by maximum likelihood and represent candidate cointegrating relations.
  • The loading matrix gives the adjustment weights associated with those relations in a VECM.
  • Failure to reject the relevant rank null hypotheses indicates no cointegration was detected in the example.
  • The R conversion function returns a levels VAR representation rather than the differenced VECM coefficients.
  • The VECM lag count follows the number of lags in differences implied by the model specification.

Tags

Full text
# Cointegrating relationships - Johansen in R


# Cointegrating relationships - Johansen in R












I read the posts, How to interpret results of Johansen Test? and How to interpret the eigenmatrix from a Johansen cointegration test? But still I am quite confused by the output. I have a project with two series: I don't reject both H0, therefore I'd say there is no cointegration.

Johansen Procedure:



- Eigenvalues (lambda): [1] 0.0189039550 0.0008903665

```

[1] 0.0189039550 0.0008903665
```

- Values of test statistic and critical values of test: test 10pct 5pct 1pct r <= 1 | 0.39 6.50 8.18 11.65 r = 0 | 8.65 15.66 17.95 23.52

```
         test 10pct  5pct  1pct
r <= 1 | 0.39  6.50  8.18 11.65
r = 0  | 8.65 15.66 17.95 23.52
```

- Eigenvectors, normalised to first column (these are the cointegration relations): Oil.l1 Fuel.l1 Oil.l1 1.000000 1.0000 Fuel.l1 -1.484484 -11.1973

```
           Oil.l1  Fuel.l1
Oil.l1   1.000000   1.0000
Fuel.l1 -1.484484 -11.1973
```

- Weights W (this is the loading matrix): Oil.l1 Fuel.l1 Oil.d -0.049059881 0.0002693549 Fuel.d 0.002111537 0.0002467205

```
             Oil.l1      Fuel.l1
Oil.d  -0.049059881 0.0002693549
Fuel.d  0.002111537 0.0002467205
```

However, I'd like to impose one. Thus, I want to read alpha and beta. From what I understand these are the vectors below the largest eigenvalue? i.e. here, beta is (1, -1.48) and alpha is (-0.049, 0.002). But, if I want to build a cointegrating relationship, then are there two of them (below), or only one (the upper one)? I believe that lower one is very unrealistic due to low eigenvalue (first one too but we impose its not):

```
Oil.l1 - 1.48*Fuel.l1 
Oil.l1 - 11.19*Fuel.l1
```

Also, to get the Gamma(j) matrices for differenced data for Vector Error Correction Form, I do the following:

```
ECF = ca.jo(ldata, type="trace", spec="transitory", K=14)
vec2var(ECF,r=1) #r = 1 for cointegration rank
```

According to theory there should be (p-1) matrices, i.e. 13 but I get 14. Should I simply ignore the last one?

I'd be extremely thankful for help!

## Answer by user21240 (score 2, accepted)

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

The two eigenvectors are are ordered by maximum likelihood. The eigenvector is the cointegrating relationship and the weight is their coefficient, if they are used, in for example a VECM.

To get the VECM-form, you need to to use the command cajorls()(restricted) or cajoorls()(unrestricted). The vec2var() gives you a level (undifferenced) representation of the VECM. In a VECM you'll have 13 $(p-1)$ lags per variable. I think you will find the help on the commands, ca.jo, vec2var, cajorls and cajools very helpful.

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.