Specifying a 3-level model, with distinct prior between groups within same level

Hey Max - thanks for the quick reply!

On the (...||...) syntax - I thought that just means the slopes/ intercepts are not correlated with other slopes/ intercepts between groups? From p.3 here: https://journal.r-project.org/archive/2018/RJ-2018-017/RJ-2018-017.pdf

For instance, if the userwere to write (1 | g1/g2),brms will expand this to (1 | g1) + (1 | g1:g2). Instead of |, usersmay use || in grouping terms to prevent group-level correlations from being modeled.

The solution implemented inbrms(and currently unique to it) expands the | operator into |<ID>|, where <ID> can be any value. Group-level terms withthe same ID will then be modeled as correlated if they share same grouping factor(s). For instance, if the terms (x1|ID|g1) and (x2|ID|g1) appear somewhere in the same or different formulas passed to brms, they will be modeled as correlated.

So based on the above, I used the || to make sure that the fixed intercept for each county would be uncorrelated to each other. Perhaps I’ve over complicated things?

And yes - the model should reflect the hierarchical structure in the picture.

In terms of your suggested formula, the syntax makes sense uner lme4. However, looking at the same page in the doc linked above:

We propose that group can generally be split upin its terms so that, for example, (1 | g1 + g2) is expanded to (1 | g1) + (1 | g2). This is fully consistent with the way / is handled and provides a natural generalization to the existing syntax.

Would that not suggest that (1 | g1) + (1 | g2) is same as (1 | g1/g2) and (1 | g1 + g2)? Or are the latter 2 terms not equivalent? I found another post, where the hierarchical formulation seems to suggest the / operator isn’t needed. Or perhaps that was only used in the case of multi-membership at level 2?

In addition, if (1 | country/region/counties) looks at the fixed intercept + random slope for each county (relative/ differences to the intercept) nested underneath the country and region, would it not be the same as (0 + counties | country/region) with a random slope per each county category with no intercept?

With regards to my 2nd question, if I formulate as per your suggested syntax, I see the following stancodes in the model portion:

     vector[N] nlp_Modifier = X_Modifier * b_Modifier;
  // initialize non-linear predictor term
  vector[N] mu;
  for (n in 1:N) {
    // add more terms to the linear predictor
    nlp_Modifier[n] += r_1_Modifier_1[J_1[n]] * Z_1_Modifier_1[n] + r_2_Modifier_1[J_2[n]] * Z_2_Modifier_1[n] + r_3_Modifier_1[J_3[n]] * Z_3_Modifier_1[n];
  }
  for (n in 1:N) {
    // compute non-linear predictor values
    mu[n] = log(C_1[n]) + nlp_Modifier[n];
  }
// priors including all constants
      target += student_t_lpdf(sigma | 3, 0, 10) - 1 * student_t_lccdf(0 | 3, 0, 10);
      target += student_t_lpdf(sd_1 | 3, 0, 10) - 1 * student_t_lccdf(0 | 3, 0, 10);
      target += normal_lpdf(z_1[1] | 0, 1);
      target += student_t_lpdf(sd_2 | 3, 0, 10) - 1 * student_t_lccdf(0 | 3, 0, 10);
      target += normal_lpdf(z_2[1] | 0, 1);
      target += student_t_lpdf(sd_3 | 3, 0, 10) - 1 * student_t_lccdf(0 | 3, 0, 10);
      target += normal_lpdf(z_3[1] | 0, 1);

What would actually be needed to put a specific prior for a given group value…? I can see that the grouping value is for example stored in J_3[n], which in turn feeds the r_3_Modifier and the nlp_Modifier, but not sure how to proceed…

Hopefully once the priors are changed, I can just follow this to re-fit in brms.

Sorry for the long reply - am still getting my head around the way that brms’ syntax and its generated code work!

Thanks again - much appreciated!

1 Like