Site icon R-bloggers

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

Statistical Models

Example of Meta Analysis in R

We will provide an example of Meta Analysis in R using the library. Let’s start.

library(meta)
data("Fleiss1993cont")

head(Fleiss1993cont)

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'))

Funnel Plot

funnel(res.flesiss)
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

The Analysis:

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

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.