Noise added to unconditional forecast
Hello,
First, thanks a lot for developing the package! I am relying on it heavily in my daily work.
However, only recently I started to doubt if I understand the details of how the BVAR unconditional forecasts are generated. In predict method there is a line made to add noise to a forecast generated with compute_fcast method.
fcast_store[["fcast"]][i, , ] <- fcast_base + t(crossprod(sigma[j, , ], matrix(rnorm(M * fcast[["horizon"]]), nrow = M)))
I have a two questions on that:
- It looks like we want to augment fcast_base with a set of shocks drawn from $N(0, \Sigma)$. But to get that, shouldn't we multiply a sample drawn form $N(0,1)$ by $L$ defined so $\Sigma=LL^T$ (e.g. obtained with Cholesky decomp), instead of multiplying that sample by the covariance matrix itself?
- More generally, wouldn't it be more appropriate to add the noise within
compute_fcastin a period-by-period manner? I mean doing that within a core loop incompute_fcast, so that Y_f[i+1,] is calculated based Y_f[i, ] that is consistent with added period i noise/shock. Adding all the shocks as a batch after the full path of base forecast was calculated seems inconsistent. The loop that I refer to:
for(i in seq.int(2, 1 + horizon)) {
Y_f[i, ] <- tcrossprod(Y_f[i - 1, ], beta_comp) +
c(beta_const, rep(0, M * (lags - 1))) # Maybe go back to normal beta
}
Thanks,
Pawel
Hey Pawel,
You raise good points. I'd have though that sigma is already the Cholesky factor (may be wrong), but the forecast definitely seems off to me. I'll have to put a closer investigation off until a later date, but thanks for raising the issue!
Best,
Nikolas
Hey @syrop87, your observation wrt to the forecasting noise hits the mark – seems that I introduced this bug while over-optimizing vectorization. We're putting off a fix until the next version, but a patched version of the package is available here: https://github.com/nk027/bvar/tree/dev_fcasts.