# Why Are Impulse Responses in VECM Permanent?

The usual interpretation of impulse response functions in standard vector autoregression (VAR) models is that they represent the response of a variable, say $y_t$, to a shock of one standard deviation (or one unit, depending on how they are computed) in another variable of the system, say $x_t$, over time.

In VARs, the impulse response function reverts to $0$, and you can compute the total (or long-run) effect of $x_t$ on $y_t$ using cumulative functions (by summing the impulse responses).

However, in vector error correction models (VECMs), the impulse response functions sometimes do not go back to $0$. Some textbooks (e.g. Lütkepohl's New Introduction to Multiple Time Series Analysis) mention that this is normal. However, it's not clear why.

What would be a correct interpretation of an impulse response that does not go back to $0$ in a VECM? And how would one interpret the cumulative impulse responses in that case, which will then grow (or decrease) infinitely?

To be clear, suppose that the function illustrating the response of $y_t$ to an impulse of $x_t$ converges at +0.5 and stays at that value. Does that mean that when $x_t$ increases by one unit (or one s.d.), $y_t$ increases by 0.5, every period, again, and again, until the end of time?

If the variables are cointegrated, shouldn't they stay "close" to each other, separated by some value that is constant over time? In that case, one variable cannot grow indefinitely when the other changes by a fixed amount.

I can't find a clear answer to that and would very much appreciate any help.

• For a cointegrated process, we may find that the VECM stabilized in a non-zero region whereas the VAR will decline steadily decline towards zero. However, this is contrary to what is expected given the data-generating process. That is, as the VECM has an implied long run matrix that has unit-roots - given by the number of cointegrating vectors - the impulse responses converge to non-zero constants. Commented Sep 9, 2016 at 14:06

This is a great question, and I'm learning so bear with me.

What would be a correct interpretation of an impulse response that does not go back to 0 in a VECM?

Riffing on the drunken walk theme, suppose a drunken man is randomly walking when a mean teenager pushes him. The push sends the man stumbling but he regains his footing after a short distance. He shrugs it off and keeps on walking, but he has been displaced a number of feet, continues his drunken walk, and may never return to the original location.

And how would one interpret the cumulative impulse responses in that case, which will then grow (or decrease) infinitely?

Since VECMs are models of the deltas, as long as an "impulse" in one of the variables leads to future deltas that eventually go to zero, then the cumulative response will not grow indefinitely! (Remember, there's no noise to push it around.) But the displacement will also not revert back to a reference value.

If the variables are cointegrated, shouldn't they stay "close" to each other, separated by some value that is constant over time? In that case, one variable cannot grow indefinitely when the other changes by a fixed amount.

They will, and that's exactly what the error correction mechanism enforces, dashing any hopes of an "exogenous" shock. In a simulation that I'm about to show you, whether the unit "shock" happens at equilibrium or a place away from equilibrium also matters...a lot. The impulse response that the urca/vars R package combo gets you, to the best of my understanding, is to what happens to each variable when exactly one variable is increased by one unit and the starting position is at equilibrium (exactly on the cointegrating vector). As soon as the shock occurs, the system is out of equilibrium and both the lag effects of the shock and the error correction mechanism will be in play. It's not clean at all.

I've got a simulation attempting to draw from:

$$\left(\begin{matrix} \Delta y_t \\ \Delta x_t \end{matrix}\right) = \left(\begin{matrix} .3 \\ .4 \end{matrix}\right) \left(\begin{matrix} 1 & -1.3 \end{matrix}\right) \left(\begin{matrix} y_{t-1} \\ x_{t-1} \end{matrix}\right) + \left(\begin{matrix} .5 & .4 \\ 0 & .8 \end{matrix}\right) \left(\begin{matrix} \Delta y_{t-1} \\ \Delta x_{t-1} \end{matrix}\right) + \mathbf{\epsilon}_t,$$ where notice I tried to make $$x_t$$ as exogenous as possible by having $$y_t$$'s previous delta not feed into $$x_t$$'s current period delta. But that doesn't appear to do much.

Here's how I fed in the unit impulse from x:

T <- 50
x0 <- 100
shock <- 1
offset <- 0

beta <- 1.3  # y_t - beta * x_t is stationary
Alpha <- matrix(c(.3, .4), ncol=1)
Beta_T <- matrix(c(1, -beta), ncol=2)
Gamma <- matrix(c(.5, .4, 0, .8), ncol=2, byrow=T)

# Shock x and run Generate Data block
x_t1 <- c(offset + beta * x0, x0)  # start at equilibrium
x_t2 <- c(offset + beta * x0, x0 + shock)  # shock in x only

# Generate data
X <- matrix(NA, nrow=T, ncol=2)
X[1, ] <- x_t1
X[2, ] <- x_t2
for (t in 3:T) {
x_lag1 <- X[t - 1, ]
del_x_lag1 <- X[t - 1, ] - X[t - 2, ]
del_x <- Alpha %*% Beta_T %*% x_lag1 + Gamma %*% del_x_lag1
X[t, ] <- x_lag1 + del_x
}
df <- as.data.frame(X)
names(df) <- c('y', 'x')
plot(df$$y, main="Effect on y_t of x's impulse at t=2") plot(df$$x, main="Effect on x_t of x's impulse at t=2")


So the unit impulse in $$x_t$$ leaves both $$x_{t+30}$$ and $$y_{t+30}$$ lower by approximately 10 units, without any noise. Note how the shock from $$x_1$$ to $$x_2$$ results in a higher value of $$x_3$$, but after that both shapes looks similar. The impulse response plot of from the irf function of the vars package looks like this (shown for the effect of a unit impulse in $$x$$ on $$y$$):

If you change the offset so that y and x start in a non-equilibrium position, then the scale of the impulse response is dramatically different.

• It's been a while and I'm not sure you still have it but could you please also share your code for producing the impulse response function with the confidence interval? Thank you. Commented Mar 18, 2023 at 7:27
• I think this would have been the file, @SavedByJESUS: github.com/baogorek/Miscellaneous/blob/master/R-code/… Commented Mar 19, 2023 at 15:39