Introduction
We can analyze different scientific studies that address the same question by applying a meta-analysis. The assumption is that every individual study contains some degree of error. For example, a study could be the mortality rate of two treatments for a specific disease. The goal is to obtain pooled summary estimates from individual studies by taking into consideration the heterogeneity among individual studies. The aggregated data from the individual studies leads to higher statistical power.
Procedure
- Define the research question
- Define inclusion/exclusion criteria for individual studies screened
- Search literature
- Select eligible studies
- Collect data
- Aggregate findings across studies and obtain pooled estimates of effect size
- Evaluate heterogeneity of included studies
- Conduct sensitivity and subgroup analyses
Statistical Models
- Pool effect sizes (of individual studies) into one overall effect
- Two types of statistical models to combine data, Fixed Effect Model and Random Effects Model
- Frequentist vs Bayesian approach
Example of Meta Analysis in R
We will provide an example of Meta Analysis in R using the meta library. Let’s start.
library(meta) data("Fleiss1993cont") head(Fleiss1993cont)
We will work with the Fleiss1993cont dataset where:
study | study label |
year | year of publication |
n.psyc | number of observations in psychotherapy group |
mean.psyc | estimated mean in psychotherapy group |
sd.psyc | standard deviation in psychotherapy group |
n.cont | number of observations in control group |
mean.cont | estimated mean in control group |
sd.cont | standard deviation in control group |
# meta-analysis with continuout outcome # comb.fixed/comb.random: indicator whether a fix/random effect mata-analysis to be conducted. # sm: Three different types of summary measures to choose,standardized mean difference (SMD),mean difference (MD), ratio of means (ROM) res.flesiss = metacont(n.psyc, mean.psyc, sd.psyc, n.cont, mean.cont, sd.cont, comb.fixed = T, comb.random = T, studlab = study, data = Fleiss1993cont, sm = "SMD") res.flesiss
Output
SMD 95%-CI %W(fixed) %W(random)
Davis -0.3399 [-1.1152; 0.4354] 11.5 11.5
Florell -0.5659 [-1.0274; -0.1044] 32.6 32.6
Gruen -0.2999 [-0.7712; 0.1714] 31.2 31.2
Hart 0.1250 [-0.4954; 0.7455] 18.0 18.0
Wilson -0.7346 [-1.7575; 0.2883] 6.6 6.6
Number of studies combined: k = 5
Number of observations: o = 232
SMD 95%-CI z p-value
Fixed effect model -0.3434 [-0.6068; -0.0800] -2.56 0.0106
Random effects model -0.3434 [-0.6068; -0.0800] -2.56 0.0106
Quantifying heterogeneity:
tau^2 = 0 [0.0000; 0.6936]; tau = 0 [0.0000; 0.8328]
I^2 = 0.0% [0.0%; 79.2%]; H = 1.00 [1.00; 2.19]
Test of heterogeneity:
Q d.f. p-value
3.68 4 0.4515
Details on meta-analytical method:
- Inverse variance method
- DerSimonian-Laird estimator for tau^2
- Jackson method for confidence interval of tau^2 and tau
- Hedges' g (bias corrected standardised mean difference)
Forest
forest(res.flesiss, leftcols = c('studlab'))
- According to the pooled results of meta-analysis, both fixed and random effects models yield a significant benefit of the intervention group against the control group (for the days of hospital stay, the lower, the better).
- The p-value =0.45 for the Cochran’s Q test, indicating no heterogeneity.
Funnel Plot
funnel(res.flesiss)
- metabias: Test for funnel plot asymmetry, based on rank correlation or linear regression method.
- Use Egger’s test to check publication bias, can take string ‘Egger’ or ‘linreg’.
metabias(res.flesiss, method.bias = 'linreg', k.min = 5, plotit = T)
Output
Linear regression test of funnel plot asymmetry
Test result: t = -0.04, df = 3, p-value = 0.9730
Sample estimates:
bias se.bias intercept se.intercept
-0.0668 1.8154 -0.3241 0.5455
Details:
- multiplicative residual heterogeneity variance (tau^2 = 1.2251)
- predictor: standard error
- weight: inverse variance
- reference: Egger et al. (1997), BMJ
The p-value is 0.973 which implies no publication bias. However, this meta-analysis contains k=5 studies. Egger’s test may lack the statistical power to detect bias when the number of studies is small (i.e., k<10).
Binary case
At this point, we will provide an example by taking into consideration a binary case.
load("binarydata.RData") binarydata
- Author: This signifies the column for the study label (i.e., the first author)
- Ee: Number of events in the experimental treatment arm
- Ne: Number of participants in the experimental treatment arm
- Ec: Number of events in the control arm
- Nc: Number of participants in the control arm
The Analysis:
- Use metabin to do the calculation.
- As we want to have a pooled effect for binary data, we have to choose another summary measure now. We can choose from “OR” (Odds Ratio), “RR” (Risk Ratio), or RD (Risk Difference), among other things.
- method: indicating which method is to be used for pooling of studies.
m.bin <- metabin(Ee,Ne,Ec,Nc, data = binarydata, studlab = paste(Author), comb.fixed = T,comb.random = T, method = 'MH',sm = "RR") # Mantel Haenszel weighting
Output
RR 95%-CI %W(fixed) %W(random)
Alcorta-Fleischmann 0.5018 [0.0462; 5.4551] 1.4 1.4
Craemer 1.0705 [0.5542; 2.0676] 15.2 18.9
Eriksson 1.1961 [0.3657; 3.9124] 4.5 5.8
Jones 0.5286 [0.1334; 2.0945] 5.3 4.3
Knauer 0.3278 [0.0134; 8.0140] 1.4 0.8
Kracauer 0.9076 [0.3512; 2.3453] 8.0 9.1
La Sala 0.9394 [0.4233; 2.0847] 11.2 12.9
Maheux 0.0998 [0.0128; 0.7768] 9.0 1.9
Schmidthauer 0.7241 [0.2674; 1.9609] 7.9 8.3
van der Zee 0.8434 [0.4543; 1.5656] 18.5 21.4
Wang 0.5519 [0.2641; 1.1534] 17.5 15.1
Number of studies combined: k = 11
Number of observations: o = 17604
Number of events: e = 194
RR 95%-CI z p-value
Fixed effect model 0.7536 [0.5696; 0.9972] -1.98 0.0478
Random effects model 0.7885 [0.5922; 1.0499] -1.63 0.1038
Quantifying heterogeneity:
tau^2 = 0; tau = 0; I^2 = 0.0% [0.0%; 60.2%]; H = 1.00 [1.00; 1.59]
Test of heterogeneity:
Q d.f. p-value
7.29 10 0.6976
Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Mantel-Haenszel estimator used in calculation of Q and tau^2 (like RevMan 5)
- Continuity correction of 0.5 in studies with zero cell frequencies
Forest
forest(m.bin, leftcols = c('studlab'))
funnel(m.bin) metabias(m.bin, method.bias = 'linreg', plotit = T)
Linear regression test of funnel plot asymmetry
Test result: t = -2.05, df = 9, p-value = 0.0701
Sample estimates:
bias se.bias intercept se.intercept
-1.1286 0.5493 0.2623 0.2661
Details:
- multiplicative residual heterogeneity variance (tau^2 = 0.5443)
- predictor: standard error
- weight: inverse variance
- reference: Egger et al. (1997), BMJ
Limitations
The limitation of Meta Analysis is that it can only conduct pariwise comparisions, and cannot include multi-arm trials.
References
[1] Dr. Na Zhao
1 thought on “Meta Analysis in R”
Thank you very much for this article.
One question. Is it possible to do a meta-analysis if I am missing the binary data and only have the Hazard ratios and confidence intervals? Thank you