Why does brms remove AR-effects in hierarchical structure?

It’s great that we can add autoregressive terms in brms with ar(), and it generally works well, even with a grouping. However, I’m confused about how this generates stancode when we have a hierarchical structure.

If we want the autoregressive parameters to have a hierarchical structure based on some grouping variable, it seems like the autoregressive part is removed. Here is an example:

  # Minimal reproducible example

  # Make simple data.
  ed <- tsibble::filter_index(tsibble::as_tsibble(EuStockMarkets), ~ "1991-07")

  # Run both models.
  gr_ar1 <- make_stancode(value ~ ar(time = index, gr = key, p = 1), data = ed)
  hi_ar1 <- make_stancode(value ~ (1 + ar(time = index, p = 1) | key), data = ed)

  # Show different stancodes.
  # ...
  # // initialize linear predictor term
  # vector[N] mu = Intercept + rep_vector(0.0, N);
  # // include ARMA terms
  # for (n in 1:N) {
  #   err[n] = Y[n] - mu[n];
  #   for (i in 1:J_lag[n]) {
  #     Err[n + 1, i] = err[n + 1 - i];
  #   }
  #   mu[n] += Err[n, 1:Kar] * ar;
  # }
  # ...
  # ...
  # // initialize linear predictor term
  # vector[N] mu = Intercept + rep_vector(0.0, N);
  # for (n in 1:N) {
  #   // add more terms to the linear predictor
  #   mu[n] += r_1_1[J_1[n]] * Z_1_1[n];
  # }
  # ...

It seems clear that the AR effect (or ARMA, where I’ve seen the same) disappears if we give a hierarchical structure. However, conceptually I don’t see why we could not give the autoregressive parameters a second-level Normal distribution, so that they shrink towards each other, etc.

My question is, does this difference happen because:

  • brms does not know how to handle both at the same time, and prefers to keep the hierarchical part of the model,
  • The hierarchical grouping part of the model already has taken into account the AR-part of the model (which I can not find in the generated model for the life of me),
  • I am stretching what fits within the brms syntax, therefore should just write my own Stan code? (Should not be a problem, but I like the brms helper functions a lot.)

  • Operating System: Windows 10
  • brms Version: 2.14.4
(1 + ar(time = index, p = 1) | key)

is invalid brms syntax and will not work. In fact it should return an error but for some reason it currently does not and just ignores the term.

1 Like

Perhaps what you want is ar(time = index, gr = key, p = 1)?

OK, thanks Paul! I agree that it makes sense to be invalid syntax; I was indeed surprised that I could just run the model.

Yes, using the grouping function with ar(time = index, gr = key, p = 1) was one of the suggestions I give in the example, but I am not sure if it is what I want.

This is because I thought it would not put a hierarchical structure on the AR coefficients, as I can’t see it in the model code. It doesn’t right?

Indeed, it does not put hierarchical structure on the AR coefficients. Just groups the data so that they are not considered a single long time series.

OK, clear, thanks a lot! I think it would be better for me to write it directly in Stan, then.