Overview

Random-effects meta-analysis on synthetic trials.

Data

d <- read_csv("data/synthetic_trials.csv", show_col_types = FALSE) |>
  mutate(
    vi  = ifelse(!is.na(sei), sei^2, vi),
    sei = ifelse(!is.na(vi) & is.na(sei), sqrt(vi), sei),
    study_id = as.character(study_id)
  )
head(d)
## # A tibble: 6 × 4
##   study_id    yi    sei      vi
##   <chr>    <dbl>  <dbl>   <dbl>
## 1 1        0.275 0.0896 0.00802
## 2 2        0.179 0.118  0.0140 
## 3 3        0.297 0.106  0.0113 
## 4 4        0.428 0.0879 0.00772
## 5 5        0.165 0.130  0.0168 
## 6 6        0.165 0.0681 0.00464

Methods

REML random-effects with metafor; heterogeneity via τ², I², H²; small-study bias via Egger test.

Results

fit <- rma(yi = yi, vi = vi, data = d, method = "REML")
egger <- try(regtest(fit, model = "rma"), silent = TRUE)
res <- tibble::tibble(
  k     = fit$k,
  est   = as.numeric(fit$b),
  se    = fit$se,
  ci_lb = fit$ci.lb,
  ci_ub = fit$ci.ub,
  tau2  = fit$tau2,
  I2    = fit$I2,
  H2    = fit$H2,
  Q     = fit$QE,
  Q_p   = fit$QEp,
  Egger_z = if (inherits(egger, "try-error")) NA_real_ else egger$zval,
  Egger_p = if (inherits(egger, "try-error")) NA_real_ else egger$pval
)
kable(res, digits = 3, caption = "Random-effects meta-analysis summary (REML)")
Random-effects meta-analysis summary (REML)
k est se ci_lb ci_ub tau2 I2 H2 Q Q_p Egger_z Egger_p
12 0.248 0.036 0.177 0.318 0.006 36.896 1.585 16.468 0.125 -0.221 0.825

Forest plot

slab <- if ("label" %in% names(d)) d$label else paste0("Study ", d$study_id)
forest(fit, slab = slab, xlab = "Effect size")

Funnel plot

funnel(fit, xlab = "Effect size")