A Bootstrap-Based Heterogeneity Test for Between-study Heterogeneity in Meta-Analysis

knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

This R package boot.heterogeneity provides functions for testing the between-study heterogeneity in meta-analysis of standardized mean differences (d), Fisher-transformed Pearson's correlations (r), and log odds ratio (OR).

In the following three examples, we describe how to use our package boot.heterogeneity to test the between-study heterogeneity for each of the three effect sizes (d, r, OR). Datasets, R codes, and Output are provided so that applied researchers can easily replicate each example or modify the codes for their own datasets.

Inclusion of moderators is an option for researchers who are interested in using factors to explain the systematic between-study heterogeneity. To see how we include moderators, please go to section 1.2.

Heterogeneity magnitude test is a test in which the researchers can compare the magnitude of the between-study heterogeneity against a specific level. This specific level is denoted as lambda in our alternative hypothesis. To see how we test a specific lambda in the alternative hypothesis, please go to section 2.2.

Parallel implementation of the bootstrapping process can save us considerable amount of computing time, especially when the number of bootstrap replications is large. To see how we accelerate the bootstrapping process with parallel implementation and computing nodes, please go to section 3.2.

In the main text of the article, an "Empirical Illustration" section is included to discuss the three examples in more detail.

Outline

0. Installation of the package {#section0}

For most recent updates, researchers are highly recommended to install the development version of this package from GitHub using the following syntax:

# install.packages("devtools")
library(devtools)
devtools::install_github("gabriellajg/boot.heterogeneity", 
                         force = TRUE, 
                         build_vignettes = TRUE, 
                         dependencies = TRUE)
library(boot.heterogeneity)

The newest version of this package will also be available on CRAN shortly.

Note that you'll need the following packages to install this package successfully:

library(metafor) # for Q-test
library(pbmcapply) # optional - for parallel implementation of bootstrapping
library(HSAUR3) # for an example dataset in the tutorial
library(knitr) # for knitting the tutorial
library(rmarkdown) # for knitting the tutorial

1. Standardized Mean Differences (d) {#section1}

boot.d() is the function to test the between-study heterogeneity in meta-analysis of standardized mean differences (d).

1.1 Without moderators {#section1.1}

Load the example dataset selfconcept first:

selfconcept <- boot.heterogeneity:::selfconcept

selfconcept consists of 18 studies in which the effect of open versus traditional education on students’ self-concept was studied (Hedges et al., 1981). The columns of selfconcept are: sample sizes of the two groups (n1 and n2), Hedges's g, Cohen's d, and a moderator X (X not used in the current example).

head(selfconcept, 3)

Extract the required arguments from selfconcept:

# n1 and n2 are lists of samples sizes in two groups
n1 <- selfconcept$n1
n2 <- selfconcept$n2
# g is a list of effect sizes
g <- selfconcept$g

If g is a list of biased estimates of standardized mean differences in the meta-analytical study, a small-sample adjustment must be applied:

cm <- (1-3/(4*(n1+n2-2)-1)) #correct factor to compensate for small sample bias (Hedges, 1981)
d <- cm*g

Run the heterogeneity test using function boot.d() and adjusted effect size d:

boot.run <- boot.d(n1, n2, est = d, model = 'random', p_cut = 0.05)

Alternatively, such an adjustment can be performed on unadjusted effect size g by specifying adjust = TRUE:

boot.run2 <- boot.d(n1, n2, est = g, model = 'random', adjust = TRUE, p_cut = 0.05)

boot.run and boot.run2 will return the same results:

boot.run
#>                  stat  p_value Heterogeneity
#> Qtest       23.391659 0.136929           n.s
#> boot.REML    2.037578 0.053100           n.s
boot.run2
#>                  stat  p_value Heterogeneity
#> Qtest       23.391659 0.136929           n.s
#> boot.REML    2.037578 0.053100           n.s

1.2 With moderators {#section1.2}

Load an hypothetical dataset hypo_moder first:

hypo_moder <- boot.heterogeneity:::hypo_moder

Three moderators (cov.z1, cov.z2, cov.z3) are included:

head(hypo_moder)

Again, run the heterogeneity test using boot.d() with all moderators included in a matrix mods and model type specified as model = 'mixed':

boot.run3 <- boot.d(n1 = hypo_moder$n1, 
                n2 = hypo_moder$n2, 
                est = hypo_moder$d, 
                model = 'mixed', 
                mods = cbind(hypo_moder$cov.z1, hypo_moder$cov.z2, hypo_moder$cov.z3), 
                p_cut = 0.05)

The results in boot.run3 will in the same format as boot.run and boot.run2:

boot.run3
#>                  stat    p_value  Heterogeneity
#> Qtest       31.849952  0.000806             sig
#> boot.REML    9.283428  0.000400             sig

In the presence of moderators, the function above tests whether the variability in the true standardized mean differences after accounting for the moderators included in the model is larger than sampling variability alone (Viechtbauer, 2010).

For the following two examples (Fisher-transformed Pearson's correlations r; log odds ratio OR), no moderators are included, but one can simply include moderators as in section 1.2.

2. Fisher-transformed Pearson's correlations (r) {#section2}

boot.fcor() is the function to test the between-study heterogeneity in meta-analysis of Fisher-transformed Pearson's correlations (r).

2.1 Heterogeneity magnitude test: lambda=0 {#section2.1}

Load the example dataset sensation first:

sensation <- boot.heterogeneity:::sensation

Extract the required arguments from sensation:

# n is a list of samples sizes
n <- sensation$n
# Pearson's correlation
r <- sensation$r
# Fisher's Transformation
z <- 1/2*log((1+r)/(1-r))

Run the heterogeneity test using boot.fcor():

boot.run.cor <- boot.fcor(n, z, model = 'random', p_cut = 0.05)

The test of between-study heterogeneity has the following results:

boot.run.cor
#>                  stat      p_value    Heterogeneity
#> Qtest       29.060970    0.00385868             sig
#> boot.REML    6.133111    0.00400882             sig

2.2 Heterogeneity magnitude test: lambda=0.08 {#section2.2}

Run the heterogeneity test using boot.fcor():

boot.run.cor2 <- boot.fcor(n, z, lambda=0.08, model = 'random', p_cut = 0.05)

The test of between-study heterogeneity has the following results:

boot.run.cor2
#>                  stat      p_value    Heterogeneity
#> boot.REML     2.42325   0.04607372              sig

3. Log odds ratio (OR) {#section3}

3.1 Without parallel implementation {#section3.1}

boot.lnOR() is the function to test the between-study heterogeneity in meta-analysis of Natural-logarithm-transformed odds ratio (OR).

Load the example dataset smoking from R package HSAUR3:

library(HSAUR3)
data(smoking)

Extract the required arguments from smoking:

# Y1: receive treatment; Y2: stop smoking
n_00 <- smoking$tc - smoking$qc  # not receive treatement yet not stop smoking
n_01 <- smoking$qc # not receive treatement but stop smoking
n_10 <- smoking$tt - smoking$qt # receive treatement but not stop smoking
n_11 <- smoking$qt # receive treatement and stop smoking

The log odds ratios can be computed, but they are not needed by boot.lnOR():

lnOR <- log(n_11*n_00/n_01/n_10)
lnOR

Run the heterogeneity test using boot.lnOR():

boot.run.lnOR <- boot.lnOR(n_00, n_01, n_10, n_11, model = 'random', p_cut = 0.05) 

The test of between-study heterogeneity has the following results:

boot.run.lnOR
#>                  stat    p_value    Heterogeneity
#> Qtest       34.873957  0.09050857             n.s
#> boot.REML    3.071329  0.03706729             sig

3.2 With parallel implementation {#section3.2}

Run the heterogeneity test using boot.lnOR() with parallel computing and 4 cores:

boot.run.lnOR2 <- boot.lnOR(n_00, n_01, n_10, n_11, model = 'random', p_cut = 0.05, 
                            parallel = TRUE, cores = 4)

The test of between-study heterogeneity has the same results as those in 3.1:

boot.run.lnOR2
#|=====================================================| 100%, Elapsed 00:41
#>                  stat    p_value    Heterogeneity
#> Qtest       34.873957  0.09050857             n.s
#> boot.REML    3.071329  0.03706729             sig
sessionInfo()


Try the boot.heterogeneity package in your browser

Any scripts or data that you put into this service are public.

boot.heterogeneity documentation built on Oct. 23, 2021, 9:08 a.m.