# Data
load("./data/01_data_ldmat.Rda")
load("./data/03_data_gwas_pqtls.Rda")
# pQTLs
<- pqtls %>%
pqtls mutate(
ld_cluster = if_else(
%in% c("rs66838809", "rs80107551", "rs76449013"),
rsid 1,
2
)
)
# GWAS
<- gwas %>%
gwas filter(!(id %in% c("GCST006979", "GCST006980")))
6 Mendelian randomization
6.1 Data
6.2 Analyses
Mendelian randomization (MR) analyses of circulating sclerostin against cardiovascular events and risk factors were performed using the datasets in Table 2.2. The cis sclerostin pQTLs were used as the genetic instruments and two variant sets were used: (i) all 5 cis sclerostin pQTLs, and (ii) one cis sclerostin pQTL from each LD cluster (i.e., rs668388091 & rs1107747; Section 3.2). Since the sclerostin pQTLs are correlated, the generalized inverse-weighted method (Burgess et al. 2016) was used to perform the MR analyses.
# MR analyses
<- tibble()
mr_results for (id in unique(gwas$id)) {
## MR data
<- gwas %>%
mr_gwas filter(id == !!id) %>%
inner_join(
x = pqtls,
y = .,
by = c("rsid", "chr", "pos", "ref", "alt")
%>%
) relocate(id, .before = rsid)
## MR analysis
for (j in seq_len(2)) {
### Data
if (j == 1) {
<- mr_gwas
mr_data <- ld_mat[
mr_corr match(mr_data$rsid, rownames(ld_mat)),
match(mr_data$rsid, rownames(ld_mat)),
= FALSE
drop
]<- "5_cis_pqtls"
mr_model else {
} <- mr_gwas %>%
mr_data arrange(pvalue.x) %>%
distinct(ld_cluster, .keep_all = TRUE)
<- ld_mat[
mr_corr match(mr_data$rsid, rownames(ld_mat)),
match(mr_data$rsid, rownames(ld_mat)),
= FALSE
drop
]<- "2_cis_pqtls"
mr_model
}if (any(mr_data$rsid != rownames(mr_corr)))
stop("genetic varaints are not aligned between the GWAS data and the LD matrix")
### Input
<- MendelianRandomization::mr_input(
mr_inputs bx = mr_data$beta.x,
bxse = mr_data$se.x,
by = mr_data$beta.y,
byse = mr_data$se.y,
correlation = mr_corr,
snps = mr_data$rsid
)
### Analysis
<- MendelianRandomization::mr_ivw(
mr_analysis
mr_inputs,model = "fixed",
correl = TRUE
)<- tibble(
mr_analysis id = !!id,
model = !!mr_model,
n_snps = !!nrow(mr_data),
beta = -1 * !!round(mr_analysis$Estimate, 6), # per lower SD sclerostin
se = !!round(mr_analysis$StdError, 6),
pvalue = !!signif(mr_analysis$Pvalue, 4)
)
### Results
<- mr_results %>%
mr_results bind_rows(mr_analysis)
}
}
# MR results
<- studies %>%
mr_results select(id, pmid, trait, n, n_cases) %>%
inner_join(
x = .,
y = mr_results,
by = "id"
)
Additional MR analyses of hypertension2, stroke events3 and coronary artery calcification were extracted from Table 2 in Zheng et al. (2023) and added to the results.
# MR analyses extra
<- fread(
mr_results_extra "./data/00_data_mr.tsv",
header = TRUE, data.table = FALSE, sep = "\t"
)<- fread(
mr_studies_extra "./data/00_data_mr_studies.tsv",
header = TRUE, data.table = FALSE, sep = "\t"
)
# MR results
<- mr_studies_extra %>%
mr_results select(id, pmid, trait, n, n_cases) %>%
inner_join(
x = .,
y = mr_results_extra,
by = "id"
%>%
) bind_rows(mr_results, .)
# MR studies
<- studies %>%
mr_studies bind_rows(mr_studies_extra)
README
id
- dataset ID
pmid
- PubMed ID
trait
- phenotype
n
- number of samples
n_cases
- number of cases
model
- MR model
n_snps
- number of SNPs
beta
- MR effect size (per SD lower sclerostin)
se
- MR standard error
pvalue
- MR p-value
6.3 Results
: Effect (in SD)
: Odds ratio
%>%
mr_results filter(model == "2_cis_pqtls") %>%
inner_join(
x = select(mr_studies, id, flag),
y = .,
by = "id"
%>%
) filter(flag == "Y") %>%
distinct(trait, .keep_all = TRUE) %>%
qq_plot()
%>%
mr_results filter(model == "5_cis_pqtls") %>%
inner_join(
x = select(mr_studies, id, flag),
y = .,
by = "id"
%>%
) filter(flag == "Y") %>%
distinct(trait, .keep_all = TRUE) %>%
qq_plot()
%>%
mr_results filter(model == "2_cis_pqtls") %>%
inner_join(
x = select(mr_studies, id, flag),
y = .,
by = "id"
%>%
) filter(flag == "N") %>%
qq_plot()
%>%
mr_results filter(model == "5_cis_pqtls") %>%
inner_join(
x = select(mr_studies, id, flag),
y = .,
by = "id"
%>%
) filter(flag == "N") %>%
qq_plot()