The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

metaGLMM

metaGLMM fits likelihood-based random-effects meta-analyses as generalized linear mixed-effects models using aggregate study data. The same interface supports covariate adjustment, non-Gaussian responses, and a small set of explicit random-effect structures without requiring individual participant data.

The package is intended for reproducible analyses in base R. A fitted model is an S3 object with familiar methods such as summary(), coef(), vcov(), confint(), predict(), and plot().

Installation

Install the development version from GitHub with:

install.packages("remotes")
remotes::install_github("keisuke-hanada/metaGLMM", build_vignettes = TRUE)

The package imports only the numerical tools needed for fitting. The examples and vignettes use base R data manipulation and graphics.

A minimal analysis

The response is an aggregate study estimate, vi is its sampling variance, and ni is the relevant study size or exposure. The formula defines the fixed-effects model matrix.

library(metaGLMM)

dat <- data.frame(
  study = paste0("Study ", 1:6),
  estimate = c(-0.30, -0.08, 0.05, 0.18, 0.27, 0.41),
  moderator = c(0, 0, 1, 1, 0, 1),
  vi = c(0.08, 0.11, 0.09, 0.13, 0.10, 0.12),
  ni = c(90, 80, 110, 75, 95, 85)
)

fit <- metaGLMM(
  estimate ~ moderator,
  data = dat,
  vi = dat$vi,
  ni = dat$ni,
  tau2 = NA,
  family = gaussian(link = "identity"),
  tau2_var = TRUE,
  fast = TRUE
)

summary(fit)
coef(fit)             # fixed effects only
vcov(fit)             # fixed-effect covariance matrix
fit$tau2              # between-study variance
confint(fit, method = "wald")
predict(fit, newdata = data.frame(moderator = c(0, 1)),
        interval = "prediction")

The vignettes provide small, self-contained examples:

Supported families

The built-in stats families are gaussian(), binomial(), poisson(), and Gamma(). Their link functions are passed in the usual R style, for example binomial(link = "logit") or Gamma(link = "log"). The fixed-effect coefficient names always follow model.matrix(), including interactions, factor contrasts, and formulas without an intercept.

For binary data, y is a proportion and ni is the number of trials. For Poisson data, y is a rate and ni is the exposure. For Gaussian and Gamma analyses, provide the aggregate response, sampling variance, and the study size used by the likelihood. Values at a binomial or Poisson boundary can be represented with the legacy vi = Inf convention; finite variances are needed when an automatic study-level display is requested.

Custom families

Use metaGLMM_family() when a response requires an R-level conditional log-likelihood. The callback is vectorized in eta and returns one log-likelihood contribution per row.

nb_size <- 8
nb_rate_family <- metaGLMM_family(
  name = "negative-binomial-rate",
  link = "log",
  loglik = function(y, eta, vi, ni) {
    dnbinom(round(y * ni), size = nb_size,
            mu = exp(eta) * ni, log = TRUE)
  }
)

nb_dat <- data.frame(events = c(8, 30, 5, 55),
                     exposure = c(20, 35, 18, 42))
nb_dat$rate <- nb_dat$events / nb_dat$exposure
nb_dat$vi <- 1 / nb_dat$events + 1 / nb_size

qmc <- qnorm((seq_len(256) - 0.5) / 256)
custom_fit <- metaGLMM(rate ~ 1, nb_dat, vi = nb_dat$vi,
                       ni = nb_dat$exposure, tau2 = NA,
                       family = nb_rate_family, tau2_var = TRUE,
                       rstdnorm = qmc, fast = FALSE)

Custom families use the QMC path (fast = FALSE) in the initial release. Compiled quadrature for custom callbacks is intentionally not part of this interface. The custom-family vignette provides validation, initialization, and a larger negative-binomial example.

Inference and prediction

The official confint() methods are "wald", "profile", and "SBC" (case-insensitive). They target fixed effects; tau2 and tau remain available as fitted-object components and in summary().

predict() can return the link or response scale. A confidence interval uses the fixed-effect covariance, while a prediction interval additionally uses random_scale^2 * tau2. Observation-level sampling variance is not added to the prediction interval. For log and logit models, type = "exp" provides a convenient multiplicative response scale.

Forest plots and data exchange

forest(fit) and plot(fit, type = "forest") use base graphics and show study estimates, their sampling intervals, selected fixed-effect confidence intervals as diamonds, and a plug-in prediction interval when available. The default uses SBC when supported and Wald otherwise. Request several rows with ci_methods = c("wald", "profile", "SBC"). Automatic study extraction uses as_metafor_data() and remains deliberately conservative. For complex arm-level data, pass estimate, vi, and labels explicitly.

as_metafor_data(fit) returns an ordinary data.frame with yi, vi, and slab columns. It does not create a class from another package or add a dependency on that package.

Citation

Please cite metaGLMM and the methodological work that motivates the likelihood construction:

Hanada, K. and Sugimoto, T. (2026). Random-effects meta-analysis via generalized linear mixed models: A Bartlett-corrected approach for few studies. doi:10.1093/biomtc/ujag148.

@article{HanadaSugimoto2026,
  author  = {Hanada, Keisuke and Sugimoto, Tomoyuki},
  title   = {Random-effects meta-analysis via generalized linear mixed models:
             A Bartlett-corrected approach for few studies},
  year    = {2026},
  doi     = {10.1093/biomtc/ujag148}
}

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.