# Multilevel Meta-Analysis

#### František Bartoš

#### 28th of April 2026

This vignette illustrates how to use the `RoBMA` R package (Bartoš & Maier, 2020) with multilevel meta-analytic data. We walk through the school-calendar dataset from Konstantopoulos (2011), showing the `brma()` call with the `cluster` argument alongside its `metafor::rma.mv()` counterpart (Viechtbauer, 2010).

All `brma()` calls keep the default prior distributions; see the Prior Distributions vignette for the prior definitions and customization options. For the non-multilevel workflow showing more features (also applicable to the multilevel models) see the Bayesian Meta-Analysis vignette.

The `RoBMA` R package currently supports the simple multilevel structure shown here, with one cluster grouping above the estimate level (parameterized by total heterogeneity \(\tau^2\) and cluster-level allocation \(\rho\)). Broader support for multivariate models and more complex random-effects structures is planned for a future release.

## Multilevel Random-Effects Model

The school-calendar dataset from the `metadat` package contains 56 standardized mean differences nested in 11 school districts. Effect sizes `yi` and sampling variances `vi` are already provided, so no `escalc()` step is needed.

    data("dat.konstantopoulos2011", package = "metadat")
    dat <- dat.konstantopoulos2011
    head(dat)
    #>
    #>   district school study year     yi    vi
    #> 1       11      1     1 1976 -0.180 0.118
    #> 2       11      2     2 1976 -0.220 0.118
    #> 3       11      3     3 1976  0.230 0.144
    #> 4       11      4     4 1976 -0.300 0.144
    #> 5       12      1     5 1989  0.130 0.014
    #> 6       12      2     6 1989 -0.260 0.014

`metafor::rma.mv()` fits a multilevel random-effects model with the compound-symmetric structure `random = ~ school | district`, parameterized by the total heterogeneity \(\tau\) and the within-district correlation \(\rho\).

    fit1_metafor <- metafor::rma.mv(yi, vi, random = ~ school | district, data = dat)
    fit1_metafor
    #>
    #> Multivariate Meta-Analysis Model (k = 56; method: REML)
    #>
    #> Variance Components:
    #>
    #> outer factor: district (nlvls = 11)
    #> inner factor: school   (nlvls = 11)
    #>
    #>             estim    sqrt  fixed
    #> tau^2      0.0978  0.3127     no
    #> rho        0.6653             no
    #>
    #> Test for Heterogeneity:
    #> Q(df = 55) = 578.8640, p-val < .0001
    #>
    #> Model Results:
    #>
    #> estimate      se    zval    pval   ci.lb   ci.ub
    #>   0.1847  0.0846  2.1845  0.0289  0.0190  0.3504  *
    #>
    #> ---
    #> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The matching Bayesian fit replaces the `random = ...` argument with `cluster = district`. `brma()` parameterizes the multilevel model in the same compound-symmetric form: a total heterogeneity \(\tau\) and a cluster-level allocation \(\rho\) where \(\tau_{between} = \tau\sqrt{\rho}\) and \(\tau_{within} = \tau\sqrt{1 - \rho}\). `measure = "SMD"` selects the default prior distributions for standardized mean differences.

    fit1_brma <- brma(
      yi = yi, vi = vi, measure = "SMD",
      cluster = district,
      data = dat, seed = 1
    )

`summary()` reports posterior means, credible intervals, and (suppressed here) MCMC convergence diagnostics for `mu`, `tau`, and `rho`.

    summary(fit1_brma, include_mcmc_diagnostics = FALSE)
    #>
    #> Bayesian Multilevel Random-Effects Model (k = 56, clusters = 11)
    #>
    #> Estimates
    #>      Mean    SD 0.025   0.5 0.975
    #> mu  0.183 0.089 0.009 0.182 0.365
    #> tau 0.323 0.058 0.233 0.314 0.461
    #> rho 0.634 0.140 0.329 0.647 0.863

The posterior mean for the pooled effect tracks the REML estimate from the `metafor` package, with comparable cluster-level allocation `rho` and total heterogeneity `tau`.

## Heterogeneity: \(\tau\) and \(\rho\)

`metafor::confint()` reports profile-likelihood confidence intervals for `tau^2`, `tau`, and `rho`.

    confint(fit1_metafor)
    #>
    #>       estimate  ci.lb  ci.ub
    #> tau^2   0.0978 0.0528 0.2398
    #> tau     0.3127 0.2298 0.4897
    #>
    #>     estimate  ci.lb  ci.ub
    #> rho   0.6653 0.3282 0.8855

`summary_heterogeneity()` is the Bayesian counterpart, reporting posterior summaries of the same quantities along with the partitioned within- and between-cluster components.

    summary_heterogeneity(fit1_brma)
    #>
    #> Heterogeneity Estimates:
    #>                  Mean Median  0.025  0.975
    #> tau             0.323  0.314  0.233  0.461
    #> rho             0.634  0.647  0.329  0.863
    #> tau [within]    0.187  0.185  0.132  0.255
    #> tau [between]   0.258  0.248  0.150  0.417
    #> tau2            0.108  0.099  0.054  0.213
    #> tau2 [within]   0.036  0.034  0.017  0.065
    #> tau2 [between]  0.071  0.062  0.022  0.174
    #> I2             95.094 95.238 91.673 97.727
    #> I2 [within]    34.673 33.498 13.262 62.913
    #> I2 [between]   60.421 61.434 30.803 83.757
    #> H2             22.745 21.000 12.010 43.998

`plot()` visualizes the posterior, and `prior = TRUE` overlays the prior distribution so the shift from prior to posterior is visible. Side-by-side panels for `tau` and `rho` show the bulk of the posterior moving away from the weakly informative defaults.

    par(mfrow = c(1, 2), mar = c(4, 4, 2, 1), cex.axis = 0.8, cex.lab = 0.8, cex.main = 0.75)
    plot(fit1_brma, parameter = "tau", prior = TRUE, main = "tau", xlim = c(0, 1))
    plot(fit1_brma, parameter = "rho", prior = TRUE, main = "rho", xlim = c(0, 1))

The `tau` posterior concentrates around 0.3 with credible interval comparable to the profile-likelihood bounds, while the `rho` posterior favors a moderate-to-high cluster-level allocation, broadly consistent with the REML point estimate of 0.67.

## Other Inference Helpers

All inference helpers available for any other `brma()` fit work the same way for the multilevel fit specified via `cluster`. This includes meta-regression and location-scale models, model comparison, and fit diagnostics. See the Bayesian Meta-Analysis vignette for the full walkthrough; the only thing that changes here is the addition of `cluster = district`.

## References

Bartoš, F., & Maier, M. (2020). RoBMA: An R package for robust Bayesian meta-analyses. https://CRAN.R-project.org/package=RoBMA
Konstantopoulos, S. (2011). Fixed effects and variance components estimation in three-level meta-analysis. Research Synthesis Methods, 2(1), 61–76. https://doi.org/10.1002/jrsm.35
Viechtbauer, W. (2010). Conducting meta-analyses in R with the metafor package. Journal of Statistical Software, 36(3), 1–48. https://doi.org/10.18637/jss.v036.i03