Cumulative meta-analysis plot

Cumulative forest plot

MA
Pooled estimate recomputed as each study is added in a chosen order, showing how the evidence evolved.
MAEstablished

Cumulative meta-analysis plot example

Cumulative random-effects meta-analysis of the BCG trials in order of publication year. Each row is the pooled risk ratio after adding the named study; the right column tracks I². Data: metadat::dat.bcg.
Family
Effect display
Purpose
Show how the pooled estimate and its precision changed as evidence accumulated.
Inputs
Study estimates with standard errors and an ordering variable (year, precision, size).
Software
R meta::metacum(), metafor::cumul(); Stata meta forestplot, cumulative()

What it shows

Each row of a cumulative forest plot is a complete meta-analysis of all studies up to and including that row. Ordered by publication year, it reconstructs the history of the evidence: when the pooled estimate stabilized, when it first became statistically significant, and whether later trials moved it. Ordered by precision or sample size, it becomes a check for small-study effects, since drift as smaller studies are added hints that they behave differently.

How to read it

  • Rows: successive meta-analyses, labeled with the study just added and the running count \(k\).
  • Squares and whiskers: the pooled estimate and 95% CI at that step (not the individual study result).
  • Bottom diamond: the final pooled estimate, identical to the last row.
  • Extra columns: running heterogeneity, such as \(I^2\).

Interpretation

The pooled risk ratio was already well below 1 after the first few trials of the 1940s and 1950s and has stayed there. What changed over time is heterogeneity: \(I^2\) climbed from 0% to 92% as trials from different latitudes were added. The history suggests the question shifted from “does BCG work” to “where does it work”.

Pitfalls

  • Repeatedly testing a cumulative estimate inflates the type I error. A cumulative plot is descriptive; formal monitoring needs trial sequential analysis or a similar method.
  • Choosing the ordering variable after looking at the data can tell a persuasive but post hoc story.
  • Early rows rest on very few studies and random-effects estimates of \(\tau^2\) are unstable there.

Code

library(meta)

data(dat.bcg, package = "metadat")

m <- metabin(
  event.e = tpos, n.e = tpos + tneg,
  event.c = cpos, n.c = cpos + cneg,
  studlab = paste(author, year),
  data = dat.bcg, sm = "RR",
  common = FALSE, random = TRUE, method.tau = "REML"
)

# Add studies one at a time in order of publication year
cum <- metacum(m, sortvar = year)

forest(
  cum,
  label.left = "Favors vaccine", label.right = "Favors control",
  col.square = "#1d4e89", col.diamond = "#1d4e89",
  rightcols = c("effect", "ci", "I2"),
  rightlabs = c("RR", "95% CI", "I2")
)
meta esize tpos tneg cpos cneg, esize(lnrratio) random(reml)
meta forestplot, eform cumulative(year)

References

  • Lau J, Antman EM, Jimenez-Silva J, Kupelnick B, Mosteller F, Chalmers TC. Cumulative meta-analysis of therapeutic trials for myocardial infarction. N Engl J Med. 1992;327:248-254. doi:10.1056/NEJM199207233270406
  • Clarke M, Brice A, Chalmers I. Accumulating research: a systematic account of how cumulative meta-analyses would have provided knowledge, improved health, reduced harm and saved resources. PLoS One. 2014;9:e102670. doi:10.1371/journal.pone.0102670