Convergent coexpression reveals shared biological mechanisms underlying common and rare variant risk in six neuropsychiatric disorders.
The 6 matches
- [1] § Methods › Heritability analysis for coexpression convergent genes ↔ example/run_BHR.R, lines 951–1069 · score 0.64 · baseline model, heritability explained, burden score, BHR, allele, variance
- [2] § Methods › Gene prioritization from GWAS and rare variant burden studies ↔ pops.py, lines 16–57 · score 0.57 · Polygenic Priority Score, PoPS, trained, gene annotation, chromosome, MAGMA
- [3] § Methods › Enrichment of evolutionarily constrained and functionally prioritized gene-sets ↔ R/gson.R, lines 289–426 · score 0.54 · access date, Targets Database, modules, matching, genes
- [4] § Methods › Gene prioritization from GWAS and rare variant burden studies ↔ R/gseAnalyzer.R, lines 1–32 · score 0.52 · pvalue cutoff, ranked genes, thresholds
- [5] § Methods › Functional annotation of convergent genes ↔ R/enricher.R, lines 83–115 · score 0.50 · cluster Profiler, Hochberg, FDR, BH, pvalue, enrichment
- [6] § Methods › Heritability analysis for coexpression convergent genes ↔ ldsc.py, lines 422–481 · score 0.50 · LD scores, kb, bin, window, partition, MAF
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
R · 1,180 lines · 67 KB · MIT · 1 match
- library(bhr)
- source("correct_winners_curse.R")
- library(pracma)
- ########################################BHR basic estimates (h2, intercept) #############################
- path = "/Users/daniel/Desktop/rare_h2/ms/genebass_summary_statistics_null/"
- phenotype_file <- read.csv("~/rv_h2/reference_files/ms_phenotype_sheet.csv")
- traits = phenotype_file[phenotype_file$phenotype_rg == 1,"phenotype_key"]
- baseline_model <- read.table("~/rv_h2/reference_files/ms_baseline_oe5.txt")
- bhr_summary_statistic_names <- c("bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_synonymous_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_synonymous_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_synonymous_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-benign_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-benign_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-benign_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0.0001_high0.001_group3")
- results_holder <- matrix(data = NA, ncol = 23, nrow = length(bhr_summary_statistic_names) * length(traits))
- counter = 1
- for (ss in bhr_summary_statistic_names){
- summary_statistics <- readRDS(paste0(path,ss,".ms.munged.Rds"))
- for (trait in traits){
- n_bhr_trait <- head(summary_statistics[summary_statistics$phenotype_key == trait,"N"],1)
- print(c(trait, n_bhr_trait))
- output = BHR(mode = "univariate",
- trait1_sumstats = summary_statistics[summary_statistics$phenotype_key == trait,],
- annotations = list(baseline_model))
- results_holder[counter,] <- c(trait,
- ss,
- output$mixed_model$heritabilities[1,ncol(baseline_model)],
- output$mixed_model$heritabilities[2,ncol(baseline_model)],
- output$mixed_model$enrichments[1,1],
- output$mixed_model$enrichments[2,1],
- output$mixed_model$enrichments[1,2],
- output$mixed_model$enrichments[2,2],
- output$mixed_model$enrichments[1,3],
- output$mixed_model$enrichments[2,3],
- output$mixed_model$enrichments[1,4],
- output$mixed_model$enrichments[2,4],
- ((1-sum(output$mixed_model$fractions[1,]))/(1-sum(output$mixed_model$fraction_burden_score))),
- output$significant_genes$number_significant_genes,
- output$significant_genes$fraction_burdenh2_significant,
- output$significant_genes$fraction_burdenh2_significant_se,
- output$qc$intercept,
- output$qc$intercept_se,
- output$qc$attenuation_ratio,
- output$qc$attenuation_ratio_se,
- output$qc$lambda_gc,
- output$qc$lambda_gc_se,
- output$qc$mu_genome)
- print(paste0("Finished BHR estimate for ",trait," in summary statistic group ",ss))
- counter = counter + 1
- }
- }
- results_holder_df = as.data.frame(results_holder)
- results_holder_df[,3:23] <- sapply(results_holder_df[,3:23],as.numeric)
- colnames(results_holder_df) <- c("phenotype_key", "summary_statistic", "bhr_h2", "bhr_h2_se",
- "bhr_enrichment_oe1", "bhr_enrichment_oe1_se",
- "bhr_enrichment_oe2", "bhr_enrichment_oe2_se",
- "bhr_enrichment_oe3", "bhr_enrichment_oe3_se",
- "bhr_enrichment_oe4", "bhr_enrichment_oe4_se",
- "bhr_enrichment_oe5",
- "n_significant_genes","fraction_h2_significant_genes", "fraction_h2_significant_genes_se",
- "intercept", "intercept_se", "attenuation_ratio", "attenuation_ratio_se", "lambda_gc", "lambda_gc_se", "mu_genome")
- results_holder_df = merge(results_holder_df, phenotype_file[c("phenotype_key", "display_name", "phenocode", "n_bhr", "phenotype_core")], by = "phenotype_key")
- write.csv(results_holder_df, "~/rv_h2/outputs/bhr_output_h2.csv")
- ######################Basic BHR estimates, plus slope correction ##########################
- source("~/rv_h2/BHR.R")
- source("~/rv_h2/BHR_h2.R")
- source("~/rv_h2/randomeffects_jackknife.R")
- source("~/rv_h2/BHR_meta.R")
- path = "/Users/daniel/Desktop/rare_h2/ms/genebass_summary_statistics_null/"
- phenotype_file <- read.csv("~/rv_h2/reference_files/ms_phenotype_sheet.csv")
- traits = phenotype_file[phenotype_file$phenotype_rg == 1,"phenotype_key"]
- baseline_model <- read.table("~/rv_h2/reference_files/ms_baseline_oe5.txt")
- bhr_summary_statistic_names <- c("bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_synonymous_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_synonymous_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_synonymous_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-benign_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-benign_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-benign_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0.0001_high0.001_group3")
- results_holder <- matrix(data = NA, ncol = 23, nrow = length(bhr_summary_statistic_names) * length(traits))
- counter = 1
- for (ss in bhr_summary_statistic_names){
- summary_statistics <- readRDS(paste0(path,ss,".ms.munged.Rds"))
- for (trait in traits){
- n_bhr_trait <- head(summary_statistics[summary_statistics$phenotype_key == trait,"N"],1)
- print(c(trait, n_bhr_trait))
- output = BHR(mode = "univariate",
- trait1_sumstats = summary_statistics[summary_statistics$phenotype_key == trait,],
- annotations = list(baseline_model),
- slope_correction = 4.55087151/n_bhr_trait)
- results_holder[counter,] <- c(trait,
- ss,
- output$mixed_model$heritabilities[1,ncol(baseline_model)],
- output$mixed_model$heritabilities[2,ncol(baseline_model)],
- output$mixed_model$enrichments[1,1],
- output$mixed_model$enrichments[2,1],
- output$mixed_model$enrichments[1,2],
- output$mixed_model$enrichments[2,2],
- output$mixed_model$enrichments[1,3],
- output$mixed_model$enrichments[2,3],
- output$mixed_model$enrichments[1,4],
- output$mixed_model$enrichments[2,4],
- ((1-sum(output$mixed_model$fractions[1,]))/(1-sum(output$mixed_model$fraction_burden_score))),
- output$significant_genes$number_significant_genes,
- output$significant_genes$fraction_burdenh2_significant,
- output$significant_genes$fraction_burdenh2_significant_se,
- output$qc$intercept,
- output$qc$intercept_se,
- output$qc$attenuation_ratio,
- output$qc$attenuation_ratio_se,
- output$qc$lambda_gc,
- output$qc$lambda_gc_se,
- output$qc$mu_genome)
- print(paste0("Finished BHR estimate for ",trait," in summary statistic group ",ss))
- counter = counter + 1
- }
- }
- results_holder_df = as.data.frame(results_holder)
- results_holder_df[,3:23] <- sapply(results_holder_df[,3:23],as.numeric)
- colnames(results_holder_df) <- c("phenotype_key", "summary_statistic", "bhr_h2", "bhr_h2_se",
- "bhr_enrichment_oe1", "bhr_enrichment_oe1_se",
- "bhr_enrichment_oe2", "bhr_enrichment_oe2_se",
- "bhr_enrichment_oe3", "bhr_enrichment_oe3_se",
- "bhr_enrichment_oe4", "bhr_enrichment_oe4_se",
- "bhr_enrichment_oe5",
- "n_significant_genes","fraction_h2_significant_genes", "fraction_h2_significant_genes_se",
- "intercept", "intercept_se", "attenuation_ratio", "attenuation_ratio_se", "lambda_gc", "lambda_gc_se", "mu_genome")
- results_holder_df = merge(results_holder_df, phenotype_file[c("phenotype_key", "display_name", "phenocode", "n_bhr", "phenotype_core")], by = "phenotype_key")
- write.csv(results_holder_df, "~/rv_h2/outputs/bhr_output_h2_ldcorrection.csv")
- #############################################BHR gene set enrichments#####################
- source("~/rv_h2/BHR.R")
- source("~/rv_h2/BHR_h2.R")
- source("~/rv_h2/randomeffects_jackknife.R")
- source("~/rv_h2/BHR_meta.R")
- phenotype_file <- read.csv("~/rv_h2/reference_files/ms_phenotype_sheet.csv")
- gene_set_path = "/Users/daniel/Desktop/rare_h2/ms/gene_sets/gene_set_output/"
- bhr_gene_sets <- c("brain_GABAergic",
- "brain_Glutamatergic",
- "cosmic_all",
- "cosmic_oncogene",
- "cosmic_tsg",
- "ICA_cordblood_Erythroid",
- "ICA_cordblood_Megakaryocytes",
- "liver_Epithelial",
- "segblood",
- "segcortex",
- "segliver",
- "siggene_50NA",
- "siggene_2453NA",
- "siggene_3063NA",
- "siggene_21001NA",
- "siggene_30010NA",
- "siggene_30080NA",
- "siggene_30620NA",
- "siggene_30680NA",
- "siggene_30750NA",
- "siggene_30770NA",
- "siggene_30780NA",
- "siggene_50NA")
- summary_statistics <- readRDS("/Users/daniel/Desktop/rare_h2/ms/genebass_summary_statistics_null/bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1.ms.munged.Rds")
- traits = phenotype_file[phenotype_file$phenotype_core == 1,"phenotype_key"]
- baseline_model <- read.table("~/rv_h2/reference_files/ms_baseline_oe5.txt")
- results_holder <- matrix(data = NA, ncol = 6, nrow = length(bhr_gene_sets) * length(traits))
- counter = 1
- for (bhr_gene_set in bhr_gene_sets){
- bhr_gene_set_annotation <- read.table(paste0(gene_set_path,"bhr_ms_" ,bhr_gene_set,".txt"), header = TRUE)
- for (trait in traits){
- output = BHR(mode = "univariate",
- trait1_sumstats = summary_statistics[summary_statistics$phenotype_key == trait,],
- annotations = list(baseline_model, bhr_gene_set_annotation))
- results_holder[counter,] <- c(trait,
- bhr_gene_set,
- output$mixed_model$fractions[1,ncol(baseline_model)],
- output$mixed_model$fractions[2,ncol(baseline_model)],
- output$mixed_model$enrichments[1,ncol(baseline_model)],
- output$mixed_model$enrichments[2,ncol(baseline_model)])
- counter = counter + 1
- print(paste0("Completed trait ",trait))
- }
- print(paste0("Completed gene set: ", bhr_gene_set))
- }
- results_holder_df = as.data.frame(results_holder)
- results_holder_df[,3:6] <- sapply(results_holder_df[,3:6],as.numeric)
- colnames(results_holder_df) <- c("phenotype_key", "gene_set", "fraction_h2", "fraction_h2_se", "enrichment", "enrichment_se")
- results_holder_df$enrichment_z <- (results_holder_df$enrichment - 1) / results_holder_df$enrichment_se
- results_holder_df = merge(results_holder_df, phenotype_file[c("phenotype_key", "display_name", "phenocode", "n_bhr", "phenotype_core")], by = "phenotype_key")
- results_holder_df_rename <- results_holder_df
- results_holder_df_rename$gene_set_display <- ifelse(results_holder_df_rename$gene_set == "brain_Glutamatergic", "Glutamatergic_neurons",
- ifelse(results_holder_df_rename$gene_set == "segliver", "Liver",
- ifelse(results_holder_df_rename$gene_set == "ICA_cordblood_Megakaryocytes", "Megakaryocytes",
- ifelse(results_holder_df_rename$gene_set == "cosmic_all", "Cancer_genes",
- ifelse(results_holder_df_rename$gene_set == "cosmic_oncogene", "Cancer_oncogenes",
- ifelse(results_holder_df_rename$gene_set == "segblood", "Whole_blood",
- ifelse(results_holder_df_rename$gene_set == "cosmic_tsg", "Cancer_TSG",
- ifelse(results_holder_df_rename$gene_set == "ICA_cordblood_Erythroid", "Erythrocyte",
- ifelse(results_holder_df_rename$gene_set == "brain_GABAergic", "GABAergic_neuron",
- ifelse(results_holder_df_rename$gene_set == "liver_Epithelial", "Hepatocyte",
- ifelse(results_holder_df_rename$gene_set == "segcortex", "Cortex", NA)))))))))))
- write.csv(results_holder_df_rename[c("gene_set", "gene_set_display", "phenotype_key", "display_name",
- "fraction_h2", "fraction_h2_se", "enrichment", "enrichment_se", "enrichment_z")], "~/rv_h2/outputs/bhr_output_geneset.csv")
- #################################################BHR aggregate for each trait, and for all traits############################################
- source("~/rv_h2/BHR.R")
- source("~/rv_h2/BHR_h2.R")
- source("~/rv_h2/randomeffects_jackknife.R")
- source("~/rv_h2/BHR_meta.R")
- path = "/Users/daniel/Desktop/rare_h2/ms/genebass_summary_statistics_null/"
- phenotype_file <- read.csv("~/rv_h2/reference_files/ms_phenotype_sheet.csv")
- traits = phenotype_file[phenotype_file$phenotype_rg == 1,"phenotype_key"]
- baseline_model <- read.table("~/rv_h2/reference_files/ms_baseline_oe5.txt")
- bhr_summary_statistic_names <- c("bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0.0001_high0.001_group3")
- #Aggregate h2 for each trait for g1-g3 (ultra-rare + rare)
- ss_list <- list(readRDS(paste0(path, bhr_summary_statistic_names[1],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[2],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[3],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[4],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[5],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[6],".ms.munged.Rds")))
- results_holder <- matrix(data = NA, ncol = 3, nrow = length(traits))
- counter = 1
- for (trait in traits){
- output <- BHR(mode = 'aggregate',
- ss_list_trait1 = ss_list, trait_list = list(trait),
- annotations = baseline_model)
- results_holder[counter,] <- c(trait,
- output$aggregated_mixed_model_h2,
- output$aggregated_mixed_model_h2se)
- print(paste0("Completed ",trait))
- counter = counter + 1
- }
- results_holder_df = as.data.frame(results_holder)
- results_holder_df[,2:3] <- sapply(results_holder_df[,2:3],as.numeric)
- colnames(results_holder_df) <- c("phenotype_key", "aggregated_h2", "aggregate_h2_se")
- results_holder_df = merge(results_holder_df, phenotype_file[c("phenotype_key", "display_name")], by = "phenotype_key")
- results_holder_df$ss_group = "g13_lof_mis"
- write.csv(results_holder_df, "~/rv_h2/outputs/bhr_output_aggregated_per_trait_h2.csv")
- #Aggregate across all core traits
- results_holder <- matrix(data = NA, ncol = 3, nrow = 1)
- output <- BHR(mode = 'aggregate', ss_list_trait1 = ss_list,
- trait_list = phenotype_file[phenotype_file$phenotype_core == 1,"phenotype_key"],
- annotations = baseline_model)
- results_holder[1,] <- c("All_traits",
- output$aggregated_mixed_model_h2,
- output$aggregated_mixed_model_h2se)
- results_holder_df = as.data.frame(results_holder)
- results_holder_df[,2:3] <- sapply(results_holder_df[,2:3],as.numeric)
- colnames(results_holder_df) <- c("phenotype_key", "aggregated_h2", "aggregated_h2_se")
- write.csv(results_holder_df, "~/rv_h2/outputs/bhr_output_aggregated_all_traits_h2.csv")
- #################################################BHR aggregate for each trait, and for all traits, with slope correction ############################################
- source("~/rv_h2/BHR.R")
- source("~/rv_h2/BHR_h2.R")
- source("~/rv_h2/randomeffects_jackknife.R")
- source("~/rv_h2/BHR_meta.R")
- path = "/Users/daniel/Desktop/rare_h2/ms/genebass_summary_statistics_null/"
- phenotype_file <- read.csv("~/rv_h2/reference_files/ms_phenotype_sheet.csv")
- traits = phenotype_file[phenotype_file$phenotype_rg == 1,"phenotype_key"]
- baseline_model <- read.table("~/rv_h2/reference_files/ms_baseline_oe5.txt")
- bhr_summary_statistic_names <- c("bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0.0001_high0.001_group3")
- #Aggregate h2 for each trait for g1-g3 (ultra-rare + rare)
- ss_list <- list(readRDS(paste0(path, bhr_summary_statistic_names[1],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[2],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[3],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[4],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[5],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[6],".ms.munged.Rds")))
- results_holder <- matrix(data = NA, ncol = 3, nrow = length(traits))
- counter = 1
- summary_statistics <- readRDS(paste0(path,"bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1.ms.munged.Rds"))
- for (trait in traits){
- n_bhr_trait <- head(summary_statistics[summary_statistics$phenotype_key == trait,"N"],1)
- output <- BHR(mode = 'aggregate',
- ss_list_trait1 = ss_list, trait_list = list(trait),
- annotations = baseline_model,
- slope_correction = 4.55087151/n_bhr_trait)
- results_holder[counter,] <- c(trait,
- output$aggregated_mixed_model_h2,
- output$aggregated_mixed_model_h2se)
- print(paste0("Completed ",trait))
- counter = counter + 1
- }
- results_holder_df = as.data.frame(results_holder)
- results_holder_df[,2:3] <- sapply(results_holder_df[,2:3],as.numeric)
- colnames(results_holder_df) <- c("phenotype_key", "aggregated_h2", "aggregate_h2_se")
- results_holder_df = merge(results_holder_df, phenotype_file[c("phenotype_key", "display_name")], by = "phenotype_key")
- results_holder_df$ss_group = "g13_lof_mis"
- write.csv(results_holder_df, "~/rv_h2/outputs/bhr_output_aggregated_per_trait_h2_ldcorrection.csv")
- #Aggregate across all core traits
- source("~/rv_h2/BHR.R")
- source("~/rv_h2/BHR_h2.R")
- source("~/rv_h2/randomeffects_jackknife.R")
- source("~/rv_h2/BHR_meta.R")
- path = "/Users/daniel/Desktop/rare_h2/ms/genebass_summary_statistics_null/"
- phenotype_file <- read.csv("~/rv_h2/reference_files/ms_phenotype_sheet.csv")
- baseline_model <- read.table("~/rv_h2/reference_files/ms_baseline_oe5.txt")
- bhr_summary_statistic_names <- c("bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0.0001_high0.001_group3",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0_high1e-05_group1",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low1e-05_high0.0001_group2",
- "bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_low0.0001_high0.001_group3")
- #Aggregate h2 for each trait for g1-g3 (ultra-rare + rare)
- ss_list <- list(readRDS(paste0(path, bhr_summary_statistic_names[1],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[2],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[3],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[4],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[5],".ms.munged.Rds")),
- readRDS(paste0(path, bhr_summary_statistic_names[6],".ms.munged.Rds")))
- #remember to add slope line to meta for this
- results_holder <- matrix(data = NA, ncol = 3, nrow = 1)
- output <- BHR(mode = 'aggregate', ss_list_trait1 = ss_list,
- trait_list = phenotype_file[phenotype_file$phenotype_core == 1,"phenotype_key"],
- annotations = baseline_model)
- results_holder[1,] <- c("All_traits",
- output$aggregated_mixed_model_h2,
- output$aggregated_mixed_model_h2se)
- results_holder_df = as.data.frame(results_holder)
- results_holder_df[,2:3] <- sapply(results_holder_df[,2:3],as.numeric)
- colnames(results_holder_df) <- c("phenotype_key", "aggregated_h2", "aggregated_h2_se")
- write.csv(results_holder_df, "~/rv_h2/outputs/bhr_output_aggregated_all_traits_h2_ldcorrection.csv")
- ####Significant gene fractions
- phenotype_file <- read.csv("~/rv_h2/reference_files/ms_phenotype_sheet.csv")
- sig_genes = read.csv("~/rv_h2/reference_files/siggenes_for_AMM.csv")
- traits = phenotype_file[phenotype_file$phenotype_core == 1,"phenotype_key"]
- summary_statistics_plof_grp1 <- readRDS("~/Documents/oconnor_rotation/rarevariantproject/bhr_ms_gene_ss_400k_withnullburden_pLoF_nvar449780_low0_high1e-05_group1.ms.munged.Rds")
- baseline_model <- read.table("~/rv_h2/reference_files/ms_baseline_oe5.txt")
- consensus_genes <- read.table("~/rv_h2/reference_files/bhr_ms_consensus_gene_list.txt")[c("gene_id", "gene")]
- get_frac_assns <- function(trait){
- print(trait)
- trait_sumstats = summary_statistics_plof_grp1[summary_statistics_plof_grp1$phenotype_key == trait,]
- sig_genes_trait = sig_genes$gene[sig_genes$id == trait]
- print(length(sig_genes_trait))
- output = BHR(mode = "univariate",
- trait1_sumstats = trait_sumstats,
- annotations = list(baseline_model),
- fixed_genes = sig_genes_trait,
- gwc_exclusion = FALSE)
- trait_sumstats_sig = trait_sumstats[trait_sumstats$gene %in% sig_genes_trait,]
- trait_sig_df <- data.frame(phenotype_key = trait,
- gene = trait_sumstats_sig$gene,
- varexplained = trait_sumstats_sig$w_t_beta^2/trait_sumstats_sig$burden_score,
- bhr_h2 = output$mixed_model$heritabilities[1,ncol(output$mixed_model$heritabilities)],
- frac_sig = output$significant_genes$fraction_burdenh2_significant,
- frac_sig_se = output$significant_genes$fraction_burdenh2_significant_se)
- trait_sig_df$chisq = trait_sumstats$N[1]*trait_sig_df$varexplained
- thresh = qchisq(p = 0.05/nrow(trait_sumstats),df = 1,lower.tail = FALSE)
- trait_sig_df$chisq_winnerscursecorr = correct_winners_curse(trait_sig_df$chisq,thresh)
- trait_sig_df$varexplained_winnerscursecorr = trait_sig_df$chisq_winnerscursecorr/trait_sumstats$N[1]
- trait_sig_df$frac_sig_winnerscursecorr = sum(trait_sig_df$varexplained_winnerscursecorr)/trait_sig_df$bhr_h2[1]
- return(trait_sig_df)
- }
- sig_results <- lapply(traits[traits %in% sig_genes$id],get_frac_assns)
- sig_df = sig_results[[1]]
- for (trait in 2:length(sig_results)){
- print(trait)
- sig_df = rbind(sig_df,sig_results[[trait]])
- }
- sig_df$display_name = phenotype_file$display_name[match(sig_df$phenotype_key,phenotype_file$phenotype_key)]
- sig_df$proportion_bhr_explained = sig_df$varexplained_winnerscursecorr/sig_df$bhr_h2
- sig_df$labelgene = consensus_genes$gene[match(sig_df$gene,consensus_genes$gene_id)]
- ordered_sigdf = sig_df[order(sig_df$phenotype_key,-sig_df$varexplained_winnerscursecorr),]
- write.csv(ordered_sigdf, "~/rv_h2/outputs/BHR_Significant_Genes_Info.csv", quote = FALSE, row.names = FALSE)
- ####Significant gene fractions, common variant space
- variant_table <- fread2("~/Documents/oconnor_rotation/rarevariantproject/variants_MAFfilt_subsetcols.tsv", header = TRUE)
- sumstat_lookup <- read.csv("reference_files/sumstat_lookup.csv", header = FALSE)
- sigclump_df = data.frame()
- for (trait in 1:nrow(sumstat_lookup)){
- print(trait)
- print(sumstat_lookup$V21[trait])
- print("loading files")
- clumpfile = paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/significant_clump/clump_output/", strsplit(sumstat_lookup$V21[trait],split = ".bgz|.gz")[[1]],".plink.tsv_clump.clumped")
- gwas_file = paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/significant_clump/gwas_sumstats/",strsplit(sumstat_lookup$V10[trait],split = ".bgz|.gz")[[1]],"_lean")
- ldsc_file = paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/significant_clump/input_sumstats/",strsplit(sumstat_lookup$V7[trait],split = ".bgz|.gz")[[1]])
- clumps = read.table(clumpfile, header = TRUE)
- clumps = clumps[clumps$P < 5e-8,]
- gwas = fread2(gwas_file, header = FALSE)
- ldsc = read.table(ldsc_file, header = TRUE)
- names(gwas) <- c("variant","minor_AF","beta")
- print("extracting significant clumps variances")
- snps = clumps$SNP
- chrs = variant_table$chr[match(snps,variant_table$rsid)]
- bps = variant_table$pos[match(snps,variant_table$rsid)]
- refs = variant_table$ref[match(snps,variant_table$rsid)]
- alts = variant_table$alt[match(snps,variant_table$rsid)]
- identifiers = paste(chrs,bps,refs,alts,sep = ":")
- betas = gwas$beta[match(identifiers,gwas$variant)]
- mafs = gwas$minor_AF[match(identifiers,gwas$variant)]
- varexplained = (betas*(sqrt(2*mafs*(1 - mafs))))^2
- traitclumpdf <- data.frame(trait = sumstat_lookup$V21[trait],
- SNP = snps,
- varexplained = varexplained,
- N = ldsc$N[1])
- traitclumpdf = traitclumpdf[!is.na(traitclumpdf$varexplained),]
- traitclumpdf$chisq = traitclumpdf$varexplained * ldsc$N[1]
- thresh = qchisq(5e-8,1,lower.tail = FALSE)
- traitclumpdf$chisq_winnerscursecorr = correct_winners_curse(traitclumpdf$chisq,thresh)
- traitclumpdf$varexplained_winnerscursecorr = traitclumpdf$chisq_winnerscursecorr/ldsc$N[1]
- sigclump_df <- rbind(sigclump_df,traitclumpdf)
- }
- #aside: get Ns
- get_N <- function(trait){
- print(trait)
- print(sumstat_lookup$V21[trait])
- ldsc_file = paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/significant_clump/input_sumstats/",strsplit(sumstat_lookup$V7[trait],split = ".bgz|.gz")[[1]])
- ldsc = read.table(ldsc_file, header = TRUE)
- return(ldsc$N[1])
- }
- ldsc_h2 = read.csv("~/Documents/oconnor_rotation/rarevariantproject/rv_h2/ldsc_h2.csv")
- ldsc_h2$N = sapply(1:nrow(ldsc_h2), get_N)
- write.csv(ldsc_h2, "outputs//ldsc_h2.csv", row.names = FALSE, quote = FALSE)
- sigclump_df <- sigclump_df[sigclump_df$trait %in% phenotype_file$phenotype_key[phenotype_file$phenotype_core ==1],]
- sigclump_df <- sigclump_df[!is.na(sigclump_df$varexplained),]
- get_HESSh2 <- function(trait){
- print(trait)
- HESS_h2_result = read.table(paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/HESS/step2_output/", trait,"_HESSformat.tsv_step2.log_HESSh2"), sep = " ")
- return(as.numeric(HESS_h2_result$V5))
- }
- get_HESSh2_se <- function(trait){
- HESS_h2_result = read.table(paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/HESS/step2_output/", trait,"_HESSformat.tsv_step2.log_HESSh2"), sep = " ")
- return(parse_number(HESS_h2_result$V6))
- }
- sigclump_df$HESS_h2 = sapply(sigclump_df$trait,get_HESSh2)
- sigclump_df$HESS_h2_se = sapply(sigclump_df$trait,get_HESSh2_se)
- sigclump_df$fraction_HESS = sigclump_df$varexplained_winnerscursecorr/sigclump_df$HESS_h2
- sigclump_df_ordered = sigclump_df[order(sigclump_df$trait,-sigclump_df$varexplained_winnerscursecorr),]
- names(sigclump_df_ordered)[1] <- "phenotype_key"
- sigclump_df_ordered$fraction_HESS_sig = sapply(sigclump_df_ordered$phenotype_key,
- function(x) {
- return(sum(sigclump_df_ordered$varexplained_winnerscursecorr[sigclump_df_ordered$phenotype_key == x])/(sigclump_df_ordered$HESS_h2[sigclump_df_ordered$phenotype_key == x][1]))
- })
- write.csv(sigclump_df_ordered,"outputs/common_significant_associations.csv", quote = FALSE, row.names = FALSE)
- ####Significant gene fractions, common variant space (HESS partitions)
- HESS_df <- data.frame()
- for (trait in phenotype_file$phenotype_key[phenotype_file$phenotype_core == 1]){
- #print(trait)
- trait_hess_results <- read.table(paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/HESS/step2_output/",
- trait,
- "_HESSformat.tsv_step2.txt"),
- header = TRUE)
- trait_hess_results$trait = trait
- HESS_df = rbind(HESS_df,trait_hess_results)
- }
- write.csv(HESS_df,"outputs/HESS_output.csv", row.names = FALSE, quote = FALSE)
- ######################################## Genetic Correlation #############################
- #Read in results from cluster
- ldsc_rg_guide <- read.table("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/LDSC_rg/ldsc_rg_guide.tsv", sep = ":")
- get_ldsc_rg <- function(pair){
- input = read.table(paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/LDSC_rg/output/",pair,".txt"), sep = " ")
- return(as.numeric(input$V3[1]))
- }
- get_ldsc_rg_se <- function(pair){
- input = read.table(paste0("~/Documents/oconnor_rotation/rarevariantproject/final_commonvar_manuscript/LDSC_rg/output/",pair,".txt"), sep = " ")
- return(parse_number(input$V4[1]))
- }
- ldsc_rg_guide$ldsc_rg = sapply(1:nrow(ldsc_rg_guide), get_ldsc_rg)
- ldsc_rg_guide$ldsc_rg_se = sapply(1:nrow(ldsc_rg_guide), get_ldsc_rg_se)
- get_bhr_rg <- function(pair){
- print(pair)
- input = read.table(paste0("~/Documents/oconnor_rotation/rarevariantproject/BHR_rg_cluster/output/",pair,".txt"), header = TRUE)
- return(input$x[1])
- }
- get_bhr_rg_se <- function(pair){
- print(pair)
- input = read.table(paste0("~/Documents/oconnor_rotation/rarevariantproject/BHR_rg_cluster/output/",pair,".txt"), header = TRUE)
- return(input$x[2])
- }
- ldsc_rg_guide$bhr_rg = sapply(1:nrow(ldsc_rg_guide), get_bhr_rg)
- ldsc_rg_guide$bhr_rg_se = sapply(1:nrow(ldsc_rg_guide), get_bhr_rg_se)
- bhr_h2 = data.frame(googlesheets4::read_sheet("https://docs.google.com/spreadsheets/d/1AwvDRKEUJ6EtUbvnvSV34JkPV0Y7ozJHw-vDJOW2PpY/edit#gid=881218879", sheet = "bhr_h2"))
- bhr_h2_plofgrp1 =bhr_h2[bhr_h2$summary_statistic == "bhr_ms_gene_ss_400k_final_withnullburden_pLoF_low0_high1e-05_group1",]
- ldsc_rg_guide$bhr_h2_trait1 = bhr_h2_plofgrp1$bhr_h2[match(ldsc_rg_guide$V3,bhr_h2_plofgrp1$phenotype_key)]
- ldsc_rg_guide$bhr_h2_trait1_se = bhr_h2_plofgrp1$bhr_h2_se[match(ldsc_rg_guide$V3,bhr_h2_plofgrp1$phenotype_key)]
- ldsc_rg_guide$bhr_h2_trait2 = bhr_h2_plofgrp1$bhr_h2[match(ldsc_rg_guide$V6,bhr_h2_plofgrp1$phenotype_key)]
- ldsc_rg_guide$bhr_h2_trait2_se = bhr_h2_plofgrp1$bhr_h2_se[match(ldsc_rg_guide$V6,bhr_h2_plofgrp1$phenotype_key)]
- ldsc_rg_guide$trait1_bhrh2_z = ldsc_rg_guide$bhr_h2_trait1/ldsc_rg_guide$bhr_h2_trait1_se
- ldsc_rg_guide$trait2_bhrh2_z = ldsc_rg_guide$bhr_h2_trait2/ldsc_rg_guide$bhr_h2_trait2_se
- rg_output = ldsc_rg_guide[,c("V3","V6","ldsc_rg","ldsc_rg_se","bhr_rg","bhr_rg_se","trait1_bhrh2_z","trait2_bhrh2_z")]
- rg_output_sigbhrh2 = rg_output[abs(rg_output$trait1_bhrh2_z) > 1.96 & abs(rg_output$trait2_bhrh2_z) > 1.96,]
- names(rg_output_sigbhrh2) <- c("trait1","trait2","ldsc_rg","ldsc_rg_se","bhr_rg","bhr_rg_se")
- names(rg_output) <- c("trait1","trait2","ldsc_rg","ldsc_rg_se","bhr_rg","bhr_rg_se")
- write.csv(rg_output,"outputs/rg_output.csv", quote = FALSE, row.names = FALSE)
- #rg between missense and plof
- plof_sumstats = readRDS("~/Documents/oconnor_rotation/rarevariantproject/bhr_ms_gene_ss_400k_withnullburden_pLoF_nvar449780_low0_high1e-05_group1.ms.munged.Rds")
- missense_sumstats = readRDS("~/Documents/oconnor_rotation/rarevariantproject/bhr_ms_gene_ss_400k_final_withnullburden_missense-notbenign_nvar1590551_low0_high1e-05_group1.ms.munged.Rds")
- traits = phenotype_file$phenotype_key[phenotype_file$phenotype_core == 1]
- get_plof_missense_stats <- function(trait){
- plof_sumstats_trait = plof_sumstats[plof_sumstats$phenotype_key == trait,]
- missense_sumstats_trait = missense_sumstats[missense_sumstats$phenotype_key == trait,]
- bhr_plof = BHR_h2(plof_sumstats_trait,
- annotations = list(baseline_model),
- num_blocks = 100,
- genomewide_correction = FALSE,
- gwc_exclusion = NULL,
- overdispersion = FALSE,
- num_null_conditions = 0,
- output_jackknife_h2 = FALSE,
- fixed_genes = NULL,
- all_models = FALSE,
- slope_correction = FALSE )
- bhr_missense = BHR_h2(missense_sumstats_trait,
- annotations = list(baseline_model),
- num_blocks = 100,
- genomewide_correction = FALSE,
- gwc_exclusion = NULL,
- overdispersion = FALSE,
- num_null_conditions = 0,
- output_jackknife_h2 = FALSE,
- fixed_genes = NULL,
- all_models = FALSE,
- slope_correction = FALSE )
- if (bhr_plof$mixed_model$heritabilities[1,5] < 0 | bhr_missense$mixed_model$heritabilities[1,5] < 0 ){
- output = list(plof_h2 = bhr_plof$mixed_model$heritabilities[1,5],
- plof_h2_se = bhr_plof$mixed_model$heritabilities[2,5],
- missense_h2 = bhr_missense$mixed_model$heritabilities[1,5],
- missense_h2_se = bhr_missense$mixed_model$heritabilities[2,5],
- rg = NA,
- rg_se = NA)
- print(output)
- return(output)
- }
- bhr_rg_trait = BHR_rg(plof_sumstats_trait,
- missense_sumstats_trait,
- annotations = list(baseline_model),
- num_blocks = 100,
- genomewide_correction = FALSE,
- overdispersion = FALSE,
- num_null_conditions = 0,
- output_jackknife_rg = FALSE,
- fixed_genes = NULL)
- output = list(plof_h2 = bhr_plof$mixed_model$heritabilities[1,5],
- plof_h2_se = bhr_plof$mixed_model$heritabilities[2,5],
- missense_h2 = bhr_missense$mixed_model$heritabilities[1,5],
- missense_h2_se = bhr_missense$mixed_model$heritabilities[2,5],
- rg = bhr_rg_trait$rg$rg_mixed,
- rg_se = bhr_rg_trait$rg$rg_mixed_se)
- print(output)
- return(output)
- }
- plof_missense_compare_bhr <- sapply(traits, get_plof_missense_stats)
- names = rownames(plof_missense_compare_bhr)
- plof_missense_compare_bhr_df = as.data.frame(t(plof_missense_compare_bhr))
- plof_missense_compare_bhr_df = as.data.frame(sapply(1:ncol(plof_missense_compare_bhr_df), function(x) as.numeric(unlist(plof_missense_compare_bhr_df[,x]))))
- names(plof_missense_compare_bhr_df) <- names
- plof_missense_compare_bhr_df$display_name = phenotype_file$display_name[phenotype_file$phenotype_core ==1]
- write.csv(plof_missense_compare_bhr_df,"outputs/plof_missense_compare.csv", quote = FALSE, row.names = FALSE)
- ######################################## SCZ and BP #############################
- #BipEx
- #Read in the baseline model file
- library(pracma)
- library(tidyverse)
- library(readr)
- baseline_model <- read.table("~/Documents/oconnor_rotation/rarevariantproject/final_manuscript_repo/bhr/reference_files/ms_baseline_oe5.txt")
- #Read in the publicly available bipex variant table.
- bp_variantlevel_bipex <- bigreadr::fread2("~/Downloads/BipEx_variant_results.tsv")
- #Subset variants
- variant_filter = bp_variantlevel_bipex$group == "Bipolar Disorder" & #Filter to Bipolar Disorder counts
- bp_variantlevel_bipex$in_analysis == TRUE & #Use variant filter from Palmer et al, 2022
- !is.na(bp_variantlevel_bipex$gene_id) & #Remove variants with NA gene ID
- str_detect(bp_variantlevel_bipex$locus, "^chr\\d") #Subset to autosomal variants
- bp_variantlevel_bipex <- bp_variantlevel_bipex[variant_filter,
- c("gene_id",
- "consequence",
- "ac_case",
- "ac_ctrl",
- "locus",
- "mpc")]
- #Function to wrangle into BHR sumstats format
- wrangle_sumstats <- function(table,n_cases,n_controls, var_filter) {
- #Filter to variants of interest
- table = table[var_filter,]
- #Compute sample prevalence, will be used to compute per-sd beta
- prevalence = n_cases/(n_cases+n_controls)
- #Compute variant MAF in cases, will be used to compute per-sd beta
- table$AF_case = table$ac_case/(2*n_cases)
- #Compute variant MAFoverall, will be used to compute per-sd beta
- table$AF = (table$ac_case + table$ac_ctrl)/(2*(n_cases + n_controls))
- #calculate per-sd betas
- table$beta = (2 * (table$AF_case - table$AF) * prevalence)/sqrt(2 * table$AF * (1 - table$AF) * prevalence * (1 - prevalence))
- #calculate variant variances
- table$twopq = 2*table$AF * (1 - table$AF)
- #convert betas from per-sd (i.e. sqrt(variance explained)) to per-allele (i.e. in units of phenotype) betas.
- #per-allele are the usual betas reported by an exome wide association study.
- table$beta_perallele = table$beta/sqrt(table$twopq)
- #aggregate into gene-level table.
- sumstats = data.frame(gene = unique(table$gene_id))
- #each element of variant_variances is a list of variances for all variants in a gene.
- sumstats$variant_variances = lapply(sumstats$gene,
- function(x) table$twopq[table$gene_id == x])
- #each element of variant_variances is a list of per-allele betas for all variants in a gene.
- sumstats$betas = lapply(sumstats$gene,
- function(x) table$beta_perallele[table$gene_id == x])
- names(sumstats) <- c("gene", "variant_variances","betas")
- #add chromosome and position information
- #position doesn't need to be super precise, as it is only used to order genes for jackknife
- sumstats$gene_position <- parse_number(sapply(strsplit(table$locus[match(sumstats$gene,table$gene_id)], split = ":"), function(x) x[[2]]))
- sumstats$chromosome = parse_number(sapply(strsplit(table$locus[match(sumstats$gene,table$gene_id)], split = ":"), function(x) x[[1]]))
- #N = sum of case and control counts
- sumstats$N = n_cases + n_controls
- #we have found that in these smaller sample analyses, there are some genes with
- #large burden scores that are clearly outliers
- #we remove genes with burden scores more than 8 sd from the mean as a conservative filter.
- burdenscores = sapply(sumstats$variant_variances, function(x) sum(x))
- sumstats <- sumstats[abs(scale(burdenscores)) < 8,]
- return(sumstats)
- }
- bp_sumstats_ptv = wrangle_sumstats(bp_variantlevel_bipex,
- 14210, #N from Palmer et al, 2022
- 14422, #N from Palmer et al, 2022
- bp_variantlevel_bipex$consequence == "ptv")
- bp_sumstats_missenseMPC2 = wrangle_sumstats(bp_variantlevel_bipex[!is.na(bp_variantlevel_bipex$mpc),],
- 14210,
- 14422,
- bp_variantlevel_bipex$consequence[!is.na(bp_variantlevel_bipex$mpc)] %in% c("damaging_missense", "other_missense") &
- bp_variantlevel_bipex$mpc[!is.na(bp_variantlevel_bipex$mpc)] > 2)
- bp_sumstats_synonymous = wrangle_sumstats(bp_variantlevel_bipex,
- 14210,
- 14422,
- bp_variantlevel_bipex$consequence == "synonymous")
- #Run BHR
- bp_ptv_bhr <- bhr::BHR(bp_sumstats_ptv,
- annotations = list(baseline_model), #baseline model including constraint annotations
- num_blocks = 100, #number of blocks for jackknife
- num_null_conditions = 5, #5*num_genes null moment conditions
- mode = "univariate") #run in univariate mode to compute burden h2
- bp_missense_bhr <- bhr::BHR(bp_sumstats_missenseMPC2,
- annotations = list(baseline_model),
- num_blocks = 100,
- num_null_conditions = 5,
- mode = "univariate")
- bp_synonymous_bhr <- bhr::BHR(bp_sumstats_synonymous,
- annotations = list(baseline_model),
- num_blocks = 100,
- genomewide_correction = FALSE,
- num_null_conditions = 5,
- mode = "univariate")
- #convert observed scale to liability scale h2
- #calculate sample prevalence
- bp_sample_prevalence = 14210/(14210 + 14422)
- #this population prevalence estimate is from Ferrari et al, 2016 Bipolar Disorders
- population_prevalence_bp = 0.007
- obs2lia_factor <- function(K, P){
- X <- qnorm(K,lower.tail=FALSE)
- z <- (1/sqrt(2*pi))*(exp(-(X**2)/2))
- factor <- (K*(1-K)*K*(1-K))/(P*(1-P)*(z**2))
- return(factor)
- }
- bp_scalingfactor = obs2lia_factor(population_prevalence_bp,bp_sample_prevalence)
- #Burden heritability of schizophrenia
- #Read in table from SCHEMA website
- SCHEMA_variants <- bigreadr::fread2("~/Downloads/SCHEMA_variant_results.tsv",
- select = c("gene_id",
- "consequence",
- "ac_case",
- "ac_ctrl",
- "group",
- "locus",
- "in_analysis"))
- #Filter variants
- SCHEMA_variant_filter = (SCHEMA_variants$in_analysis | SCHEMA_variants$consequence == "synonymous_variant") & #Either filtered SCHEMA damaging variant, or synonymous
- SCHEMA_variants$group %in% c("EUR (exomes)","EUR (gnomAD exomes)","EUR-N (exomes)") & #In one of the primary EUR cohorts
- !is.na(SCHEMA_variants$gene_id) & #non-NA gene ID
- str_detect(SCHEMA_variants$locus, "X", negate = TRUE) & #autosomal
- str_detect(SCHEMA_variants$locus, "Y", negate = TRUE) #autosomal
- SCHEMA_variants = SCHEMA_variants[SCHEMA_variant_filter,]
- SCHEMA_variants = SCHEMA_variants[!is.na(SCHEMA_variants$ac_case),]
- #Aggregate variants into nextera and non-nextera variant tables
- EUR_Nextera <- SCHEMA_variants[SCHEMA_variants$group %in% c("EUR (exomes)","EUR (gnomAD exomes)"),]
- EUR_agg_Nextera <- aggregate(cbind(EUR_Nextera$ac_case,EUR_Nextera$ac_ctrl), by = list(EUR_Nextera$locus),FUN = sum)
- EUR_agg_Nextera <- EUR_agg_Nextera[EUR_agg_Nextera$V1 + EUR_agg_Nextera$V2 <= 5,]
- EUR_agg_Nextera$gene_id = EUR_Nextera$gene_id[match(EUR_agg_Nextera$Group.1,EUR_Nextera$locus)]
- EUR_agg_Nextera$consequence = EUR_Nextera$consequence[match(EUR_agg_Nextera$Group.1,EUR_Nextera$locus)]
- names(EUR_agg_Nextera) <- c("locus","ac_case","ac_ctrl","gene_id","consequence")
- EUR_NonNextera <- SCHEMA_variants[SCHEMA_variants$group %in% c("EUR-N (exomes)"),]
- EUR_agg_NonNextera <- aggregate(cbind(EUR_NonNextera$ac_case,EUR_NonNextera$ac_ctrl), by = list(EUR_NonNextera$locus),FUN = sum)
- EUR_agg_NonNextera <- EUR_agg_NonNextera[EUR_agg_NonNextera$V1 + EUR_agg_NonNextera$V2 <= 5,]
- EUR_agg_NonNextera$gene_id = EUR_NonNextera$gene_id[match(EUR_agg_NonNextera$Group.1,EUR_NonNextera$locus)]
- EUR_agg_NonNextera$consequence = EUR_NonNextera$consequence[match(EUR_agg_NonNextera$Group.1,EUR_NonNextera$locus)]
- names(EUR_agg_NonNextera) <- c("locus","ac_case","ac_ctrl","gene_id","consequence")
- #PTV wrangling
- scz_ptv_sumstats_Nextera <- wrangle_sumstats(EUR_agg_Nextera,
- 8874,
- 19074+23561,
- EUR_agg_Nextera$consequence %in% c("stop_gained",
- "frameshift_variant",
- "splice_acceptor_variant",
- "splice_donor_variant"))
- scz_ptv_sumstats_NonNextera <- wrangle_sumstats(EUR_agg_NonNextera,
- 7277,
- 11187,
- EUR_agg_NonNextera$consequence %in% c("stop_gained",
- "frameshift_variant",
- "splice_acceptor_variant",
- "splice_donor_variant"))
- #Missense wrangling
- scz_missenseMPC2_sumstats_Nextera <- wrangle_sumstats(EUR_agg_Nextera,
- 8874,
- 19074+23561,
- EUR_agg_Nextera$consequence %in% c("missense_variant_mpc_2-3",
- "missense_variant_mpc_>=3"))
- scz_missenseMPC2_sumstats_NonNextera <- wrangle_sumstats(EUR_agg_NonNextera,
- 7277,
- 11187,
- EUR_agg_NonNextera$consequence %in% c("missense_variant_mpc_2-3",
- "missense_variant_mpc_>=3"))
- #Synonymous wrangling
- scz_synonymous_sumstats_Nextera <- wrangle_sumstats(EUR_agg_Nextera,
- 8874,
- 19074+23561,
- EUR_agg_Nextera$consequence %in% c("synonymous_variant"))
- scz_synonymous_sumstats_NonNextera <- wrangle_sumstats(EUR_agg_NonNextera,
- 7277,
- 11187,
- EUR_agg_NonNextera$consequence %in% c("synonymous_variant"))
- #PTV BHR Models
- scz_ptv_bhr_Nextera <- bhr::BHR(scz_ptv_sumstats_Nextera,
- annotations = list(baseline_model),
- num_blocks = 100,
- mode = "univariate",
- output_jackknife_h2 = TRUE,
- all_models = TRUE)
- scz_ptv_bhr_NonNextera <- bhr::BHR(scz_ptv_sumstats_NonNextera,
- annotations = list(baseline_model),
- num_blocks = 100,
- mode = "univariate",
- output_jackknife_h2 = TRUE,
- all_models = TRUE)
- #Missense BHR Models
- scz_missenseMPC2_bhr_Nextera <- bhr::BHR(scz_missenseMPC2_sumstats_Nextera,
- annotations = list(baseline_model),
- num_blocks = 100,
- mode = "univariate",
- output_jackknife_h2 = TRUE,
- all_models = TRUE)
- scz_missenseMPC2_bhr_NonNextera <- bhr::BHR(scz_missenseMPC2_sumstats_NonNextera,
- annotations = list(baseline_model),
- num_blocks = 100,
- mode = "univariate",
- output_jackknife_h2 = TRUE,
- all_models = TRUE)
- #Synonymous BHR Models
- scz_synonymous_bhr_Nextera <- bhr::BHR(scz_synonymous_sumstats_Nextera,
- annotations = list(baseline_model),
- num_blocks = 100,
- mode = "univariate",
- output_jackknife_h2 = TRUE,
- all_models = TRUE)
- scz_synonymous_bhr_NonNextera <- bhr::BHR(scz_synonymous_sumstats_NonNextera,
- annotations = list(baseline_model),
- num_blocks = 100,
- mode = "univariate",
- output_jackknife_h2 = TRUE,
- all_models = TRUE)
- #Functions for meta-analysis
- get_metabeta <- function(betas, ses){
- we = 1 / (ses)^2
- return(sum(betas * we) / sum(we))
- }
- get_metase <- function(ses){
- we = 1 / (ses)^2
- return(sqrt(1/sum(we)))
- }
- #Function for meta-analyzing nextera and non-nextera samples, and extracting key parameters of interest
- SCZ_meta_analysis <- function(modelNextera,modelNonNextera,sumstatsNextera,sumstatsNonNextera, liability = TRUE){
- #calculate factor for conversion to liability scale.
- #Population prevalence is from Charlson et al, 2016, Schizophrenia Bulletin
- nextera_prevalence = 8874/(19074+23561+8874)
- nonnextera_prevalence = 7277/(11187+7277)
- population_prevalence = 0.0028
- obs2lia_factor <- function(K, P){
- X <- qnorm(K,lower.tail=FALSE)
- z <- (1/sqrt(2*pi))*(exp(-(X**2)/2))
- factor <- (K*(1-K)*K*(1-K))/(P*(1-P)*(z**2))
- return(factor)
- }
- nextera_scalingfactor = obs2lia_factor(population_prevalence,nextera_prevalence)
- nonnextera_scalingfactor = obs2lia_factor(population_prevalence,nonnextera_prevalence)
- #If observed scale desired, set scaling factor to 1
- if (liability == FALSE){
- nextera_scalingfactor = 1
- nonnextera_scalingfactor = 1
- }
- #extract heritability from constrained genes in nextera and non-nextera samples
- h2_constrained = c(modelNextera$mixed_model$heritabilities[1,1]*nextera_scalingfactor,
- modelNonNextera$mixed_model$heritabilities[1,1]*nonnextera_scalingfactor)
- h2_constrained_se = c(modelNextera$mixed_model$heritabilities[2,1]*nextera_scalingfactor,
- modelNonNextera$mixed_model$heritabilities[2,1]*nonnextera_scalingfactor)
- #extract overall heritability in nextera and non-nextera samples
- h2_all = c(modelNextera$mixed_model$heritabilities[1,5]*nextera_scalingfactor,
- modelNonNextera$mixed_model$heritabilities[1,5]*nonnextera_scalingfactor)
- h2_all_se = c(modelNextera$mixed_model$heritabilities[2,5]*nextera_scalingfactor,
- modelNonNextera$mixed_model$heritabilities[2,5]*nonnextera_scalingfactor)
- #meta-analyze constrained heritability ("numerator" of fraction explained by constrained genes)
- numerator = get_metabeta(h2_constrained,h2_constrained_se)
- numerator_se = get_metase(h2_constrained_se)
- #meta-analyze total heritability ("denominator" of fraction explained by constrained genes)
- denominator = get_metabeta(h2_all,h2_all_se)
- denominator_se = get_metase(h2_all_se)
- #get point estimate of fraction explained by constrained genes
- fraction = numerator/denominator
- #compute fraction of alleles in constrained annotation
- sumstatsNextera_annot = merge(sumstatsNextera, baseline_model, by.x = "gene", by.y = "gene")
- sumstatsNonNextera_annot = merge(sumstatsNonNextera, baseline_model, by.x = "gene", by.y = "gene")
- sumstatsNextera_annot$burden_score = sapply(sumstatsNextera_annot$variant_variances, function(x) sum(x))
- sumstatsNonNextera_annot$burden_score = sapply(sumstatsNonNextera_annot$variant_variances, function(x) sum(x))
- total_variants = sum(sumstatsNextera_annot$burden_score) + sum(sumstatsNonNextera_annot$burden_score)
- constrained_variants = sum(sumstatsNextera_annot$burden_score * sumstatsNextera_annot$baseline_oe1_total5) + sum(sumstatsNonNextera_annot$burden_score*sumstatsNonNextera_annot$baseline_oe1_total5)
- fraction_constrained_variants = constrained_variants/total_variants
- #compute constraint enrichment point estimate
- enrichment = fraction/fraction_constrained_variants
- #get SE of fraction with delta method
- #First, compute covariance matrix of (h2 total, h2 constrained), for nextera and non-nextera
- sigma = matrix(data = NA, nrow = 2,ncol = 2)
- sigma[1,1] = numerator_se^2
- sigma[2,2] = denominator_se^2
- #jackknife variances of h2 constrained and h2 total, and jackknfie covariance between h2 constrained and h2 total
- Nextera_constrained_jackknife = modelNextera$subthreshold_genes$jackknife_h2[1,]*nextera_scalingfactor
- Nextera_total_jackknife = modelNextera$subthreshold_genes$jackknife_h2[5,]*nextera_scalingfactor
- variance_constrained_Nextera = ((length(Nextera_constrained_jackknife) -1)/length(Nextera_constrained_jackknife))*sum((Nextera_constrained_jackknife - mean(Nextera_constrained_jackknife))^2)
- variance_total_Nextera = ((length(Nextera_total_jackknife) -1)/length(Nextera_total_jackknife))*sum((Nextera_total_jackknife - mean(Nextera_total_jackknife))^2)
- covariance_Nextera_jackknife = ((length(Nextera_constrained_jackknife) -1)/length(Nextera_constrained_jackknife)) * sum((Nextera_constrained_jackknife - mean(Nextera_constrained_jackknife))*(Nextera_total_jackknife - mean(Nextera_total_jackknife)))
- sigma_nextera = matrix(data = NA, nrow = 2,ncol = 2)
- sigma_nextera[1,1] = variance_constrained_Nextera
- sigma_nextera[2,2] = variance_total_Nextera
- sigma_nextera[1,2] = covariance_Nextera_jackknife
- sigma_nextera[2,1] = covariance_Nextera_jackknife
- NonNextera_constrained_jackknife = modelNonNextera$subthreshold_genes$jackknife_h2[1,]*nonnextera_scalingfactor
- NonNextera_total_jackknife = modelNonNextera$subthreshold_genes$jackknife_h2[5,]*nonnextera_scalingfactor
- variance_constrained_NonNextera = ((length(NonNextera_constrained_jackknife) -1)/length(NonNextera_constrained_jackknife))*sum((NonNextera_constrained_jackknife - mean(NonNextera_constrained_jackknife))^2)
- variance_total_NonNextera = ((length(NonNextera_total_jackknife) -1)/length(NonNextera_total_jackknife))*sum((NonNextera_total_jackknife - mean(NonNextera_total_jackknife))^2)
- covariance_NonNextera_jackknife = ((length(NonNextera_constrained_jackknife) -1)/length(NonNextera_constrained_jackknife)) * sum((NonNextera_constrained_jackknife - mean(NonNextera_constrained_jackknife))*(NonNextera_total_jackknife - mean(NonNextera_total_jackknife)))
- sigma_NonNextera = matrix(data = NA, nrow = 2,ncol = 2)
- sigma_NonNextera[1,1] = variance_constrained_NonNextera
- sigma_NonNextera[2,2] = variance_total_NonNextera
- sigma_NonNextera[1,2] = covariance_NonNextera_jackknife
- sigma_NonNextera[2,1] = covariance_NonNextera_jackknife
- #meta-analyze covariance matrices
- sigma_meta = pracma::inv(pracma::inv(sigma_nextera) + pracma::inv(sigma_NonNextera))
- #get gradient
- dg_dh2c = 1/denominator
- dg_dh2all = (-numerator)/(denominator^2)
- fraction_gradient = matrix(c(dg_dh2c,dg_dh2all), ncol = 1)
- #compute variance of fraction of heritability explained by constrained genes
- fraction_se = sqrt(t(fraction_gradient) %*% sigma_meta %*% fraction_gradient)
- #convert fraction to enrichment
- enrichment_se = fraction_se/fraction_constrained_variants
- return(list(bhr_h2 = denominator,
- bhr_h2_se = denominator_se,
- fraction_constrained = fraction,
- fraction_se = fraction_se,
- enrichment_constrained = enrichment,
- enrichment_constrained_se = enrichment_se))
- }
- scz_ptv_bhr_output = SCZ_meta_analysis(scz_ptv_bhr_Nextera,
- scz_ptv_bhr_NonNextera,
- scz_ptv_sumstats_Nextera,
- scz_ptv_sumstats_NonNextera)
- scz_missense_bhr_output = SCZ_meta_analysis(scz_missenseMPC2_bhr_Nextera,
- scz_missenseMPC2_bhr_NonNextera,
- scz_missenseMPC2_sumstats_Nextera,
- scz_missenseMPC2_sumstats_NonNextera)
- scz_synonymous_bhr_output = SCZ_meta_analysis(scz_synonymous_bhr_Nextera,
- scz_synonymous_bhr_NonNextera,
- scz_synonymous_sumstats_Nextera,
- scz_synonymous_sumstats_NonNextera)
- #Gather output
- output_df_SCZBP <- data.frame(dx =c(rep("SCZ",3),rep("BP",3)),
- class = c(c("pLoF","Missense (MPC >2)", "Syn"),c("pLoF","Missense (MPC >2)", "Syn")),
- bhr_h2 = c(scz_ptv_bhr_output$bhr_h2,
- scz_missense_bhr_output$bhr_h2,
- scz_synonymous_bhr_output$bhr_h2,
- bp_ptv_bhr$mixed_model$heritabilities[1,5]*bp_scalingfactor,
- bp_missense_bhr$mixed_model$heritabilities[1,5]*bp_scalingfactor,
- bp_synonymous_bhr$mixed_model$heritabilities[1,5]*bp_scalingfactor),
- bhr_h2_se = c(scz_ptv_bhr_output$bhr_h2_se,
- scz_missense_bhr_output$bhr_h2_se,
- scz_synonymous_bhr_output$bhr_h2_se,
- bp_ptv_bhr$mixed_model$heritabilities[2,5]*bp_scalingfactor,
- bp_missense_bhr$mixed_model$heritabilities[2,5]*bp_scalingfactor,
- bp_synonymous_bhr$mixed_model$heritabilities[2,5]*bp_scalingfactor),
- fraction_constrained = c(scz_ptv_bhr_output$fraction_constrained,
- scz_missense_bhr_output$fraction_constrained,
- scz_synonymous_bhr_output$fraction_constrained,
- bp_ptv_bhr$mixed_model$fractions[1,1],
- bp_missense_bhr$mixed_model$fractions[1,1],
- bp_synonymous_bhr$mixed_model$fractions[1,1]),
- fraction_constrained_se = c(scz_ptv_bhr_output$fraction_constrained_se,
- scz_missense_bhr_output$fraction_constrained_se,
- scz_synonymous_bhr_output$fraction_constrained_se,
- bp_ptv_bhr$mixed_model$fractions[2,1],
- bp_missense_bhr$mixed_model$fractions[2,1],
- bp_synonymous_bhr$mixed_model$fractions[2,1]),
- enrichment_constrained = c(scz_ptv_bhr_output$enrichment_constrained,
- scz_missense_bhr_output$enrichment_constrained,
- scz_synonymous_bhr_output$enrichment_constrained,
- bp_ptv_bhr$mixed_model$enrichments[1,1],
- bp_missense_bhr$mixed_model$enrichments[1,1],
- bp_synonymous_bhr$mixed_model$enrichments[1,1]),
- enrichment_constrained_se = c(scz_ptv_bhr_output$enrichment_constrained_se,
- scz_missense_bhr_output$enrichment_constrained_se,
- scz_synonymous_bhr_output$enrichment_constrained_se,
- bp_ptv_bhr$mixed_model$enrichments[2,1],
- bp_missense_bhr$mixed_model$enrichments[2,1],
- bp_synonymous_bhr$mixed_model$enrichments[2,1]))
- #fractions of SCZ h2 explained by sig genes
- #Load in gnomad information to match gene ids to gene names
- gnomad_information <- data.frame(data.table::fread("~/Documents/oconnor_rotation/rarevariantproject/final_manuscript_repo/rv_h2/reference_files/gnomad.v2.1.1.lof_metrics.by_gene.txt",
- select = c("gene","gene_id", "chromosome", "start_position", "end_position", "pLI")))
- gnomad_information = gnomad_information[gnomad_information$chromosome != "X",]
- gnomad_information = gnomad_information[gnomad_information$chromosome != "Y",]
- gnomad_information_counts = data.frame(table(gnomad_information$gene))
- gnomad_information_counts = gnomad_information_counts[gnomad_information_counts$Freq == 1,]
- gene_information <- gnomad_information[gnomad_information$gene %in% gnomad_information_counts$Var1,]
- gene_information$midpoint <- (gene_information$start_position + gene_information$end_position)/2
- #9 autosomal SCHEMA genes
- SCHEMAgenes = c("SETD1A", "CUL1", "XPO7","TRIO","CACNA1G","SP4","GRIA3","GRIN2A","HERC1","RB1CC1")
- SCHEMAgenes_id = gene_information$gene_id[match(SCHEMAgenes,gene_information$gene)]
- SCHEMAgenes_id = SCHEMAgenes_id[!is.na(SCHEMAgenes_id)]
- #Run BHR with SCHEMA significant genes as fixed effects.
- nextera_model_SCHEMA = bhr::BHR(scz_ptv_sumstats_Nextera,
- annotations = list(baseline_model),
- fixed_genes =SCHEMAgenes_id,
- num_blocks = 100,
- mode = "univariate")
- nonnextera_model_SCHEMA = bhr::BHR(scz_ptv_sumstats_NonNextera,
- annotations = list(baseline_model),
- fixed_genes =SCHEMAgenes_id,
- num_blocks = 100,
- mode = "univariate")
- #Meta analyze fraction of heritability explained by sig genes
- meta_frac_SCHEMA = get_metabeta(c(nextera_model_SCHEMA$significant_genes$fraction_burdenh2_significant,
- nonnextera_model_SCHEMA$significant_genes$fraction_burdenh2_significant),
- c(nextera_model_SCHEMA$significant_genes$fraction_burdenh2_significant_se,
- nonnextera_model_SCHEMA$significant_genes$fraction_burdenh2_significant_se))
- meta_frac_SCHEMA_se = get_metase(c(nextera_model_SCHEMA$significant_genes$fraction_burdenh2_significant_se,
- nonnextera_model_SCHEMA$significant_genes$fraction_burdenh2_significant_se))
- #rg between scz and bp
- nextera_bp_rg = bhr::BHR(mode = "bivariate",
- trait1_sumstats = scz_ptv_sumstats_Nextera,
- trait2_sumstats = bp_sumstats_ptv,
- annotations = list(baseline_model),
- num_blocks = 100)
- nonnextera_bp_rg = bhr::BHR(mode = "bivariate",
- trait1_sumstats = scz_ptv_sumstats_NonNextera,
- trait2_sumstats = bp_sumstats_ptv,
- annotations = list(baseline_model),
- num_blocks = 100)
- write.csv(output_df_SCZBP,"~/Documents/SCZ_BP_output.csv", quote = FALSE, row.names = FALSE)
run_BHR.R at commit 108e9c8, under MIT · at the source
Overview
- Vanderbilt University, Vanderbilt Genetics Institute, Nashville, TN USA
- Analytic and Translational Genetics Unit, Department of Medicine, Massachusetts General Hospital, Boston, MA USA
- Stanley Center for Psychiatric Research, Broad Institute of MIT and Harvard, Cambridge, MA USA
- Center for Genomic Medicine, Massachusetts General Hospital, Boston, MA USA
- Division of Genetic Medicine, Department of Medicine, Vanderbilt University Medical Center, Nashville, TN USA
- Departments of Psychiatry and Genetics, Division of Molecular Psychiatry, Department of Genetics, Wu Tsai Institute, Yale University School of Medicine, New Haven, CT USA
- Department of Biomedical Informatics and Psychiatry and Behavioral Sciences, Vanderbilt University Medical Center, Nashville, TN USA
Abstract
Genome-wide association studies (GWAS) and large-scale rare variant burden analyses have identified both common and rare loss-of-function variants associated with neuropsychiatric and neurodegenerative disorders. Yet, the shared biological processes influenced by both classes of variation remain poorly characterized. In this study, we utilized transcriptomic data from 933 post-mortem brain samples to identify genes that show convergent coexpression with GWAS and rare variant burden risk genes across six brain disorders. Despite largely distinct sets of significant risk genes from GWAS and rare variant burden studies, we found a significant overlap in their convergently coexpressed genes. These convergent genes showed enrichment for common and rare variant heritability and highlighted key biological pathways and cell-type markers impacted by both types of genetic variation. Compared to genes coexpressed with one variant class, shared convergent genes exhibited stronger evolutionary constraint and greater enrichment for known drug targets, underscoring their potential therapeutic relevance. Collectively, our results establish a systematic and generalizable framework for integrating coexpression data with genetic risk to reveal transcriptional programs supported by both common and rare variant evidence, offering mechanistic insights into neuropsychiatric diseases.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 6 matches between paragraphs and lines of code.
FinucaneLab/gene_features
41d006d5c0e9cbdb8dfafdf0ee821f165e5e708c, 19 May 2022Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
83 files
- code/
copy_data.sh , Shell, 6 lines - code/
human_airway.R , R, 128 lines - code/
human_bladder.R , R, 135 lines - code/
human_bonemarrow.R , R, 168 lines - code/
human_brain2.R , R, 129 lines - code/
human_brain3_adult.R , R, 136 lines - code/
human_brain3_prenatal.R , R, 136 lines - code/
human_brain4.R , R, 135 lines - code/
human_brain_cerebellarhe , R, 117 linesm.R - code/
human_brain_frontalcorte , R, 117 linesx.R - code/
human_brain_visualcortex , R, 117 lines.R - code/
human_colon.R , R, 166 lines - code/
human_colon2.R , R, 126 lines - code/
human_coloncancer.R , R, 164 lines - code/
human_csf.R , R, 151 lines - code/
human_embryo.R , R, 114 lines - code/
human_eye.R , R, 141 lines - code/
human_fetalblood.R , R, 184 lines - code/
human_gut.R , R, 88 lines - code/
human_gut_epi.R , R, 172 lines - code/
human_gut_fib.R , R, 172 lines - code/
human_heme.R , R, 115 lines - code/
human_hippocampus.R , R, 122 lines - code/
human_ileum.R , R, 157 lines - code/
human_immune.R , R, 159 lines - code/
human_intestine.R , R, 127 lines - code/
human_kidney.R , R, 165 lines - code/
human_kidney2.R , R, 128 lines - code/
human_kidney3.R , R, 132 lines - code/
human_liver.R , R, 134 lines - code/
human_lung.R , R, 135 lines - code/
human_lymphnodes.R , R, 168 lines - code/
human_monocytes.R , R, 141 lines - code/
human_multiple.R , R, 144 lines - code/
human_muscle.R , R, 144 lines - code/
human_nk.R , R, 168 lines - code/
human_pancreas.R , R, 153 lines - code/
human_pancreasductal.R , R, 116 lines - code/
human_pbmc.R , R, 116 lines - code/
human_placenta.R , R, 116 lines - code/
human_prostate.R , R, 168 lines - code/
human_retina.R , R, 170 lines - code/
human_retina2.R , R, 130 lines - code/
human_synovialfibroblast , R, 132 lines.R - code/
human_tcell.R , R, 128 lines - code/
human_testis.R , R, 135 lines - code/
human_thymus.R , R, 160 lines - code/
install.R , R, 12 lines - code/
mouse_adipocyte.R , R, 162 lines - code/
mouse_airway.R , R, 116 lines - code/
mouse_aorta.R , R, 129 lines - code/
mouse_brain.R , R, 126 lines - code/
mouse_brain2.R , R, 141 lines - code/
mouse_brain4_bnst.R , R, 135 lines - code/
mouse_brain4_neurons.R , R, 139 lines - code/
mouse_development.R , R, 138 lines - code/
mouse_digestive_adult.R , R, 118 lines - code/
mouse_digestive_fetal.R , R, 118 lines - code/
mouse_endothelium.R , R, 150 lines - code/
mouse_epithelium.R , R, 135 lines - code/
mouse_gastrulation.R , R, 141 lines - code/
mouse_gutendoderm.R , R, 128 lines - code/
mouse_hairfollicle.R , R, 155 lines - code/
mouse_heart_control.R , R, 156 lines - code/
mouse_heart_ko.R , R, 153 lines - code/
mouse_hemogenicendotheli , R, 134 linesum.R - code/
mouse_immune.R , R, 136 lines - code/
mouse_islets.R , R, 121 lines - code/
mouse_kidney.R , R, 122 lines - code/
mouse_lung.R , R, 155 lines - code/
mouse_microglia.R , R, 162 lines - code/
mouse_multiple.R , R, 143 lines - code/
mouse_multiple2_bulk.R , R, 127 lines - code/
mouse_multiple2_droplet. , R, 134 linesR - code/
mouse_multiple2_facs.R , R, 134 lines - code/
mouse_muscle.R , R, 126 lines - code/
mouse_muscle2.R , R, 124 lines - code/
mouse_nerve.R , R, 135 lines - code/
mouse_thymus.R , R, 147 lines - code/
mouse_vagina.R , R, 158 lines - code/
utils.R , R, 520 lines - LICENSE, License, 674 lines
- README.md, Text, 117 lines
ajaynadig/bhr
108e9c897d1b7da2a6b0bace9f63e54da55e25a0, 19 June 2026Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
26 files
- MATLAB/
approx_binornd.m , MATLAB, 30 lines - MATLAB/
create_gene_info_burdenE , MATLAB, 11 linesM.m - MATLAB/
create_studies_table_bur , MATLAB, 28 linesdenEM.m - MATLAB/
format_genes_burdenEM.m , MATLAB, 17 lines - MATLAB/
format_variants_burdenEM , MATLAB, 32 lines.m - MATLAB/
nonneutral_af.m , MATLAB, 42 lines - MATLAB/
old/ , MATLAB, 28 linessimulate_allele_frequenc ies.m - MATLAB/
simulateGeneration.m , MATLAB, 33 lines - MATLAB/
simulate_data_script.m , MATLAB, 91 lines - MATLAB/
simulate_genos_sumstats. , MATLAB, 111 linesm - MATLAB/
simulate_rare_sumstats.m , MATLAB, 396 lines - MATLAB/
writePedFile.m , MATLAB, 10 lines - MATLAB/
writePhenFile.m , MATLAB, 10 lines - R/
BHR.R , R, 229 lines - R/
BHR_h2.R , R, 386 lines - R/
BHR_meta.R , R, 70 lines - R/
BHR_rg.R , R, 233 lines - R/
randomeffects_jackknife. , R, 135 linesR - example/
BipEx_Example.Rmd , R, 176 lines - example/
genebass_variant_filter_ , Python, 46 linesjanuary_2023.py - example/
generate_figures.R , R, 948 lines - example/
run_BHR.R , R, 1,180 lines, 1 match - tests/
testthat.R , R, 4 lines - tests/
testthat/ , R, 97 linestest-univariate-fixed-ge nes.R - LICENSE, License, 21 lines
- README.md, Text, 16 lines
FinucaneLab/pops
76eb86cba10254490003c8f4dc7ff5ce492d3667, 21 July 2025Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
4 files
- munge_feature_directory.
py , Python, 68 lines - pops.py, Python, 912 lines, 1 match
- LICENSE, License, 674 lines
- README.md, Text, 70 lines
hakyimlab/MetaXcan
e069063a10539fe92adadb645fc667a40c2cf885, 8 September 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
124 files
- DevNotes.Rmd, R, 13 lines
- software/
BuildExpressionProduct.p , Python, 63 linesy - software/
CovarianceBuilder.py , Python, 88 lines - software/
M00_prerequisites.py , Python, 176 lines - software/
M01_covariances_correlat , Python, 358 linesions.py - software/
M02_variances.py , Python, 83 lines - software/
M03_betas.py , Python, 188 lines - software/
M04_zscores.py , Python, 152 lines - software/
MPSimulation.py , Python, 101 lines - software/
MetaMany.py , Python, 163 lines - software/
MetaXcanUI.py , Python, 44 lines - software/
MulTiXcan.py , Python, 110 lines - software/
PrediXcan.py , Python, 45 lines - software/
PrediXcanAssociation.py , Python, 83 lines - software/
Predict.py , Python, 281 lines - software/
SMulTiXcan.py , Python, 100 lines - software/
SPrediXcan.py , Python, 77 lines - software/
ToHDF5.py , Python, 61 lines - software/
__init__.py , Python, 1 line - software/
build_minimal_data_requi , Shell, 23 linesrements.sh - software/
build_minimal_example_da , Shell, 11 linesta.sh - software/
ez_setup.py , Python, 391 lines - software/
metax/ , Python, 16 linesConstants.py - software/
metax/ , Python, 50 linesDataSet.py - software/
metax/ , Python, 11 linesDataSetSNP.py - software/
metax/ , Python, 49 linesExceptions.py - software/
metax/ , Python, 7 linesFormats.py - software/
metax/ , Python, 56 linesGene.py - software/
metax/ , Python, 156 linesKeyedDataSet.py - software/
metax/ , Python, 34 linesLogging.py - software/
metax/ , Python, 379 linesMainScreen.py - software/
metax/ , Python, 282 linesMainScreenView.py - software/
metax/ , Python, 237 linesMatrixManager.py - software/
metax/ , Python, 87 linesMatrixManager2.py - software/
metax/ , Python, 61 linesMetaXcanUITask.py - software/
metax/ , Python, 130 linesNamingConventions.py - software/
metax/ , Python, 86 linesPerson.py - software/
metax/ , Python, 189 linesPrediXcanFormatUtilities .py - software/
metax/ , Python, 315 linesPredictionModel.py - software/
metax/ , Python, 281 linesThousandGenomesUtilities .py - software/
metax/ , Python, 254 linesUtilities.py - software/
metax/ , Python, 170 linesWeightDBUtilities.py - software/
metax/ , Python, 5 lines__init__.py - software/
metax/ , Python, 150 linescross_model/ JointAnalysis.py - software/
metax/ , Python, 211 linescross_model/ Utilities.py - software/
metax/ , Python, 1 linecross_model/ __init__.py - software/
metax/ , Python, 93 linesdeprecated/ DBLoaders.py - software/
metax/ , Python, 92 linesdeprecated/ MatrixUtilities.py - software/
metax/ , Python, 72 linesdeprecated/ MethodGuessing.py - software/
metax/ , Python, 126 linesdeprecated/ Normalization.py - software/
metax/ , Python, 211 linesdeprecated/ SQLUtilities.py - software/
metax/ , Python, 210 linesdeprecated/ ZScoreCalculation.py - software/
metax/ , Python, 1 linedeprecated/ __init__.py - software/
metax/ , Python, 30 linesexpression/ Expression.py - software/
metax/ , Python, 164 linesexpression/ HDF5Expression.py - software/
metax/ , Python, 130 linesexpression/ PlainTextExpression.py - software/
metax/ , Python, 1 lineexpression/ __init__.py - software/
metax/ , Python, 73 linesgenotype/ BGENGenotype.py - software/
metax/ , Python, 83 linesgenotype/ CYVCF2Genotype.py - software/
metax/ , Python, 104 linesgenotype/ DosageGenotype.py - software/
metax/ , Python, 96 linesgenotype/ GTExGenotype.py - software/
metax/ , Python, 158 linesgenotype/ GeneExpressionMatrixMana ger.py - software/
metax/ , Python, 33 linesgenotype/ Genotype.py - software/
metax/ , Python, 99 linesgenotype/ GenotypeAnalysis.py - software/
metax/ , Python, 17 linesgenotype/ Helpers.py - software/
metax/ , Python, 75 linesgenotype/ ModelTrainingGenotype.py - software/
metax/ , Python, 69 linesgenotype/ PYVCFGenotype.py - software/
metax/ , Python, 15 linesgenotype/ Utilities.py - software/
metax/ , Python, 1 linegenotype/ __init__.py - software/
metax/ , Python, 290 linesgwas/ GWAS.py - software/
metax/ , Python, 90 linesgwas/ GWASSpecialHandling.py - software/
metax/ , Python, 122 linesgwas/ Utilities.py - software/
metax/ , Python, 1 linegwas/ __init__.py - software/
metax/ , Python, 132 linesmetaxcan/ AssociationCalculation.p y - software/
metax/ , Python, 84 linesmetaxcan/ MetaXcanResultsManager.p y - software/
metax/ , Python, 347 linesmetaxcan/ Utilities.py - software/
metax/ , Python, 1 linemetaxcan/ __init__.py - software/
metax/ , Python, 83 linesmisc/ DataFrameStreamer.py - software/
metax/ , Python, 128 linesmisc/ FeatureMatrix.py - software/
metax/ , Python, 82 linesmisc/ GWASAndModels.py - software/
metax/ , Python, 118 linesmisc/ Genomics.py - software/
metax/ , Python, 82 linesmisc/ KeyedDataSource.py - software/
metax/ , Python, 69 linesmisc/ Math.py - software/
metax/ , Python, 1 linemisc/ __init__.py - software/
metax/ , Python, 240 linespredixcan/ MultiPrediXcanAssociatio n.py - software/
metax/ , Python, 136 linespredixcan/ PrediXcanAssociation.py - software/
metax/ , Python, 253 linespredixcan/ Simulations.py - software/
metax/ , Python, 360 linespredixcan/ Utilities.py - software/
metax/ , Python, 1 linepredixcan/ __init__.py - software/
setup.py , Python, 56 lines - software/
tests/ , Python, 147 linesCreateGTExLike.py - software/
tests/ , Python, 295 linesSampleData.py - software/
tests/ , Python, 6 lines__init__.py - software/
tests/ , R, 6 lines_td/ beta_builder.R - software/
tests/ , Python, 39 lines_td/ convert_model_to_text.py - software/
tests/ , Python, 46 lines_td/ trim_data_for_multi_tiss ue_test.py - software/
tests/ , Python, 45 linescov_data.py - software/
tests/ , Python, 15 linesgen_data.py - software/
tests/ , Python, 17 linesscz2_sample.py - software/
tests/ , Python, 103 linestest_M00_prerequisites.p y - software/
tests/ , Python, 95 linestest_M01_covariances_cor relations.py - software/
tests/ , Python, 249 linestest_M03_betas.py - software/
tests/ , Python, 198 linestest_Person.py - software/
tests/ , Python, 97 linestest_association_calcula tion.py - software/
tests/ , Python, 30 linestest_dataframe_streamer. py - software/
tests/ , Python, 71 linestest_dataset.py - software/
tests/ , Python, 47 linestest_dataset_snp.py - software/
tests/ , Python, 152 linestest_dbloaders.py - software/
tests/ , Python, 66 linestest_feature_matrix.py - software/
tests/ , Python, 154 linestest_gene.py - software/
tests/ , Python, 90 linestest_gtex_genotype.py - software/
tests/ , Python, 272 linestest_gwas.py - software/
tests/ , Python, 40 linestest_gwas_special_handli ng.py - software/
tests/ , Python, 75 linestest_gwas_utilities.py - software/
tests/ , Python, 40 linestest_keyed_data_source.p y - software/
tests/ , Python, 413 linestest_keyed_dataset.py - software/
tests/ , Python, 101 linestest_matrix_manager.py - software/
tests/ , Python, 167 linestest_prediction_model.py - software/
tests/ , Python, 58 linestest_predixcan_format_ut ilities.py - software/
tests/ , Python, 156 linestest_thousand_genomes_ut ilities.py - software/
tests/ , Python, 235 linestest_utilities.py - software/
tests/ , Python, 194 linestest_weight_db_utilities .py - LICENSE, License, 23 lines
- README.md, Text, 313 lines
RuderferLab/coexpression_convergence
8e847ffc072415891ecd6f5178c3f982836c65b5, 21 July 2022Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
3 files
- Calculate.coexpression.R
, R, 10 lines - Permutation.R, R, 61 lines
- README.md, Text, 30 lines
bulik/ldsc
2fdeeb3b44379408794154993dbd6101b8946b7e, 16 January 2026Availability: 1 check, the latest on 26 September 2026: the link answers
- 26 September 2026: the link answers
27 files
- ContinuousAnnotations/
quantile_M.pl , Perl, 241 lines - ContinuousAnnotations/
quantile_h2g.r , R, 76 lines - ldsc.py, Python, 660 lines, 1 match
- ldscore/
__init__.py , Python, 1 line - ldscore/
irwls.py , Python, 196 lines - ldscore/
jackknife.py , Python, 514 lines - ldscore/
ldscore.py , Python, 415 lines - ldscore/
parse.py , Python, 292 lines - ldscore/
regressions.py , Python, 743 lines - ldscore/
sumstats.py , Python, 581 lines - make_annot.py, Python, 56 lines
- munge_sumstats.py, Python, 745 lines
- setup.py, Python, 20 lines
- test/
parse_test/ , MATLAB, 1 linetest.l2.M - test/
parse_test/ , MATLAB, 1 linetest1.l2.M - test/
parse_test/ , MATLAB, 1 linetest2.l2.M - test/
parse_test/ , MATLAB, 1 linetest_bad.l2.M - test/
simulate.py , Python, 81 lines - test/
test_irwls.py , Python, 69 lines - test/
test_jackknife.py , Python, 267 lines - test/
test_ldscore.py , Python, 111 lines - test/
test_munge_sumstats.py , Python, 358 lines - test/
test_parse.py , Python, 129 lines - test/
test_regressions.py , Python, 342 lines - test/
test_sumstats.py , Python, 487 lines - LICENSE, License, 675 lines
- README.md, Text, 122 lines
YuLab-SMU/clusterProfiler
d10e74853722ca5f3fb3a0c3466c4649e0fedada, 26 September 2026Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
61 files
- R/
00-AllClasses.R , R, 28 lines - R/
AllGenerics.R , R, 20 lines - R/
GFFparser.R , R, 143 lines - R/
accessor.R , R, 71 lines - R/
bitr.R , R, 206 lines - R/
clusterProfiler-package. , R, 2 linesR - R/
compareCluster.R , R, 377 lines - R/
data.R , R, 43 lines - R/
dplyr-arrange.R , R, 21 lines - R/
dplyr-filter.R , R, 21 lines - R/
dplyr-group_by.R , R, 21 lines - R/
dplyr-mutate.R , R, 23 lines - R/
dplyr-rename.R , R, 20 lines - R/
dplyr-select.R , R, 21 lines - R/
dplyr-slice.R , R, 20 lines - R/
dplyr-summarise.R , R, 18 lines - R/
enrichDAVID.R , R, 180 lines - R/
enrichGO.R , R, 556 lines - R/
enrichKEGG.R , R, 466 lines - R/
enrichMKEGG.R , R, 53 lines - R/
enricher.R , R, 204 lines, 1 match - R/
enrichit.R , R, 42 lines - R/
enrichplot.R , R, 28 lines - R/
go-utilities.R , R, 272 lines - R/
gofilter.R , R, 24 lines - R/
groupGO.R , R, 135 lines - R/
gseAnalyzer.R , R, 272 lines, 1 match - R/
gson.R , R, 437 lines, 1 match - R/
interpret.R , R, 1,316 lines - R/
kegg-utilities.R , R, 302 lines - R/
nseaAnalyzer.R , R, 580 lines - R/
pathwayCommons.R , R, 172 lines - R/
plotGOgraph.R , R, 83 lines - R/
plot_interpret.R , R, 76 lines - R/
ppi.R , R, 241 lines - R/
reexports.R , R, 66 lines - R/
simplify.R , R, 248 lines - R/
taxa.R , R, 141 lines - R/
uniprot.R , R, 80 lines - R/
utilities.R , R, 49 lines - R/
wikiPathways.R , R, 105 lines - R/
zzz.R , R, 13 lines - README.Rmd, R, 75 lines
- inst/
extdata/ , R, 54 lineskegg_pathway_category.r - inst/
sticker/ , R, 34 linesmake_sticker.R - local_test/
test_interpret.R , R, 213 lines - outdated/
for_unsupported.rmd , R, 85 lines - outdated/
rmd2pdf.R , R, 11 lines - tests/
testthat.R , R, 4 lines - tests/
testthat/ , R, 141 linestest-bitr.R - tests/
testthat/ , R, 65 linestest-compareCluster.R - tests/
testthat/ , R, 134 linestest-enrichGO.R - tests/
testthat/ , R, 89 linestest-gff.R - tests/
testthat/ , R, 108 linestest-go-level.R - tests/
testthat/ , R, 48 linestest-gsea-params.R - tests/
testthat/ , R, 78 linestest-interpret-models.R - tests/
testthat/ , R, 55 linestest-mkegg-gson.R - tests/
testthat/ , R, 306 linestest-nsea-wrappers.R - tests/
testthat/ , R, 107 linestest-simplify.R - vignettes/
clusterProfiler.qmd , Quarto, 92 lines - README.md, Text, 69 lines
Code availability
For gene prioritization: MAGMA (https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 7 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 316 scripts, each with its path and the digest of its content;
- 6 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
Datasets cited
- doi:10.7303/
syn22000731.1 , at the source; found in “Data availability”
Data Availability Statement
GWAS summary statistics data from Psychiatric genomics consortium (PGC) : (https://
For gene prioritization: MAGMA (https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 29 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 7 authors, 2 keywords, 10 MeSH terms, 3 funders, 53 references.
Cite
This paper
Abe, H., Liao, C., Han, L., Morley, T., Talkowski, M. E., Brennand, K. J., & Ruderfer, D. M. (2026). Convergent coexpression reveals shared biological mechanisms underlying common and rare variant risk in six neuropsychiatric disorders. Molecular psychiatry, 31(8), 4787-4798. https://
BibTeX
@article{abe2026converge
author = {Abe, Hanna and Liao, Calwing and Han, Lide and Morley, Theodore and Talkowski, Michael E and Brennand, Kristen J and Ruderfer, Douglas M},
title = {{Convergent coexpression reveals shared biological mechanisms underlying common and rare variant risk in six neuropsychiatric disorders}},
journal = {Molecular psychiatry},
year = {2026},
month = apr,
volume = {31},
number = {8},
pages = {4787--4798},
publisher = {Springer Nature},
issn = {1359-4184},
doi = {10.1038/
url = {https://
pmid = {41946833},
pmcid = {PMC13364661}
}
RIS
TY - JOUR
AU - Abe, Hanna
AU - Liao, Calwing
AU - Han, Lide
AU - Morley, Theodore
AU - Talkowski, Michael E
AU - Brennand, Kristen J
AU - Ruderfer, Douglas M
TI - Convergent coexpression reveals shared biological mechanisms underlying common and rare variant risk in six neuropsychiatric disorders
T2 - Molecular psychiatry
J2 - Mol Psychiatry
PY - 2026
DA - 2026/
VL - 31
IS - 8
SP - 4787
EP - 4798
SN - 1359-4184
PB - Springer Nature
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Convergent coexpression reveals shared biological mechanisms underlying common and rare variant risk in six neuropsychiatric disorders",
"container-title": "Molecular psychiatry",
"author": [
{
"family": "Abe",
"given": "Hanna"
},
{
"family": "Liao",
"given": "Calwing"
},
{
"family": "Han",
"given": "Lide"
},
{
"family": "Morley",
"given": "Theodore"
},
{
"family": "Talkowski",
"given": "Michael E"
},
{
"family": "Brennand",
"given": "Kristen J"
},
{
"family": "Ruderfer",
"given": "Douglas M"
}
],
"container-title-short":
"volume": "31",
"issue": "8",
"page": "4787-4798",
"DOI": "10.1038/
"PMID": "41946833",
"PMCID": "PMC13364661",
"ISSN": "1359-4184",
"publisher": "Springer Nature",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
7
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s41467-026-75193-4 [code]
- Multi-ancestry gene expression models amplify transcriptome-wide association study discovery and validation.Journal: Nature communicationsIn common: Monocle 3, igraph, Seurat, 10 other tools, genetics / omics, cellular / molecular, 5 references
- [2] doi:10.1038/s41593-026-02247-7 [code]
- Transcriptomic and phenotypic convergence of neurodevelopmental disorder risk genes in vitro and in vivo.Journal: Nature neuroscienceIn common: Statistics and Machine Learning Toolbox, genetics / omics, cellular / molecular, 12 references, author Kristen J. Brennand
- [3] doi:10.1038/s41588-026-02646-3 [code]
- Co-expression-based models improve eQTL predictions for transcriptome-wide association studies and highlight new schizophrenia-associated
genes. Journal: Nature geneticsIn common: reshape2, h5py, data.table, 5 other tools, genetics / omics, cellular / molecular, 11 references - [4] doi:10.1186/s12967-026-08266-z [code]
- Single-cell multi-omic integration analysis prioritizes druggable genes and reveals cell-type-specific causal effects in glioblastomagenesis.Journal: Journal of translational medicineIn common: Monocle 3, reticulate, igraph, 7 other tools, genetics / omics, cellular / molecular, 5 references
- [5] doi:10.1038/s44318-026-00818-9 [code]
- FAM134B-mediated ER-phagy degrades APP and suppresses Alzheimer's disease pathology.Journal: The EMBO journalIn common: Monocle 3, BEDTools, Harmony, 13 other tools, cellular / molecular
- [6] doi:10.1038/s41467-026-71542-5 [code]
- Astrocyte fatty acid metabolism as a driver of risk for major depressive disorder.Journal: Nature communicationsIn common: igraph, Seurat, reshape2, 4 other tools, genetics / omics, cellular / molecular, 10 references
- [7] doi:10.1038/s41467-026-76675-1 [code]
- Long-read proteogenomic atlas of human neuronal differentiation reveals isoform diversity informing neurodevelopmental risk mechanisms.Journal: Nature communicationsIn common: Monocle 3, BEDTools, reticulate, 12 other tools, genetics / omics, 1 reference
- [8] doi:10.1016/j.xcrm.2026.102766 [code]
- A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.Journal: Cell reports. MedicineIn common: Monocle 3, Harmony, igraph, 12 other tools, genetics / omics, cellular / molecular, 1 reference
- [9] doi:10.1038/s41467-026-76676-0 [code]
- Determinants of functional burden pleiotropy and gene dosage responses across human traits.Journal: Nature communicationsIn common: igraph, reshape2, data.table, 8 other tools, genetics / omics, cellular / molecular, 5 references
- [10] doi:10.1038/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: Monocle 3, reticulate, igraph, 13 other tools, cellular / molecular
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 7 repositories of the authors' code, each at its verified commit and with its license, 316 scripts, and 6 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:1e9e32e6e7adc820…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
