Meta Analysis in R

[This article was first published on R – Predictive Hacks, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

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)
Meta Analysis in R 1

We will work with the Fleiss1993cont dataset where:

studystudy label
yearyear of publication
n.psycnumber of observations in psychotherapy group
mean.psycestimated mean in psychotherapy group
sd.psycstandard deviation in psychotherapy group
n.contnumber of observations in control group
mean.contestimated mean in control group
sd.contstandard 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'))
Meta Analysis in R 2
  • 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)
Meta Analysis in R 3
  • 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
Meta Analysis in R 4

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
Meta Analysis in R 5
  • 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'))
Meta Analysis in R 6
funnel(m.bin)
metabias(m.bin, method.bias = 'linreg', plotit = T)
Meta Analysis in R 7
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

To leave a comment for the author, please follow the link and comment on their blog: R – Predictive Hacks.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)