Background
Absolute and relative risks will change across populations if the baseline risks are different.
For example, suppose BMI increases CHD by 20% per SD. BMI is distributed differently in two populations
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
n <- 10000000
dat <- tibble(
bmi_1 = rnorm(n, 25, sd=5),
bmi_2 = rnorm(n, 20, sd=5),
chdr_1 = 0.2,
chdr_2 = 0.2
)
dat$chdr_1[dat$bmi_1 > 27] <- 0.2*1.5
dat$chdr_2[dat$bmi_2 > 27] <- 0.2*1.5
dat$chd_1 <- rbinom(n, 1, dat$chdr_1)
dat$chd_2 <- rbinom(n, 1, dat$chdr_2)
dat
# A tibble: 10,000,000 × 6
bmi_1 bmi_2 chdr_1 chdr_2 chd_1 chd_2
<dbl> <dbl> <dbl> <dbl> <int> <int>
1 17.9 22.4 0.2 0.2 0 0
2 31.9 20.3 0.3 0.2 0 0
3 24.1 23.3 0.2 0.2 0 0
4 21.2 21.6 0.2 0.2 0 1
5 28.5 13.7 0.3 0.2 1 1
6 21.6 30.7 0.2 0.3 1 0
7 26.6 19.3 0.2 0.2 0 0
8 18.8 25.9 0.2 0.2 0 0
9 21.0 26.6 0.2 0.2 0 1
10 25.1 24.1 0.2 0.2 1 0
# ℹ 9,999,990 more rows
rr1 <- mean(dat$chd_1[dat$bmi_1 > 27]) / mean(dat$chd_1)
rr2 <- mean(dat$chd_2[dat$bmi_2 > 27]) / mean(dat$chd_2)
rr1
glm(chd_1 ~ bmi_1, dat, family="binomial")$coef[2]
glm(chd_2 ~ bmi_2, dat, family="binomial")$coef[2]
glm(chd_1 ~ bmi_1>27, dat, family="binomial")$coef[2]
glm(chd_2 ~ bmi_2>27, dat, family="binomial")$coef[2]
lm(chd_1 ~ bmi_1>27, dat)$coef[2]
bmi_1 > 27TRUE
0.09984052
lm(chd_2 ~ bmi_2>27, dat)$coef[2]
bmi_2 > 27TRUE
0.09955787
lm(chd_1 ~ bmi_1>27, dat)$coef[2]
bmi_1 > 27TRUE
0.09984052
lm(chd_2 ~ bmi_2>27, dat)$coef[2]
bmi_2 > 27TRUE
0.09955787
R version 4.3.0 (2023-04-21)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Monterey 12.6.2
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
time zone: Europe/London
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_1.1.2
loaded via a namespace (and not attached):
[1] digest_0.6.31 utf8_1.2.3 R6_2.5.1 fastmap_1.1.1
[5] tidyselect_1.2.0 xfun_0.39 magrittr_2.0.3 glue_1.6.2
[9] tibble_3.2.1 knitr_1.43 pkgconfig_2.0.3 htmltools_0.5.5
[13] generics_0.1.3 rmarkdown_2.22 lifecycle_1.0.3 cli_3.6.1
[17] fansi_1.0.4 vctrs_0.6.2 compiler_4.3.0 rstudioapi_0.14
[21] tools_4.3.0 pillar_1.9.0 evaluate_0.21 yaml_2.3.7
[25] rlang_1.1.1 jsonlite_1.8.5 htmlwidgets_1.6.2