set.seed(2024)
n_studies <- 10
meta_dat <- data.frame(
study = c(
"Anderson et al. (2014)",
"Bauer et al. (2015)",
"Chen et al. (2016)",
"Di et al. (2017)",
"Evans et al. (2018)",
"Fuentes et al. (2019)",
"Garcia et al. (2020)",
"Hart et al. (2021)",
"Ibrahim et al. (2022)",
"Jensen et al. (2023)"
),
region = c(
"North America", "Europe", "Asia", "North America", "Europe",
"Latin America", "Europe", "North America", "Asia", "Europe"
),
n = c(4520, 2810, 8340, 12600, 3950, 1870, 5430, 9100, 6780, 3210),
events = c( 612, 390, 1120, 1950, 540, 255, 770, 1380, 980, 450),
# Log odds ratios and SEs (simulated around a true log-OR of 0.08 per
# 10 µg/m³ increase in PM2.5)
log_or = c(0.062, 0.091, 0.078, 0.095, 0.055, 0.110, 0.083,
0.072, 0.088, 0.068),
se = c(0.028, 0.035, 0.022, 0.019, 0.031, 0.042, 0.026,
0.021, 0.024, 0.033),
is_sum = FALSE
)
# Back-transform to OR scale
meta_dat$or <- exp(meta_dat$log_or)
meta_dat$lower <- exp(meta_dat$log_or - 1.96 * meta_dat$se)
meta_dat$upper <- exp(meta_dat$log_or + 1.96 * meta_dat$se)
# Inverse-variance weights for the fixed-effect pooled estimate
meta_dat$weight <- 1 / meta_dat$se^2
# Fixed-effect pooled log-OR and SE
pooled_log_or <- with(meta_dat,
sum(weight * log_or) / sum(weight)
)
pooled_se <- sqrt(1 / sum(meta_dat$weight))
# Append pooled row
pooled_row <- data.frame(
study = "Pooled (fixed-effect)",
region = NA_character_,
n = sum(meta_dat$n),
events = sum(meta_dat$events),
log_or = pooled_log_or,
se = pooled_se,
or = exp(pooled_log_or),
lower = exp(pooled_log_or - 1.96 * pooled_se),
upper = exp(pooled_log_or + 1.96 * pooled_se),
weight = NA_real_,
is_sum = TRUE
)
meta_all <- rbind(meta_dat, pooled_row)
# Formatted text for the right-hand table columns
meta_all$or_text <- ifelse(
meta_all$is_sum,
sprintf("%.2f (%.2f\u2013%.2f)", meta_all$or, meta_all$lower, meta_all$upper),
sprintf("%.2f (%.2f\u2013%.2f)", meta_all$or, meta_all$lower, meta_all$upper)
)
meta_all$n_text <- formatC(meta_all$n, format = "d", big.mark = ",")
meta_all$events_text <- formatC(meta_all$events, format = "d", big.mark = ",")