Nine studies investigating the effect of NO2 exposure on respiratory illness in children.

dat.dumouchel1994

Format

The data frame contains the following columns:

studycharacterstudy label
smokefactoradjustment for smoking (y/n)
no2factordirect measurement of NO2 concentration (y/n)
genderfactoradjustment for gender (y/n)
ornumericodds ratio for childhood respiratory illness
lowernumericlower bound of 95 percent CI
uppernumericupper bound of 95 percent CI

Details

Hasselblad et al. (1992) investigated the effects of nitrogen dioxide (NO2) exposure on the occurrence of respiratory illness in children. Their data were picked up by DuMouchel (1994) as an illustrative example in his article on Bayesian meta-analysis, and were also part of his “hblm” S-Plus software package. DuMouchel's dataset differs slightly from the figures quoted by Hasselblad et al. (1992), apparently because he had additional, more detailed data available.

The data set features three study-level covariables reflecting characteristics of the study designs, namely, whether the quoted estimate had been adjusted for parents' smoking status, whether NO2 exposure had been measured directly (or presence of a gas stove in the household had been used as a proxy instead), and whether the quoted effect had been adjusted for gender. Inclusion of the covariables allows to account for the studies' design features, quantify their effects, and adjust for these.

Source

DuMouchel, W. H. (1994). Hierarchical Bayes linear models for meta-analysis. Technical Report 27, National Institute of Statistical Sciences (NISS); Research Triangle Park, NC, USA. https://www.niss.org/research/technical-reports/hierarchical-bayes-linear-models-meta-analysis-1994

References

Hasselblad, V., Eddy, D. M., & Kotchmar, D. J. (1992). Synthesis of environmental evidence: Nitrogen dioxide epidemiology studies. Journal of the Air and Waste Management Association, 42(5), 662–671. https://doi.org/10.1080/10473289.1992.10467018

Author

Christian Roever, christian.roever@med.uni-goettingen.de

Concepts

medicine, odds ratios, meta-regression

Examples

# show data:
dat.dumouchel1994
#>        study smoke no2 gender   or lower upper
#> 1    Melia77    no  no    yes 1.28  1.14  1.43
#> 2    Melia79    no  no    yes 1.22  1.08  1.37
#> 3    Melia80    no yes    yes 1.49  1.04  2.14
#> 4    Melia82    no yes    yes 1.11  0.84  1.46
#> 5     Ware84    no  no     no 1.07  0.98  1.17
#> 6     Neas91   yes yes    yes 1.40  1.14  1.72
#> 7     Ekwo83   yes  no     no 1.09  0.82  1.45
#> 8 Dijkstra90    no yes     no 0.94  0.70  1.27
#> 9   Keller79    no  no     no 0.75  0.35  1.62

# derive effect sizes (log-ORs):
library(metafor)
no2 <- escalc(measure="OR", yi=log(or),
              sei=(log(upper)-log(lower))/(2*qnorm(0.975)),
              slab=study, data=dat.dumouchel1994)
summary(no2)
#> 
#>        study smoke no2 gender   or lower upper      yi     vi    sei      zi   pval   ci.lb  ci.ub 
#> 1    Melia77    no  no    yes 1.28  1.14  1.43  0.2469 0.0033 0.0578  4.2695 <.0001  0.1335 0.3602 
#> 2    Melia79    no  no    yes 1.22  1.08  1.37  0.1989 0.0037 0.0607  3.2772 0.0010  0.0799 0.3178 
#> 3    Melia80    no yes    yes 1.49  1.04  2.14  0.3988 0.0339 0.1841  2.1663 0.0303  0.0380 0.7596 
#> 4    Melia82    no yes    yes 1.11  0.84  1.46  0.1044 0.0199 0.1410  0.7400 0.4593 -0.1720 0.3808 
#> 5     Ware84    no  no     no 1.07  0.98  1.17  0.0677 0.0020 0.0452  1.4967 0.1345 -0.0209 0.1563 
#> 6     Neas91   yes yes    yes 1.40  1.14  1.72  0.3365 0.0110 0.1049  3.2068 0.0013  0.1308 0.5421 
#> 7     Ekwo83   yes  no     no 1.09  0.82  1.45  0.0862 0.0211 0.1454  0.5926 0.5534 -0.1988 0.3712 
#> 8 Dijkstra90    no yes     no 0.94  0.70  1.27 -0.0619 0.0231 0.1520 -0.4072 0.6839 -0.3597 0.2360 
#> 9   Keller79    no  no     no 0.75  0.35  1.62 -0.2877 0.1528 0.3909 -0.7360 0.4617 -1.0538 0.4784 
#> 

# compute overall meta-analysis:
library(bayesmeta)
#> Loading required package: forestplot
#> Loading required package: grid
#> Loading required package: checkmate
#> Loading required package: abind
#> Loading required package: mvtnorm
#> 
#> Attaching package: ‘bayesmeta’
#> The following object is masked from ‘package:stats’:
#> 
#>     convolve
bm01 <- bayesmeta(no2, tau.prior="DuMouchel")

# show results:
bm01
#>  'bayesmeta' object.
#> 
#> 9 estimates:
#> Melia77, Melia79, Melia80, Melia82, Ware84, Neas91, Ekwo83, Dijkstra90, Keller79
#> 
#> tau prior (proper):
#> DuMouchel prior 
#> 
#> mu prior (improper):
#> uniform(min=-Inf, max=Inf)
#> 
#> ML and MAP estimates:
#>                     tau        mu
#> ML joint     0.06501696 0.1652389
#> ML marginal  0.07833098 0.1614342
#> MAP joint    0.00000000 0.1566709
#> MAP marginal 0.05379867 0.1613962
#> 
#> marginal posterior summary:
#>                  tau         mu
#> mode      0.05379867 0.16139622
#> median    0.06468375 0.16220432
#> mean      0.07320351 0.16237119
#> sd        0.05141140 0.04540694
#> 95% lower 0.00000000 0.07230307
#> 95% upper 0.16817450 0.25433497
#> 
#> (quoted intervals are shortest credible intervals.)
forestplot(bm01)

traceplot(bm01)


# perform meta-regression;
# specify regressor matrix:
X <- model.matrix( ~ smoke + no2 + gender, data=no2)
colnames(X) <- c("intercept", "smoke", "no2", "gender")

# perform regression:
bm02 <- bmr(no2, X=X, tau.prior="DuMouchel")

# show results:
bm02
#>  'bmr' object.
#> 
#> 9 estimates:
#> Melia77, Melia79, Melia80, Melia82, Ware84, Neas91, Ekwo83, Dijkstra90, Keller79
#> 
#> 4 regression parameters:
#> intercept, smoke, no2, gender
#> 
#> tau prior (proper):
#> DuMouchel prior 
#> 
#> beta prior: (improper) uniform
#> 
#> MAP estimates:
#>          tau  intercept      smoke         no2    gender
#> joint      0 0.04953994 0.09955415 -0.02627344 0.1809562
#> marginal   0 0.04529170 0.10031227 -0.02546997 0.1862744
#> 
#> marginal posterior summary:
#>                  tau   intercept      smoke         no2     gender
#> mode      0.00000000  0.04529170  0.1003123 -0.02546997 0.18627439
#> median    0.02876977  0.04140935  0.1005924 -0.02510083 0.19031411
#> mean      0.04265608  0.03751861  0.1008461 -0.02474112 0.19410424
#> sd        0.04578384  0.06421741  0.1135835  0.09736343 0.08028811
#> 95% lower 0.00000000 -0.09126973 -0.1210495 -0.21483758 0.04033739
#> 95% upper 0.12945431  0.15924345  0.3227122  0.16525866 0.35335461
#> 
#> (quoted intervals are shortest credible intervals.)
forestplot(bm02)

#forestplot(bm02, xlab="log-OR",
#           X.mean=rbind("none"      = c(1,0,0,0),
#                        "smoke"     = c(1,1,0,0),
#                        "no2"       = c(1,0,1,0),
#                        "gender"    = c(1,0,0,1),
#                        "all three" = c(1,1,1,1)))
traceplot(bm02)