Random-effects meta-analysis on synthetic trials.
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
REML random-effects with metafor; heterogeneity via τ², I², H²; small-study bias via Egger test.
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)")
| 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 |
slab <- if ("label" %in% names(d)) d$label else paste0("Study ", d$study_id)
forest(fit, slab = slab, xlab = "Effect size")
funnel(fit, xlab = "Effect size")