Load R Packages
library(tidyverse) # Data wrangling
library(glue)
library(TwoSampleMR) # MR
library(LDlinkR) # LD and proxy snps
library(lhcMR)
library(gt)
# Usr defined functions
source('scripts/misc_functions.R')
library(tidyverse) # Data wrangling
library(glue)
library(TwoSampleMR) # MR
library(LDlinkR) # LD and proxy snps
library(lhcMR)
library(gt)
# Usr defined functions
source('scripts/misc_functions.R')
[Introduction: insert text]
## Import harmonized data
<- read_csv('data/harmonized_ldl_AD_data.csv') %>%
mr_dat mutate(
outcome = str_replace(outcome, '_stage123', ''),
# mr_keep = ifelse(gws.outcome == TRUE, TRUE, mr_keep)
)
## MR
<- mr(mr_dat, method_list = c("mr_ivw_fe", "mr_egger_regression", "mr_weighted_median", "mr_weighted_mode")) %>%
mr_res as_tibble()
## Single SNP analysis
<- mr_singlesnp(mr_dat, all_method = c("mr_ivw_fe", "mr_egger_regression", "mr_weighted_median", "mr_weighted_mode")) %>% as_tibble()
res_single
## Egger intercept for pleitropy
<- mr_pleiotropy_test(mr_dat)
res_pleio
## Cochrans Q for heterogeneity
<- mr_heterogeneity(mr_dat, method_list = c("mr_egger_regression", "mr_ivw"))
res_het
# Radial MR
# radial_dat <- mr_dat %>% filter(mr_keep == T) %>% dat_to_RadialMR()
# radial_res <- map(radial_dat, function(x){
# ivw_radial(x, alpha = 0.05/nrow(x))
# }
# )
[insert text]
method | nsnp | b | se | pval | |
---|---|---|---|---|---|
Willer2013ldl | |||||
Bellenguez2022load | IVW | 66 | −0.06 | 0.02 | 0.003 |
Bellenguez2022load | MR Egger | 66 | −0.11 | 0.06 | 0.062 |
Bellenguez2022load | Weighted median | 66 | −0.08 | 0.03 | 0.021 |
Bellenguez2022load | Weighted mode | 66 | −0.07 | 0.03 | 0.025 |
Kunkle2019load | IVW | 66 | −0.03 | 0.04 | 0.525 |
Kunkle2019load | MR Egger | 66 | 0.01 | 0.09 | 0.956 |
Kunkle2019load | Weighted median | 66 | 0.04 | 0.06 | 0.535 |
Kunkle2019load | Weighted mode | 66 | 0.01 | 0.06 | 0.898 |
Graham2021ldl | |||||
Bellenguez2022load | IVW | 349 | −0.08 | 0.02 | 9.7 × 10−4 |
Bellenguez2022load | MR Egger | 349 | −0.10 | 0.05 | 0.046 |
Bellenguez2022load | Weighted median | 349 | −0.08 | 0.04 | 0.035 |
Bellenguez2022load | Weighted mode | 349 | −0.07 | 0.05 | 0.180 |
Kunkle2019load | IVW | 349 | 0.00 | 0.04 | 0.941 |
Kunkle2019load | MR Egger | 349 | 0.00 | 0.08 | 0.992 |
Kunkle2019load | Weighted median | 349 | 0.02 | 0.07 | 0.783 |
Kunkle2019load | Weighted mode | 349 | −0.05 | 0.09 | 0.591 |
## Plots
<- mr_scatter_plot(mr_res, mr_dat) %>%
scatter_p map(., function(scater_plot){
+ theme_bw() +
scater_plot theme(
legend.position = 'none',
text = element_text(size = 8),
)
})
<- mr_funnel_plot(res_single) %>%
funnel_p map(., function(funnel_plot){
+ theme_bw() +
funnel_plot theme(
legend.position = 'none',
text = element_text(size = 8),
)
})
<- cowplot::get_legend(
mr_legend mr_scatter_plot(mr_res, mr_dat)[[1]] + theme_bw() +
guides(colour = guide_legend(nrow = 1)) +
theme(
text = element_text(size = 8),
)
)
<- cowplot::plot_grid(
joint_mr_p plotlist=c(scatter_p, funnel_p),
ncol = 2, byrow = FALSE,
align = 'hv'
)
<- cowplot::plot_grid(
mr_p_out
joint_mr_p, mr_legend,ncol = 1,
rel_heights = c(1, 0.1)
)
mr_p_out
ggsave("results/plots/mr_ldl_ad_all.png", units = "in", height = 6, width = 4)
# Radial MR
# radial_p <- map(radial_res, function(x){
# plot_radial(x, radial_scale = F, show_outliers = F)
# }
# )
[Pleiotropy: insert text]
egger_intercept | se | pval | |
---|---|---|---|
Willer2013ldl | |||
Bellenguez2022load | 0.00 | 0.00 | 0.321 |
Kunkle2019load | 0.00 | 0.01 | 0.688 |
Graham2021ldl | |||
Bellenguez2022load | 0.00 | 0.00 | 0.487 |
Kunkle2019load | 0.00 | 0.00 | 0.952 |
[Heterogeneity: insert text]
# Heterogeneity statistics
<- mr_heterogeneity(mr_dat, method_list = c("mr_egger_regression", "mr_ivw"))
res_het
%>%
res_het select(-id.exposure, -id.outcome, -outcome, -exposure) %>%
gt() %>%
fmt_number(
columns = Q
%>%
) fmt_number(
columns = Q_pval,
rows = Q_pval > 0.001,
decimals = 3
%>%
) fmt_scientific(
columns = Q_pval,
rows = Q_pval <= 0.001,
decimals = 1
)
method | Q | Q_df | Q_pval |
---|---|---|---|
MR Egger | 163.37 | 64 | 1.2 × 10−10 |
Inverse variance weighted | 165.92 | 65 | 9.0 × 10−11 |
MR Egger | 111.96 | 64 | 2.0 × 10−4 |
Inverse variance weighted | 112.25 | 65 | 2.5 × 10−4 |
MR Egger | 683.04 | 347 | 3.5 × 10−24 |
Inverse variance weighted | 684.00 | 348 | 3.9 × 10−24 |
MR Egger | 487.97 | 347 | 8.5 × 10−7 |
Inverse variance weighted | 487.97 | 348 | 1.0 × 10−6 |
## File paths needed for the analysis
= "resources/LDscores_filtered.csv" # LD scores
LD.filepath = "resources/LD_GM2_2prm.csv" # local/SNP-specfic LD scores
rho.filepath
= "resources/eur_w_ld_chr/"
ld = "resources/w_hm3.snplist" hm3
= c(
paths "resources/Graham2021ldl.chrall.CPRA_b37.tsv.gz",
"resources/Willer2013ldl.chrall.CPRA_b37.tsv.gz",
"resources/Kunkle2019load_stage123.chrall.CPRA_b37.tsv.gz",
"resources/Bellenguez2022load.chrall.CPRA_b37.tsv.gz"
)<- str_extract(paths, "(?<=/).*(?=.chrall)")
phenotypes
<- map(paths, function(x){
ss <- str_extract(x, "(?<=/).*(?=.chrall)")
trait
message("Imporing: ", x, "....")
## Filter out problematic snps - MAF < 1%, MNVs, rsid, APOE region
<- read_tsv(
ss comment = "##", col_types = coltypes, # n_max = 100,
x, col_select = c(DBSNP_ID, CHROM, POS, REF, ALT, AF, BETA, SE, Z, P, N, TRAIT)) %>%
filter(between(AF, 0.01, 0.99)) %>%
filter(nchar(REF) == 1 & nchar(ALT) == 1) %>%
filter(!is.na(DBSNP_ID)) %>%
filter(!(CHROM == 19 & between(POS, 44912079, 45912079))) %>%
mutate(TRAIT = trait) %>%
rename(SNP = DBSNP_ID)
%>%
}) ::set_names(phenotypes)
magrittr
names(exposure_ss) <- exposures