6  Mendelian randomization

6.1 Data

# Data
load("./data/01_data_ldmat.Rda")
load("./data/03_data_gwas_pqtls.Rda")

# pQTLs
pqtls <- pqtls %>%
  mutate(
    ld_cluster = if_else(
      rsid %in% c("rs66838809", "rs80107551", "rs76449013"),
      1,
      2
    )
  )

# GWAS
gwas <- gwas %>%
  filter(!(id %in% c("GCST006979", "GCST006980")))

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
mr_results <- tibble()
for (id in unique(gwas$id)) {

  ## MR data
  mr_gwas <- 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_data <- mr_gwas
      mr_corr <- ld_mat[
        match(mr_data$rsid, rownames(ld_mat)),
        match(mr_data$rsid, rownames(ld_mat)),
        drop = FALSE
      ]
      mr_model <- "5_cis_pqtls"
    } else {
      mr_data <- mr_gwas %>%
        arrange(pvalue.x) %>%
        distinct(ld_cluster, .keep_all = TRUE)
      mr_corr <- ld_mat[
        match(mr_data$rsid, rownames(ld_mat)),
        match(mr_data$rsid, rownames(ld_mat)),
        drop = FALSE
      ]
      mr_model <- "2_cis_pqtls"
    }
    if (any(mr_data$rsid != rownames(mr_corr)))
      stop("genetic varaints are not aligned between the GWAS data and the LD matrix")

    ### Input
    mr_inputs <- MendelianRandomization::mr_input(
      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
    mr_analysis <- MendelianRandomization::mr_ivw(
      mr_inputs,
      model = "fixed",
      correl = TRUE
    )
    mr_analysis <- tibble(
      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
mr_results <- studies %>%
  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
mr_results_extra <- fread(
  "./data/00_data_mr.tsv",
  header = TRUE, data.table = FALSE, sep = "\t"
)
mr_studies_extra <- fread(
  "./data/00_data_mr_studies.tsv",
  header = TRUE, data.table = FALSE, sep = "\t"
)

# MR results
mr_results <- mr_studies_extra %>%
  select(id, pmid, trait, n, n_cases) %>%
  inner_join(
    x = .,
    y = mr_results_extra,
    by = "id"
  ) %>%
  bind_rows(mr_results, .)

# MR studies
mr_studies <- 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

Table 6.1: MR results of the effect of per SD lower sclerostin on cardiovascular events and risk factors

: Effect (in SD)
: Odds ratio


  1. rs66838809 was not available in GCST006867, so rs80107551 was used instead.↩︎

  2. The hypertension results were transformed from the risk difference scale to the log-odds scale.↩︎

  3. These stroke analyses use rs1107747 and a proxy of rs80107551.↩︎