From 9d116ea681dcd6f618109d7106f1b991aab770cd Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Wed, 18 Jun 2025 10:51:30 -0400 Subject: [PATCH 01/45] Add TensorQTL support to eQTL mapping function and update README --- .DS_Store | Bin 0 -> 6148 bytes R/eQTL_mapping.R | 220 ++++++++++++++++++++++++++------------------ README.md | 235 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 316 insertions(+), 139 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bbc983b92ee0809a19f8f89bfeec7c33d8f2df23 GIT binary patch literal 6148 zcmeHK%}T>S5T0$TO(;SR3Oz1(E!aN_;w9Aj0*&ZFr8XqgV9b^#Z4af8v%Zi|;`2EB zQ?Wl@Me0nL{bqJ&66QV%FPJ;%30{|AP#Da~(4w36px1?ZZN{CF}L-=UD`{OuD zv#n^F_=^nach~pl>DZ6IzrT9@gB6OUgTt~_wkptTRy5t|QO?tDpP-^(69$0b*dU7+|HI*Xv?Q=4{<6PM) # Package Installation and Dependencies -FastGxC is an R package that can be loaded and used in any R environment. -In order for FastGxC to run properly, the following packages are required and should be installed in R prior to using any FastGxC functions. -``` + +FastGxC is an R package that can be loaded and used in any R +environment. In order for FastGxC to run properly, the following +packages are required and should be installed in R prior to using any +FastGxC functions. + +``` library(devtools) library(dplyr) library(data.table) @@ -24,59 +42,113 @@ library(mvtnorm) library(reshape2) library(magrittr) library(TreeQTL) +library(reticulate) +library(qvalue) ``` -** Note ** : to install TreeQTL, qvalue must be installed first. -Once all dependencies are installed and loaded you can install FastGxC using: -``` +\*\* Note \*\* : to install TreeQTL, qvalue must be installed first. + +Once all dependencies are installed and loaded you can install FastGxC +using: + +``` devtools::install_github("BalliuLab/FastGxC") ``` -Once FastGxC is installed, load all functions using -``` + +Once FastGxC is installed, load all functions using + +``` library(FastGxC) ``` +Optional: Set up Python dependencies for TensorQTL (used with method = +"tensor")\ +Requires: reticulate + compatible Python environment + +``` +reticulate::py_install(c( + "tensorqtl", + "pandas", + "numpy", + "pyarrow", + "torch" +)) +``` + # Simulate toy data -To run a toy example, generate simulated data by running the following code in R: -``` +To run a toy example, generate simulated data by running the following +code in R: + +``` data_dir_sim = "~/simulations/" sim_scenario = "single_context_het" simulate_data(data_dir = data_dir_sim, sim_scenario = sim_scenario) ``` -** Note: running the code above simulates data with default parameters (300 individuals, 10,000 SNPs, 100 genes, and 50 contexts without missing data), but this function can be run with any combination of parameter values. See all possible parameters for ```simulate_data()``` by running ```?simulate_data``` in R. +\*\* Note: running the code above simulates data with default parameters +(300 individuals, 10,000 SNPs, 100 genes, and 50 contexts without +missing data), but this function can be run with any combination of +parameter values. See all possible parameters for `simulate_data()` by +running `?simulate_data` in R. -Running the above code will generate and save the following files in the data_dir: -(1) {sim_scenario}_SNPs.txt: SNP genotype data for 10,000 SNPs and 300 individuals (individual IDs as columns and SNP IDs as rows)\ +Running the above code will generate and save the following files in the +data_dir: (1) {sim_scenario}\_SNPs.txt: SNP genotype data for 10,000 +SNPs and 300 individuals (individual IDs as columns and SNP IDs as +rows)\ -(2) {sim_scenario}_snpsloc.txt: location information of the 10,000 simulated SNPs (MatrixEQTL input format)\ +(2) {sim_scenario}\_snpsloc.txt: location information of the 10,000 + simulated SNPs (MatrixEQTL input format)\ -(3) {sim_scenario}_geneloc.txt: location information of the 100 simulated genes (MatrixEQTL input format)\ +(3) {sim_scenario}\_geneloc.txt: location information of the 100 + simulated genes (MatrixEQTL input format)\ -(4) {sun_scenario}_simulated_expression.txt: gene expression data for the 300 simulated individuals across 100 genes and 50 contexts \ +(4) {sun_scenario}\_simulated_expression.txt: gene expression data for + the 300 simulated individuals across 100 genes and 50 contexts\ # Running FastGxC -FastGxC works in two steps. In the first step, expression is decomposed into shared and context-specific components. In the second step, eQTLs are separately mapped on these components. - -*Step 1 - Decomposition:* For each individual, decompose the phenotype of interest (e.g. gene expression) across C contexts (e.g. tissues or cell-types) into one context-shared and C context-specific components using the ```decomposition_step()``` function. -This function takes as imput a file with gene expression data for all individuals, genes, and contexts (see output of ```simulate_data()``` for the right format) and outputs one file with context-shared expression (context_shared_expression.txt) and C files with expression specific to each context (CONTEXT_NAME_specific_expression.txt). +FastGxC works in two steps. In the first step, expression is decomposed +into shared and context-specific components. In the second step, eQTLs +are separately mapped on these components. + +*Step 1 - Decomposition:* For each individual, decompose the phenotype +of interest (e.g. gene expression) across C contexts (e.g. tissues or +cell-types) into one context-shared and C context-specific components +using the `decomposition_step()` function. This function takes as imput +a file with gene expression data for all individuals, genes, and +contexts (see output of `simulate_data()` for the right format) and +outputs one file with context-shared expression +(context_shared_expression.txt) and C files with expression specific to +each context (CONTEXT_NAME_specific_expression.txt). + +The following code example demonstrates how to use this function with +the data we just simulated above. + +``` +exp_mat_filename = "~/simulations/single_context_het_simulated_expression.txt" +data_dir_decomp = "~/example_output_single_context_het/" +decomposition_step(exp_mat_filename, data_dir_decomp) +``` -The following code example demonstrates how to use this function with the data we just simulated above. - - ``` - exp_mat_filename = "~/simulations/single_context_het_simulated_expression.txt" - data_dir_decomp = "~/example_output_single_context_het/" - decomposition_step(exp_mat_filename, data_dir_decomp) - ``` +*Step 2 - eQTL mapping:* FastGxC estimates genetic effects on the +context-shared component and each of the C context-specific components +separately using simple linear models. Note: Here we use the R package +[MatrixEQTL](http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/) +but any other software that can perform quick linear regression can be +used (e.g. [FastQTL](http://fastqtl.sourceforge.net/) or +[tensorqtl](https://github.com/broadinstitute/tensorqtl)). FastGxC +implements eQTL mapping using its `eQTL_mapping_step()` function. -*Step 2 - eQTL mapping:* FastGxC estimates genetic effects on the context-shared component and each of the C context-specific components separately using simple linear models. Note: Here we use the R package [MatrixEQTL](http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/) but any other software that can perform quick linear regression can be used (e.g. [FastQTL](http://fastqtl.sourceforge.net/) or [tensorqtl](https://github.com/broadinstitute/tensorqtl)). FastGxC implements eQTL mapping using its ```eQTL_mapping_step()``` function. +This function take as input data needed to run MatrixEQTL and outputs +eQTL summary statistics in the MatrixEQTL format. In the end, you should +have one file with summary statistics for shared eQTL and C files with +summary statistics for each context C. -This function take as input data needed to run MatrixEQTL and outputs eQTL summary statistics in the MatrixEQTL format. In the end, you should have one file with summary statistics for shared eQTL and C files with summary statistics for each context C. +Below is a code example to map context-specific eQTLs and shared eQTLs +using the decomposed simulated data from above. -Below is a code example to map context-specific eQTLs and shared eQTLs using the decomposed simulated data from above. -``` +``` out_dir = "~/example_output_single_context_het/" input_dir = "~/simulations/" context_names = paste0("context", seq(1,50)) @@ -111,19 +183,91 @@ for(context in context_names){ context = "shared", shared_specific = shared_specific, out_dir = out_dir) +``` + +*Step 2 - eQTL mapping with TensorQTL (optional alternative):* FastGxC +also supports cis-eQTL mapping using TensorQTL, a GPU-accelerated +implementation for fast eQTL analysis. This is enabled through the R +package reticulate, which allows Python functions to be called from +within R. + +To use this functionality, specify method = "tensor" when calling +eQTL_mapping(). All input formats remain the same as for MatrixEQTL. The +function returns results in a format consistent with MatrixEQTL outputs +for compatibility with downstream steps. TensorQTL is particularly +useful when working with large datasets due to its computational +efficiency. + +Below is an example of how to perform eQTL mapping using TensorQTL on +context-specific and shared components: + +``` +out_dir = "~/example_output_single_context_het/" +input_dir = "~/simulations/" +context_names = paste0("context", seq(1, 10)) + +SNP_file_name = paste0(input_dir, "single_context_het_SNPs.txt") +snps_location_file_name = paste0(input_dir, "single_context_het_snpsloc.txt") +gene_location_file_name = paste0(input_dir, "single_context_het_geneloc.txt") +## map context specific eQTLs: +for (context in context_names) { + expression_file_name = paste0(out_dir, context, "_specific_expression.txt") + context = context + shared_specific = "specific" + out_dir = out_dir + + eQTL_mapping_step(SNP_file_name = SNP_file_name, + snps_location_file_name = snps_location_file_name, + expression_file_name = expression_file_name, + gene_location_file_name = gene_location_file_name, + context = context, + shared_specific = shared_specific, + out_dir = out_dir, + method = "tensor") +} + +## map shared eQTLs: + expression_file_name = paste0(out_dir, "context_shared_expression.txt") + shared_specific = "shared" + eQTL_mapping_step(SNP_file_name = SNP_file_name, + snps_location_file_name = snps_location_file_name, + expression_file_name = expression_file_name, + gene_location_file_name = gene_location_file_name, + context = "shared", + shared_specific = shared_specific, + out_dir = out_dir, + method = "tensor") ``` -# Multiple testing adjustment +Note: TensorQTL writes intermediate results as .parquet files by +default, but FastGxC saves the final output in .txt format for +consistency with MatrixEQTL outputs. -To adjust for multiple testing across all contexts, genes, and genetic variants tested, FastGxC uses the hierarchical FDR procedures implemented in the R package [TreeQTL](http://bioinformatics.org/treeqtl/) via the ```treeQTL_step()``` function. +# Multiple testing adjustment -This function requires that you run MatrixEQTL to do eQTL mapping (see step 2 above). If you used another eQTL mapping softwares, please make sure the output is in the format required by TreeQTL. You can also replace TreeQTL with other methods, e.g. [mashR](https://github.com/stephenslab/mashr), which can also lead to a considerable increase in power. +To adjust for multiple testing across all contexts, genes, and genetic +variants tested, FastGxC uses the hierarchical FDR procedures +implemented in the R package +[TreeQTL](http://bioinformatics.org/treeqtl/) via the `treeQTL_step()` +function. -The following code example demonstrates how to use this function with the data outputted from the eQTL mapping we just ran. This script take as input data needed to run TreeQTL and outputs shared and specific eGenes (two files) and eAssociation (C+1 files) summary statistics in the TreeQTL format. +This function requires that you run MatrixEQTL to do eQTL mapping (see +step 2 above). If you used another eQTL mapping softwares, please make +sure the output is in the format required by TreeQTL. You can also +replace TreeQTL with other methods, e.g. +[mashR](https://github.com/stephenslab/mashr), which can also lead to a +considerable increase in power. -Map specific-eGenes, i.e., genes with at least one context-specific eQTL -``` +The following code example demonstrates how to use this function with +the data outputted from the eQTL mapping we just ran. This script take +as input data needed to run TreeQTL and outputs shared and specific +eGenes (two files) and eAssociation (C+1 files) summary statistics in +the TreeQTL format. + +Map specific-eGenes, i.e., genes with at least one context-specific eQTL + +``` ## directory with all matrixeQTL files for all contexts ## (note that this function expects files to be named in the same was as the output files from FastGxC's eQTL mapping function) data_dir = "~/example_output_single_context_het/" @@ -155,8 +299,3 @@ treeQTL_step( four_level = T ) ``` - - - - - From db710a7f64ca7d3451421aa724429d53b9a370d3 Mon Sep 17 00:00:00 2001 From: Brunilda Balliu Date: Wed, 18 Jun 2025 11:13:16 -0700 Subject: [PATCH 02/45] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 651a90b..75cae45 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,4 @@ ---- -editor_options: - markdown: - wrap: 72 ---- + # FastGxC: A powerful and computationally efficient software for context-specific eQTL mapping in single-cell omics data From 4d5a2f296f5724fd3a18bfbad16ce1b6b8a39bc3 Mon Sep 17 00:00:00 2001 From: Brunilda Balliu Date: Wed, 18 Jun 2025 11:22:09 -0700 Subject: [PATCH 03/45] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 75cae45..0a1fede 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ code in R: ``` \*\* Note: running the code above simulates data with default parameters -(300 individuals, 10,000 SNPs, 100 genes, and 50 contexts without +(300 individuals, 1,000 SNPs, 100 genes, and 50 contexts without missing data), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. From 0f4b5fc994b422e7631ca5832516a1e44bb71150 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Wed, 18 Jun 2025 20:22:21 -0400 Subject: [PATCH 04/45] Noted Python requirement --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0a1fede..d94c985 100644 --- a/README.md +++ b/README.md @@ -194,6 +194,8 @@ for compatibility with downstream steps. TensorQTL is particularly useful when working with large datasets due to its computational efficiency. +**Note:** TensorQTL requires Python version 3.7 or higher to run properly. + Below is an example of how to perform eQTL mapping using TensorQTL on context-specific and shared components: @@ -265,7 +267,8 @@ Map specific-eGenes, i.e., genes with at least one context-specific eQTL ``` ## directory with all matrixeQTL files for all contexts -## (note that this function expects files to be named in the same was as the output files from FastGxC's eQTL mapping function) +## (note that this function expects files to be named in the same was as the +output files from FastGxC's eQTL mapping function) data_dir = "~/example_output_single_context_het/" snps_location_file_name = "~/simulations/single_context_het_snpsloc.txt" gene_location_file_name = "~/simulations/single_context_het_geneloc.txt" @@ -284,7 +287,8 @@ treeQTL_step( ) ## Run multiple testing correction with the four level hierarchy: -## this will output specific and shared eGenes and eAssociations as well as global eGenes +## this will output specific and shared eGenes and eAssociations as well as +global eGenes treeQTL_step( data_dir, snps_location_file_name, From 6bd829e7b8b8076e255911e352ad17d7aaffb33d Mon Sep 17 00:00:00 2001 From: Anthony Zhao Date: Thu, 19 Jun 2025 00:26:49 -0400 Subject: [PATCH 05/45] Added TreeBH functions --- NAMESPACE | 2 + R/treeBH.R | 133 +++++++++++++++++++++++++++++++++++++++++ man/to_TreeBH_input.Rd | 40 +++++++++++++ man/treeBH_step.Rd | 35 +++++++++++ 4 files changed, 210 insertions(+) create mode 100644 R/treeBH.R create mode 100644 man/to_TreeBH_input.Rd create mode 100644 man/treeBH_step.Rd diff --git a/NAMESPACE b/NAMESPACE index d75a3a3..243257d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,4 +7,6 @@ export(get_eGenes_multi_tissue_mod) export(get_eSNPs_multi_tissue_mod) export(get_pvals_and_fam_p_mod) export(simulate_data) +export(to_TreeBH_input) +export(treeBH_step) export(treeQTL_step) diff --git a/R/treeBH.R b/R/treeBH.R new file mode 100644 index 0000000..45d4b6c --- /dev/null +++ b/R/treeBH.R @@ -0,0 +1,133 @@ +#' Converting eQTL Mapping Output to TreeBH Input +#' +#' @param data_dir - full filepath of the directory where eQTL output files are stored. This function assumes that files are named as outputted by FastGxC's eQTL mapping function +#' @param shared_file - full filepath to the shared all_pairs file from the output of the mapping function +#' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) +#' @param out_dir - full filepath of the output directory where the input of TreeBH can be stored +#' @return A data.frame with columns: +#' - gene_name : gene name +#' - snp_name : snp name +#' - context_name : context name (or "shared") +#' - gene_snp : concatenated "gene_SNP" +#' - component_tag : "gene_SNP_specific" or "gene_SNP_shared" +#' - context_tag : "gene_SNP_component_context" +#' - p_value : numeric p-value +#' @export +to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { + # Prepare list to hold each context-specific + shared df + num_contexts <- length(context_names) + df_list <- vector("list", num_contexts + 1) + + # Inline file-reading and p-value/column validation per context + for (i in seq_len(num_contexts)) { + context <- context_names[i] + pattern <- paste0(context, "_specific.all_pairs.txt$") + files <- list.files(path = data_dir, pattern = pattern, full.names = TRUE) + if (length(files) == 0) stop("No file matching pattern ", pattern) + df <- readr::read_tsv(files[[1]], col_types = readr::cols()) + + # Ensure columns exist and types are correct + if (!"p-value" %in% names(df)) stop("Missing 'p-value' in ", files[[1]]) + p <- df[["p-value"]] + if (!is.numeric(p) || any(is.na(p))) stop("`p-value` must be numeric without NAs") + if (any(p < 0 | p > 1)) stop("`p-value` entries must lie between 0 and 1") + + if (!"gene" %in% names(df)) stop("Missing 'gene' in ", files[[1]]) + if (!is.character(df[["gene"]])) stop("`gene` must be character in ", files[[1]]) + + if (!"SNP" %in% names(df)) stop("Missing 'SNP' in ", files[[1]]) + if (!is.character(df[["SNP"]])) stop("`SNP` must be character in ", files[[1]]) + + df_list[[i]] <- df + } + + # Shared file: same inline checks + df_shared <- readr::read_tsv(shared_file, col_types = readr::cols()) + for (col in c("p-value","gene","SNP")) { + if (!col %in% names(df_shared)) stop("Missing '", col, "' in shared_file") + col_data <- df_shared[[col]] + if (col == "p-value") { + if (!is.numeric(col_data) || any(is.na(col_data))) stop("`p-value` invalid in shared_file") + if (any(col_data < 0 | col_data > 1)) stop("`p-value` entries must lie between 0 and 1 in shared_file") + } else { + if (!is.character(col_data)) stop("`", col, "` must be character in shared_file") + } + } + df_list[[num_contexts + 1]] <- df_shared + + # Build grouping labels + rows_per_df <- vapply(df_list, nrow, integer(1)) + context_index <- rep(seq_along(df_list), times = rows_per_df) + context_label <- c(context_names, "shared")[context_index] + component_label <- ifelse(context_label == "shared", "shared", "specific") + + # Extract columns across all data.frames + p_values <- unlist(lapply(df_list, `[[`, "p-value"), use.names = FALSE) + gene_names <- unlist(lapply(df_list, `[[`, "gene"), use.names = FALSE) + snp_names <- unlist(lapply(df_list, `[[`, "SNP"), use.names = FALSE) + + # Build hierarchical identifiers + gene_snp_id <- paste0(gene_names, "_", snp_names) + component_id <- paste0(gene_snp_id, "_", component_label) + context_id <- paste0(component_id, "_", context_label) + + # Assemble final data.frame + out_df <- data.frame( + gene_name = gene_names, + snp_name = snp_names, + context_name = context_label, + gene_snp = gene_snp_id, + component_tag = component_id, + context_tag = context_id, + p_value = p_values, + stringsAsFactors = FALSE, + check.names = FALSE + ) + + # Write file + write.table( + out_df, + file = file.path(out_dir, "treeBH_input.txt"), + sep = "\t", + row.names = FALSE, + col.names = TRUE, + quote = FALSE + ) +} + +#' Multiple Testing Correction with TreeBH +#' Function to adjust for hierarchical multiple testing correction using TreeBH. +#' @param matrix - output of to_TreeBH_Input, matrix with the groups and pvalues +#' @param fdr_thres - value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. +#' @param out_dir - full filepath of the output directory where the output of TreeBH can be stored +#' @return A matrix with identification columns and output columns: +#' - gene : gene name +#' - snp : snp name +#' - context : context name or "specific" +#' - treeBH Output Columns : eGene, eQTL, Component, Context Specific +#' @export +treeBH_step <- function(matrix, fdr_thres, out_dir) { + + id_mat <- matrix[, 1:3] + groups <- matrix[, c(1, 4, 5, 6)] + p_values <- matrix[, 7] |> as.vector() |> as.numeric() + + num_levels <- 4 + + treeBH_results <- TreeBH::get_TreeBH_selections(pvals = p_values, + groups = groups, + q = rep(fdr_thres, num_levels)) + + colnames(treeBH_results) <- c("eGene", "eQTL", "Component", "ContextSpecific") + + results <- cbind(id_mat, treeBH_results) + + write.table( + results, + file = file.path(out_dir, "treeBH_output.txt"), + sep = "\t", + row.names = FALSE, + col.names = TRUE, + quote = FALSE + ) +} \ No newline at end of file diff --git a/man/to_TreeBH_input.Rd b/man/to_TreeBH_input.Rd new file mode 100644 index 0000000..a891a59 --- /dev/null +++ b/man/to_TreeBH_input.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/treeBH.R +\name{to_TreeBH_input} +\alias{to_TreeBH_input} +\title{Converting eQTL Mapping Output to TreeBH Input} +\usage{ +to_TreeBH_input(data_dir, shared_file, context_names, out_dir) +} +\arguments{ +\item{data_dir}{\itemize{ +\item full filepath of the directory where eQTL output files are stored. This function assumes that files are named as outputted by FastGxC's eQTL mapping function +}} + +\item{shared_file}{\itemize{ +\item full filepath to the shared all_pairs file from the output of the mapping function +}} + +\item{context_names}{\itemize{ +\item vector of all context names in the format c("tissue1", "tissue2", ..., etc.) +}} + +\item{out_dir}{\itemize{ +\item full filepath of the output directory where the input of TreeBH can be stored +}} +} +\value{ +A data.frame with columns: +\itemize{ +\item gene_name : gene name +\item snp_name : snp name +\item context_name : context name (or "shared") +\item gene_snp : concatenated "gene_SNP" +\item component_tag : "gene_SNP_specific" or "gene_SNP_shared" +\item context_tag : "gene_SNP_component_context" +\item p_value : numeric p-value +} +} +\description{ +Converting eQTL Mapping Output to TreeBH Input +} diff --git a/man/treeBH_step.Rd b/man/treeBH_step.Rd new file mode 100644 index 0000000..cdd4ceb --- /dev/null +++ b/man/treeBH_step.Rd @@ -0,0 +1,35 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/treeBH.R +\name{treeBH_step} +\alias{treeBH_step} +\title{Multiple Testing Correction with TreeBH +Function to adjust for hierarchical multiple testing correction using TreeBH.} +\usage{ +treeBH_step(matrix, fdr_thres, out_dir) +} +\arguments{ +\item{matrix}{\itemize{ +\item output of to_TreeBH_Input, matrix with the groups and pvalues +}} + +\item{fdr_thres}{\itemize{ +\item value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. +}} + +\item{out_dir}{\itemize{ +\item full filepath of the output directory where the output of TreeBH can be stored +}} +} +\value{ +A matrix with identification columns and output columns: +\itemize{ +\item gene : gene name +\item snp : snp name +\item context : context name or "specific" +\item treeBH Output Columns : eGene, eQTL, Component, Context Specific +} +} +\description{ +Multiple Testing Correction with TreeBH +Function to adjust for hierarchical multiple testing correction using TreeBH. +} From f6ee0eaf6314c90d731c0796394e18c4ee02bcb2 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 19 Jun 2025 21:37:57 -0400 Subject: [PATCH 06/45] Updated correct default parameters for simulate_data --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d94c985..a5dc319 100644 --- a/README.md +++ b/README.md @@ -83,24 +83,24 @@ code in R: ``` \*\* Note: running the code above simulates data with default parameters -(300 individuals, 1,000 SNPs, 100 genes, and 50 contexts without +(300 individuals, 1,000 SNPs, 100 genes, and 10 contexts without missing data), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. Running the above code will generate and save the following files in the -data_dir: (1) {sim_scenario}\_SNPs.txt: SNP genotype data for 10,000 +data_dir: (1) {sim_scenario}\_SNPs.txt: SNP genotype data for 1,000 SNPs and 300 individuals (individual IDs as columns and SNP IDs as rows)\ -(2) {sim_scenario}\_snpsloc.txt: location information of the 10,000 +(2) {sim_scenario}\_snpsloc.txt: location information of the 1,000 simulated SNPs (MatrixEQTL input format)\ (3) {sim_scenario}\_geneloc.txt: location information of the 100 simulated genes (MatrixEQTL input format)\ (4) {sun_scenario}\_simulated_expression.txt: gene expression data for - the 300 simulated individuals across 100 genes and 50 contexts\ + the 300 simulated individuals across 100 genes and 10 contexts\ # Running FastGxC From ae17358e4f6d86f0ca9b2d968e0c37166ef87709 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 26 Jun 2025 10:35:41 -0400 Subject: [PATCH 07/45] Updated README.md and eQTL_mapping.R MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - eQTL mapping parameters are provided as options in the function instead of hard coded (e.g. model, cis distance, p-value threshold etc) - output_file_name_cis = paste0(out_dir, context, "_", shared_specific, ".all_pairs.txt"); -> output_file_name_cis needs to be a parameter in the function - output_file_name_tra = tempfile(); -> output_file_name_tra needs to be a parameter in the function - genepos = read.table(file = …)[,1:4]; -> Instead of column numbers you need to ask for column names - snpspos = read.table(file = …)[,1:3]; -> Instead of column numbers you need to ask for column names - tensorQTL output needs to match MatrixEQTL output - p-values in tensorQTL output need to be ordered in ascending order (0,1) --- .DS_Store | Bin 6148 -> 6148 bytes R/eQTL_mapping.R | 201 +++++++++++++++--------------- README.md | 311 ++++++++++++++++++++++------------------------- 3 files changed, 250 insertions(+), 262 deletions(-) diff --git a/.DS_Store b/.DS_Store index bbc983b92ee0809a19f8f89bfeec7c33d8f2df23..4599bdcd4231b1980296a845b7eb42590ce83722 100644 GIT binary patch delta 33 ocmZoMXffC@iAluB&{#*o$ilEzN1@u%+(bvg)YM?}GNw3D0GvGt+5i9m delta 16 XcmZoMXffC@iD_~jv-{?oOxmIVHIN0? diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index ef435bf..16e13bc 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -1,134 +1,143 @@ #' eQTL Mapping Step #' -#' Function to map cis eQTLs using either Matrix eQTL or TensorQTL. The cis window is defined as 1Mb. +#' Function to map cis eQTLs using either Matrix eQTL or TensorQTL. #' -#' @param SNP_file_name Full file path with genotypes of all individuals. -#' @param snps_location_file_name Full file path with SNP IDs, start, and end positions. -#' @param expression_file_name Full file path with expression matrix of individuals per gene. -#' @param gene_location_file_name Full file path with gene IDs, start, and end positions. -#' @param context Name of context for output file naming purposes. -#' @param shared_specific Either "shared" if mapping eQTLs with a shared component, or "specific" if mapping eQTLs with a specific component. -#' @param out_dir Full path of the output directory where eQTL result files will be written. -#' @param method Mapping method to use: either "matrix" (Matrix eQTL) or "tensor" (TensorQTL). Default is "matrix". +#' @param SNP_file_name Full path to SNP genotype matrix. +#' @param snps_location_file_name Full path to SNP location file. +#' @param expression_file_name Full path to expression matrix. +#' @param gene_location_file_name Full path to gene location file. +#' @param context Context name for labeling output. +#' @param shared_specific Either "shared" or "specific". +#' @param out_dir Output directory. +#' @param output_file_name_cis Path to write cis-eQTL output. +#' @param output_file_name_tra Path to write trans-eQTL output. +#' @param method Either "MatrixEQTL" or "tensorQTL". +#' @param python_dir Path to Python (for TensorQTL). +#' @param use_model MatrixEQTL model (default: modelLINEAR). +#' @param cis_dist Distance threshold for cis-eQTLs. +#' @param pv_threshold_cis P-value threshold for cis. +#' @param pv_threshold_tra P-value threshold for trans. +#' @param error_covariance Covariance matrix (or numeric()). #' -#' @return Writes one file of mapped cis eQTLs to the output directory. +#' @return Writes cis-eQTLs and trans-eQTLs (optional) to disk. #' @export -eQTL_mapping_step = function(SNP_file_name, snps_location_file_name, expression_file_name, gene_location_file_name, context, shared_specific, out_dir, method = "matrix"){ - if(method == "matrix"){ - # Output file name - output_file_name_cis = paste0(out_dir, context, "_", shared_specific, ".all_pairs.txt"); - output_file_name_tra = tempfile(); - +eQTL_mapping_step = function( + SNP_file_name, + snps_location_file_name, + expression_file_name, + gene_location_file_name, + context, + shared_specific, + out_dir, + output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, ".all_pairs.txt")), + output_file_name_tra = file.path(out_dir, paste0(context, "_", shared_specific, ".trans_pairs.txt")), + method = "MatrixEQTL", + python_dir = Sys.which("python"), + use_model = modelLINEAR, + cis_dist = 1e6, + pv_threshold_cis = 1, + pv_threshold_tra = 0, + error_covariance = numeric() +) { + if (method == "MatrixEQTL") { setDTthreads(1) - print(paste0("data.table getDTthreads(): ",getDTthreads())) - - string1 = sprintf("Running analysis for %s \n", expression_file_name) - cat(string1) - - #%%%%%%%%%%%%%%%%%%%%%%%% - #%%%%%%%%%%%%%%%%%%%%%%%% MatrixEQTL parameters - #%%%%%%%%%%%%%%%%%%%%%%%% - - # Linear model to use - useModel = modelLINEAR; - - # Only associations significant at this level will be saved - pvOutputThreshold_cis = 1; - pvOutputThreshold_tra = 0; - - # Error covariance matrix - errorCovariance = numeric(); - # Distance for local gene-SNP pairs - cisDist = 1e6; + expression_mat <- as.matrix(data.frame(fread(expression_file_name, header = TRUE), row.names = 1, check.names = FALSE)) + genepos <- read.table(gene_location_file_name, header = TRUE)[, c("geneid", "chr", "s1", "s2")] - #%%%%%%%%%%%%%%%%%%%%%%%% - #%%%%%%%%%%%%%%%%%%%%%%%% Read files - #%%%%%%%%%%%%%%%%%%%%%%%% + snps <- SlicedData$new() + snps$fileDelimiter <- "\t" + snps$fileOmitCharacters <- "NA" + snps$fileSkipRows <- 1 + snps$fileSkipColumns <- 1 + snps$fileSliceSize <- 2000 + snps$LoadFile(SNP_file_name) - ## Raw gene expression data with gene position - expression_mat=as.matrix(data.frame(data.table::fread(input = expression_file_name, header = T),row.names = 1, check.names = F)) - genepos = read.table(file = gene_location_file_name, header = TRUE, stringsAsFactors = FALSE)[,1:4]; + snpspos <- read.table(snps_location_file_name, header = TRUE)[, c("snpid", "chr", "pos")] + snps$ColumnSubsample(which(snps$columnNames %in% colnames(expression_mat))) + expression_mat <- expression_mat[, snps$columnNames] - ## Genotype data with snp position - snps = MatrixEQTL::SlicedData$new(); - snps$fileDelimiter = "\t"; # the TAB character - snps$fileOmitCharacters = "NA"; # denote missing values; - snps$fileSkipRows = 1; # one row of column labels - snps$fileSkipColumns = 1; # one column of row labels - snps$fileSliceSize = 2000; # read file in slices of 2,000 rows - snps$LoadFile(SNP_file_name); - - snpspos = read.table(file = snps_location_file_name, header = TRUE, stringsAsFactors = FALSE)[,1:3]; - - print(dim(snps)) - print(snps$columnNames) - - ## Make sure order of individuals is the same in gene expression and genotype matrices - snps$ColumnSubsample(which(snps$columnNames %in% colnames(expression_mat))) # Match SNP and expression individuals - expression_mat=expression_mat[,snps$columnNames] - gene = SlicedData$new(); + gene <- SlicedData$new() gene$CreateFromMatrix(expression_mat) - #%%%%%%%%%%%%%%%%%%%%%%%% - #%%%%%%%%%%%%%%%%%%%%%%%% Run the analysis - #%%%%%%%%%%%%%%%%%%%%%%%% - - me = Matrix_eQTL_main( + Matrix_eQTL_main( snps = snps, gene = gene, cvrt = SlicedData$new(), - output_file_name = output_file_name_tra, - pvOutputThreshold = pvOutputThreshold_tra, - useModel = useModel, - errorCovariance = errorCovariance, + output_file_name = output_file_name_tra, + pvOutputThreshold = pv_threshold_tra, + useModel = use_model, + errorCovariance = error_covariance, verbose = TRUE, output_file_name.cis = output_file_name_cis, - pvOutputThreshold.cis = pvOutputThreshold_cis, + pvOutputThreshold.cis = pv_threshold_cis, snpspos = snpspos, genepos = genepos, - cisDist = cisDist, + cisDist = cis_dist, pvalue.hist = FALSE, min.pv.by.genesnp = FALSE, - noFDRsaveMemory = FALSE); + noFDRsaveMemory = FALSE + ) - ## Results: - cat('Analysis finished in: ', me$time.in.sec, ' seconds', '\n') - } - else if (method == "tensor") { - use_python(Sys.which("python"), required = TRUE) + } else if (method == "tensorQTL") { + use_python(python_dir, required = TRUE) + # Define Python helper py_run_string(" -import pandas as pd +import os import torch -import tensorqtl -from tensorqtl import pgen, cis, trans, post +import pandas as pd +import numpy as np +from tensorqtl import cis + +os.environ['CUDA_VISIBLE_DEVICES'] = '' def run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefix=''): - phenotype_pos_df.rename(columns={'s1': 'start', 's2': 'end'}, inplace=True) - variant_df.rename(columns={'chr': 'chrom'}, inplace=True) + if 's1' in phenotype_pos_df.columns and 's2' in phenotype_pos_df.columns: + phenotype_pos_df.rename(columns={'s1': 'start', 's2': 'end'}, inplace=True) + if 'chr' in variant_df.columns: + variant_df.rename(columns={'chr': 'chrom'}, inplace=True) cis.map_nominal(genotype_df, variant_df, phenotype_df, phenotype_pos_df, prefix=prefix) - pairs_df = pd.read_parquet(f'{prefix}.cis_qtl_pairs.chr1.parquet') - pairs_df.rename(columns={'phenotype_id': 'gene', 'variant_id': 'SNP'}, inplace=True) - return pairs_df ") - phenotype_df = read.table(expression_file_name, header = TRUE, row.names = 1) - phenotype_pos_df = read.table(gene_location_file_name, header = TRUE, row.names = 1) - genotype_df = read.table(SNP_file_name, header = TRUE, row.names = 1) - variant_df = read.table(snps_location_file_name, header = TRUE, row.names = 1) - + # R -> Python input + phenotype_df <- read.table(expression_file_name, header = TRUE, row.names = 1) + phenotype_pos_df <- read.table(gene_location_file_name, header = TRUE, row.names = 1) + genotype_df <- read.table(SNP_file_name, header = TRUE, row.names = 1) + variant_df <- read.table(snps_location_file_name, header = TRUE, row.names = 1) py$phenotype_df <- phenotype_df py$phenotype_pos_df <- phenotype_pos_df py$genotype_df <- genotype_df py$variant_df <- variant_df - py$prefix <- paste0(out_dir, '/', context, '_tensor') + py$prefix <- paste0(out_dir, "/", context, "_tensor") + + # Run Python-side TensorQTL + py_run_string("run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefix)") + + # Validate output + parquet_path <- paste0(out_dir, "/", context, "_tensor.cis_qtl_pairs.chr1.parquet") + if (!file.exists(parquet_path)) stop("TensorQTL failed: .parquet output not found") + + # Load and convert output + pd <- import("pandas", convert = FALSE) + pq <- pd$read_parquet(parquet_path) + py$pq <- pq + + # Rename columns (skip stderr_beta and t.stat) + py_run_string(" +pq.rename(columns={ + 'phenotype_id': 'gene', + 'variant_id': 'SNP', + 'slope': 'beta', + 'pval_nominal': 'p.value' +}, inplace=True) +") - py_run_string("result = run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefix)") - tensorqtl_result <- py$result - write.table(tensorqtl_result, file = paste0(out_dir, '/', context, '_tensorqtl_results.txt'), - sep = "\t", row.names = FALSE, quote = FALSE) + pq_df <- py_eval("pq.loc[:, ['SNP', 'gene', 'beta', 'p.value']]", convert = TRUE) + pq_df$FDR <- p.adjust(pq_df$p.value, method = "BH") + pq_df <- pq_df[order(pq_df$p.value), ] + write.table(pq_df, file = output_file_name_cis, sep = '\t', row.names = FALSE, quote = FALSE) } else { - stop("Invalid method. Use 'matrix' or 'tensor'") + stop("Invalid method. Use 'MatrixEQTL' or 'tensorQTL'") } } \ No newline at end of file diff --git a/README.md b/README.md index a5dc319..ce70047 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,24 @@ - - # FastGxC: A powerful and computationally efficient software for context-specific eQTL mapping in single-cell omics data -FastGxC was originally developed for single-cell data, where each -individual contributes gene expression measurements across multiple cell -types. +FastGxC was originally developed for single-cell data, where each individual contributes gene expression measurements across multiple cell types. -However, it can also be applied to bulk RNA-seq data when the same -individuals are profiled across multiple tissues or conditions. +However, it can also be applied to bulk RNA-seq data when the same individuals are profiled across multiple tissues or conditions. -In both settings, FastGxC models **repeated samples** from each -individual, removing shared noise and enabling more accurate detection -of context-specific genetic effects. +In both settings, FastGxC models **repeated samples** from each individual, removing shared noise and enabling more accurate detection of context-specific genetic effects. -FastGxC is also **robust to missing data** —for example, when certain -individuals or genes are missing in some cell types or tissues. +FastGxC is also **robust to missing data** —for example, when certain individuals or genes are missing in some cell types or tissues. -Please read the -[BioRxiv](https://www.biorxiv.org/content/10.1101/2021.06.17.448889v2) -preprint for more details. +Please read the [BioRxiv](https://www.biorxiv.org/content/10.1101/2021.06.17.448889v2) preprint for more details. # Package Installation and Dependencies -FastGxC is an R package that can be loaded and used in any R -environment. In order for FastGxC to run properly, the following -packages are required and should be installed in R prior to using any -FastGxC functions. +FastGxC is an R package that can be loaded and used in any R environment. In order for FastGxC to run properly, the following packages are required and should be installed in R prior to using any FastGxC functions. ``` +library(reticulate) +library(qvalue) library(devtools) library(dplyr) library(data.table) @@ -38,14 +27,11 @@ library(mvtnorm) library(reshape2) library(magrittr) library(TreeQTL) -library(reticulate) -library(qvalue) ``` \*\* Note \*\* : to install TreeQTL, qvalue must be installed first. -Once all dependencies are installed and loaded you can install FastGxC -using: +Once all dependencies are installed and loaded you can install FastGxC using: ``` devtools::install_github("BalliuLab/FastGxC") @@ -57,8 +43,7 @@ Once FastGxC is installed, load all functions using library(FastGxC) ``` -Optional: Set up Python dependencies for TensorQTL (used with method = -"tensor")\ +Optional: Set up Python dependencies for TensorQTL (used with method = "tensor")\ Requires: reticulate + compatible Python environment ``` @@ -73,8 +58,7 @@ reticulate::py_install(c( # Simulate toy data -To run a toy example, generate simulated data by running the following -code in R: +To run a toy example, generate simulated data by running the following code in R: ``` data_dir_sim = "~/simulations/" @@ -82,44 +66,23 @@ code in R: simulate_data(data_dir = data_dir_sim, sim_scenario = sim_scenario) ``` -\*\* Note: running the code above simulates data with default parameters -(300 individuals, 1,000 SNPs, 100 genes, and 10 contexts without -missing data), but this function can be run with any combination of -parameter values. See all possible parameters for `simulate_data()` by -running `?simulate_data` in R. +\*\* Note: running the code above simulates data with default parameters (300 individuals, 1,000 SNPs, 100 genes, and 10 contexts without missing data), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. -Running the above code will generate and save the following files in the -data_dir: (1) {sim_scenario}\_SNPs.txt: SNP genotype data for 1,000 -SNPs and 300 individuals (individual IDs as columns and SNP IDs as -rows)\ +Running the above code will generate and save the following files in the data_dir: (1) {sim_scenario}\_SNPs.txt: SNP genotype data for 1,000 SNPs and 300 individuals (individual IDs as columns and SNP IDs as rows)\ -(2) {sim_scenario}\_snpsloc.txt: location information of the 1,000 - simulated SNPs (MatrixEQTL input format)\ +(2) {sim_scenario}\_snpsloc.txt: location information of the 1,000 simulated SNPs (MatrixEQTL input format)\ -(3) {sim_scenario}\_geneloc.txt: location information of the 100 - simulated genes (MatrixEQTL input format)\ +(3) {sim_scenario}\_geneloc.txt: location information of the 100 simulated genes (MatrixEQTL input format)\ -(4) {sun_scenario}\_simulated_expression.txt: gene expression data for - the 300 simulated individuals across 100 genes and 10 contexts\ +(4) {sun_scenario}\_simulated_expression.txt: gene expression data for the 300 simulated individuals across 100 genes and 10 contexts\ # Running FastGxC -FastGxC works in two steps. In the first step, expression is decomposed -into shared and context-specific components. In the second step, eQTLs -are separately mapped on these components. +FastGxC works in two steps. In the first step, expression is decomposed into shared and context-specific components. In the second step, eQTLs are separately mapped on these components. -*Step 1 - Decomposition:* For each individual, decompose the phenotype -of interest (e.g. gene expression) across C contexts (e.g. tissues or -cell-types) into one context-shared and C context-specific components -using the `decomposition_step()` function. This function takes as imput -a file with gene expression data for all individuals, genes, and -contexts (see output of `simulate_data()` for the right format) and -outputs one file with context-shared expression -(context_shared_expression.txt) and C files with expression specific to -each context (CONTEXT_NAME_specific_expression.txt). +*Step 1 - Decomposition:* For each individual, decompose the phenotype of interest (e.g. gene expression) across C contexts (e.g. tissues or cell-types) into one context-shared and C context-specific components using the `decomposition_step()` function. This function takes as imput a file with gene expression data for all individuals, genes, and contexts (see output of `simulate_data()` for the right format) and outputs one file with context-shared expression (context_shared_expression.txt) and C files with expression specific to each context (CONTEXT_NAME_specific_expression.txt). -The following code example demonstrates how to use this function with -the data we just simulated above. +The following code example demonstrates how to use this function with the data we just simulated above. ``` exp_mat_filename = "~/simulations/single_context_het_simulated_expression.txt" @@ -127,141 +90,157 @@ data_dir_decomp = "~/example_output_single_context_het/" decomposition_step(exp_mat_filename, data_dir_decomp) ``` -*Step 2 - eQTL mapping:* FastGxC estimates genetic effects on the -context-shared component and each of the C context-specific components -separately using simple linear models. Note: Here we use the R package -[MatrixEQTL](http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/) -but any other software that can perform quick linear regression can be -used (e.g. [FastQTL](http://fastqtl.sourceforge.net/) or -[tensorqtl](https://github.com/broadinstitute/tensorqtl)). FastGxC -implements eQTL mapping using its `eQTL_mapping_step()` function. +*Step 2 - eQTL mapping:* FastGxC estimates genetic effects on the context-shared component and each of the C context-specific components separately using simple linear models. Note: Here we use the R package [MatrixEQTL](http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/) but any other software that can perform quick linear regression can be used (e.g. [FastQTL](http://fastqtl.sourceforge.net/) or [tensorqtl](https://github.com/broadinstitute/tensorqtl)). FastGxC implements eQTL mapping using its `eQTL_mapping_step()` function. -This function take as input data needed to run MatrixEQTL and outputs -eQTL summary statistics in the MatrixEQTL format. In the end, you should -have one file with summary statistics for shared eQTL and C files with -summary statistics for each context C. +This function take as input data needed to run MatrixEQTL and outputs eQTL summary statistics in the MatrixEQTL format. In the end, you should have one file with summary statistics for shared eQTL and C files with summary statistics for each context C. -Below is a code example to map context-specific eQTLs and shared eQTLs -using the decomposed simulated data from above. +Below is a code example to map context-specific eQTLs and shared eQTLs using the decomposed simulated data from above. ``` out_dir = "~/example_output_single_context_het/" input_dir = "~/simulations/" -context_names = paste0("context", seq(1,50)) - -SNP_file_name = paste0(input_dir, "single_context_het_SNPs.txt") -snps_location_file_name = paste0(input_dir, "single_context_het_snpsloc.txt") -gene_location_file_name = paste0(input_dir, "single_context_het_geneloc.txt") -## map context specific eQTLs: -for(context in context_names){ - expression_file_name = paste0(out_dir, context, "_specific_expression.txt") - context = context - shared_specific = "specific" - out_dir = out_dir - - eQTL_mapping_step(SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = context, - shared_specific = shared_specific, - out_dir = out_dir) +expr_files <- list.files(out_dir, pattern = "_specific_expression.txt$") +nC <- length(expr_files) +context_names <- paste0("context", seq(1, nC)) + +SNP_file_name <- file.path(input_dir, "single_context_het_SNPs.txt") +snps_location_file_name <- file.path(input_dir, "single_context_het_snpsloc.txt") +gene_location_file_name <- file.path(input_dir, "single_context_het_geneloc.txt") + +for (context in context_names) { + expression_file_name <- file.path(out_dir, paste0(context, "_specific_expression.txt")) + shared_specific <- "specific" + + if (!dir.exists(out_dir)) dir.create(out_dir, recursive = TRUE) + + eQTL_mapping_step( + SNP_file_name = SNP_file_name, + snps_location_file_name = snps_location_file_name, + expression_file_name = expression_file_name, + gene_location_file_name = gene_location_file_name, + context = context, + shared_specific = shared_specific, + out_dir = out_dir, + output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), + output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), + method = "MatrixEQTL", + python_dir, + use_model = use_model, + cis_dist = cis_dist, + pv_threshold_cis = pv_threshold_cis, + pv_threshold_tra = pv_threshold_tra, + error_covariance = error_covariance + ) } -## map shared eQTLs: - expression_file_name = paste0(input_dir, "context_shared_expression.txt") - shared_specific = "shared" - - eQTL_mapping_step(SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = "shared", - shared_specific = shared_specific, - out_dir = out_dir) +expression_file_name <- file.path(out_dir, "context_shared_expression.txt") +shared_specific <- "shared" +context <- "shared" + +eQTL_mapping_step( + SNP_file_name = SNP_file_name, + snps_location_file_name = snps_location_file_name, + expression_file_name = expression_file_name, + gene_location_file_name = gene_location_file_name, + context = context, + shared_specific = shared_specific, + out_dir = out_dir, + output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), + output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), + method = method, + python_dir = python_dir, + use_model = use_model, + cis_dist = cis_dist, + pv_threshold_cis = pv_threshold_cis, + pv_threshold_tra = pv_threshold_tra, + error_covariance = error_covariance +) ``` -*Step 2 - eQTL mapping with TensorQTL (optional alternative):* FastGxC -also supports cis-eQTL mapping using TensorQTL, a GPU-accelerated -implementation for fast eQTL analysis. This is enabled through the R -package reticulate, which allows Python functions to be called from -within R. +*Step 2 - eQTL mapping with TensorQTL (optional alternative):* FastGxC also supports cis-eQTL mapping using TensorQTL, a GPU-accelerated implementation for fast eQTL analysis. This is enabled through the R package reticulate, which allows Python functions to be called from within R. -To use this functionality, specify method = "tensor" when calling -eQTL_mapping(). All input formats remain the same as for MatrixEQTL. The -function returns results in a format consistent with MatrixEQTL outputs -for compatibility with downstream steps. TensorQTL is particularly -useful when working with large datasets due to its computational -efficiency. +To use this functionality, specify method = "tensorQTL" when calling eQTL_mapping(). All input formats remain the same as for MatrixEQTL. The function returns results in a format consistent with MatrixEQTL outputs for compatibility with downstream steps. TensorQTL is particularly useful when working with large datasets due to its computational efficiency. **Note:** TensorQTL requires Python version 3.7 or higher to run properly. -Below is an example of how to perform eQTL mapping using TensorQTL on -context-specific and shared components: +Below is an example of how to perform eQTL mapping using TensorQTL on context-specific and shared components: ``` -out_dir = "~/example_output_single_context_het/" -input_dir = "~/simulations/" -context_names = paste0("context", seq(1, 10)) +# Replace '/your/python/path/here' with the full path to your Python 3 executable (e.g., from `which python3` in terminal) +use_python("/your/python/path/here", required = TRUE) + +# Store the path in a variable for downstream use (e.g., inside function calls) +python_dir <- "/your/python/path/here" + +input_dir <- "~/Library/Mobile Documents/com~apple~CloudDocs/Balliu_Lab/simulations_0.8/" +out_dir <- path.expand("~/Library/Mobile Documents/com~apple~CloudDocs/Balliu_Lab/tensor/") +expr_files <- list.files(out_dir, pattern = "_specific_expression.txt$") +nC <- length(expr_files) +context_names <- paste0("context", seq(1, nC)) + +SNP_file_name <- file.path(input_dir, "single_context_het_SNPs.txt") +snps_location_file_name <- file.path(input_dir, "single_context_het_snpsloc.txt") +gene_location_file_name <- file.path(input_dir, "single_context_het_geneloc.txt") -SNP_file_name = paste0(input_dir, "single_context_het_SNPs.txt") -snps_location_file_name = paste0(input_dir, "single_context_het_snpsloc.txt") -gene_location_file_name = paste0(input_dir, "single_context_het_geneloc.txt") -## map context specific eQTLs: for (context in context_names) { - expression_file_name = paste0(out_dir, context, "_specific_expression.txt") - context = context - shared_specific = "specific" - out_dir = out_dir - - eQTL_mapping_step(SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = context, - shared_specific = shared_specific, - out_dir = out_dir, - method = "tensor") + expression_file_name <- file.path(out_dir, paste0(context, "_specific_expression.txt")) + shared_specific <- "specific" + + if (!dir.exists(out_dir)) dir.create(out_dir, recursive = TRUE) + + eQTL_mapping_step( + SNP_file_name = SNP_file_name, + snps_location_file_name = snps_location_file_name, + expression_file_name = expression_file_name, + gene_location_file_name = gene_location_file_name, + context = context, + shared_specific = shared_specific, + out_dir = out_dir, + output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), + output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), + method = "tensorQTL", + python_dir = python_dir, + use_model = use_model, + cis_dist = cis_dist, + pv_threshold_cis = pv_threshold_cis, + pv_threshold_tra = pv_threshold_tra, + error_covariance = error_covariance + ) } -## map shared eQTLs: - expression_file_name = paste0(out_dir, "context_shared_expression.txt") - shared_specific = "shared" - - eQTL_mapping_step(SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = "shared", - shared_specific = shared_specific, - out_dir = out_dir, - method = "tensor") +expression_file_name <- file.path(out_dir, "context_shared_expression.txt") +shared_specific <- "shared" +context <- "shared" + +eQTL_mapping_step( + SNP_file_name = SNP_file_name, + snps_location_file_name = snps_location_file_name, + expression_file_name = expression_file_name, + gene_location_file_name = gene_location_file_name, + context = context, + shared_specific = shared_specific, + out_dir = out_dir, + output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), + output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), + method = method, + python_dir = python_dir, + use_model = use_model, + cis_dist = cis_dist, + pv_threshold_cis = pv_threshold_cis, + pv_threshold_tra = pv_threshold_tra, + error_covariance = error_covariance +) ``` -Note: TensorQTL writes intermediate results as .parquet files by -default, but FastGxC saves the final output in .txt format for -consistency with MatrixEQTL outputs. +Note: TensorQTL writes intermediate results as .parquet files by default, but FastGxC saves the final output in .txt format for consistency with MatrixEQTL outputs. # Multiple testing adjustment -To adjust for multiple testing across all contexts, genes, and genetic -variants tested, FastGxC uses the hierarchical FDR procedures -implemented in the R package -[TreeQTL](http://bioinformatics.org/treeqtl/) via the `treeQTL_step()` -function. - -This function requires that you run MatrixEQTL to do eQTL mapping (see -step 2 above). If you used another eQTL mapping softwares, please make -sure the output is in the format required by TreeQTL. You can also -replace TreeQTL with other methods, e.g. -[mashR](https://github.com/stephenslab/mashr), which can also lead to a -considerable increase in power. - -The following code example demonstrates how to use this function with -the data outputted from the eQTL mapping we just ran. This script take -as input data needed to run TreeQTL and outputs shared and specific -eGenes (two files) and eAssociation (C+1 files) summary statistics in -the TreeQTL format. +To adjust for multiple testing across all contexts, genes, and genetic variants tested, FastGxC uses the hierarchical FDR procedures implemented in the R package [TreeQTL](http://bioinformatics.org/treeqtl/) via the `treeQTL_step()` function. + +This function requires that you run MatrixEQTL to do eQTL mapping (see step 2 above). If you used another eQTL mapping softwares, please make sure the output is in the format required by TreeQTL. You can also replace TreeQTL with other methods, e.g. [mashR](https://github.com/stephenslab/mashr), which can also lead to a considerable increase in power. + +The following code example demonstrates how to use this function with the data outputted from the eQTL mapping we just ran. This script take as input data needed to run TreeQTL and outputs shared and specific eGenes (two files) and eAssociation (C+1 files) summary statistics in the TreeQTL format. Map specific-eGenes, i.e., genes with at least one context-specific eQTL From 4691726e4af46698a017339106e64705b666757a Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Fri, 27 Jun 2025 11:09:49 -0400 Subject: [PATCH 08/45] Update README.md --- README.md | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ce70047..1c68560 100644 --- a/README.md +++ b/README.md @@ -46,14 +46,23 @@ library(FastGxC) Optional: Set up Python dependencies for TensorQTL (used with method = "tensor")\ Requires: reticulate + compatible Python environment -``` +``` +library(reticulate) +# Replace '/your/python/path/here' with the full path to your Python 3 executable (e.g., from `which python3` in terminal) +use_python("/your/python/path/here", required = TRUE) + reticulate::py_install(c( "tensorqtl", "pandas", "numpy", "pyarrow", - "torch" + "torch", + "rpy2" )) + +if (!requireNamespace("qvalue", quietly = TRUE)) { + BiocManager::install("qvalue") +} ``` # Simulate toy data @@ -166,14 +175,11 @@ To use this functionality, specify method = "tensorQTL" when calling eQTL_mappin Below is an example of how to perform eQTL mapping using TensorQTL on context-specific and shared components: ``` -# Replace '/your/python/path/here' with the full path to your Python 3 executable (e.g., from `which python3` in terminal) -use_python("/your/python/path/here", required = TRUE) - # Store the path in a variable for downstream use (e.g., inside function calls) python_dir <- "/your/python/path/here" -input_dir <- "~/Library/Mobile Documents/com~apple~CloudDocs/Balliu_Lab/simulations_0.8/" -out_dir <- path.expand("~/Library/Mobile Documents/com~apple~CloudDocs/Balliu_Lab/tensor/") +out_dir = "~/example_output_single_context_het/" +input_dir = "~/simulations/" expr_files <- list.files(out_dir, pattern = "_specific_expression.txt$") nC <- length(expr_files) context_names <- paste0("context", seq(1, nC)) From 9321110ac99000bd8e3d70284744b974f7107574 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Sun, 6 Jul 2025 10:19:27 -0400 Subject: [PATCH 09/45] Completed action items for this week --- R/eQTL_mapping.R | 63 ++++++----- R/simulate_data.R | 214 +++++++++++++++---------------------- README.md | 261 +++++++++++++++++++++++----------------------- 3 files changed, 250 insertions(+), 288 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index 16e13bc..8374f81 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -12,7 +12,6 @@ #' @param output_file_name_cis Path to write cis-eQTL output. #' @param output_file_name_tra Path to write trans-eQTL output. #' @param method Either "MatrixEQTL" or "tensorQTL". -#' @param python_dir Path to Python (for TensorQTL). #' @param use_model MatrixEQTL model (default: modelLINEAR). #' @param cis_dist Distance threshold for cis-eQTLs. #' @param pv_threshold_cis P-value threshold for cis. @@ -29,10 +28,9 @@ eQTL_mapping_step = function( context, shared_specific, out_dir, - output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, ".all_pairs.txt")), + output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, ".cis_pairs.txt")), output_file_name_tra = file.path(out_dir, paste0(context, "_", shared_specific, ".trans_pairs.txt")), method = "MatrixEQTL", - python_dir = Sys.which("python"), use_model = modelLINEAR, cis_dist = 1e6, pv_threshold_cis = 1, @@ -80,17 +78,22 @@ eQTL_mapping_step = function( ) } else if (method == "tensorQTL") { - use_python(python_dir, required = TRUE) + SNP_file_name <- path.expand(SNP_file_name) + snps_location_file_name <- path.expand(snps_location_file_name) + gene_location_file_name <- path.expand(gene_location_file_name) + expression_file_name <- path.expand(expression_file_name) + out_dir <- path.expand(out_dir) - # Define Python helper py_run_string(" import os import torch import pandas as pd import numpy as np from tensorqtl import cis +import builtins os.environ['CUDA_VISIBLE_DEVICES'] = '' +torch.set_num_threads(1) def run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefix=''): if 's1' in phenotype_pos_df.columns and 's2' in phenotype_pos_df.columns: @@ -98,44 +101,52 @@ def run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefi if 'chr' in variant_df.columns: variant_df.rename(columns={'chr': 'chrom'}, inplace=True) cis.map_nominal(genotype_df, variant_df, phenotype_df, phenotype_pos_df, prefix=prefix) + +builtins.run_tensorqtl = run_tensorqtl ") - - # R -> Python input + phenotype_df <- read.table(expression_file_name, header = TRUE, row.names = 1) phenotype_pos_df <- read.table(gene_location_file_name, header = TRUE, row.names = 1) genotype_df <- read.table(SNP_file_name, header = TRUE, row.names = 1) variant_df <- read.table(snps_location_file_name, header = TRUE, row.names = 1) + py$phenotype_df <- phenotype_df py$phenotype_pos_df <- phenotype_pos_df py$genotype_df <- genotype_df py$variant_df <- variant_df - py$prefix <- paste0(out_dir, "/", context, "_tensor") - - # Run Python-side TensorQTL - py_run_string("run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefix)") + py$prefix <- file.path(out_dir, paste0(context, "_tensor")) + + tryCatch({ + py$run_tensorqtl( + py$phenotype_df, + py$phenotype_pos_df, + py$genotype_df, + py$variant_df, + prefix = py$prefix + ) + }, error = function(e) { + message("TensorQTL failed for context: ", context) + message(e$message) + }) - # Validate output - parquet_path <- paste0(out_dir, "/", context, "_tensor.cis_qtl_pairs.chr1.parquet") + parquet_path <- file.path(out_dir, paste0(context, "_tensor.cis_qtl_pairs.chr1.parquet")) if (!file.exists(parquet_path)) stop("TensorQTL failed: .parquet output not found") - - # Load and convert output + pd <- import("pandas", convert = FALSE) pq <- pd$read_parquet(parquet_path) py$pq <- pq - - # Rename columns (skip stderr_beta and t.stat) - py_run_string(" -pq.rename(columns={ - 'phenotype_id': 'gene', - 'variant_id': 'SNP', - 'slope': 'beta', - 'pval_nominal': 'p.value' -}, inplace=True) -") - + + pq$rename(columns = dict( + phenotype_id = "gene", + variant_id = "SNP", + slope = "beta", + pval_nominal = "p.value" + ), inplace = TRUE) + pq_df <- py_eval("pq.loc[:, ['SNP', 'gene', 'beta', 'p.value']]", convert = TRUE) pq_df$FDR <- p.adjust(pq_df$p.value, method = "BH") pq_df <- pq_df[order(pq_df$p.value), ] + write.table(pq_df, file = output_file_name_cis, sep = '\t', row.names = FALSE, quote = FALSE) } else { stop("Invalid method. Use 'MatrixEQTL' or 'tensorQTL'") diff --git a/R/simulate_data.R b/R/simulate_data.R index 654a75c..e9c1c7a 100644 --- a/R/simulate_data.R +++ b/R/simulate_data.R @@ -1,137 +1,87 @@ -#' Simulations +#' Simulate Gene Expression and Genotype Data #' -#' Function to generate simulated SNP and expression data +#' Generates simulated SNP genotypes, gene expression data across multiple contexts (e.g., tissues or cell types) #' -#' @param data_dir - full filepath of the directory where simulated data will be written to -#' @param N - number of individuals simulated (must be a whole number) -#' @param n_genes - number of genes simulated (must be a whole number) -#' @param n_snps_per_gene - number of cis-SNPs per gene (must be a whole number) -#' @param n_contexts - number of contexts to simulate (e.g. tissues or cell types) (must be a whole number) -#' @param maf - minor allele frequency for genotypes -#' @param w_corr - error covariance between contexts -#' @param v_e - error variance in each context (maybe take this out and set it to 1) -#' @param missing - decimal value signifying percentage of missingness in simulated expression data (e.g. parameter value of 0.3 would indicate 30% missing values in outputted expression matrix) -#' @param seed - can set seed for reproducibility -#' @param sim_scenario - must be either "null" or "single_context_het" to signify simulations under the null case (no genetic effects in any context) or the case of single context heterogeneity (one context drives the genetic effect heterogeneity) -#' @return outputs an expression matrix file, a genotype matrix file, a SNP location file, and a gene location file all in the format needed for FastGxC's decomposition step and then subsequent eQTL mapping step with Matrix eQTL. +#' @param data_dir String. Full file path to the directory where simulated data will be saved. +#' @param N Integer. Number of individuals to simulate. +#' @param n_genes Integer. Number of genes to simulate. +#' @param n_snps_per_gene Integer. Number of cis-SNPs per gene. +#' @param n_contexts Integer. Number of contexts to simulate (e.g., tissues or cell types). +#' @param maf Numeric. Minor allele frequency for simulated SNPs (value between 0 and 1). +#' @param w_corr Numeric. Off-diagonal values for the error covariance matrix (correlation between contexts). +#' @param v_e Numeric. Error variance for expression in each context. +#' @param missing Numeric. Proportion of missing values in the simulated expression data (e.g., 0.3 = 30% missing). +#' @param hsq Numeric vector of length `n_contexts`. Heritability values in each context (defaults to 0 = null model). +#' @param mus Numeric vector of length `n_contexts`. Mean expression in each context. +#' +#' @return Writes the following files to `data_dir`: +#' \itemize{ +#' \item \code{SNPs.txt} – genotype matrix (individuals × SNPs) +#' \item \code{snpsloc.txt} – SNP location file for cis-window definitions +#' \item \code{geneloc.txt} – gene location file for cis-window definitions +#' \item \code{simulated_expression.txt} – simulated gene expression matrix with optional missingness +#' } #' #' @export -simulate_data = function(data_dir, N = 300, n_genes=100, n_snps_per_gene=1000, n_contexts=10, maf=0.2, w_corr=0.2, v_e=1, missing = 0, seed = 1, sim_scenario = "single_context_het"){ - -if(!dir.exists(data_dir)) dir.create(data_dir) - -mus = c(rep(0, n_contexts-1),0) # gene expression mean in each context for genotype = 0 - -# Error variance-covariance matrix -sigma = matrix(w_corr,nrow=n_contexts,ncol=n_contexts) # Error variance-covariance matrix -diag(sigma) = v_e - -# Simulate genotypes -genos = sapply(X = 1:(n_snps_per_gene*n_genes), FUN = function(X) rbinom(N, 2, maf)) -colnames(genos) = paste0("snp",1:(n_snps_per_gene*n_genes)) -rownames(genos) = paste0("ind",1:N) -write.table(x = t(data.table(genos, keep.rownames = T) %>% rename(snpid=rn)), file = paste0(data_dir,sim_scenario, "_SNPs.txt"), quote = F, sep = '\t', row.names = T, col.names = F) - -print("Finished simulating and saving genotypes") - -# Save SNP location file -# Data frame with 3 initial columns (name, chrom, and position) that match standard SNP map file, followed by 1 column for each context with a 0/1 indicator of whether the given SNP passed QC in that tissue. -snp_loc=data.frame(snpid=colnames(genos), chr="chr1",pos=rep(x = seq(1,n_genes*1e9, by = 1e9), each=n_snps_per_gene), - matrix(data = 1, nrow = ncol(genos), ncol = n_contexts, dimnames = list(NULL, paste0("context",1:n_contexts)))) -write.table(x = snp_loc, file = paste0(data_dir,sim_scenario,"_snpsloc.txt"), quote = F, sep = '\t', row.names = F, col.names = T) - -print("Finished saving snp location file") - -# Save gene location file -# data frame with 4 initial columns (name, chrom, and start and end position) that match standard gene map file, followed by 1 column for each context with a 0/1 indicator of whether the given gene passed QC in that context -gene_loc=data.frame(geneid=paste0("gene",1:n_genes), - chr="chr1", - s1=seq(1,n_genes*1e9, by = 1e9), - s2=seq(1,n_genes*1e9, by = 1e9)+ 1000, - matrix(data = 1, nrow = n_genes, ncol = n_contexts, dimnames = list(NULL, paste0("context",1:n_contexts)))) -write.table(x = gene_loc, file = paste0(data_dir,sim_scenario,"_geneloc.txt"), quote = F, sep = '\t', row.names = F, col.names = T) - -print("Finished saving gene location file") - -# Use only one snp per gene to generate expression -genos_with_effect = genos[,seq(from = 1, to = (n_snps_per_gene*n_genes), by = n_snps_per_gene)] - -# Generate expression matrix -exp_mat=expand.grid(iid=paste0("ind",1:N),context=paste0("context",1:n_contexts)) - -which_context=rep_len(x = 1:n_contexts, length.out = n_genes) - -if(sim_scenario == "null"){ -which_context=rep_len(x = 1:n_contexts, length.out = n_genes) - -for(i in 1:n_genes){ - - # Genotypic effect in each context for assumed heritability - hsq=rep(NA, n_contexts) # expression heritability, i.e. proportion of gene expression variance explained by genetics, in each context - hsq[which_context[i]]= 0 - hsq[-which_context[i]]= rep(0, n_contexts-1) - betas=sqrt((hsq*v_e)/((1-hsq)*var(genos_with_effect[,i]))) - - # expression of gene per context without noise - Y = matrix(0,nrow=N,ncol=n_contexts, dimnames = list(paste0("ind",1:N), paste0("context",1:n_contexts))) - for (j in 1:n_contexts) Y[,j] = mus[j] + genos_with_effect[,i]*betas[j] - - # get noise per individual - for(j in 1:N) Y[j,] = Y[j,] + rmvnorm(1, rep(0,n_contexts), sigma) - - data_mat=melt(data = data.table(Y,keep.rownames = T), id.vars = "rn") - colnames(data_mat) = c("iid", "context", paste0("gene",i)) - exp_mat = merge(x = exp_mat, y = data_mat) - -} -} - -if(sim_scenario == "single_context_het"){ -which_context=rep_len(x = 1:n_contexts, length.out = n_genes) - -for(i in 1:n_genes){ - - # Genotypic effect in each context for assumed heritability - hsq=rep(NA, n_contexts) # expression heritability, i.e. proportion of gene expression variance explained by genetics, in each context - hsq[which_context[i]]= 0.2 - hsq[-which_context[i]]= rep(0.1, n_contexts-1) - betas=sqrt((hsq*v_e)/((1-hsq)*var(genos_with_effect[,i]))) - - # expression of gene per context without noise - Y = matrix(0,nrow=N,ncol=n_contexts, dimnames = list(paste0("ind",1:N), paste0("context",1:n_contexts))) - for (j in 1:n_contexts) Y[,j] = mus[j] + genos_with_effect[,i]*betas[j] - - # get noise per individual - for(j in 1:N) Y[j,] = Y[j,] + rmvnorm(1, rep(0,n_contexts), sigma) - - data_mat=melt(data = data.table(Y,keep.rownames = T), id.vars = "rn") - colnames(data_mat) = c("iid", "context", paste0("gene",i)) - exp_mat = merge(x = exp_mat, y = data_mat) - -} -} - -rownames(exp_mat) = paste(exp_mat$iid,exp_mat$context, sep = " - ") -exp_mat = cbind(data.frame(design = paste(exp_mat$iid,exp_mat$context, sep = " - ")), exp_mat) - -## add missing values -total_elements = prod(dim(exp_mat[,-c(1,2,3)])) -missing_elements = floor(missing * total_elements) - -missing_indices = sample(1:total_elements, missing_elements) - -# Convert the dataframe to a vector, set the selected elements to NA, and then convert it back to a dataframe -identifiers = exp_mat[,c(1,2,3)] -exp_mat_missing = as.vector(as.matrix(exp_mat[,-c(1,2,3)])) -exp_mat_missing[missing_indices] = NA # Set selected elements to NA - -# Convert the vector back to a dataframe with the original dimensions -exp_mat_missing = matrix(exp_mat_missing, nrow = nrow(exp_mat), ncol = ncol(exp_mat)-3) -exp_mat_missing = as.data.frame(exp_mat_missing) -exp_mat_missing = cbind(identifiers, exp_mat_missing) -colnames(exp_mat_missing) = colnames(exp_mat) - -write.table(x = exp_mat_missing[,-c(2:3)], file = paste0(data_dir,sim_scenario, "_simulated_expression.txt"), quote = F, sep = '\t', row.names = F, col.names = T) - -print("Finished simulating and saving expression file") +simulate_data = function(data_dir, N = 300, n_genes = 100, n_snps_per_gene = 1000, + n_contexts = 10, maf = 0.2, w_corr = 0.2, + v_e = 1, missing = 0, + hsq = rep(0,n_contexts), + mus = rep(0, n_contexts)) { + if (!dir.exists(data_dir)) dir.create(data_dir) + sigma = matrix(w_corr, nrow = n_contexts, ncol = n_contexts) + diag(sigma) = v_e + genos = sapply(X = 1:(n_snps_per_gene * n_genes), FUN = function(X) rbinom(N, 2, maf)) + colnames(genos) = paste0("snp", 1:(n_snps_per_gene * n_genes)) + rownames(genos) = paste0("ind", 1:N) + write.table(x = t(data.table(genos, keep.rownames = T) %>% + rename(snpid = rn)), file = paste0(data_dir, "SNPs.txt"), quote = F, sep = "\t", row.names = T, col.names = F) + print("Finished simulating and saving genotypes") + snp_loc = data.frame(snpid = colnames(genos), chr = "chr1", + pos = rep(x = seq(1, n_genes * 1e+09, by = 1e+09), each = n_snps_per_gene), + matrix(data = 1, nrow = ncol(genos), ncol = n_contexts, + dimnames = list(NULL, paste0("context", 1:n_contexts)))) + write.table(x = snp_loc, file = paste0(data_dir,"snpsloc.txt"), quote = F, sep = "\t", row.names = F, + col.names = T) + print("Finished saving snp location file") + gene_loc = data.frame(geneid = paste0("gene", 1:n_genes), + chr = "chr1", s1 = seq(1, n_genes * 1e+09, by = 1e+09), + s2 = seq(1, n_genes * 1e+09, by = 1e+09) + 1000, matrix(data = 1, + nrow = n_genes, + ncol = n_contexts, + dimnames = list(NULL, + paste0("context", 1:n_contexts)))) + write.table(x = gene_loc, file = paste0(data_dir, "geneloc.txt"), quote = F, sep = "\t", row.names = F, + col.names = T) + print("Finished saving gene location file") + genos_with_effect = genos[, seq(from = 1, to = (n_snps_per_gene * + n_genes), by = n_snps_per_gene)] + exp_mat = expand.grid(iid = paste0("ind", 1:N), context = paste0("context", + 1:n_contexts)) + which_context = rep_len(x = 1:n_contexts, length.out = n_genes) + for (i in 1:n_genes) { + betas = sqrt((hsq * v_e)/((1 - hsq) * var(genos_with_effect[, i]))) + Y = matrix(0, nrow = N, ncol = n_contexts, dimnames = list(paste0("ind", 1:N), paste0("context", 1:n_contexts))) + for (j in 1:n_contexts) Y[, j] = mus[j] + genos_with_effect[, i] * betas[j] + for (j in 1:N) Y[j, ] = Y[j, ] + rmvnorm(1, rep(0, n_contexts), sigma) + data_mat = melt(data = data.table(Y, keep.rownames = T), + id.vars = "rn") + colnames(data_mat) = c("iid", "context", paste0("gene", i)) + exp_mat = merge(x = exp_mat, y = data_mat) + } + rownames(exp_mat) = paste(exp_mat$iid, exp_mat$context, sep = " - ") + exp_mat = cbind(data.frame(design = paste(exp_mat$iid, exp_mat$context, sep = " - ")), exp_mat) + total_elements = prod(dim(exp_mat[, -c(1:3)])) + missing_elements = floor(missing * total_elements) + missing_indices = sample(1:total_elements, missing_elements) + identifiers = exp_mat[, 1:3] + exp_mat_missing = as.vector(as.matrix(exp_mat[, -c(1:3)])) + exp_mat_missing[missing_indices] = NA + exp_mat_missing = matrix(exp_mat_missing, nrow = nrow(exp_mat), ncol = ncol(exp_mat) - 3) + exp_mat_missing = as.data.frame(exp_mat_missing) + exp_mat_missing = cbind(identifiers, exp_mat_missing) + colnames(exp_mat_missing) = colnames(exp_mat) + write.table(x = exp_mat_missing[, -c(2:3)], file = paste0(data_dir, "simulated_expression.txt"), quote = F, + sep = "\t", row.names = F, col.names = T) + print("Finished simulating and saving expression file") } diff --git a/README.md b/README.md index 1c68560..11ce91b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ Please read the [BioRxiv](https://www.biorxiv.org/content/10.1101/2021.06.17.448 FastGxC is an R package that can be loaded and used in any R environment. In order for FastGxC to run properly, the following packages are required and should be installed in R prior to using any FastGxC functions. ``` -library(reticulate) library(qvalue) library(devtools) library(dplyr) @@ -31,10 +30,16 @@ library(TreeQTL) \*\* Note \*\* : to install TreeQTL, qvalue must be installed first. +``` +if (!requireNamespace("qvalue", quietly = TRUE)) { + BiocManager::install("qvalue") +} +``` + Once all dependencies are installed and loaded you can install FastGxC using: ``` - devtools::install_github("BalliuLab/FastGxC") +devtools::install_github("BalliuLab/FastGxC") ``` Once FastGxC is installed, load all functions using @@ -46,23 +51,24 @@ library(FastGxC) Optional: Set up Python dependencies for TensorQTL (used with method = "tensor")\ Requires: reticulate + compatible Python environment +To check your Python setup, run in your terminal: + +``` +which python3 ``` -library(reticulate) -# Replace '/your/python/path/here' with the full path to your Python 3 executable (e.g., from `which python3` in terminal) -use_python("/your/python/path/here", required = TRUE) -reticulate::py_install(c( - "tensorqtl", - "pandas", - "numpy", - "pyarrow", - "torch", - "rpy2" -)) +Install required Python packages (Terminal only) -if (!requireNamespace("qvalue", quietly = TRUE)) { - BiocManager::install("qvalue") -} +``` +/your/python/path/here -m pip install numpy pandas pyarrow rpy2 torch tensorqtl +``` + +Next, start RStudio and set Python path + +``` +library(reticulate) +use_python("/your/python/path/here", required = TRUE) +py <- import_builtins() ``` # Simulate toy data @@ -70,20 +76,70 @@ if (!requireNamespace("qvalue", quietly = TRUE)) { To run a toy example, generate simulated data by running the following code in R: ``` - data_dir_sim = "~/simulations/" - sim_scenario = "single_context_het" - simulate_data(data_dir = data_dir_sim, sim_scenario = sim_scenario) + data_dir_sim= "~/simulated_example/" + simulate_data(data_dir = data_dir_sim, # Path to directory where output files will be saved + N = 300, # Number of individuals + n_contexts = 10, # Number of contexts + n_genes = 100, # Number of Genes + n_snps_per_gene = 1000, # Number of SNPs per gene + maf = 0.2, # Minor allele frequency for SNPs + w_corr = 0.2, # Intra-individual residual correlation between contexts + v_e = 1, # Error variance per context + missing = 0.05, # Fraction of missing values in the simulated expression matrix + hsq = rep(0,n_contexts), # Vector with proportion of expression heritability explained by eQTL in each context + mus = rep(0, n_contexts)) # Vector with average expression in each context +``` + +\*\* Note: running the code above simulates data with default parameters (300 individuals, 1,000 SNPs, 100 genes, 10 contexts, etc.), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. + +**Output Files**\ + +The simulation will generate the following files in data_dir:\ + +**SNPs.txt** + +``` +snpid ind1 ind2 ind3 ind4 ind5 ... +snp1 0 2 1 1 0 ... +snp2 1 2 0 1 1 ... +snp3 0 1 0 1 1 ... +snp4 1 2 0 1 1 ... +snp5 0 0 0 1 1 ... ``` -\*\* Note: running the code above simulates data with default parameters (300 individuals, 1,000 SNPs, 100 genes, and 10 contexts without missing data), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. +**snpsloc.txt** -Running the above code will generate and save the following files in the data_dir: (1) {sim_scenario}\_SNPs.txt: SNP genotype data for 1,000 SNPs and 300 individuals (individual IDs as columns and SNP IDs as rows)\ +``` +snpid chr pos context1 context2 ... context10 +snp1 chr1 1 1 1 1 +snp2 chr1 1 1 1 1 +snp3 chr1 1 1 1 1 +snp4 chr1 1 1 1 1 +snp5 chr1 1 1 1 1 +``` -(2) {sim_scenario}\_snpsloc.txt: location information of the 1,000 simulated SNPs (MatrixEQTL input format)\ +**simulated_expression.txt** + +``` +design gene1 gene2 gene3 ... gene100 +ind1 - context1 0.4369 -1.7087 -1.8113 ... 1.1721 +ind1 - context10 0.6437 -0.4357 -0.8296 ... -0.3944 +ind1 - context2 0.1092 -0.1294 -0.3222 ... -0.4939 +ind1 - context3 0.1234 -0.1947 -0.1111 ... -0.9999 +ind1 - context4 0.8347 -0.9876 -0.1490 ... -0.3833 +``` -(3) {sim_scenario}\_geneloc.txt: location information of the 100 simulated genes (MatrixEQTL input format)\ +**geneloc.txt** -(4) {sun_scenario}\_simulated_expression.txt: gene expression data for the 300 simulated individuals across 100 genes and 10 contexts\ +``` +geneid chr s1 s2 context1 context2 context3 context4 context5 context6 +gene1 chr1 0 1001 1 1 1 1 1 1 +gene2 chr1 100000001 100001001 1 1 1 1 1 1 +gene3 chr1 200000001 200001001 1 1 1 1 1 1 +gene4 chr1 300000001 300001001 1 1 1 1 1 1 +gene5 chr1 400000001 400001001 1 1 1 1 1 1 +gene6 chr1 500000001 500001001 1 1 1 1 1 1 +``` # Running FastGxC @@ -94,11 +150,24 @@ FastGxC works in two steps. In the first step, expression is decomposed into sha The following code example demonstrates how to use this function with the data we just simulated above. ``` -exp_mat_filename = "~/simulations/single_context_het_simulated_expression.txt" -data_dir_decomp = "~/example_output_single_context_het/" +data_dir_decomp = "~/simulated_example/" +exp_mat_filename = paste0(data_dir_decomp, "simulated_expression.txt") decomposition_step(exp_mat_filename, data_dir_decomp) ``` +**Output Files**\ + +context_shared_expression.txt / contextX_specific_expression.txt + +``` + ind1 ind2 ind3 ind4 ind5 +gene1 0.1834 0.0456 -0.0912 0.2314 -0.0873 +gene2 -0.1345 0.0543 0.1123 -0.0784 0.0912 +gene3 0.0034 -0.0312 0.0402 0.0105 -0.0067 +gene4 -0.1423 -0.1092 -0.0876 -0.1904 -0.1523 +gene5 0.2145 0.1432 0.1784 0.1984 0.2013 +``` + *Step 2 - eQTL mapping:* FastGxC estimates genetic effects on the context-shared component and each of the C context-specific components separately using simple linear models. Note: Here we use the R package [MatrixEQTL](http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/) but any other software that can perform quick linear regression can be used (e.g. [FastQTL](http://fastqtl.sourceforge.net/) or [tensorqtl](https://github.com/broadinstitute/tensorqtl)). FastGxC implements eQTL mapping using its `eQTL_mapping_step()` function. This function take as input data needed to run MatrixEQTL and outputs eQTL summary statistics in the MatrixEQTL format. In the end, you should have one file with summary statistics for shared eQTL and C files with summary statistics for each context C. @@ -106,22 +175,29 @@ This function take as input data needed to run MatrixEQTL and outputs eQTL summa Below is a code example to map context-specific eQTLs and shared eQTLs using the decomposed simulated data from above. ``` -out_dir = "~/example_output_single_context_het/" -input_dir = "~/simulations/" -expr_files <- list.files(out_dir, pattern = "_specific_expression.txt$") +input_dir = "~/simulated_example/" +out_dir = input_dir +expr_files <- list.files(input_dir, pattern = "_specific_expression.txt$") nC <- length(expr_files) context_names <- paste0("context", seq(1, nC)) -SNP_file_name <- file.path(input_dir, "single_context_het_SNPs.txt") -snps_location_file_name <- file.path(input_dir, "single_context_het_snpsloc.txt") -gene_location_file_name <- file.path(input_dir, "single_context_het_geneloc.txt") +all_contexts <- c(context_names, "shared") +all_shared_specific <- c(rep("specific", nC), "shared") -for (context in context_names) { - expression_file_name <- file.path(out_dir, paste0(context, "_specific_expression.txt")) - shared_specific <- "specific" - - if (!dir.exists(out_dir)) dir.create(out_dir, recursive = TRUE) +SNP_file_name <- file.path(input_dir, "SNPs.txt") +snps_location_file_name <- file.path(input_dir, "snpsloc.txt") +gene_location_file_name <- file.path(input_dir, "geneloc.txt") + +for (i in seq_along(all_contexts)) { + context <- all_contexts[i] + shared_specific <- all_shared_specific[i] + if (shared_specific == "shared") { + expression_file_name <- file.path(input_dir, "context_shared_expression.txt") + } else { + expression_file_name <- file.path(input_dir, paste0(context, "_specific_expression.txt")) + } + eQTL_mapping_step( SNP_file_name = SNP_file_name, snps_location_file_name = snps_location_file_name, @@ -130,40 +206,16 @@ for (context in context_names) { context = context, shared_specific = shared_specific, out_dir = out_dir, - output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), - output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), + output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, ".cis_pairs.txt")), + output_file_name_tra = file.path(out_dir, paste0(context, "_", shared_specific, ".trans_pairs.txt")), method = "MatrixEQTL", - python_dir, - use_model = use_model, - cis_dist = cis_dist, - pv_threshold_cis = pv_threshold_cis, - pv_threshold_tra = pv_threshold_tra, - error_covariance = error_covariance + use_model = modelLINEAR, + cis_dist = 1e6, + pv_threshold_cis = 1, + pv_threshold_tra = 0, + error_covariance = numeric() ) } - -expression_file_name <- file.path(out_dir, "context_shared_expression.txt") -shared_specific <- "shared" -context <- "shared" - -eQTL_mapping_step( - SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = context, - shared_specific = shared_specific, - out_dir = out_dir, - output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), - output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), - method = method, - python_dir = python_dir, - use_model = use_model, - cis_dist = cis_dist, - pv_threshold_cis = pv_threshold_cis, - pv_threshold_tra = pv_threshold_tra, - error_covariance = error_covariance -) ``` *Step 2 - eQTL mapping with TensorQTL (optional alternative):* FastGxC also supports cis-eQTL mapping using TensorQTL, a GPU-accelerated implementation for fast eQTL analysis. This is enabled through the R package reticulate, which allows Python functions to be called from within R. @@ -172,73 +224,22 @@ To use this functionality, specify method = "tensorQTL" when calling eQTL_mappin **Note:** TensorQTL requires Python version 3.7 or higher to run properly. -Below is an example of how to perform eQTL mapping using TensorQTL on context-specific and shared components: - -``` -# Store the path in a variable for downstream use (e.g., inside function calls) -python_dir <- "/your/python/path/here" - -out_dir = "~/example_output_single_context_het/" -input_dir = "~/simulations/" -expr_files <- list.files(out_dir, pattern = "_specific_expression.txt$") -nC <- length(expr_files) -context_names <- paste0("context", seq(1, nC)) +To run TensorQTL, simply pass method = "TensorQTL." The inputs remain unchanged. -SNP_file_name <- file.path(input_dir, "single_context_het_SNPs.txt") -snps_location_file_name <- file.path(input_dir, "single_context_het_snpsloc.txt") -gene_location_file_name <- file.path(input_dir, "single_context_het_geneloc.txt") +**Output Files**\ -for (context in context_names) { - expression_file_name <- file.path(out_dir, paste0(context, "_specific_expression.txt")) - shared_specific <- "specific" - - if (!dir.exists(out_dir)) dir.create(out_dir, recursive = TRUE) - - eQTL_mapping_step( - SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = context, - shared_specific = shared_specific, - out_dir = out_dir, - output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), - output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), - method = "tensorQTL", - python_dir = python_dir, - use_model = use_model, - cis_dist = cis_dist, - pv_threshold_cis = pv_threshold_cis, - pv_threshold_tra = pv_threshold_tra, - error_covariance = error_covariance - ) -} +contextX_specific.cis_pairs.txt -expression_file_name <- file.path(out_dir, "context_shared_expression.txt") -shared_specific <- "shared" -context <- "shared" - -eQTL_mapping_step( - SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = context, - shared_specific = shared_specific, - out_dir = out_dir, - output_file_name_cis = paste0(out_dir, "/", context, "_", shared_specific, ".all_pairs.txt"), - output_file_name_tra = paste0(out_dir, "/", context, "_", shared_specific, ".trans_pairs.txt"), - method = method, - python_dir = python_dir, - use_model = use_model, - cis_dist = cis_dist, - pv_threshold_cis = pv_threshold_cis, - pv_threshold_tra = pv_threshold_tra, - error_covariance = error_covariance -) +``` +SNP gene beta p.value FDR +snp64928 gene65 0.418661087751389 8.4807042218939e-07 0.084807042218939 +snp42566 gene43 -0.355810463428497 7.53491371859939e-06 0.306773379105091 +snp22672 gene23 -0.394770801067352 9.20320137315272e-06 0.306773379105091 +snp73350 gene74 0.344478219747543 1.59910672991937e-05 0.399776682479843 +snp86064 gene87 -0.371489137411118 3.10237595856035e-05 0.550542627746407 ``` -Note: TensorQTL writes intermediate results as .parquet files by default, but FastGxC saves the final output in .txt format for consistency with MatrixEQTL outputs. +**Note:** TensorQTL writes intermediate results as .parquet files by default, but FastGxC saves the final output in .txt format for consistency with MatrixEQTL outputs. # Multiple testing adjustment From 3c995185a1e0c7f1b2bd73e27be4351c6b96a34e Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 15 Jul 2025 10:14:29 -0400 Subject: [PATCH 10/45] Update eQTL_mapping.R and simulate_data.R --- R/eQTL_mapping.R | 8 +++----- R/simulate_data.R | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index 8374f81..ed70536 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -7,7 +7,6 @@ #' @param expression_file_name Full path to expression matrix. #' @param gene_location_file_name Full path to gene location file. #' @param context Context name for labeling output. -#' @param shared_specific Either "shared" or "specific". #' @param out_dir Output directory. #' @param output_file_name_cis Path to write cis-eQTL output. #' @param output_file_name_tra Path to write trans-eQTL output. @@ -26,10 +25,9 @@ eQTL_mapping_step = function( expression_file_name, gene_location_file_name, context, - shared_specific, out_dir, - output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, ".cis_pairs.txt")), - output_file_name_tra = file.path(out_dir, paste0(context, "_", shared_specific, ".trans_pairs.txt")), + output_file_name_cis = output_file_name_cis, + output_file_name_tra = output_file_name_tra, method = "MatrixEQTL", use_model = modelLINEAR, cis_dist = 1e6, @@ -129,7 +127,7 @@ builtins.run_tensorqtl = run_tensorqtl message(e$message) }) - parquet_path <- file.path(out_dir, paste0(context, "_tensor.cis_qtl_pairs.chr1.parquet")) + parquet_path <- output_file_name_cis if (!file.exists(parquet_path)) stop("TensorQTL failed: .parquet output not found") pd <- import("pandas", convert = FALSE) diff --git a/R/simulate_data.R b/R/simulate_data.R index e9c1c7a..0e6586d 100644 --- a/R/simulate_data.R +++ b/R/simulate_data.R @@ -81,7 +81,7 @@ simulate_data = function(data_dir, N = 300, n_genes = 100, n_snps_per_gene = 100 exp_mat_missing = as.data.frame(exp_mat_missing) exp_mat_missing = cbind(identifiers, exp_mat_missing) colnames(exp_mat_missing) = colnames(exp_mat) - write.table(x = exp_mat_missing[, -c(2:3)], file = paste0(data_dir, "simulated_expression.txt"), quote = F, + write.table(x = exp_mat_missing[, -c(2:3)], file = paste0(data_dir, "expression.txt"), quote = F, sep = "\t", row.names = F, col.names = T) print("Finished simulating and saving expression file") } From 427842dcd4f8c9086d0acd4a5be4355c95af90a3 Mon Sep 17 00:00:00 2001 From: Anthony Zhao Date: Thu, 17 Jul 2025 19:59:14 -0700 Subject: [PATCH 11/45] Updated README.md --- README.md | 5 ++-- man/eQTL_mapping_step.Rd | 57 +++++++++++++++++++++----------------- man/simulate_data.Rd | 60 +++++++++++++++------------------------- 3 files changed, 57 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 11ce91b..1eddb85 100644 --- a/README.md +++ b/README.md @@ -76,17 +76,18 @@ py <- import_builtins() To run a toy example, generate simulated data by running the following code in R: ``` +n_contexts = 10 data_dir_sim= "~/simulated_example/" simulate_data(data_dir = data_dir_sim, # Path to directory where output files will be saved N = 300, # Number of individuals - n_contexts = 10, # Number of contexts + n_contexts = n_contexts, # Number of contexts n_genes = 100, # Number of Genes n_snps_per_gene = 1000, # Number of SNPs per gene maf = 0.2, # Minor allele frequency for SNPs w_corr = 0.2, # Intra-individual residual correlation between contexts v_e = 1, # Error variance per context missing = 0.05, # Fraction of missing values in the simulated expression matrix - hsq = rep(0,n_contexts), # Vector with proportion of expression heritability explained by eQTL in each context + hsq = rep(0, n_contexts), # Vector with proportion of expression heritability explained by eQTL in each context mus = rep(0, n_contexts)) # Vector with average expression in each context ``` diff --git a/man/eQTL_mapping_step.Rd b/man/eQTL_mapping_step.Rd index 52f4195..847c8ec 100644 --- a/man/eQTL_mapping_step.Rd +++ b/man/eQTL_mapping_step.Rd @@ -10,42 +10,49 @@ eQTL_mapping_step( expression_file_name, gene_location_file_name, context, - shared_specific, - out_dir + out_dir, + output_file_name_cis = output_file_name_cis, + output_file_name_tra = output_file_name_tra, + method = "MatrixEQTL", + use_model = modelLINEAR, + cis_dist = 1e+06, + pv_threshold_cis = 1, + pv_threshold_tra = 0, + error_covariance = numeric() ) } \arguments{ -\item{SNP_file_name}{\itemize{ -\item full file path with genotypes of all individuals -}} +\item{SNP_file_name}{Full path to SNP genotype matrix.} -\item{snps_location_file_name}{\itemize{ -\item full file path with snp ids, start, and end positions -}} +\item{snps_location_file_name}{Full path to SNP location file.} -\item{expression_file_name}{\itemize{ -\item full file path with expression matrix of individuals per gene -}} +\item{expression_file_name}{Full path to expression matrix.} -\item{gene_location_file_name}{\itemize{ -\item full file path with gene ids, start, and end positions -}} +\item{gene_location_file_name}{Full path to gene location file.} -\item{context}{\itemize{ -\item name of context for output file naming purposes -}} +\item{context}{Context name for labeling output.} -\item{shared_specific}{\itemize{ -\item either "shared" if mapping eQTLs with shared component or "specific" if mapping eQTLs with specific component -}} +\item{out_dir}{Output directory.} -\item{out_dir}{\itemize{ -\item full file path of output directory where eQTL file will be written out -}} +\item{output_file_name_cis}{Path to write cis-eQTL output.} + +\item{output_file_name_tra}{Path to write trans-eQTL output.} + +\item{method}{Either "MatrixEQTL" or "tensorQTL".} + +\item{use_model}{MatrixEQTL model (default: modelLINEAR).} + +\item{cis_dist}{Distance threshold for cis-eQTLs.} + +\item{pv_threshold_cis}{P-value threshold for cis.} + +\item{pv_threshold_tra}{P-value threshold for trans.} + +\item{error_covariance}{Covariance matrix (or numeric()).} } \value{ -outputs one file of mapped cis eQTLs +Writes cis-eQTLs and trans-eQTLs (optional) to disk. } \description{ -Function to map cis eQTLs - cis window is defined as 1Mb +Function to map cis eQTLs using either Matrix eQTL or TensorQTL. } diff --git a/man/simulate_data.Rd b/man/simulate_data.Rd index 2f46d3a..10bcbaa 100644 --- a/man/simulate_data.Rd +++ b/man/simulate_data.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/simulate_data.R \name{simulate_data} \alias{simulate_data} -\title{Simulations} +\title{Simulate Gene Expression and Genotype Data} \usage{ simulate_data( data_dir, @@ -14,58 +14,42 @@ simulate_data( w_corr = 0.2, v_e = 1, missing = 0, - seed = 1, - sim_scenario = "single_context_het" + hsq = rep(0, n_contexts), + mus = rep(0, n_contexts) ) } \arguments{ -\item{data_dir}{\itemize{ -\item full filepath of the directory where simulated data will be written to -}} +\item{data_dir}{String. Full file path to the directory where simulated data will be saved.} -\item{N}{\itemize{ -\item number of individuals simulated (must be a whole number) -}} +\item{N}{Integer. Number of individuals to simulate.} -\item{n_genes}{\itemize{ -\item number of genes simulated (must be a whole number) -}} +\item{n_genes}{Integer. Number of genes to simulate.} -\item{n_snps_per_gene}{\itemize{ -\item number of cis-SNPs per gene (must be a whole number) -}} +\item{n_snps_per_gene}{Integer. Number of cis-SNPs per gene.} -\item{n_contexts}{\itemize{ -\item number of contexts to simulate (e.g. tissues or cell types) (must be a whole number) -}} +\item{n_contexts}{Integer. Number of contexts to simulate (e.g., tissues or cell types).} -\item{maf}{\itemize{ -\item minor allele frequency for genotypes -}} +\item{maf}{Numeric. Minor allele frequency for simulated SNPs (value between 0 and 1).} -\item{w_corr}{\itemize{ -\item error covariance between contexts -}} +\item{w_corr}{Numeric. Off-diagonal values for the error covariance matrix (correlation between contexts).} -\item{v_e}{\itemize{ -\item error variance in each context (maybe take this out and set it to 1) -}} +\item{v_e}{Numeric. Error variance for expression in each context.} -\item{missing}{\itemize{ -\item decimal value signifying percentage of missingness in simulated expression data (e.g. parameter value of 0.3 would indicate 30\% missing values in outputted expression matrix) -}} +\item{missing}{Numeric. Proportion of missing values in the simulated expression data (e.g., 0.3 = 30\% missing).} -\item{seed}{\itemize{ -\item can set seed for reproducibility -}} +\item{hsq}{Numeric vector of length \code{n_contexts}. Heritability values in each context (defaults to 0 = null model).} -\item{sim_scenario}{\itemize{ -\item must be either "null" or "single_context_het" to signify simulations under the null case (no genetic effects in any context) or the case of single context heterogeneity (one context drives the genetic effect heterogeneity) -}} +\item{mus}{Numeric vector of length \code{n_contexts}. Mean expression in each context.} } \value{ -outputs an expression matrix file, a genotype matrix file, a SNP location file, and a gene location file all in the format needed for FastGxC's decomposition step and then subsequent eQTL mapping step with Matrix eQTL. +Writes the following files to \code{data_dir}: +\itemize{ +\item \code{SNPs.txt} – genotype matrix (individuals × SNPs) +\item \code{snpsloc.txt} – SNP location file for cis-window definitions +\item \code{geneloc.txt} – gene location file for cis-window definitions +\item \code{simulated_expression.txt} – simulated gene expression matrix with optional missingness +} } \description{ -Function to generate simulated SNP and expression data +Generates simulated SNP genotypes, gene expression data across multiple contexts (e.g., tissues or cell types) } From ed0c6209bfaa9850d38fca1db69e3d734fed1f80 Mon Sep 17 00:00:00 2001 From: Anthony Zhao Date: Thu, 17 Jul 2025 22:40:08 -0700 Subject: [PATCH 12/45] Updated README with TreeBH section and Updated TreeBH file reading --- R/treeBH.R | 8 +++++--- README.md | 41 ++++++++++++++++++++++++++++++++++++----- man/to_TreeBH_input.Rd | 2 +- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/R/treeBH.R b/R/treeBH.R index 45d4b6c..b067f45 100644 --- a/R/treeBH.R +++ b/R/treeBH.R @@ -1,7 +1,7 @@ #' Converting eQTL Mapping Output to TreeBH Input #' #' @param data_dir - full filepath of the directory where eQTL output files are stored. This function assumes that files are named as outputted by FastGxC's eQTL mapping function -#' @param shared_file - full filepath to the shared all_pairs file from the output of the mapping function +#' @param shared_file - full filepath to the shared cis_pairs file from the output of the mapping function #' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) #' @param out_dir - full filepath of the output directory where the input of TreeBH can be stored #' @return A data.frame with columns: @@ -21,7 +21,7 @@ to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { # Inline file-reading and p-value/column validation per context for (i in seq_len(num_contexts)) { context <- context_names[i] - pattern <- paste0(context, "_specific.all_pairs.txt$") + pattern <- paste0(context, "_specific.cis_pairs.txt$") files <- list.files(path = data_dir, pattern = pattern, full.names = TRUE) if (length(files) == 0) stop("No file matching pattern ", pattern) df <- readr::read_tsv(files[[1]], col_types = readr::cols()) @@ -83,6 +83,8 @@ to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { stringsAsFactors = FALSE, check.names = FALSE ) + + if (!dir.exists(out_dir)) dir.create(out_dir, recursive = TRUE) # Write file write.table( @@ -130,4 +132,4 @@ treeBH_step <- function(matrix, fdr_thres, out_dir) { col.names = TRUE, quote = FALSE ) -} \ No newline at end of file +} diff --git a/README.md b/README.md index 1eddb85..1e33676 100644 --- a/README.md +++ b/README.md @@ -93,9 +93,9 @@ n_contexts = 10 \*\* Note: running the code above simulates data with default parameters (300 individuals, 1,000 SNPs, 100 genes, 10 contexts, etc.), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. -**Output Files**\ +**Output Files** -The simulation will generate the following files in data_dir:\ +The simulation will generate the following files in `data_dir`: **SNPs.txt** @@ -119,7 +119,7 @@ snp4 chr1 1 1 1 1 snp5 chr1 1 1 1 1 ``` -**simulated_expression.txt** +**expression.txt** ``` design gene1 gene2 gene3 ... gene100 @@ -152,11 +152,11 @@ The following code example demonstrates how to use this function with the data w ``` data_dir_decomp = "~/simulated_example/" -exp_mat_filename = paste0(data_dir_decomp, "simulated_expression.txt") +exp_mat_filename = paste0(data_dir_decomp, "expression.txt") decomposition_step(exp_mat_filename, data_dir_decomp) ``` -**Output Files**\ +**Output Files** context_shared_expression.txt / contextX_specific_expression.txt @@ -244,6 +244,7 @@ snp86064 gene87 -0.371489137411118 3.10237595856035e-05 0.55054262774640 # Multiple testing adjustment +## With `TreeQTL` To adjust for multiple testing across all contexts, genes, and genetic variants tested, FastGxC uses the hierarchical FDR procedures implemented in the R package [TreeQTL](http://bioinformatics.org/treeqtl/) via the `treeQTL_step()` function. This function requires that you run MatrixEQTL to do eQTL mapping (see step 2 above). If you used another eQTL mapping softwares, please make sure the output is in the format required by TreeQTL. You can also replace TreeQTL with other methods, e.g. [mashR](https://github.com/stephenslab/mashr), which can also lead to a considerable increase in power. @@ -286,3 +287,33 @@ treeQTL_step( four_level = T ) ``` + +## With `TreeBH` +[TreeBH](https://github.com/cbpeterson/TreeBH) is the updated version of TreeQTL and supports the implementation of custom and more complex hierarchies. FastGxC provides the functions `to_TreeBH_input()` and `treeBH_step()` to leverage TreeBH's capibilities. + +The following code example demonstrates how to use these functions with the data outputted from the eQTL mapping step. In the example, the output of TreeBH will be saved to the path `~/simulated_example/treeBH_input.txt`. + + +```R +context_names <- paste0("context", 1:10) +shared_file <- "~/simulated_example/shared_shared.cis_pairs.txt" +data_dir <- "~/simulated_example/" +out_dir <- "~/simulated_example" + +FastGxC::to_TreeBH_input( + data_dir = data_dir, + shared_file = shared_file, + context_names = context_names, + out_dir = out_dir +) + +out_dir <- "~/simulated_example/" +df <- read.table(out_dir) +fdr_thres <- 0.05 + +FastGxC::treeBH_step( + matrix = df, + fdr_thres = 0.05, + out_dir +) +``` diff --git a/man/to_TreeBH_input.Rd b/man/to_TreeBH_input.Rd index a891a59..4cdff3c 100644 --- a/man/to_TreeBH_input.Rd +++ b/man/to_TreeBH_input.Rd @@ -12,7 +12,7 @@ to_TreeBH_input(data_dir, shared_file, context_names, out_dir) }} \item{shared_file}{\itemize{ -\item full filepath to the shared all_pairs file from the output of the mapping function +\item full filepath to the shared cis_pairs file from the output of the mapping function }} \item{context_names}{\itemize{ From a4668a02675e3e7dccf00bd74aaf74f53aa49fc7 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Fri, 18 Jul 2025 10:57:51 -0400 Subject: [PATCH 13/45] Update eQTL_mapping.R --- R/eQTL_mapping.R | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index ed70536..509b0eb 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -7,6 +7,7 @@ #' @param expression_file_name Full path to expression matrix. #' @param gene_location_file_name Full path to gene location file. #' @param context Context name for labeling output. +#' @param shared_specific Context specific or context shared #' @param out_dir Output directory. #' @param output_file_name_cis Path to write cis-eQTL output. #' @param output_file_name_tra Path to write trans-eQTL output. @@ -25,9 +26,10 @@ eQTL_mapping_step = function( expression_file_name, gene_location_file_name, context, + shared_specific, out_dir, - output_file_name_cis = output_file_name_cis, - output_file_name_tra = output_file_name_tra, + output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, ".cis_pairs.txt")), + output_file_name_tra = file.path(out_dir, paste0(context, "_", shared_specific, ".trans_pairs.txt")), method = "MatrixEQTL", use_model = modelLINEAR, cis_dist = 1e6, @@ -76,12 +78,14 @@ eQTL_mapping_step = function( ) } else if (method == "tensorQTL") { + # ✅ Expand all paths for Python compatibility SNP_file_name <- path.expand(SNP_file_name) snps_location_file_name <- path.expand(snps_location_file_name) gene_location_file_name <- path.expand(gene_location_file_name) expression_file_name <- path.expand(expression_file_name) out_dir <- path.expand(out_dir) + # ✅ Define and register the Python TensorQTL helper function py_run_string(" import os import torch @@ -102,7 +106,8 @@ def run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefi builtins.run_tensorqtl = run_tensorqtl ") - + + # ✅ Load data from R → Python phenotype_df <- read.table(expression_file_name, header = TRUE, row.names = 1) phenotype_pos_df <- read.table(gene_location_file_name, header = TRUE, row.names = 1) genotype_df <- read.table(SNP_file_name, header = TRUE, row.names = 1) @@ -113,7 +118,8 @@ builtins.run_tensorqtl = run_tensorqtl py$genotype_df <- genotype_df py$variant_df <- variant_df py$prefix <- file.path(out_dir, paste0(context, "_tensor")) - + + # ✅ Run TensorQTL safely tryCatch({ py$run_tensorqtl( py$phenotype_df, @@ -127,20 +133,24 @@ builtins.run_tensorqtl = run_tensorqtl message(e$message) }) - parquet_path <- output_file_name_cis + # ✅ Validate output file + parquet_path <- file.path(out_dir, paste0(context, "_tensor.cis_qtl_pairs.chr1.parquet")) if (!file.exists(parquet_path)) stop("TensorQTL failed: .parquet output not found") - + + # ✅ Load and convert output pd <- import("pandas", convert = FALSE) pq <- pd$read_parquet(parquet_path) py$pq <- pq - + + # ✅ Rename columns pq$rename(columns = dict( phenotype_id = "gene", variant_id = "SNP", slope = "beta", pval_nominal = "p.value" ), inplace = TRUE) - + + # ✅ Extract results and save pq_df <- py_eval("pq.loc[:, ['SNP', 'gene', 'beta', 'p.value']]", convert = TRUE) pq_df$FDR <- p.adjust(pq_df$p.value, method = "BH") pq_df <- pq_df[order(pq_df$p.value), ] From 472c5660fbc4ab719b6c7784e5940b65f14f9981 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Sun, 20 Jul 2025 21:15:02 -0400 Subject: [PATCH 14/45] Update README.md --- README.md | 47 +++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 1e33676..6bb386d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# FastGxC: A powerful and computationally efficient software for context-specific eQTL mapping in single-cell omics data +# FastGxC: A powerful and computationally efficient software for context-specific eQTL mapping in single-cell genomics data FastGxC was originally developed for single-cell data, where each individual contributes gene expression measurements across multiple cell types. @@ -28,7 +28,7 @@ library(magrittr) library(TreeQTL) ``` -\*\* Note \*\* : to install TreeQTL, qvalue must be installed first. +**Note** : To install TreeQTL, qvalue must be installed first. ``` if (!requireNamespace("qvalue", quietly = TRUE)) { @@ -36,12 +36,27 @@ if (!requireNamespace("qvalue", quietly = TRUE)) { } ``` +To install TreeBH, download the following package: [TreeBH_1.0.tar.gz](https://github.com/user-attachments/files/21328935/TreeBH_1.0.tar.gz) + +Then, run the following command: + +``` +install.packages("~/Downloads/TreeBH_1.0.tar.gz", repos = NULL, type = "source") +library(TreeBH) +``` + Once all dependencies are installed and loaded you can install FastGxC using: ``` devtools::install_github("BalliuLab/FastGxC") ``` +If devtools is not installed: + +``` +install.packages("devtools") +``` + Once FastGxC is installed, load all functions using ``` @@ -87,14 +102,13 @@ n_contexts = 10 w_corr = 0.2, # Intra-individual residual correlation between contexts v_e = 1, # Error variance per context missing = 0.05, # Fraction of missing values in the simulated expression matrix - hsq = rep(0, n_contexts), # Vector with proportion of expression heritability explained by eQTL in each context + hsq = rep(0, n_contexts), # Vector with proportion of expression heritability explained by eQTL in each context mus = rep(0, n_contexts)) # Vector with average expression in each context ``` -\*\* Note: running the code above simulates data with default parameters (300 individuals, 1,000 SNPs, 100 genes, 10 contexts, etc.), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. - -**Output Files** +**Note**: running the code above simulates data with default parameters (300 individuals, 1,000 SNPs, 100 genes, 10 contexts, etc.), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. +**Output Files**\ The simulation will generate the following files in `data_dir`: **SNPs.txt** @@ -225,11 +239,11 @@ To use this functionality, specify method = "tensorQTL" when calling eQTL_mappin **Note:** TensorQTL requires Python version 3.7 or higher to run properly. -To run TensorQTL, simply pass method = "TensorQTL." The inputs remain unchanged. +To run TensorQTL, simply pass method = TensorQTL. The inputs remain unchanged. -**Output Files**\ +**Output Files** -contextX_specific.cis_pairs.txt +contextX_specific.cis_pairs.txt / shared_shared.cis_pairs.txt ``` SNP gene beta p.value FDR @@ -245,6 +259,7 @@ snp86064 gene87 -0.371489137411118 3.10237595856035e-05 0.55054262774640 # Multiple testing adjustment ## With `TreeQTL` + To adjust for multiple testing across all contexts, genes, and genetic variants tested, FastGxC uses the hierarchical FDR procedures implemented in the R package [TreeQTL](http://bioinformatics.org/treeqtl/) via the `treeQTL_step()` function. This function requires that you run MatrixEQTL to do eQTL mapping (see step 2 above). If you used another eQTL mapping softwares, please make sure the output is in the format required by TreeQTL. You can also replace TreeQTL with other methods, e.g. [mashR](https://github.com/stephenslab/mashr), which can also lead to a considerable increase in power. @@ -257,10 +272,10 @@ Map specific-eGenes, i.e., genes with at least one context-specific eQTL ## directory with all matrixeQTL files for all contexts ## (note that this function expects files to be named in the same was as the output files from FastGxC's eQTL mapping function) -data_dir = "~/example_output_single_context_het/" -snps_location_file_name = "~/simulations/single_context_het_snpsloc.txt" -gene_location_file_name = "~/simulations/single_context_het_geneloc.txt" -out_dir = "~/example_output_single_context_het/" +data_dir = "~/simulated_example/" +snps_location_file_name = "~/simulated_example/snpsloc.txt" +gene_location_file_name = "~/simulated_example/geneloc.txt" +out_dir = "~/simulated_example/" fdr_thresh = 0.05 ## Run multiple testing correction without the four level hierarchy: @@ -289,12 +304,12 @@ treeQTL_step( ``` ## With `TreeBH` -[TreeBH](https://github.com/cbpeterson/TreeBH) is the updated version of TreeQTL and supports the implementation of custom and more complex hierarchies. FastGxC provides the functions `to_TreeBH_input()` and `treeBH_step()` to leverage TreeBH's capibilities. -The following code example demonstrates how to use these functions with the data outputted from the eQTL mapping step. In the example, the output of TreeBH will be saved to the path `~/simulated_example/treeBH_input.txt`. +[TreeBH](https://github.com/cbpeterson/TreeBH) is the updated version of TreeQTL and supports the implementation of custom and more complex hierarchies. FastGxC provides the functions `to_TreeBH_input()` and `treeBH_step()` to leverage TreeBH's capibilities. +The following code example demonstrates how to use these functions with the data outputted from the eQTL mapping step. In the example, the output of TreeBH will be saved to the path `~/simulated_example/treeBH_input.txt`. -```R +``` r context_names <- paste0("context", 1:10) shared_file <- "~/simulated_example/shared_shared.cis_pairs.txt" data_dir <- "~/simulated_example/" From 6fd2897925c59baa84f359a9a4f6d8ff3ea8ea7d Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Fri, 25 Jul 2025 14:56:46 -0400 Subject: [PATCH 15/45] Multiple Testing Changes --- .DS_Store | Bin 6148 -> 6148 bytes R/treeQTL.R | 216 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 144 insertions(+), 72 deletions(-) diff --git a/.DS_Store b/.DS_Store index 4599bdcd4231b1980296a845b7eb42590ce83722..e9df88fbf3c1b2fccd304d9be93effdb7476c11c 100644 GIT binary patch delta 21 ccmZoMXffC@iHXD1&`?Lg*wAS6ET$|`07euA`~Uy| delta 21 ccmZoMXffC@iHXC=&{#*o$ii^*ET$|`07fPT00000 diff --git a/R/treeQTL.R b/R/treeQTL.R index a69e579..b053354 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -5,86 +5,158 @@ #' @param data_dir - full filepath of the directory where eQTL output files are stored. This function assumes that files are named as outputted by FastGxC's eQTL mapping function #' @param snps_location_file_name - full filepath of the snpsloc file used in the eQTL mapping step #' @param gene_location_file_name - full filepath of the geneloc file used in the eQTL mapping step -#' @param out_dir - full filepath of the output directory that FDR adjusted eQTLs should be written out to. #' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) +#' @param out_dir - full filepath of the output directory that FDR adjusted eQTLs should be written out to. #' @param fdr_thresh - value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. #' @param four_level - boolean value (T or F) that signifies whether to use the 4-level hierarchy (set this parameter to R and test for a global eQTL across shared and specific components) or a 3-level hierarchy (this parameter is default set to F to test for shared vs specific eQTLs) #' @return outputs one file of specific eGenes across all contexts and one file of shared eGenes. Outputs an eAssociation file for each context and one for shared eQTLs with snp-gene pairs and FDR adjusted p-values. #' #' @export -treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = F){ - -# use a single thread -print(paste0("data.table getDTthreads(): ",getDTthreads())) -setDTthreads(1) -print(paste0("after setting as 1 thread; data.table getDTthreads(): ",getDTthreads())) - -# Display all warnings as they occur -options(warn=1) - -# FDR thresholds -level1=fdr_thresh -level2=fdr_thresh -level3=fdr_thresh - -# Distance for local gene-SNP pairs -cisDist = 1e6; - -snpspos = fread(file = snps_location_file_name); -genepos = fread(file = gene_location_file_name); - -## get context names -if (is.vector(context_names)) { +treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE){ + + print(paste0("data.table getDTthreads(): ", getDTthreads())) + setDTthreads(1) + print(paste0("after setting as 1 thread; data.table getDTthreads(): ", getDTthreads())) + + options(warn=1) + + level1 = fdr_thresh + level2 = fdr_thresh + level3 = fdr_thresh + + cisDist = 1e6; + + snpspos = fread(file = snps_location_file_name); + genepos = fread(file = gene_location_file_name); + + if (is.vector(context_names)) { print(paste("Input for context names is a valid vector.")) -}else{ + } else { stop(print(paste0("No valid input for context names."))) -} -# Use treeQTL to perform hierarchical FDR and get specific_eGenes, i.e. genes with at least one context-specific eQTL, and shared_eGenes, i.e. genes with at least one context-shared eQTL + } -shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], - nearby = TRUE, dist = cisDist) -shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) -shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) -names(shared_n_tests_per_gene) = c("family", "n_tests") - - -if(four_level){ - specific_eGenes=get_eGenes_multi_tissue_mod( - m_eqtl_out_dir = data_dir, - treeQTL_dir = out_dir, - tissue_names = context_names, - level1 = level1, level2 = level2, level3 = level3, - exp_suffix = "specific", - four_level = four_level, - shared_n_tests_per_gene = shared_n_tests_per_gene) - write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') -}else{ - specific_eGenes=get_eGenes_multi_tissue_mod( - m_eqtl_out_dir = data_dir, - treeQTL_dir = out_dir, - tissue_names = context_names, - level1 = level1, level2 = level2, level3 = level3, - exp_suffix = "specific", - four_level = four_level) - write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') - - pattern=("shared.all_pairs.txt") - shared_eGenes = get_eGenes(n_tests_per_gene = shared_n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), - method = "BH", - level1 = level1, level2 = level2, - slice_size = 1e+05, - silent = FALSE) - - write.table(x = shared_eGenes, file = paste0(out_dir,"shared_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') - - - eAssociations = get_eAssociations(eDiscoveries = shared_eGenes, n_tests = n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), - out_file = paste0(out_dir,"eAssoc_by_gene.context_shared.txt"), - by_snp = F, slice_size = 1e+05, - silent = FALSE) -} - + shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], + nearby = TRUE, dist = cisDist) + shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) + shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) + names(shared_n_tests_per_gene) = c("family", "n_tests") + + get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = 0.05, level2 = 0.05, level3 = 0.05, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { + pattern <- paste0("context", 1:length(tissue_names), "_", exp_suffix, ".cis_pairs.txt") + m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) + print("Constructed MatrixEQTL output files:") + print(m_eqtl_outfiles) + + if (!all(file.exists(m_eqtl_outfiles))) { + stop("Some expected MatrixEQTL files do not exist.") + } + + n_tissue <- length(tissue_names) + for (i in 1:n_tissue) { + cur_tissue_name <- tissue_names[i] + m_eqtl_out <- m_eqtl_outfiles[i] + print(paste("Computing summary statistics for tissue", cur_tissue_name)) + n_SNPs_per_gene_this_tissue <- fread(m_eqtl_out) %>% select(gene) %>% group_by(gene) %>% mutate(n = n()) %>% distinct() + colnames(n_SNPs_per_gene_this_tissue) <- c("family", "n_tests") + gene_simes_cur_tissue <- get_eGenes(n_tests_per_gene = n_SNPs_per_gene_this_tissue, m_eqtl_out = m_eqtl_out, method = "BH", level1 = 1, level2 = 1, silent = TRUE) + gene_simes_cur_tissue <- merge(gene_simes_cur_tissue, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) + gene_simes_cur_tissue$fam_p[which(is.na(gene_simes_cur_tissue$fam_p))] <- 1 + if (i == 1) { + eGene_pvals <- gene_simes_cur_tissue[, c("family", "fam_p")] + n_SNPs_per_gene_xT <- n_SNPs_per_gene_this_tissue + } else { + eGene_pvals <- merge(eGene_pvals, gene_simes_cur_tissue[, c("family", "fam_p")], by = "family", all = TRUE) + n_SNPs_per_gene_xT <- merge(n_SNPs_per_gene_xT, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) + } + names(eGene_pvals)[i + 1] <- cur_tissue_name + names(n_SNPs_per_gene_xT)[i + 1] <- cur_tissue_name + } + names(eGene_pvals)[1] <- "gene" + col_ind_pvals <- 2:(n_tissue + 1) + eGene_pvals$simes_p <- apply(eGene_pvals[, col_ind_pvals], 1, TreeQTL:::get_simes_p) + eGene_xT_qvals <- qvalue(eGene_pvals$simes_p, lambda = 0)$qvalue + R_G <- sum(eGene_xT_qvals <= level1) + print(paste("Number of cross-tissue eGenes = ", R_G)) + + if (R_G == 0) { + warning("No eGenes selected at level1; skipping lower-level selections.") + return(list( + qvalue_table = data.frame(), + raw_pval_table = eGene_pvals, + qvals = eGene_xT_qvals + )) + } + + q2_adj <- R_G * level2 / nrow(eGene_pvals) + ind_sel_simes <- which(eGene_xT_qvals <= level1) + sel_eGenes_simes <- eGene_pvals[ind_sel_simes, ] + rej_simes <- t(1 * apply(sel_eGenes_simes[, col_ind_pvals], 1, TreeQTL:::qsel_by_fam, q2_adj)) + sel_eGenes_simes$n_sel_tissues <- rowSums(rej_simes) + sel_eGenes_simes$n_tested_tissues <- rowSums(!is.na(sel_eGenes_simes[, col_ind_pvals])) + eGene_xT_sel <- data.frame(gene = sel_eGenes_simes$gene) + eGene_xT_sel <- cbind(eGene_xT_sel, rej_simes) + names(eGene_xT_sel)[2:(n_tissue + 1)] <- tissue_names + + return(list( + qvalue_table = eGene_xT_sel, + raw_pval_table = eGene_pvals, + qvals = eGene_xT_qvals + )) + } + if (four_level) { + shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) + if (length(shared_file) == 0) stop("No shared_shared.cis_pairs.txt file found.") + + to_TreeBH_input(data_dir = data_dir, shared_file = shared_file, context_names = context_names, out_dir = out_dir) + df <- read.table(file.path(out_dir, "treeBH_input.txt"), header = TRUE) + treeBH_step(matrix = df, fdr_thres = fdr_thresh, out_dir = out_dir) + + message("TreeBH multiple testing finished. Output written to ", out_dir) + return(invisible("TreeBH done")) + } else { + res = get_eGenes_multi_tissue_mod( + m_eqtl_out_dir = data_dir, + treeQTL_dir = out_dir, + tissue_names = context_names, + level1 = level1, level2 = level2, level3 = level3, + exp_suffix = "specific", + four_level = four_level, + shared_n_tests_per_gene = shared_n_tests_per_gene + ) + + specific_eGenes = res$qvalue_table + + if (nrow(specific_eGenes) == 0) { + message("No specific eGenes discovered. Skipping downstream steps.") + return(NULL) + } + + write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + + pattern = ("shared.all_pairs.txt") + shared_eGenes = get_eGenes( + n_tests_per_gene = shared_n_tests_per_gene, + m_eqtl_out = list.files(data_dir, pattern = pattern, full.names = TRUE), + method = "BH", + level1 = level1, level2 = level2, + slice_size = 1e+05, + silent = FALSE + ) + + if (nrow(shared_eGenes) == 0) { + message("No shared eGenes discovered. Skipping shared association analysis.") + return(NULL) + } + + write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + + eAssociations = get_eAssociations( + eDiscoveries = shared_eGenes, n_tests = shared_n_tests_per_gene, + m_eqtl_out = list.files(data_dir, pattern = pattern, full.names = TRUE), + out_file = paste0(out_dir, "eAssoc_by_gene.context_shared.txt"), + by_snp = FALSE, slice_size = 1e+05, + silent = FALSE + ) + } } From 58832ae77c8c1e0693cab596fe829455a02146ea Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 29 Jul 2025 12:41:35 -0400 Subject: [PATCH 16/45] Update treeQTL.R --- R/treeQTL.R | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index b053354..bfc68f7 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -129,15 +129,17 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na if (nrow(specific_eGenes) == 0) { message("No specific eGenes discovered. Skipping downstream steps.") - return(NULL) } write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') pattern = ("shared.all_pairs.txt") + shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) + if (length(shared_file) != 1) stop("Expected one shared file but found: ", length(shared_file)) + shared_eGenes = get_eGenes( n_tests_per_gene = shared_n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern, full.names = TRUE), + m_eqtl_out = shared_file, method = "BH", level1 = level1, level2 = level2, slice_size = 1e+05, @@ -152,11 +154,12 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') eAssociations = get_eAssociations( - eDiscoveries = shared_eGenes, n_tests = shared_n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern, full.names = TRUE), + eDiscoveries = shared_eGenes, + n_tests = shared_n_tests_per_gene, + m_eqtl_out = shared_file, out_file = paste0(out_dir, "eAssoc_by_gene.context_shared.txt"), by_snp = FALSE, slice_size = 1e+05, silent = FALSE ) } -} +} \ No newline at end of file From 345af8374e438ca4fc249aab0220149f3e663151 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Sun, 7 Sep 2025 08:17:47 -0400 Subject: [PATCH 17/45] Update README.md --- README.md | 328 +++--------------------------------------------------- 1 file changed, 13 insertions(+), 315 deletions(-) diff --git a/README.md b/README.md index 6bb386d..3009dcf 100644 --- a/README.md +++ b/README.md @@ -1,334 +1,32 @@ # FastGxC: A powerful and computationally efficient software for context-specific eQTL mapping in single-cell genomics data -FastGxC was originally developed for single-cell data, where each individual contributes gene expression measurements across multiple cell types. +FastGxC is a computationally efficient R package for mapping context-specific eQTLs across multiple biological conditions (e.g., tissues or cell types). It was originally designed for single-cell RNA-seq data, but also supports bulk RNA-seq from multi-context samples. -However, it can also be applied to bulk RNA-seq data when the same individuals are profiled across multiple tissues or conditions. +# Installation and Setup -In both settings, FastGxC models **repeated samples** from each individual, removing shared noise and enabling more accurate detection of context-specific genetic effects. +Before using FastGxC, make sure all required R packages are installed. -FastGxC is also **robust to missing data** —for example, when certain individuals or genes are missing in some cell types or tissues. - -Please read the [BioRxiv](https://www.biorxiv.org/content/10.1101/2021.06.17.448889v2) preprint for more details. - - - -# Package Installation and Dependencies - -FastGxC is an R package that can be loaded and used in any R environment. In order for FastGxC to run properly, the following packages are required and should be installed in R prior to using any FastGxC functions. - -``` -library(qvalue) -library(devtools) -library(dplyr) -library(data.table) -library(MatrixEQTL) -library(mvtnorm) -library(reshape2) -library(magrittr) -library(TreeQTL) -``` - -**Note** : To install TreeQTL, qvalue must be installed first. - -``` -if (!requireNamespace("qvalue", quietly = TRUE)) { - BiocManager::install("qvalue") -} -``` - -To install TreeBH, download the following package: [TreeBH_1.0.tar.gz](https://github.com/user-attachments/files/21328935/TreeBH_1.0.tar.gz) - -Then, run the following command: - -``` -install.packages("~/Downloads/TreeBH_1.0.tar.gz", repos = NULL, type = "source") -library(TreeBH) -``` - -Once all dependencies are installed and loaded you can install FastGxC using: +To install FastGxC: ``` devtools::install_github("BalliuLab/FastGxC") -``` - -If devtools is not installed: - -``` -install.packages("devtools") -``` - -Once FastGxC is installed, load all functions using - -``` library(FastGxC) ``` -Optional: Set up Python dependencies for TensorQTL (used with method = "tensor")\ -Requires: reticulate + compatible Python environment - -To check your Python setup, run in your terminal: - -``` -which python3 -``` - -Install required Python packages (Terminal only) - -``` -/your/python/path/here -m pip install numpy pandas pyarrow rpy2 torch tensorqtl -``` - -Next, start RStudio and set Python path - -``` -library(reticulate) -use_python("/your/python/path/here", required = TRUE) -py <- import_builtins() -``` - -# Simulate toy data - -To run a toy example, generate simulated data by running the following code in R: - -``` -n_contexts = 10 - data_dir_sim= "~/simulated_example/" - simulate_data(data_dir = data_dir_sim, # Path to directory where output files will be saved - N = 300, # Number of individuals - n_contexts = n_contexts, # Number of contexts - n_genes = 100, # Number of Genes - n_snps_per_gene = 1000, # Number of SNPs per gene - maf = 0.2, # Minor allele frequency for SNPs - w_corr = 0.2, # Intra-individual residual correlation between contexts - v_e = 1, # Error variance per context - missing = 0.05, # Fraction of missing values in the simulated expression matrix - hsq = rep(0, n_contexts), # Vector with proportion of expression heritability explained by eQTL in each context - mus = rep(0, n_contexts)) # Vector with average expression in each context -``` - -**Note**: running the code above simulates data with default parameters (300 individuals, 1,000 SNPs, 100 genes, 10 contexts, etc.), but this function can be run with any combination of parameter values. See all possible parameters for `simulate_data()` by running `?simulate_data` in R. +If you need help installing dependencies or Python integration, refer to the Wiki's [Installation and Dependences Guide](https://github.com/BalliuLab/FastGxC/wiki/1.-Installation-and-Dependencies) -**Output Files**\ -The simulation will generate the following files in `data_dir`: +# Installation and Setup -**SNPs.txt** +This repository is supported by a full [Wiki](https://github.com/BalliuLab/FastGxC/wiki) that includes the following: -``` -snpid ind1 ind2 ind3 ind4 ind5 ... -snp1 0 2 1 1 0 ... -snp2 1 2 0 1 1 ... -snp3 0 1 0 1 1 ... -snp4 1 2 0 1 1 ... -snp5 0 0 0 1 1 ... -``` +1. [Installation and Dependences](https://github.com/BalliuLab/FastGxC/wiki/1.-Installation-and-Dependencies) -**snpsloc.txt** +2. [Simulate Data](https://github.com/BalliuLab/FastGxC/wiki/2.-Simulate-Data) -``` -snpid chr pos context1 context2 ... context10 -snp1 chr1 1 1 1 1 -snp2 chr1 1 1 1 1 -snp3 chr1 1 1 1 1 -snp4 chr1 1 1 1 1 -snp5 chr1 1 1 1 1 -``` - -**expression.txt** +3. [Decomposition Step](https://github.com/BalliuLab/FastGxC/wiki/3.-Decomposition-Step) -``` -design gene1 gene2 gene3 ... gene100 -ind1 - context1 0.4369 -1.7087 -1.8113 ... 1.1721 -ind1 - context10 0.6437 -0.4357 -0.8296 ... -0.3944 -ind1 - context2 0.1092 -0.1294 -0.3222 ... -0.4939 -ind1 - context3 0.1234 -0.1947 -0.1111 ... -0.9999 -ind1 - context4 0.8347 -0.9876 -0.1490 ... -0.3833 -``` +4. [eQTL Mapping](https://github.com/BalliuLab/FastGxC/wiki/4.-eQTL-Mapping) -**geneloc.txt** +5. [Multiple Testing Correction](https://github.com/BalliuLab/FastGxC/wiki/5.-Multiple-Testing-Correction) -``` -geneid chr s1 s2 context1 context2 context3 context4 context5 context6 -gene1 chr1 0 1001 1 1 1 1 1 1 -gene2 chr1 100000001 100001001 1 1 1 1 1 1 -gene3 chr1 200000001 200001001 1 1 1 1 1 1 -gene4 chr1 300000001 300001001 1 1 1 1 1 1 -gene5 chr1 400000001 400001001 1 1 1 1 1 1 -gene6 chr1 500000001 500001001 1 1 1 1 1 1 -``` - -# Running FastGxC - -FastGxC works in two steps. In the first step, expression is decomposed into shared and context-specific components. In the second step, eQTLs are separately mapped on these components. - -*Step 1 - Decomposition:* For each individual, decompose the phenotype of interest (e.g. gene expression) across C contexts (e.g. tissues or cell-types) into one context-shared and C context-specific components using the `decomposition_step()` function. This function takes as imput a file with gene expression data for all individuals, genes, and contexts (see output of `simulate_data()` for the right format) and outputs one file with context-shared expression (context_shared_expression.txt) and C files with expression specific to each context (CONTEXT_NAME_specific_expression.txt). - -The following code example demonstrates how to use this function with the data we just simulated above. - -``` -data_dir_decomp = "~/simulated_example/" -exp_mat_filename = paste0(data_dir_decomp, "expression.txt") -decomposition_step(exp_mat_filename, data_dir_decomp) -``` - -**Output Files** - -context_shared_expression.txt / contextX_specific_expression.txt - -``` - ind1 ind2 ind3 ind4 ind5 -gene1 0.1834 0.0456 -0.0912 0.2314 -0.0873 -gene2 -0.1345 0.0543 0.1123 -0.0784 0.0912 -gene3 0.0034 -0.0312 0.0402 0.0105 -0.0067 -gene4 -0.1423 -0.1092 -0.0876 -0.1904 -0.1523 -gene5 0.2145 0.1432 0.1784 0.1984 0.2013 -``` - -*Step 2 - eQTL mapping:* FastGxC estimates genetic effects on the context-shared component and each of the C context-specific components separately using simple linear models. Note: Here we use the R package [MatrixEQTL](http://www.bios.unc.edu/research/genomic_software/Matrix_eQTL/) but any other software that can perform quick linear regression can be used (e.g. [FastQTL](http://fastqtl.sourceforge.net/) or [tensorqtl](https://github.com/broadinstitute/tensorqtl)). FastGxC implements eQTL mapping using its `eQTL_mapping_step()` function. - -This function take as input data needed to run MatrixEQTL and outputs eQTL summary statistics in the MatrixEQTL format. In the end, you should have one file with summary statistics for shared eQTL and C files with summary statistics for each context C. - -Below is a code example to map context-specific eQTLs and shared eQTLs using the decomposed simulated data from above. - -``` -input_dir = "~/simulated_example/" -out_dir = input_dir -expr_files <- list.files(input_dir, pattern = "_specific_expression.txt$") -nC <- length(expr_files) -context_names <- paste0("context", seq(1, nC)) - -all_contexts <- c(context_names, "shared") -all_shared_specific <- c(rep("specific", nC), "shared") - -SNP_file_name <- file.path(input_dir, "SNPs.txt") -snps_location_file_name <- file.path(input_dir, "snpsloc.txt") -gene_location_file_name <- file.path(input_dir, "geneloc.txt") - -for (i in seq_along(all_contexts)) { - context <- all_contexts[i] - shared_specific <- all_shared_specific[i] - - if (shared_specific == "shared") { - expression_file_name <- file.path(input_dir, "context_shared_expression.txt") - } else { - expression_file_name <- file.path(input_dir, paste0(context, "_specific_expression.txt")) - } - - eQTL_mapping_step( - SNP_file_name = SNP_file_name, - snps_location_file_name = snps_location_file_name, - expression_file_name = expression_file_name, - gene_location_file_name = gene_location_file_name, - context = context, - shared_specific = shared_specific, - out_dir = out_dir, - output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, ".cis_pairs.txt")), - output_file_name_tra = file.path(out_dir, paste0(context, "_", shared_specific, ".trans_pairs.txt")), - method = "MatrixEQTL", - use_model = modelLINEAR, - cis_dist = 1e6, - pv_threshold_cis = 1, - pv_threshold_tra = 0, - error_covariance = numeric() - ) -} -``` - -*Step 2 - eQTL mapping with TensorQTL (optional alternative):* FastGxC also supports cis-eQTL mapping using TensorQTL, a GPU-accelerated implementation for fast eQTL analysis. This is enabled through the R package reticulate, which allows Python functions to be called from within R. - -To use this functionality, specify method = "tensorQTL" when calling eQTL_mapping(). All input formats remain the same as for MatrixEQTL. The function returns results in a format consistent with MatrixEQTL outputs for compatibility with downstream steps. TensorQTL is particularly useful when working with large datasets due to its computational efficiency. - -**Note:** TensorQTL requires Python version 3.7 or higher to run properly. - -To run TensorQTL, simply pass method = TensorQTL. The inputs remain unchanged. - -**Output Files** - -contextX_specific.cis_pairs.txt / shared_shared.cis_pairs.txt - -``` -SNP gene beta p.value FDR -snp64928 gene65 0.418661087751389 8.4807042218939e-07 0.084807042218939 -snp42566 gene43 -0.355810463428497 7.53491371859939e-06 0.306773379105091 -snp22672 gene23 -0.394770801067352 9.20320137315272e-06 0.306773379105091 -snp73350 gene74 0.344478219747543 1.59910672991937e-05 0.399776682479843 -snp86064 gene87 -0.371489137411118 3.10237595856035e-05 0.550542627746407 -``` - -**Note:** TensorQTL writes intermediate results as .parquet files by default, but FastGxC saves the final output in .txt format for consistency with MatrixEQTL outputs. - -# Multiple testing adjustment - -## With `TreeQTL` - -To adjust for multiple testing across all contexts, genes, and genetic variants tested, FastGxC uses the hierarchical FDR procedures implemented in the R package [TreeQTL](http://bioinformatics.org/treeqtl/) via the `treeQTL_step()` function. - -This function requires that you run MatrixEQTL to do eQTL mapping (see step 2 above). If you used another eQTL mapping softwares, please make sure the output is in the format required by TreeQTL. You can also replace TreeQTL with other methods, e.g. [mashR](https://github.com/stephenslab/mashr), which can also lead to a considerable increase in power. - -The following code example demonstrates how to use this function with the data outputted from the eQTL mapping we just ran. This script take as input data needed to run TreeQTL and outputs shared and specific eGenes (two files) and eAssociation (C+1 files) summary statistics in the TreeQTL format. - -Map specific-eGenes, i.e., genes with at least one context-specific eQTL - -``` -## directory with all matrixeQTL files for all contexts -## (note that this function expects files to be named in the same was as the -output files from FastGxC's eQTL mapping function) -data_dir = "~/simulated_example/" -snps_location_file_name = "~/simulated_example/snpsloc.txt" -gene_location_file_name = "~/simulated_example/geneloc.txt" -out_dir = "~/simulated_example/" -fdr_thresh = 0.05 - -## Run multiple testing correction without the four level hierarchy: -## this will only output specfic eGenes and eAssociations -treeQTL_step( - data_dir, - snps_location_file_name, - gene_location_file_name, - context_names, - out_dir, - fdr_thresh = fdr_thresh - ) - -## Run multiple testing correction with the four level hierarchy: -## this will output specific and shared eGenes and eAssociations as well as -global eGenes -treeQTL_step( - data_dir, - snps_location_file_name, - gene_location_file_name, - context_names, - out_dir, - fdr_thresh = fdr_thresh, - four_level = T - ) -``` - -## With `TreeBH` - -[TreeBH](https://github.com/cbpeterson/TreeBH) is the updated version of TreeQTL and supports the implementation of custom and more complex hierarchies. FastGxC provides the functions `to_TreeBH_input()` and `treeBH_step()` to leverage TreeBH's capibilities. - -The following code example demonstrates how to use these functions with the data outputted from the eQTL mapping step. In the example, the output of TreeBH will be saved to the path `~/simulated_example/treeBH_input.txt`. - -``` r -context_names <- paste0("context", 1:10) -shared_file <- "~/simulated_example/shared_shared.cis_pairs.txt" -data_dir <- "~/simulated_example/" -out_dir <- "~/simulated_example" - -FastGxC::to_TreeBH_input( - data_dir = data_dir, - shared_file = shared_file, - context_names = context_names, - out_dir = out_dir -) - -out_dir <- "~/simulated_example/" -df <- read.table(out_dir) -fdr_thres <- 0.05 - -FastGxC::treeBH_step( - matrix = df, - fdr_thres = 0.05, - out_dir -) -``` +If you're unsure where to start or encounter issues, please check the [Wiki](https://github.com/BalliuLab/FastGxC/wiki) first — it covers all major steps with examples and explanations. From ea978390301df0e5a17459346b8ae7af5cb05fa9 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 18 Sep 2025 11:39:38 -0400 Subject: [PATCH 18/45] Reset treeQTL function to version from main --- R/treeQTL.R | 220 ++++++++++++++++++---------------------------------- 1 file changed, 74 insertions(+), 146 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index bfc68f7..7bfe852 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -5,161 +5,89 @@ #' @param data_dir - full filepath of the directory where eQTL output files are stored. This function assumes that files are named as outputted by FastGxC's eQTL mapping function #' @param snps_location_file_name - full filepath of the snpsloc file used in the eQTL mapping step #' @param gene_location_file_name - full filepath of the geneloc file used in the eQTL mapping step -#' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) #' @param out_dir - full filepath of the output directory that FDR adjusted eQTLs should be written out to. +#' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) #' @param fdr_thresh - value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. #' @param four_level - boolean value (T or F) that signifies whether to use the 4-level hierarchy (set this parameter to R and test for a global eQTL across shared and specific components) or a 3-level hierarchy (this parameter is default set to F to test for shared vs specific eQTLs) #' @return outputs one file of specific eGenes across all contexts and one file of shared eGenes. Outputs an eAssociation file for each context and one for shared eQTLs with snp-gene pairs and FDR adjusted p-values. #' #' @export -treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE){ - - print(paste0("data.table getDTthreads(): ", getDTthreads())) - setDTthreads(1) - print(paste0("after setting as 1 thread; data.table getDTthreads(): ", getDTthreads())) - - options(warn=1) - - level1 = fdr_thresh - level2 = fdr_thresh - level3 = fdr_thresh - - cisDist = 1e6; - - snpspos = fread(file = snps_location_file_name); - genepos = fread(file = gene_location_file_name); - - if (is.vector(context_names)) { +treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = F){ + +# use a single thread +print(paste0("data.table getDTthreads(): ",getDTthreads())) +setDTthreads(1) +print(paste0("after setting as 1 thread; data.table getDTthreads(): ",getDTthreads())) + +# Display all warnings as they occur +options(warn=1) + +# FDR thresholds +level1=fdr_thresh +level2=fdr_thresh +level3=fdr_thresh + +# Distance for local gene-SNP pairs +cisDist = 1e6; + +snpspos = fread(file = snps_location_file_name); +genepos = fread(file = gene_location_file_name); + +## get context names +if (is.vector(context_names)) { print(paste("Input for context names is a valid vector.")) - } else { +}else{ stop(print(paste0("No valid input for context names."))) - } +} +# Use treeQTL to perform hierarchical FDR and get specific_eGenes, i.e. genes with at least one context-specific eQTL, and shared_eGenes, i.e. genes with at least one context-shared eQTL - shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], - nearby = TRUE, dist = cisDist) - shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) +shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], + nearby = TRUE, dist = cisDist) +shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) + +if(ncol(shared_n_tests_per_gene) < 2){ shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) names(shared_n_tests_per_gene) = c("family", "n_tests") +} + + +if(four_level){ + specific_eGenes=get_eGenes_multi_tissue_mod( + m_eqtl_out_dir = data_dir, + treeQTL_dir = out_dir, + tissue_names = context_names, + level1 = level1, level2 = level2, level3 = level3, + exp_suffix = "specific", + four_level = four_level, + shared_n_tests_per_gene = shared_n_tests_per_gene) + write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') +}else{ + specific_eGenes=get_eGenes_multi_tissue_mod( + m_eqtl_out_dir = data_dir, + treeQTL_dir = out_dir, + tissue_names = context_names, + level1 = level1, level2 = level2, level3 = level3, + exp_suffix = "specific", + four_level = four_level) + write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') + + pattern=("shared.all_pairs.txt") + shared_eGenes = get_eGenes(n_tests_per_gene = shared_n_tests_per_gene, + m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), + method = "BH", + level1 = level1, level2 = level2, + slice_size = 1e+05, + silent = FALSE) + + write.table(x = shared_eGenes, file = paste0(out_dir,"shared_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') + + + eAssociations = get_eAssociations(eDiscoveries = shared_eGenes, n_tests = n_tests_per_gene, + m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), + out_file = paste0(out_dir,"eAssoc_by_gene.context_shared.txt"), + by_snp = F, slice_size = 1e+05, + silent = FALSE) +} + - get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = 0.05, level2 = 0.05, level3 = 0.05, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { - pattern <- paste0("context", 1:length(tissue_names), "_", exp_suffix, ".cis_pairs.txt") - m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) - print("Constructed MatrixEQTL output files:") - print(m_eqtl_outfiles) - - if (!all(file.exists(m_eqtl_outfiles))) { - stop("Some expected MatrixEQTL files do not exist.") - } - - n_tissue <- length(tissue_names) - for (i in 1:n_tissue) { - cur_tissue_name <- tissue_names[i] - m_eqtl_out <- m_eqtl_outfiles[i] - print(paste("Computing summary statistics for tissue", cur_tissue_name)) - n_SNPs_per_gene_this_tissue <- fread(m_eqtl_out) %>% select(gene) %>% group_by(gene) %>% mutate(n = n()) %>% distinct() - colnames(n_SNPs_per_gene_this_tissue) <- c("family", "n_tests") - gene_simes_cur_tissue <- get_eGenes(n_tests_per_gene = n_SNPs_per_gene_this_tissue, m_eqtl_out = m_eqtl_out, method = "BH", level1 = 1, level2 = 1, silent = TRUE) - gene_simes_cur_tissue <- merge(gene_simes_cur_tissue, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) - gene_simes_cur_tissue$fam_p[which(is.na(gene_simes_cur_tissue$fam_p))] <- 1 - if (i == 1) { - eGene_pvals <- gene_simes_cur_tissue[, c("family", "fam_p")] - n_SNPs_per_gene_xT <- n_SNPs_per_gene_this_tissue - } else { - eGene_pvals <- merge(eGene_pvals, gene_simes_cur_tissue[, c("family", "fam_p")], by = "family", all = TRUE) - n_SNPs_per_gene_xT <- merge(n_SNPs_per_gene_xT, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) - } - names(eGene_pvals)[i + 1] <- cur_tissue_name - names(n_SNPs_per_gene_xT)[i + 1] <- cur_tissue_name - } - names(eGene_pvals)[1] <- "gene" - col_ind_pvals <- 2:(n_tissue + 1) - eGene_pvals$simes_p <- apply(eGene_pvals[, col_ind_pvals], 1, TreeQTL:::get_simes_p) - eGene_xT_qvals <- qvalue(eGene_pvals$simes_p, lambda = 0)$qvalue - R_G <- sum(eGene_xT_qvals <= level1) - print(paste("Number of cross-tissue eGenes = ", R_G)) - - if (R_G == 0) { - warning("No eGenes selected at level1; skipping lower-level selections.") - return(list( - qvalue_table = data.frame(), - raw_pval_table = eGene_pvals, - qvals = eGene_xT_qvals - )) - } - - q2_adj <- R_G * level2 / nrow(eGene_pvals) - ind_sel_simes <- which(eGene_xT_qvals <= level1) - sel_eGenes_simes <- eGene_pvals[ind_sel_simes, ] - rej_simes <- t(1 * apply(sel_eGenes_simes[, col_ind_pvals], 1, TreeQTL:::qsel_by_fam, q2_adj)) - sel_eGenes_simes$n_sel_tissues <- rowSums(rej_simes) - sel_eGenes_simes$n_tested_tissues <- rowSums(!is.na(sel_eGenes_simes[, col_ind_pvals])) - eGene_xT_sel <- data.frame(gene = sel_eGenes_simes$gene) - eGene_xT_sel <- cbind(eGene_xT_sel, rej_simes) - names(eGene_xT_sel)[2:(n_tissue + 1)] <- tissue_names - - return(list( - qvalue_table = eGene_xT_sel, - raw_pval_table = eGene_pvals, - qvals = eGene_xT_qvals - )) - } - - if (four_level) { - shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) - if (length(shared_file) == 0) stop("No shared_shared.cis_pairs.txt file found.") - - to_TreeBH_input(data_dir = data_dir, shared_file = shared_file, context_names = context_names, out_dir = out_dir) - df <- read.table(file.path(out_dir, "treeBH_input.txt"), header = TRUE) - treeBH_step(matrix = df, fdr_thres = fdr_thresh, out_dir = out_dir) - - message("TreeBH multiple testing finished. Output written to ", out_dir) - return(invisible("TreeBH done")) - } else { - res = get_eGenes_multi_tissue_mod( - m_eqtl_out_dir = data_dir, - treeQTL_dir = out_dir, - tissue_names = context_names, - level1 = level1, level2 = level2, level3 = level3, - exp_suffix = "specific", - four_level = four_level, - shared_n_tests_per_gene = shared_n_tests_per_gene - ) - - specific_eGenes = res$qvalue_table - - if (nrow(specific_eGenes) == 0) { - message("No specific eGenes discovered. Skipping downstream steps.") - } - - write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') - - pattern = ("shared.all_pairs.txt") - shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) - if (length(shared_file) != 1) stop("Expected one shared file but found: ", length(shared_file)) - - shared_eGenes = get_eGenes( - n_tests_per_gene = shared_n_tests_per_gene, - m_eqtl_out = shared_file, - method = "BH", - level1 = level1, level2 = level2, - slice_size = 1e+05, - silent = FALSE - ) - - if (nrow(shared_eGenes) == 0) { - message("No shared eGenes discovered. Skipping shared association analysis.") - return(NULL) - } - - write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') - - eAssociations = get_eAssociations( - eDiscoveries = shared_eGenes, - n_tests = shared_n_tests_per_gene, - m_eqtl_out = shared_file, - out_file = paste0(out_dir, "eAssoc_by_gene.context_shared.txt"), - by_snp = FALSE, slice_size = 1e+05, - silent = FALSE - ) - } -} \ No newline at end of file +} From 807ced9559092293a96a7e75f6e89b5ee42c66d8 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 18 Sep 2025 11:46:33 -0400 Subject: [PATCH 19/45] Update treeQTL.R --- R/treeQTL.R | 132 ++++++++++++++++++++++++++-------------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index 7bfe852..f9b5060 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -13,81 +13,81 @@ #' #' @export treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = F){ - -# use a single thread -print(paste0("data.table getDTthreads(): ",getDTthreads())) -setDTthreads(1) -print(paste0("after setting as 1 thread; data.table getDTthreads(): ",getDTthreads())) - -# Display all warnings as they occur -options(warn=1) - -# FDR thresholds -level1=fdr_thresh -level2=fdr_thresh -level3=fdr_thresh - -# Distance for local gene-SNP pairs -cisDist = 1e6; - -snpspos = fread(file = snps_location_file_name); -genepos = fread(file = gene_location_file_name); - -## get context names -if (is.vector(context_names)) { + + # use a single thread + print(paste0("data.table getDTthreads(): ",getDTthreads())) + setDTthreads(1) + print(paste0("after setting as 1 thread; data.table getDTthreads(): ",getDTthreads())) + + # Display all warnings as they occur + options(warn=1) + + # FDR thresholds + level1=fdr_thresh + level2=fdr_thresh + level3=fdr_thresh + + # Distance for local gene-SNP pairs + cisDist = 1e6; + + snpspos = fread(file = snps_location_file_name); + genepos = fread(file = gene_location_file_name); + + ## get context names + if (is.vector(context_names)) { print(paste("Input for context names is a valid vector.")) -}else{ + }else{ stop(print(paste0("No valid input for context names."))) -} -# Use treeQTL to perform hierarchical FDR and get specific_eGenes, i.e. genes with at least one context-specific eQTL, and shared_eGenes, i.e. genes with at least one context-shared eQTL + } + # Use treeQTL to perform hierarchical FDR and get specific_eGenes, i.e. genes with at least one context-specific eQTL, and shared_eGenes, i.e. genes with at least one context-shared eQTL + + shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], + nearby = TRUE, dist = cisDist) + shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) + + if(ncol(shared_n_tests_per_gene) < 2){ + shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) + names(shared_n_tests_per_gene) = c("family", "n_tests") + } -shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], - nearby = TRUE, dist = cisDist) -shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) - -if(ncol(shared_n_tests_per_gene) < 2){ - shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) - names(shared_n_tests_per_gene) = c("family", "n_tests") -} - - -if(four_level){ + + if(four_level){ specific_eGenes=get_eGenes_multi_tissue_mod( - m_eqtl_out_dir = data_dir, - treeQTL_dir = out_dir, - tissue_names = context_names, - level1 = level1, level2 = level2, level3 = level3, - exp_suffix = "specific", - four_level = four_level, - shared_n_tests_per_gene = shared_n_tests_per_gene) + m_eqtl_out_dir = data_dir, + treeQTL_dir = out_dir, + tissue_names = context_names, + level1 = level1, level2 = level2, level3 = level3, + exp_suffix = "specific", + four_level = four_level, + shared_n_tests_per_gene = shared_n_tests_per_gene) write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') -}else{ + }else{ specific_eGenes=get_eGenes_multi_tissue_mod( - m_eqtl_out_dir = data_dir, - treeQTL_dir = out_dir, - tissue_names = context_names, - level1 = level1, level2 = level2, level3 = level3, - exp_suffix = "specific", - four_level = four_level) + m_eqtl_out_dir = data_dir, + treeQTL_dir = out_dir, + tissue_names = context_names, + level1 = level1, level2 = level2, level3 = level3, + exp_suffix = "specific", + four_level = four_level) write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') - + pattern=("shared.all_pairs.txt") shared_eGenes = get_eGenes(n_tests_per_gene = shared_n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), - method = "BH", - level1 = level1, level2 = level2, - slice_size = 1e+05, - silent = FALSE) - + m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), + method = "BH", + level1 = level1, level2 = level2, + slice_size = 1e+05, + silent = FALSE) + write.table(x = shared_eGenes, file = paste0(out_dir,"shared_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') - - + + eAssociations = get_eAssociations(eDiscoveries = shared_eGenes, n_tests = n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), - out_file = paste0(out_dir,"eAssoc_by_gene.context_shared.txt"), - by_snp = F, slice_size = 1e+05, - silent = FALSE) -} - + m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), + out_file = paste0(out_dir,"eAssoc_by_gene.context_shared.txt"), + by_snp = F, slice_size = 1e+05, + silent = FALSE) + } + -} +} \ No newline at end of file From 0f53953a730f8c9e3a5923cd6aa4d8a1c1ff81ef Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Mon, 22 Sep 2025 13:44:41 -0700 Subject: [PATCH 20/45] Update eQTL_mapping.R --- R/eQTL_mapping.R | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index 509b0eb..dbb5600 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -117,7 +117,8 @@ builtins.run_tensorqtl = run_tensorqtl py$phenotype_pos_df <- phenotype_pos_df py$genotype_df <- genotype_df py$variant_df <- variant_df - py$prefix <- file.path(out_dir, paste0(context, "_tensor")) + tensorqtl_prefix <- file.path(out_dir, paste0(context, "_", shared_specific)) + py$prefix <- tensorqtl_prefix # ✅ Run TensorQTL safely tryCatch({ @@ -134,7 +135,7 @@ builtins.run_tensorqtl = run_tensorqtl }) # ✅ Validate output file - parquet_path <- file.path(out_dir, paste0(context, "_tensor.cis_qtl_pairs.chr1.parquet")) + parquet_path <- paste0(py$prefix, ".cis_qtl_pairs.chr1.parquet") if (!file.exists(parquet_path)) stop("TensorQTL failed: .parquet output not found") # ✅ Load and convert output @@ -147,13 +148,13 @@ builtins.run_tensorqtl = run_tensorqtl phenotype_id = "gene", variant_id = "SNP", slope = "beta", - pval_nominal = "p.value" + pval_nominal = "p-value" ), inplace = TRUE) # ✅ Extract results and save - pq_df <- py_eval("pq.loc[:, ['SNP', 'gene', 'beta', 'p.value']]", convert = TRUE) - pq_df$FDR <- p.adjust(pq_df$p.value, method = "BH") - pq_df <- pq_df[order(pq_df$p.value), ] + pq_df <- py_eval("pq.loc[:, ['SNP', 'gene', 'beta', 'p-value']]", convert = TRUE) + pq_df$FDR <- p.adjust(pq_df$`p-value`, method = "BH") + pq_df <- pq_df[order(pq_df$`p-value`), ] write.table(pq_df, file = output_file_name_cis, sep = '\t', row.names = FALSE, quote = FALSE) } else { From 3876b5535585c11e7541c14dcc96221f27d7ef4b Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Mon, 22 Sep 2025 13:46:40 -0700 Subject: [PATCH 21/45] Update treeQTL.R --- R/treeQTL.R | 184 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 139 insertions(+), 45 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index f9b5060..7c27de5 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -12,82 +12,176 @@ #' @return outputs one file of specific eGenes across all contexts and one file of shared eGenes. Outputs an eAssociation file for each context and one for shared eQTLs with snp-gene pairs and FDR adjusted p-values. #' #' @export -treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = F){ +treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE){ - # use a single thread - print(paste0("data.table getDTthreads(): ",getDTthreads())) + print(paste0("data.table getDTthreads(): ", getDTthreads())) setDTthreads(1) - print(paste0("after setting as 1 thread; data.table getDTthreads(): ",getDTthreads())) + print(paste0("after setting as 1 thread; data.table getDTthreads(): ", getDTthreads())) - # Display all warnings as they occur options(warn=1) - # FDR thresholds - level1=fdr_thresh - level2=fdr_thresh - level3=fdr_thresh + level1 = fdr_thresh + level2 = fdr_thresh + level3 = fdr_thresh - # Distance for local gene-SNP pairs cisDist = 1e6; snpspos = fread(file = snps_location_file_name); genepos = fread(file = gene_location_file_name); - ## get context names if (is.vector(context_names)) { print(paste("Input for context names is a valid vector.")) - }else{ + } else { stop(print(paste0("No valid input for context names."))) } - # Use treeQTL to perform hierarchical FDR and get specific_eGenes, i.e. genes with at least one context-specific eQTL, and shared_eGenes, i.e. genes with at least one context-shared eQTL shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], nearby = TRUE, dist = cisDist) shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) + shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) + names(shared_n_tests_per_gene) = c("family", "n_tests") - if(ncol(shared_n_tests_per_gene) < 2){ - shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) - names(shared_n_tests_per_gene) = c("family", "n_tests") + get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = 0.05, level2 = 0.05, level3 = 0.05, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { + pattern <- paste0("context", 1:length(tissue_names), "_", exp_suffix, ".cis_pairs.txt") + m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) + print("Constructed MatrixEQTL output files:") + print(m_eqtl_outfiles) + + if (!all(file.exists(m_eqtl_outfiles))) { + stop("Some expected MatrixEQTL files do not exist.") + } + + n_tissue <- length(tissue_names) + for (i in 1:n_tissue) { + cur_tissue_name <- tissue_names[i] + m_eqtl_out <- m_eqtl_outfiles[i] + print(paste("Computing summary statistics for tissue", cur_tissue_name)) + n_SNPs_per_gene_this_tissue <- fread(m_eqtl_out) %>% select(gene) %>% group_by(gene) %>% mutate(n = n()) %>% distinct() + colnames(n_SNPs_per_gene_this_tissue) <- c("family", "n_tests") + gene_simes_cur_tissue <- get_eGenes(n_tests_per_gene = n_SNPs_per_gene_this_tissue, m_eqtl_out = m_eqtl_out, method = "BH", level1 = 1, level2 = 1, silent = TRUE) + gene_simes_cur_tissue <- merge(gene_simes_cur_tissue, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) + gene_simes_cur_tissue$fam_p[which(is.na(gene_simes_cur_tissue$fam_p))] <- 1 + gene_simes_cur_tissue$eGene <- as.integer(gene_simes_cur_tissue$fam_p <= level1) + + # Output eAssociations for specific context + context_eGenes <- gene_simes_cur_tissue[gene_simes_cur_tissue$eGene == 1, , drop = FALSE] + if (nrow(context_eGenes) > 0) { + colnames(context_eGenes)[1] <- "family" + context_eGenes$pval <- 0 + context_eGenes$n_sel <- 1 + + eAssoc_file <- paste0(treeQTL_dir, "/eAssoc_by_gene.context_", cur_tissue_name, ".txt") + get_eAssociations( + eDiscoveries = context_eGenes, + n_tests = n_SNPs_per_gene_this_tissue, + m_eqtl_out = m_eqtl_out, + out_file = eAssoc_file, + by_snp = FALSE, + slice_size = 1e+05, + silent = FALSE + ) + } + + if (i == 1) { + eGene_pvals <- gene_simes_cur_tissue[, c("family", "fam_p")] + n_SNPs_per_gene_xT <- n_SNPs_per_gene_this_tissue + } else { + eGene_pvals <- merge(eGene_pvals, gene_simes_cur_tissue[, c("family", "fam_p")], by = "family", all = TRUE) + n_SNPs_per_gene_xT <- merge(n_SNPs_per_gene_xT, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) + } + names(eGene_pvals)[i + 1] <- cur_tissue_name + names(n_SNPs_per_gene_xT)[i + 1] <- cur_tissue_name + } + names(eGene_pvals)[1] <- "gene" + col_ind_pvals <- 2:(n_tissue + 1) + eGene_pvals$simes_p <- apply(eGene_pvals[, col_ind_pvals], 1, TreeQTL:::get_simes_p) + eGene_xT_qvals <- qvalue(eGene_pvals$simes_p, lambda = 0)$qvalue + R_G <- sum(eGene_xT_qvals <= level1) + print(paste("Number of cross-tissue eGenes = ", R_G)) + + if (R_G == 0) { + warning("No eGenes selected at level1; skipping lower-level selections.") + return(list( + qvalue_table = data.frame(), + raw_pval_table = eGene_pvals, + qvals = eGene_xT_qvals + )) + } + + q2_adj <- R_G * level2 / nrow(eGene_pvals) + ind_sel_simes <- which(eGene_xT_qvals <= level1) + sel_eGenes_simes <- eGene_pvals[ind_sel_simes, ] + rej_simes <- t(1 * apply(sel_eGenes_simes[, col_ind_pvals], 1, TreeQTL:::qsel_by_fam, q2_adj)) + colnames(rej_simes) <- tissue_names + sel_eGenes_simes$n_sel_tissues <- rowSums(rej_simes) + sel_eGenes_simes$n_tested_tissues <- rowSums(!is.na(sel_eGenes_simes[, col_ind_pvals])) + eGene_xT_sel <- data.frame(gene = sel_eGenes_simes$gene) + eGene_xT_sel <- cbind(eGene_xT_sel, rej_simes) + names(eGene_xT_sel)[2:(n_tissue + 1)] <- tissue_names + + return(list( + qvalue_table = eGene_xT_sel, + raw_pval_table = eGene_pvals, + qvals = eGene_xT_qvals + )) } - - if(four_level){ - specific_eGenes=get_eGenes_multi_tissue_mod( + if (four_level) { + shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) + if (length(shared_file) == 0) stop("No shared_shared.cis_pairs.txt file found.") + + to_TreeBH_input(data_dir = data_dir, shared_file = shared_file, context_names = context_names, out_dir = out_dir) + df <- read.table(file.path(out_dir, "treeBH_input.txt"), header = TRUE) + treeBH_step(matrix = df, fdr_thres = fdr_thresh, out_dir = out_dir) + + message("TreeBH multiple testing finished. Output written to ", out_dir) + return(invisible("TreeBH done")) + } else { + res = get_eGenes_multi_tissue_mod( m_eqtl_out_dir = data_dir, treeQTL_dir = out_dir, tissue_names = context_names, level1 = level1, level2 = level2, level3 = level3, exp_suffix = "specific", four_level = four_level, - shared_n_tests_per_gene = shared_n_tests_per_gene) - write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') - }else{ - specific_eGenes=get_eGenes_multi_tissue_mod( - m_eqtl_out_dir = data_dir, - treeQTL_dir = out_dir, - tissue_names = context_names, - level1 = level1, level2 = level2, level3 = level3, - exp_suffix = "specific", - four_level = four_level) - write.table(x = specific_eGenes, file = paste0(out_dir,"specific_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') + shared_n_tests_per_gene = shared_n_tests_per_gene + ) + + specific_eGenes = res$qvalue_table + + if (nrow(specific_eGenes) == 0) { + message("No specific eGenes discovered. Skipping downstream steps.") + } - pattern=("shared.all_pairs.txt") - shared_eGenes = get_eGenes(n_tests_per_gene = shared_n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), - method = "BH", - level1 = level1, level2 = level2, - slice_size = 1e+05, - silent = FALSE) + write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') - write.table(x = shared_eGenes, file = paste0(out_dir,"shared_eGenes.txt"), quote = F, row.names = F, col.names = T, sep = '\t') + pattern = ("shared.all_pairs.txt") + shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) + if (length(shared_file) != 1) stop("Expected one shared file but found: ", length(shared_file)) + shared_eGenes = get_eGenes( + n_tests_per_gene = shared_n_tests_per_gene, + m_eqtl_out = shared_file, + method = "BH", + level1 = level1, level2 = level2, + slice_size = 1e+05, + silent = FALSE + ) - eAssociations = get_eAssociations(eDiscoveries = shared_eGenes, n_tests = n_tests_per_gene, - m_eqtl_out = list.files(data_dir, pattern = pattern,full.names = T), - out_file = paste0(out_dir,"eAssoc_by_gene.context_shared.txt"), - by_snp = F, slice_size = 1e+05, - silent = FALSE) + if (nrow(shared_eGenes) == 0) { + message("No shared eGenes discovered. Skipping shared association analysis.") + return(NULL) + } + + write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + + eAssociations = get_eAssociations( + eDiscoveries = shared_eGenes, + n_tests = shared_n_tests_per_gene, + m_eqtl_out = shared_file, + out_file = paste0(out_dir, "eAssoc_by_gene.context_shared.txt"), + by_snp = FALSE, slice_size = 1e+05, + silent = FALSE + ) } - - } \ No newline at end of file From 8489b06ebe92330a08208e062ab364c21d56c157 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Mon, 22 Sep 2025 13:55:49 -0700 Subject: [PATCH 22/45] Debug multiple testing --- R/treeBH.R | 24 ++-- R/treeQTL.R | 312 ++++++++++++++++++++++++++-------------------------- 2 files changed, 169 insertions(+), 167 deletions(-) diff --git a/R/treeBH.R b/R/treeBH.R index b067f45..bd2054d 100644 --- a/R/treeBH.R +++ b/R/treeBH.R @@ -17,7 +17,7 @@ to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { # Prepare list to hold each context-specific + shared df num_contexts <- length(context_names) df_list <- vector("list", num_contexts + 1) - + # Inline file-reading and p-value/column validation per context for (i in seq_len(num_contexts)) { context <- context_names[i] @@ -25,22 +25,22 @@ to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { files <- list.files(path = data_dir, pattern = pattern, full.names = TRUE) if (length(files) == 0) stop("No file matching pattern ", pattern) df <- readr::read_tsv(files[[1]], col_types = readr::cols()) - + # Ensure columns exist and types are correct if (!"p-value" %in% names(df)) stop("Missing 'p-value' in ", files[[1]]) p <- df[["p-value"]] if (!is.numeric(p) || any(is.na(p))) stop("`p-value` must be numeric without NAs") if (any(p < 0 | p > 1)) stop("`p-value` entries must lie between 0 and 1") - + if (!"gene" %in% names(df)) stop("Missing 'gene' in ", files[[1]]) if (!is.character(df[["gene"]])) stop("`gene` must be character in ", files[[1]]) - + if (!"SNP" %in% names(df)) stop("Missing 'SNP' in ", files[[1]]) if (!is.character(df[["SNP"]])) stop("`SNP` must be character in ", files[[1]]) - + df_list[[i]] <- df } - + # Shared file: same inline checks df_shared <- readr::read_tsv(shared_file, col_types = readr::cols()) for (col in c("p-value","gene","SNP")) { @@ -54,23 +54,23 @@ to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { } } df_list[[num_contexts + 1]] <- df_shared - + # Build grouping labels rows_per_df <- vapply(df_list, nrow, integer(1)) context_index <- rep(seq_along(df_list), times = rows_per_df) context_label <- c(context_names, "shared")[context_index] component_label <- ifelse(context_label == "shared", "shared", "specific") - + # Extract columns across all data.frames p_values <- unlist(lapply(df_list, `[[`, "p-value"), use.names = FALSE) gene_names <- unlist(lapply(df_list, `[[`, "gene"), use.names = FALSE) snp_names <- unlist(lapply(df_list, `[[`, "SNP"), use.names = FALSE) - + # Build hierarchical identifiers gene_snp_id <- paste0(gene_names, "_", snp_names) component_id <- paste0(gene_snp_id, "_", component_label) context_id <- paste0(component_id, "_", context_label) - + # Assemble final data.frame out_df <- data.frame( gene_name = gene_names, @@ -85,7 +85,7 @@ to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { ) if (!dir.exists(out_dir)) dir.create(out_dir, recursive = TRUE) - + # Write file write.table( out_df, @@ -132,4 +132,4 @@ treeBH_step <- function(matrix, fdr_thres, out_dir) { col.names = TRUE, quote = FALSE ) -} +} \ No newline at end of file diff --git a/R/treeQTL.R b/R/treeQTL.R index 7c27de5..5691c0f 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -14,174 +14,176 @@ #' @export treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE){ - print(paste0("data.table getDTthreads(): ", getDTthreads())) - setDTthreads(1) - print(paste0("after setting as 1 thread; data.table getDTthreads(): ", getDTthreads())) - - options(warn=1) - - level1 = fdr_thresh - level2 = fdr_thresh - level3 = fdr_thresh - - cisDist = 1e6; - - snpspos = fread(file = snps_location_file_name); - genepos = fread(file = gene_location_file_name); - - if (is.vector(context_names)) { - print(paste("Input for context names is a valid vector.")) - } else { - stop(print(paste0("No valid input for context names."))) - } - - shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], - nearby = TRUE, dist = cisDist) - shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) - shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) - names(shared_n_tests_per_gene) = c("family", "n_tests") - - get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = 0.05, level2 = 0.05, level3 = 0.05, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { - pattern <- paste0("context", 1:length(tissue_names), "_", exp_suffix, ".cis_pairs.txt") - m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) - print("Constructed MatrixEQTL output files:") - print(m_eqtl_outfiles) + suppressWarnings({ + print(paste0("data.table getDTthreads(): ", getDTthreads())) + setDTthreads(1) + print(paste0("after setting as 1 thread; data.table getDTthreads(): ", getDTthreads())) + + options(warn=1) + + level1 = fdr_thresh + level2 = fdr_thresh + level3 = fdr_thresh + + cisDist = 1e6; + + snpspos = fread(file = snps_location_file_name); + genepos = fread(file = gene_location_file_name); - if (!all(file.exists(m_eqtl_outfiles))) { - stop("Some expected MatrixEQTL files do not exist.") + if (is.vector(context_names)) { + print(paste("Input for context names is a valid vector.")) + } else { + stop(print(paste0("No valid input for context names."))) } - n_tissue <- length(tissue_names) - for (i in 1:n_tissue) { - cur_tissue_name <- tissue_names[i] - m_eqtl_out <- m_eqtl_outfiles[i] - print(paste("Computing summary statistics for tissue", cur_tissue_name)) - n_SNPs_per_gene_this_tissue <- fread(m_eqtl_out) %>% select(gene) %>% group_by(gene) %>% mutate(n = n()) %>% distinct() - colnames(n_SNPs_per_gene_this_tissue) <- c("family", "n_tests") - gene_simes_cur_tissue <- get_eGenes(n_tests_per_gene = n_SNPs_per_gene_this_tissue, m_eqtl_out = m_eqtl_out, method = "BH", level1 = 1, level2 = 1, silent = TRUE) - gene_simes_cur_tissue <- merge(gene_simes_cur_tissue, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) - gene_simes_cur_tissue$fam_p[which(is.na(gene_simes_cur_tissue$fam_p))] <- 1 - gene_simes_cur_tissue$eGene <- as.integer(gene_simes_cur_tissue$fam_p <= level1) + shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], + nearby = TRUE, dist = cisDist) + shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) + shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) + names(shared_n_tests_per_gene) = c("family", "n_tests") + + get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = 0.05, level2 = 0.05, level3 = 0.05, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { + pattern <- paste0("context", 1:length(tissue_names), "_", exp_suffix, ".cis_pairs.txt") + m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) + print("Constructed MatrixEQTL output files:") + print(m_eqtl_outfiles) + + if (!all(file.exists(m_eqtl_outfiles))) { + stop("Some expected MatrixEQTL files do not exist.") + } - # Output eAssociations for specific context - context_eGenes <- gene_simes_cur_tissue[gene_simes_cur_tissue$eGene == 1, , drop = FALSE] - if (nrow(context_eGenes) > 0) { - colnames(context_eGenes)[1] <- "family" - context_eGenes$pval <- 0 - context_eGenes$n_sel <- 1 + n_tissue <- length(tissue_names) + for (i in 1:n_tissue) { + cur_tissue_name <- tissue_names[i] + m_eqtl_out <- m_eqtl_outfiles[i] + print(paste("Computing summary statistics for tissue", cur_tissue_name)) + n_SNPs_per_gene_this_tissue <- fread(m_eqtl_out) %>% select(gene) %>% group_by(gene) %>% mutate(n = n()) %>% distinct() + colnames(n_SNPs_per_gene_this_tissue) <- c("family", "n_tests") + gene_simes_cur_tissue <- get_eGenes(n_tests_per_gene = n_SNPs_per_gene_this_tissue, m_eqtl_out = m_eqtl_out, method = "BH", level1 = 1, level2 = 1, silent = TRUE) + gene_simes_cur_tissue <- merge(gene_simes_cur_tissue, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) + gene_simes_cur_tissue$fam_p[which(is.na(gene_simes_cur_tissue$fam_p))] <- 1 + gene_simes_cur_tissue$eGene <- as.integer(gene_simes_cur_tissue$fam_p <= level1) - eAssoc_file <- paste0(treeQTL_dir, "/eAssoc_by_gene.context_", cur_tissue_name, ".txt") - get_eAssociations( - eDiscoveries = context_eGenes, - n_tests = n_SNPs_per_gene_this_tissue, - m_eqtl_out = m_eqtl_out, - out_file = eAssoc_file, - by_snp = FALSE, - slice_size = 1e+05, - silent = FALSE - ) + # Output eAssociations for specific context + context_eGenes <- gene_simes_cur_tissue[gene_simes_cur_tissue$eGene == 1, , drop = FALSE] + if (nrow(context_eGenes) > 0) { + colnames(context_eGenes)[1] <- "family" + context_eGenes$pval <- 0 + context_eGenes$n_sel <- 1 + + eAssoc_file <- paste0(treeQTL_dir, "/eAssoc_by_gene.context_", cur_tissue_name, ".txt") + get_eAssociations( + eDiscoveries = context_eGenes, + n_tests = n_SNPs_per_gene_this_tissue, + m_eqtl_out = m_eqtl_out, + out_file = eAssoc_file, + by_snp = FALSE, + slice_size = 1e+05, + silent = FALSE + ) + } + + if (i == 1) { + eGene_pvals <- gene_simes_cur_tissue[, c("family", "fam_p")] + n_SNPs_per_gene_xT <- n_SNPs_per_gene_this_tissue + } else { + eGene_pvals <- merge(eGene_pvals, gene_simes_cur_tissue[, c("family", "fam_p")], by = "family", all = TRUE) + n_SNPs_per_gene_xT <- merge(n_SNPs_per_gene_xT, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) + } + names(eGene_pvals)[i + 1] <- cur_tissue_name + names(n_SNPs_per_gene_xT)[i + 1] <- cur_tissue_name } + names(eGene_pvals)[1] <- "gene" + col_ind_pvals <- 2:(n_tissue + 1) + eGene_pvals$simes_p <- apply(eGene_pvals[, col_ind_pvals], 1, TreeQTL:::get_simes_p) + eGene_xT_qvals <- qvalue(eGene_pvals$simes_p, lambda = 0)$qvalue + R_G <- sum(eGene_xT_qvals <= level1) + print(paste("Number of cross-tissue eGenes = ", R_G)) - if (i == 1) { - eGene_pvals <- gene_simes_cur_tissue[, c("family", "fam_p")] - n_SNPs_per_gene_xT <- n_SNPs_per_gene_this_tissue - } else { - eGene_pvals <- merge(eGene_pvals, gene_simes_cur_tissue[, c("family", "fam_p")], by = "family", all = TRUE) - n_SNPs_per_gene_xT <- merge(n_SNPs_per_gene_xT, n_SNPs_per_gene_this_tissue, by = "family", all = TRUE) + if (R_G == 0) { + warning("No eGenes selected at level1; skipping lower-level selections.") + return(list( + qvalue_table = data.frame(), + raw_pval_table = eGene_pvals, + qvals = eGene_xT_qvals + )) } - names(eGene_pvals)[i + 1] <- cur_tissue_name - names(n_SNPs_per_gene_xT)[i + 1] <- cur_tissue_name - } - names(eGene_pvals)[1] <- "gene" - col_ind_pvals <- 2:(n_tissue + 1) - eGene_pvals$simes_p <- apply(eGene_pvals[, col_ind_pvals], 1, TreeQTL:::get_simes_p) - eGene_xT_qvals <- qvalue(eGene_pvals$simes_p, lambda = 0)$qvalue - R_G <- sum(eGene_xT_qvals <= level1) - print(paste("Number of cross-tissue eGenes = ", R_G)) - - if (R_G == 0) { - warning("No eGenes selected at level1; skipping lower-level selections.") + + q2_adj <- R_G * level2 / nrow(eGene_pvals) + ind_sel_simes <- which(eGene_xT_qvals <= level1) + sel_eGenes_simes <- eGene_pvals[ind_sel_simes, ] + rej_simes <- t(1 * apply(sel_eGenes_simes[, col_ind_pvals], 1, TreeQTL:::qsel_by_fam, q2_adj)) + colnames(rej_simes) <- tissue_names + sel_eGenes_simes$n_sel_tissues <- rowSums(rej_simes) + sel_eGenes_simes$n_tested_tissues <- rowSums(!is.na(sel_eGenes_simes[, col_ind_pvals])) + eGene_xT_sel <- data.frame(gene = sel_eGenes_simes$gene) + eGene_xT_sel <- cbind(eGene_xT_sel, rej_simes) + names(eGene_xT_sel)[2:(n_tissue + 1)] <- tissue_names + return(list( - qvalue_table = data.frame(), + qvalue_table = eGene_xT_sel, raw_pval_table = eGene_pvals, qvals = eGene_xT_qvals )) } - q2_adj <- R_G * level2 / nrow(eGene_pvals) - ind_sel_simes <- which(eGene_xT_qvals <= level1) - sel_eGenes_simes <- eGene_pvals[ind_sel_simes, ] - rej_simes <- t(1 * apply(sel_eGenes_simes[, col_ind_pvals], 1, TreeQTL:::qsel_by_fam, q2_adj)) - colnames(rej_simes) <- tissue_names - sel_eGenes_simes$n_sel_tissues <- rowSums(rej_simes) - sel_eGenes_simes$n_tested_tissues <- rowSums(!is.na(sel_eGenes_simes[, col_ind_pvals])) - eGene_xT_sel <- data.frame(gene = sel_eGenes_simes$gene) - eGene_xT_sel <- cbind(eGene_xT_sel, rej_simes) - names(eGene_xT_sel)[2:(n_tissue + 1)] <- tissue_names - - return(list( - qvalue_table = eGene_xT_sel, - raw_pval_table = eGene_pvals, - qvals = eGene_xT_qvals - )) - } - - if (four_level) { - shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) - if (length(shared_file) == 0) stop("No shared_shared.cis_pairs.txt file found.") - - to_TreeBH_input(data_dir = data_dir, shared_file = shared_file, context_names = context_names, out_dir = out_dir) - df <- read.table(file.path(out_dir, "treeBH_input.txt"), header = TRUE) - treeBH_step(matrix = df, fdr_thres = fdr_thresh, out_dir = out_dir) - - message("TreeBH multiple testing finished. Output written to ", out_dir) - return(invisible("TreeBH done")) - } else { - res = get_eGenes_multi_tissue_mod( - m_eqtl_out_dir = data_dir, - treeQTL_dir = out_dir, - tissue_names = context_names, - level1 = level1, level2 = level2, level3 = level3, - exp_suffix = "specific", - four_level = four_level, - shared_n_tests_per_gene = shared_n_tests_per_gene - ) - - specific_eGenes = res$qvalue_table - - if (nrow(specific_eGenes) == 0) { - message("No specific eGenes discovered. Skipping downstream steps.") - } - - write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') - - pattern = ("shared.all_pairs.txt") - shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) - if (length(shared_file) != 1) stop("Expected one shared file but found: ", length(shared_file)) - - shared_eGenes = get_eGenes( - n_tests_per_gene = shared_n_tests_per_gene, - m_eqtl_out = shared_file, - method = "BH", - level1 = level1, level2 = level2, - slice_size = 1e+05, - silent = FALSE - ) - - if (nrow(shared_eGenes) == 0) { - message("No shared eGenes discovered. Skipping shared association analysis.") - return(NULL) + if (four_level) { + shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) + if (length(shared_file) == 0) stop("No shared_shared.cis_pairs.txt file found.") + + to_TreeBH_input(data_dir = data_dir, shared_file = shared_file, context_names = context_names, out_dir = out_dir) + df <- read.table(file.path(out_dir, "treeBH_input.txt"), header = TRUE) + treeBH_step(matrix = df, fdr_thres = fdr_thresh, out_dir = out_dir) + + message("TreeBH multiple testing finished. Output written to ", out_dir) + return(invisible("TreeBH done")) + } else { + res = get_eGenes_multi_tissue_mod( + m_eqtl_out_dir = data_dir, + treeQTL_dir = out_dir, + tissue_names = context_names, + level1 = level1, level2 = level2, level3 = level3, + exp_suffix = "specific", + four_level = four_level, + shared_n_tests_per_gene = shared_n_tests_per_gene + ) + + specific_eGenes = res$qvalue_table + + if (nrow(specific_eGenes) == 0) { + message("No specific eGenes discovered. Skipping downstream steps.") + } + + write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + + pattern = ("shared.all_pairs.txt") + shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) + if (length(shared_file) != 1) stop("Expected one shared file but found: ", length(shared_file)) + + shared_eGenes = get_eGenes( + n_tests_per_gene = shared_n_tests_per_gene, + m_eqtl_out = shared_file, + method = "BH", + level1 = level1, level2 = level2, + slice_size = 1e+05, + silent = FALSE + ) + + if (nrow(shared_eGenes) == 0) { + message("No shared eGenes discovered. Skipping shared association analysis.") + return(NULL) + } + + write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + + eAssociations = get_eAssociations( + eDiscoveries = shared_eGenes, + n_tests = shared_n_tests_per_gene, + m_eqtl_out = shared_file, + out_file = paste0(out_dir, "eAssoc_by_gene.context_shared.txt"), + by_snp = FALSE, slice_size = 1e+05, + silent = FALSE + ) } - - write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') - - eAssociations = get_eAssociations( - eDiscoveries = shared_eGenes, - n_tests = shared_n_tests_per_gene, - m_eqtl_out = shared_file, - out_file = paste0(out_dir, "eAssoc_by_gene.context_shared.txt"), - by_snp = FALSE, slice_size = 1e+05, - silent = FALSE - ) - } + }) } \ No newline at end of file From d42d3f0ef827cc15c0dc12d985dfde09f39e559b Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 30 Sep 2025 17:17:52 -0400 Subject: [PATCH 23/45] Update DESCRIPTION --- DESCRIPTION | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c603411..4bc193a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,20 +1,32 @@ Package: FastGxC Title: Efficient and Powerful Software for Simulating Data and Detecting Context-specific eQTL Effects in Multi-context Genomic Studies -Version: 0.0.0.9000 +Version: 0.0.1 Authors@R: person("Lena", "Krockenberger", , "lkrocken@g.ucla.edu", role = c("aut", "cre"), comment = c(ORCID = "0009-0002-5987-5496")) -Description: Functions to run FastGxC decomposition and subsequent context-specific eQTL mapping with multiple testing adjustment. This software also can be used to simulate data and run eQTL mapping on toy examples. -Suggests: +Description: Functions to run FastGxC decomposition and subsequent context-specific eQTL mapping with multiple testing adjustment. This software can also simulate data and run eQTL mapping on toy examples. +License: MIT + file LICENSE +Encoding: UTF-8 +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.2 +Depends: R (>= 4.2.0) + +Imports: + devtools, dplyr, data.table, MatrixEQTL, mvtnorm, reshape2, magrittr, - TreeQTL -License: `use_mit_license()`, `use_gpl3_license()` or friends to pick a - license -Encoding: UTF-8 -Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.2 + reticulate + +Suggests: + qvalue, + TreeQTL, + TreeBH, + knitr, + rmarkdown, + testthat (>= 3.0.0) + +Config/testthat/edition: 3 From a0918076ac70d8f5d6f1d527e6d573c2f2818c50 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 30 Sep 2025 14:25:03 -0700 Subject: [PATCH 24/45] Update functions --- .gitignore | 4 ++++ NAMESPACE | 1 + R/R.Rproj | 14 ++++++++++++ R/deps.R | 46 ++++++++++++++++++++++++++++++++++++++++ man/eQTL_mapping_step.Rd | 9 ++++++-- man/install_deps.Rd | 15 +++++++++++++ man/treeQTL_step.Rd | 2 +- 7 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 R/R.Rproj create mode 100644 R/deps.R create mode 100644 man/install_deps.Rd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b6a065 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.Rproj.user +.Rhistory +.RData +.Ruserdata diff --git a/NAMESPACE b/NAMESPACE index 243257d..6164fad 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,6 +6,7 @@ export(eQTL_mapping_step) export(get_eGenes_multi_tissue_mod) export(get_eSNPs_multi_tissue_mod) export(get_pvals_and_fam_p_mod) +export(install_deps) export(simulate_data) export(to_TreeBH_input) export(treeBH_step) diff --git a/R/R.Rproj b/R/R.Rproj new file mode 100644 index 0000000..0345f05 --- /dev/null +++ b/R/R.Rproj @@ -0,0 +1,14 @@ +Version: 1.0 +ProjectId: d1a319e7-3038-4366-839c-40f5c13f51d9 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX diff --git a/R/deps.R b/R/deps.R new file mode 100644 index 0000000..f21c55f --- /dev/null +++ b/R/deps.R @@ -0,0 +1,46 @@ +# R/deps.R + +#' Install FastGxC dependencies +#' +#' Installs CRAN, Bioconductor, and source packages required by FastGxC. +#' This includes optional packages like qvalue, TreeQTL, and TreeBH. +#' +#' @param ask Logical, whether to ask before installing (default: TRUE if interactive). +#' @export +install_deps <- function(ask = interactive()) { + # --- Core CRAN packages (should already install via Imports:) --- + cran_pkgs <- c("devtools","dplyr","data.table","MatrixEQTL", + "mvtnorm","reshape2","magrittr","reticulate") + to_install <- cran_pkgs[!cran_pkgs %in% rownames(installed.packages())] + if (length(to_install)) { + msg <- paste("Installing missing CRAN packages:", paste(to_install, collapse = ", ")) + if (!ask || utils::menu(c("Yes","No"), title = msg) == 1) { + install.packages(to_install) + } + } + + # --- Bioconductor package: qvalue --- + if (!requireNamespace("qvalue", quietly = TRUE)) { + message("Installing Bioconductor package: qvalue") + if (!requireNamespace("BiocManager", quietly = TRUE)) { + install.packages("BiocManager") + } + BiocManager::install("qvalue") + } + + # --- Source-only package: TreeQTL --- + if (!requireNamespace("TreeQTL", quietly = TRUE)) { + message("Installing TreeQTL from source tarball") + utils::install.packages("http://bioinformatics.org/treeqtl/TreeQTL_2.0.tar.gz", + repos = NULL, type = "source") + } + + # --- Source-only package: TreeBH --- + if (!requireNamespace("TreeBH", quietly = TRUE)) { + message("Installing TreeBH from source tarball") + utils::install.packages("https://github.com/user-attachments/files/21328935/TreeBH_1.0.tar.gz", + repos = NULL, type = "source") + } + + message("All FastGxC dependencies are installed or already present.") +} diff --git a/man/eQTL_mapping_step.Rd b/man/eQTL_mapping_step.Rd index 847c8ec..e50267e 100644 --- a/man/eQTL_mapping_step.Rd +++ b/man/eQTL_mapping_step.Rd @@ -10,9 +10,12 @@ eQTL_mapping_step( expression_file_name, gene_location_file_name, context, + shared_specific, out_dir, - output_file_name_cis = output_file_name_cis, - output_file_name_tra = output_file_name_tra, + output_file_name_cis = file.path(out_dir, paste0(context, "_", shared_specific, + ".cis_pairs.txt")), + output_file_name_tra = file.path(out_dir, paste0(context, "_", shared_specific, + ".trans_pairs.txt")), method = "MatrixEQTL", use_model = modelLINEAR, cis_dist = 1e+06, @@ -32,6 +35,8 @@ eQTL_mapping_step( \item{context}{Context name for labeling output.} +\item{shared_specific}{Context specific or context shared} + \item{out_dir}{Output directory.} \item{output_file_name_cis}{Path to write cis-eQTL output.} diff --git a/man/install_deps.Rd b/man/install_deps.Rd new file mode 100644 index 0000000..5331481 --- /dev/null +++ b/man/install_deps.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/deps.R +\name{install_deps} +\alias{install_deps} +\title{Install FastGxC dependencies} +\usage{ +install_deps(ask = interactive()) +} +\arguments{ +\item{ask}{Logical, whether to ask before installing (default: TRUE if interactive).} +} +\description{ +Installs CRAN, Bioconductor, and source packages required by FastGxC. +This includes optional packages like qvalue, TreeQTL, and TreeBH. +} diff --git a/man/treeQTL_step.Rd b/man/treeQTL_step.Rd index 7c95d47..ba9e2ed 100644 --- a/man/treeQTL_step.Rd +++ b/man/treeQTL_step.Rd @@ -11,7 +11,7 @@ treeQTL_step( context_names, out_dir, fdr_thresh = 0.05, - four_level = F + four_level = FALSE ) } \arguments{ From a044b924026ce7be5ce92cc48fd7db2eaf8dde1b Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 30 Sep 2025 17:26:16 -0400 Subject: [PATCH 25/45] Delete R/R.Rproj --- R/R.Rproj | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 R/R.Rproj diff --git a/R/R.Rproj b/R/R.Rproj deleted file mode 100644 index 0345f05..0000000 --- a/R/R.Rproj +++ /dev/null @@ -1,14 +0,0 @@ -Version: 1.0 -ProjectId: d1a319e7-3038-4366-839c-40f5c13f51d9 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX From c09d7c8845726ab35ddaaa22b4c377819b0a1114 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 30 Sep 2025 14:29:05 -0700 Subject: [PATCH 26/45] Delete R.Rproj --- R/R.Rproj | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 R/R.Rproj diff --git a/R/R.Rproj b/R/R.Rproj deleted file mode 100644 index 0345f05..0000000 --- a/R/R.Rproj +++ /dev/null @@ -1,14 +0,0 @@ -Version: 1.0 -ProjectId: d1a319e7-3038-4366-839c-40f5c13f51d9 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX From 4876b574628ae9a5e4a3c3065fbe2263b8b2a549 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 2 Oct 2025 13:39:43 -0700 Subject: [PATCH 27/45] Bug changes --- R/.DS_Store | Bin 0 -> 6148 bytes R/treeQTL.R | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 R/.DS_Store diff --git a/R/.DS_Store b/R/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Tue, 7 Oct 2025 08:49:32 -0700 Subject: [PATCH 28/45] Brief Cleaning of Files --- R/decompose.R | 119 +++++++++++++++++++++++++++------------------- R/simulate_data.R | 101 +++++++++++++++++++++++++-------------- 2 files changed, 135 insertions(+), 85 deletions(-) diff --git a/R/decompose.R b/R/decompose.R index a53c5e9..57de60f 100644 --- a/R/decompose.R +++ b/R/decompose.R @@ -8,52 +8,73 @@ #' #' @export decomposition_step = function(exp_mat_filename, data_dir){ -if(!dir.exists(data_dir)) dir.create(data_dir) -#%%%%%%%%%%%%%%% Read expression matrix, genes in columns, samples in rows. -#exp_mat=read.table(file = paste0(data_dir,exp_mat_filename), sep = '\t') -exp_mat=data.table::fread(file = exp_mat_filename, sep = '\t', data.table = F) - -#%%%%%%%%%%%%%%% Sample and context names -design=sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[1]) -context_names=sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[2]) -contexts=unique(context_names) - -#%%%%%%%%%%%%%%% Decompose expression into homogeneous and heterogeneous context expression -print("Decomposing data") -rownames(exp_mat) = exp_mat[,1] -exp_mat = exp_mat[,-1] - -#%%%%%%%%%%%%%%% Print number of genes and samples -string1 = sprintf("There are %s samples and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s. \n", nrow(exp_mat), ncol(exp_mat),max(colSums(is.na(exp_mat))),max(rowSums(is.na(exp_mat)))) -cat(string1) - -dec_exp_all=decompose(X = exp_mat, design = design) -bexp_all=dec_exp_all$Xb -wexp_all=dec_exp_all$Xw -bexp_all[is.nan(bexp_all)]=NA -wexp_all[is.nan(wexp_all)]=NA - -string2 = sprintf("Between individual matrix: There are %s individuals and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s. \n", nrow(bexp_all), ncol(bexp_all),max(colSums(is.na(bexp_all))),max(rowSums(is.na(bexp_all)))) -cat(string2) - -string3 = sprintf("Within individual matrix: There are %s samples and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s. \n", nrow(wexp_all), ncol(wexp_all),max(colSums(is.na(wexp_all))),max(rowSums(is.na(wexp_all)))) -cat(string3) - -#%%%%%%%%%%%%%%% Save decomposed expression files -print("Finished decomposition, saving files") - -print("Saving between-individuals variation matrix") -fwrite(x = data.table::data.table(t(bexp_all),keep.rownames = T) %>% {setnames(., old = "rn", new = "geneID")[]}, - file = paste0(data_dir,"context_shared_expression.txt"), quote = F, row.names = F, - col.names = T, append = F, sep = '\t') - -print("Saving within-individuals variation matrix for context: ") -for(i in 1:length(contexts)){ - print(contexts[i]) - wexp_t = wexp_all[grep(pattern = paste0(contexts[i],"$"), rownames(wexp_all)),] - rownames(wexp_t)=gsub(pattern = paste0(" - ",contexts[i]), replacement = "", x = rownames(wexp_t)) - fwrite(x = data.table::data.table(t(wexp_t),keep.rownames = T) %>% {setnames(., old = "rn", new = "geneID")[]}, - file = paste0(data_dir,contexts[i],"_specific_expression.txt"),quote = F, row.names = F, - col.names = T, append = F, sep = '\t') -} -} + if(!dir.exists(data_dir)) dir.create(data_dir) + + exp_mat = data.table::fread(file = exp_mat_filename, sep = '\t', data.table = FALSE) + + design = sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[1]) + context_names = sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[2]) + contexts = unique(context_names) + + print("Decomposing data") + rownames(exp_mat) = exp_mat[,1] + exp_mat = exp_mat[, -1] + + cat(sprintf("There are %s samples and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s.\n", + nrow(exp_mat), ncol(exp_mat), max(colSums(is.na(exp_mat))), max(rowSums(is.na(exp_mat))))) + + dec_exp_all = decompose(X = exp_mat, design = design) + bexp_all = dec_exp_all$Xb + wexp_all = dec_exp_all$Xw + bexp_all[is.nan(bexp_all)] = NA + wexp_all[is.nan(wexp_all)] = NA + + cat(sprintf("Between-individual matrix: %s individuals, %s genes. Max missing per gene: %s. Max missing per sample: %s.\n", + nrow(bexp_all), ncol(bexp_all), max(colSums(is.na(bexp_all))), max(rowSums(is.na(bexp_all))))) + cat(sprintf("Within-individual matrix: %s samples, %s genes. Max missing per gene: %s. Max missing per sample: %s.\n", + nrow(wexp_all), ncol(wexp_all), max(colSums(is.na(wexp_all))), max(rowSums(is.na(wexp_all))))) + + # Function to clean expression files + clean_expr_file <- function(f, n_individuals = 300) { + lines <- readLines(f) + header <- strsplit(lines[1], "\t")[[1]] + if (header[1] == "") header <- header[-1] + header <- header[header != "V301"] + correct_header <- c("geneID", paste0("ind", 1:n_individuals)) + rows <- strsplit(lines[-1], "\t") + maxlen <- max(sapply(rows, length)) + rows <- lapply(rows, function(x) { length(x) <- maxlen; x }) + mat <- do.call(rbind, rows) + df <- as.data.frame(mat, stringsAsFactors = FALSE) + colnames(df) <- correct_header + for (j in 2:ncol(df)) df[[j]] <- suppressWarnings(as.numeric(df[[j]])) + rownames(df) <- df$geneID + df <- df[, -1] + write.table(df, file = f, sep = "\t", row.names = TRUE, col.names = NA, quote = FALSE) + } + + # Save shared expression matrix + print("Saving between-individuals variation matrix") + shared_file <- paste0(data_dir, "context_shared_expression.txt") + fwrite( + x = data.table::data.table(t(bexp_all), keep.rownames = TRUE) %>% + { setnames(., old = "rn", new = "geneID")[] }, + file = shared_file, quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t" + ) + clean_expr_file(shared_file) + + # Save context-specific expression matrices + print("Saving within-individuals variation matrix for context:") + for (i in seq_along(contexts)) { + print(contexts[i]) + wexp_t = wexp_all[grep(pattern = paste0(contexts[i], "$"), rownames(wexp_all)), ] + rownames(wexp_t) = gsub(pattern = paste0(" - ", contexts[i]), replacement = "", x = rownames(wexp_t)) + context_file <- paste0(data_dir, contexts[i], "_specific_expression.txt") + fwrite( + x = data.table::data.table(t(wexp_t), keep.rownames = TRUE) %>% + { setnames(., old = "rn", new = "geneID")[] }, + file = context_file, quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t" + ) + clean_expr_file(context_file) + } +} \ No newline at end of file diff --git a/R/simulate_data.R b/R/simulate_data.R index 0e6586d..59ef019 100644 --- a/R/simulate_data.R +++ b/R/simulate_data.R @@ -24,64 +24,93 @@ #' #' @export simulate_data = function(data_dir, N = 300, n_genes = 100, n_snps_per_gene = 1000, - n_contexts = 10, maf = 0.2, w_corr = 0.2, - v_e = 1, missing = 0, - hsq = rep(0,n_contexts), - mus = rep(0, n_contexts)) { + n_contexts = 10, maf = 0.2, w_corr = 0.2, + v_e = 1, missing = 0, + hsq = rep(0,n_contexts), + mus = rep(0, n_contexts)) { + + clean_expr_file <- function(f) { + lines <- readLines(f) + header <- strsplit(lines[1], "\t")[[1]] + if (header[1] == "") header <- header[-1] + header <- header[header != "V301"] + correct_header <- c("geneID", paste0("ind", 1:N)) + + rows <- strsplit(lines[-1], "\t") + maxlen <- max(sapply(rows, length)) + rows <- lapply(rows, function(x) { length(x) <- maxlen; x }) + mat <- do.call(rbind, rows) + df <- as.data.frame(mat, stringsAsFactors = FALSE) + colnames(df) <- correct_header + for (j in 2:ncol(df)) df[[j]] <- suppressWarnings(as.numeric(df[[j]])) + rownames(df) <- df$geneID + df <- df[, -1] + write.table(df, file = f, sep = "\t", row.names = TRUE, col.names = NA, quote = FALSE) + } + if (!dir.exists(data_dir)) dir.create(data_dir) sigma = matrix(w_corr, nrow = n_contexts, ncol = n_contexts) diag(sigma) = v_e - genos = sapply(X = 1:(n_snps_per_gene * n_genes), FUN = function(X) rbinom(N, 2, maf)) + genos = sapply(1:(n_snps_per_gene * n_genes), function(X) rbinom(N, 2, maf)) colnames(genos) = paste0("snp", 1:(n_snps_per_gene * n_genes)) rownames(genos) = paste0("ind", 1:N) - write.table(x = t(data.table(genos, keep.rownames = T) %>% - rename(snpid = rn)), file = paste0(data_dir, "SNPs.txt"), quote = F, sep = "\t", row.names = T, col.names = F) + write.table(t(data.table(genos, keep.rownames = TRUE) %>% + rename(snpid = rn)), + file = paste0(data_dir, "SNPs.txt"), quote = FALSE, sep = "\t", row.names = TRUE, col.names = FALSE) print("Finished simulating and saving genotypes") + snp_loc = data.frame(snpid = colnames(genos), chr = "chr1", - pos = rep(x = seq(1, n_genes * 1e+09, by = 1e+09), each = n_snps_per_gene), - matrix(data = 1, nrow = ncol(genos), ncol = n_contexts, + pos = rep(seq(1, n_genes * 1e9, by = 1e9), each = n_snps_per_gene), + matrix(1, nrow = ncol(genos), ncol = n_contexts, dimnames = list(NULL, paste0("context", 1:n_contexts)))) - write.table(x = snp_loc, file = paste0(data_dir,"snpsloc.txt"), quote = F, sep = "\t", row.names = F, - col.names = T) + write.table(snp_loc, file = paste0(data_dir, "snpsloc.txt"), quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) print("Finished saving snp location file") + gene_loc = data.frame(geneid = paste0("gene", 1:n_genes), - chr = "chr1", s1 = seq(1, n_genes * 1e+09, by = 1e+09), - s2 = seq(1, n_genes * 1e+09, by = 1e+09) + 1000, matrix(data = 1, - nrow = n_genes, - ncol = n_contexts, - dimnames = list(NULL, - paste0("context", 1:n_contexts)))) - write.table(x = gene_loc, file = paste0(data_dir, "geneloc.txt"), quote = F, sep = "\t", row.names = F, - col.names = T) + chr = "chr1", s1 = seq(1, n_genes * 1e9, by = 1e9), + s2 = seq(1, n_genes * 1e9, by = 1e9) + 1000, + matrix(1, nrow = n_genes, ncol = n_contexts, + dimnames = list(NULL, paste0("context", 1:n_contexts)))) + write.table(gene_loc, file = paste0(data_dir, "geneloc.txt"), quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) print("Finished saving gene location file") - genos_with_effect = genos[, seq(from = 1, to = (n_snps_per_gene * - n_genes), by = n_snps_per_gene)] - exp_mat = expand.grid(iid = paste0("ind", 1:N), context = paste0("context", - 1:n_contexts)) - which_context = rep_len(x = 1:n_contexts, length.out = n_genes) + + genos_with_effect = genos[, seq(from = 1, to = (n_snps_per_gene * n_genes), by = n_snps_per_gene)] + exp_mat = expand.grid(iid = paste0("ind", 1:N), context = paste0("context", 1:n_contexts)) + which_context = rep_len(1:n_contexts, length.out = n_genes) + for (i in 1:n_genes) { - betas = sqrt((hsq * v_e)/((1 - hsq) * var(genos_with_effect[, i]))) - Y = matrix(0, nrow = N, ncol = n_contexts, dimnames = list(paste0("ind", 1:N), paste0("context", 1:n_contexts))) - for (j in 1:n_contexts) Y[, j] = mus[j] + genos_with_effect[, i] * betas[j] - for (j in 1:N) Y[j, ] = Y[j, ] + rmvnorm(1, rep(0, n_contexts), sigma) - data_mat = melt(data = data.table(Y, keep.rownames = T), - id.vars = "rn") + betas = sqrt((hsq * v_e) / ((1 - hsq) * var(genos_with_effect[, i]))) + Y = matrix(0, nrow = N, ncol = n_contexts, + dimnames = list(paste0("ind", 1:N), paste0("context", 1:n_contexts))) + for (j in 1:n_contexts) { + Y[, j] = mus[j] + genos_with_effect[, i] * betas[j] + } + for (j in 1:N) { + Y[j, ] = Y[j, ] + rmvnorm(1, rep(0, n_contexts), sigma) + } + data_mat = melt(data.table(Y, keep.rownames = TRUE), id.vars = "rn") colnames(data_mat) = c("iid", "context", paste0("gene", i)) - exp_mat = merge(x = exp_mat, y = data_mat) + exp_mat = merge(exp_mat, data_mat) } + rownames(exp_mat) = paste(exp_mat$iid, exp_mat$context, sep = " - ") - exp_mat = cbind(data.frame(design = paste(exp_mat$iid, exp_mat$context, sep = " - ")), exp_mat) + exp_mat = cbind(data.frame(design = paste(exp_mat$iid, exp_mat$context, sep = " - ")), exp_mat) total_elements = prod(dim(exp_mat[, -c(1:3)])) missing_elements = floor(missing * total_elements) missing_indices = sample(1:total_elements, missing_elements) identifiers = exp_mat[, 1:3] exp_mat_missing = as.vector(as.matrix(exp_mat[, -c(1:3)])) exp_mat_missing[missing_indices] = NA - exp_mat_missing = matrix(exp_mat_missing, nrow = nrow(exp_mat), ncol = ncol(exp_mat) - 3) + exp_mat_missing = matrix(exp_mat_missing, nrow = nrow(exp_mat), ncol = ncol(exp_mat) - 3) exp_mat_missing = as.data.frame(exp_mat_missing) exp_mat_missing = cbind(identifiers, exp_mat_missing) colnames(exp_mat_missing) = colnames(exp_mat) - write.table(x = exp_mat_missing[, -c(2:3)], file = paste0(data_dir, "expression.txt"), quote = F, - sep = "\t", row.names = F, col.names = T) + + expr_file_path <- file.path(data_dir, "expression.txt") + write.table(exp_mat_missing[, -c(2:3)], file = expr_file_path, + quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) print("Finished simulating and saving expression file") -} + + clean_expr_file(expr_file_path) + print("Cleaned expression file for downstream compatibility") +} \ No newline at end of file From 8ff60f1f2197b99b020c8977504506c3978171ff Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 7 Oct 2025 08:51:20 -0700 Subject: [PATCH 29/45] Change back --- R/decompose.R | 119 +++++++++++++++++++--------------------------- R/simulate_data.R | 101 ++++++++++++++------------------------- 2 files changed, 85 insertions(+), 135 deletions(-) diff --git a/R/decompose.R b/R/decompose.R index 57de60f..a53c5e9 100644 --- a/R/decompose.R +++ b/R/decompose.R @@ -8,73 +8,52 @@ #' #' @export decomposition_step = function(exp_mat_filename, data_dir){ - if(!dir.exists(data_dir)) dir.create(data_dir) - - exp_mat = data.table::fread(file = exp_mat_filename, sep = '\t', data.table = FALSE) - - design = sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[1]) - context_names = sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[2]) - contexts = unique(context_names) - - print("Decomposing data") - rownames(exp_mat) = exp_mat[,1] - exp_mat = exp_mat[, -1] - - cat(sprintf("There are %s samples and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s.\n", - nrow(exp_mat), ncol(exp_mat), max(colSums(is.na(exp_mat))), max(rowSums(is.na(exp_mat))))) - - dec_exp_all = decompose(X = exp_mat, design = design) - bexp_all = dec_exp_all$Xb - wexp_all = dec_exp_all$Xw - bexp_all[is.nan(bexp_all)] = NA - wexp_all[is.nan(wexp_all)] = NA - - cat(sprintf("Between-individual matrix: %s individuals, %s genes. Max missing per gene: %s. Max missing per sample: %s.\n", - nrow(bexp_all), ncol(bexp_all), max(colSums(is.na(bexp_all))), max(rowSums(is.na(bexp_all))))) - cat(sprintf("Within-individual matrix: %s samples, %s genes. Max missing per gene: %s. Max missing per sample: %s.\n", - nrow(wexp_all), ncol(wexp_all), max(colSums(is.na(wexp_all))), max(rowSums(is.na(wexp_all))))) - - # Function to clean expression files - clean_expr_file <- function(f, n_individuals = 300) { - lines <- readLines(f) - header <- strsplit(lines[1], "\t")[[1]] - if (header[1] == "") header <- header[-1] - header <- header[header != "V301"] - correct_header <- c("geneID", paste0("ind", 1:n_individuals)) - rows <- strsplit(lines[-1], "\t") - maxlen <- max(sapply(rows, length)) - rows <- lapply(rows, function(x) { length(x) <- maxlen; x }) - mat <- do.call(rbind, rows) - df <- as.data.frame(mat, stringsAsFactors = FALSE) - colnames(df) <- correct_header - for (j in 2:ncol(df)) df[[j]] <- suppressWarnings(as.numeric(df[[j]])) - rownames(df) <- df$geneID - df <- df[, -1] - write.table(df, file = f, sep = "\t", row.names = TRUE, col.names = NA, quote = FALSE) - } - - # Save shared expression matrix - print("Saving between-individuals variation matrix") - shared_file <- paste0(data_dir, "context_shared_expression.txt") - fwrite( - x = data.table::data.table(t(bexp_all), keep.rownames = TRUE) %>% - { setnames(., old = "rn", new = "geneID")[] }, - file = shared_file, quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t" - ) - clean_expr_file(shared_file) - - # Save context-specific expression matrices - print("Saving within-individuals variation matrix for context:") - for (i in seq_along(contexts)) { - print(contexts[i]) - wexp_t = wexp_all[grep(pattern = paste0(contexts[i], "$"), rownames(wexp_all)), ] - rownames(wexp_t) = gsub(pattern = paste0(" - ", contexts[i]), replacement = "", x = rownames(wexp_t)) - context_file <- paste0(data_dir, contexts[i], "_specific_expression.txt") - fwrite( - x = data.table::data.table(t(wexp_t), keep.rownames = TRUE) %>% - { setnames(., old = "rn", new = "geneID")[] }, - file = context_file, quote = FALSE, row.names = FALSE, col.names = TRUE, sep = "\t" - ) - clean_expr_file(context_file) - } -} \ No newline at end of file +if(!dir.exists(data_dir)) dir.create(data_dir) +#%%%%%%%%%%%%%%% Read expression matrix, genes in columns, samples in rows. +#exp_mat=read.table(file = paste0(data_dir,exp_mat_filename), sep = '\t') +exp_mat=data.table::fread(file = exp_mat_filename, sep = '\t', data.table = F) + +#%%%%%%%%%%%%%%% Sample and context names +design=sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[1]) +context_names=sapply(1:nrow(exp_mat), function(i) unlist(strsplit(exp_mat[,1][i], split = " - "))[2]) +contexts=unique(context_names) + +#%%%%%%%%%%%%%%% Decompose expression into homogeneous and heterogeneous context expression +print("Decomposing data") +rownames(exp_mat) = exp_mat[,1] +exp_mat = exp_mat[,-1] + +#%%%%%%%%%%%%%%% Print number of genes and samples +string1 = sprintf("There are %s samples and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s. \n", nrow(exp_mat), ncol(exp_mat),max(colSums(is.na(exp_mat))),max(rowSums(is.na(exp_mat)))) +cat(string1) + +dec_exp_all=decompose(X = exp_mat, design = design) +bexp_all=dec_exp_all$Xb +wexp_all=dec_exp_all$Xw +bexp_all[is.nan(bexp_all)]=NA +wexp_all[is.nan(wexp_all)]=NA + +string2 = sprintf("Between individual matrix: There are %s individuals and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s. \n", nrow(bexp_all), ncol(bexp_all),max(colSums(is.na(bexp_all))),max(rowSums(is.na(bexp_all)))) +cat(string2) + +string3 = sprintf("Within individual matrix: There are %s samples and %s genes. The max number of missing samples for a gene is %s. The max number of missing genes for a sample is %s. \n", nrow(wexp_all), ncol(wexp_all),max(colSums(is.na(wexp_all))),max(rowSums(is.na(wexp_all)))) +cat(string3) + +#%%%%%%%%%%%%%%% Save decomposed expression files +print("Finished decomposition, saving files") + +print("Saving between-individuals variation matrix") +fwrite(x = data.table::data.table(t(bexp_all),keep.rownames = T) %>% {setnames(., old = "rn", new = "geneID")[]}, + file = paste0(data_dir,"context_shared_expression.txt"), quote = F, row.names = F, + col.names = T, append = F, sep = '\t') + +print("Saving within-individuals variation matrix for context: ") +for(i in 1:length(contexts)){ + print(contexts[i]) + wexp_t = wexp_all[grep(pattern = paste0(contexts[i],"$"), rownames(wexp_all)),] + rownames(wexp_t)=gsub(pattern = paste0(" - ",contexts[i]), replacement = "", x = rownames(wexp_t)) + fwrite(x = data.table::data.table(t(wexp_t),keep.rownames = T) %>% {setnames(., old = "rn", new = "geneID")[]}, + file = paste0(data_dir,contexts[i],"_specific_expression.txt"),quote = F, row.names = F, + col.names = T, append = F, sep = '\t') +} +} diff --git a/R/simulate_data.R b/R/simulate_data.R index 59ef019..0e6586d 100644 --- a/R/simulate_data.R +++ b/R/simulate_data.R @@ -24,93 +24,64 @@ #' #' @export simulate_data = function(data_dir, N = 300, n_genes = 100, n_snps_per_gene = 1000, - n_contexts = 10, maf = 0.2, w_corr = 0.2, - v_e = 1, missing = 0, - hsq = rep(0,n_contexts), - mus = rep(0, n_contexts)) { - - clean_expr_file <- function(f) { - lines <- readLines(f) - header <- strsplit(lines[1], "\t")[[1]] - if (header[1] == "") header <- header[-1] - header <- header[header != "V301"] - correct_header <- c("geneID", paste0("ind", 1:N)) - - rows <- strsplit(lines[-1], "\t") - maxlen <- max(sapply(rows, length)) - rows <- lapply(rows, function(x) { length(x) <- maxlen; x }) - mat <- do.call(rbind, rows) - df <- as.data.frame(mat, stringsAsFactors = FALSE) - colnames(df) <- correct_header - for (j in 2:ncol(df)) df[[j]] <- suppressWarnings(as.numeric(df[[j]])) - rownames(df) <- df$geneID - df <- df[, -1] - write.table(df, file = f, sep = "\t", row.names = TRUE, col.names = NA, quote = FALSE) - } - + n_contexts = 10, maf = 0.2, w_corr = 0.2, + v_e = 1, missing = 0, + hsq = rep(0,n_contexts), + mus = rep(0, n_contexts)) { if (!dir.exists(data_dir)) dir.create(data_dir) sigma = matrix(w_corr, nrow = n_contexts, ncol = n_contexts) diag(sigma) = v_e - genos = sapply(1:(n_snps_per_gene * n_genes), function(X) rbinom(N, 2, maf)) + genos = sapply(X = 1:(n_snps_per_gene * n_genes), FUN = function(X) rbinom(N, 2, maf)) colnames(genos) = paste0("snp", 1:(n_snps_per_gene * n_genes)) rownames(genos) = paste0("ind", 1:N) - write.table(t(data.table(genos, keep.rownames = TRUE) %>% - rename(snpid = rn)), - file = paste0(data_dir, "SNPs.txt"), quote = FALSE, sep = "\t", row.names = TRUE, col.names = FALSE) + write.table(x = t(data.table(genos, keep.rownames = T) %>% + rename(snpid = rn)), file = paste0(data_dir, "SNPs.txt"), quote = F, sep = "\t", row.names = T, col.names = F) print("Finished simulating and saving genotypes") - snp_loc = data.frame(snpid = colnames(genos), chr = "chr1", - pos = rep(seq(1, n_genes * 1e9, by = 1e9), each = n_snps_per_gene), - matrix(1, nrow = ncol(genos), ncol = n_contexts, + pos = rep(x = seq(1, n_genes * 1e+09, by = 1e+09), each = n_snps_per_gene), + matrix(data = 1, nrow = ncol(genos), ncol = n_contexts, dimnames = list(NULL, paste0("context", 1:n_contexts)))) - write.table(snp_loc, file = paste0(data_dir, "snpsloc.txt"), quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) + write.table(x = snp_loc, file = paste0(data_dir,"snpsloc.txt"), quote = F, sep = "\t", row.names = F, + col.names = T) print("Finished saving snp location file") - gene_loc = data.frame(geneid = paste0("gene", 1:n_genes), - chr = "chr1", s1 = seq(1, n_genes * 1e9, by = 1e9), - s2 = seq(1, n_genes * 1e9, by = 1e9) + 1000, - matrix(1, nrow = n_genes, ncol = n_contexts, - dimnames = list(NULL, paste0("context", 1:n_contexts)))) - write.table(gene_loc, file = paste0(data_dir, "geneloc.txt"), quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) + chr = "chr1", s1 = seq(1, n_genes * 1e+09, by = 1e+09), + s2 = seq(1, n_genes * 1e+09, by = 1e+09) + 1000, matrix(data = 1, + nrow = n_genes, + ncol = n_contexts, + dimnames = list(NULL, + paste0("context", 1:n_contexts)))) + write.table(x = gene_loc, file = paste0(data_dir, "geneloc.txt"), quote = F, sep = "\t", row.names = F, + col.names = T) print("Finished saving gene location file") - - genos_with_effect = genos[, seq(from = 1, to = (n_snps_per_gene * n_genes), by = n_snps_per_gene)] - exp_mat = expand.grid(iid = paste0("ind", 1:N), context = paste0("context", 1:n_contexts)) - which_context = rep_len(1:n_contexts, length.out = n_genes) - + genos_with_effect = genos[, seq(from = 1, to = (n_snps_per_gene * + n_genes), by = n_snps_per_gene)] + exp_mat = expand.grid(iid = paste0("ind", 1:N), context = paste0("context", + 1:n_contexts)) + which_context = rep_len(x = 1:n_contexts, length.out = n_genes) for (i in 1:n_genes) { - betas = sqrt((hsq * v_e) / ((1 - hsq) * var(genos_with_effect[, i]))) - Y = matrix(0, nrow = N, ncol = n_contexts, - dimnames = list(paste0("ind", 1:N), paste0("context", 1:n_contexts))) - for (j in 1:n_contexts) { - Y[, j] = mus[j] + genos_with_effect[, i] * betas[j] - } - for (j in 1:N) { - Y[j, ] = Y[j, ] + rmvnorm(1, rep(0, n_contexts), sigma) - } - data_mat = melt(data.table(Y, keep.rownames = TRUE), id.vars = "rn") + betas = sqrt((hsq * v_e)/((1 - hsq) * var(genos_with_effect[, i]))) + Y = matrix(0, nrow = N, ncol = n_contexts, dimnames = list(paste0("ind", 1:N), paste0("context", 1:n_contexts))) + for (j in 1:n_contexts) Y[, j] = mus[j] + genos_with_effect[, i] * betas[j] + for (j in 1:N) Y[j, ] = Y[j, ] + rmvnorm(1, rep(0, n_contexts), sigma) + data_mat = melt(data = data.table(Y, keep.rownames = T), + id.vars = "rn") colnames(data_mat) = c("iid", "context", paste0("gene", i)) - exp_mat = merge(exp_mat, data_mat) + exp_mat = merge(x = exp_mat, y = data_mat) } - rownames(exp_mat) = paste(exp_mat$iid, exp_mat$context, sep = " - ") - exp_mat = cbind(data.frame(design = paste(exp_mat$iid, exp_mat$context, sep = " - ")), exp_mat) + exp_mat = cbind(data.frame(design = paste(exp_mat$iid, exp_mat$context, sep = " - ")), exp_mat) total_elements = prod(dim(exp_mat[, -c(1:3)])) missing_elements = floor(missing * total_elements) missing_indices = sample(1:total_elements, missing_elements) identifiers = exp_mat[, 1:3] exp_mat_missing = as.vector(as.matrix(exp_mat[, -c(1:3)])) exp_mat_missing[missing_indices] = NA - exp_mat_missing = matrix(exp_mat_missing, nrow = nrow(exp_mat), ncol = ncol(exp_mat) - 3) + exp_mat_missing = matrix(exp_mat_missing, nrow = nrow(exp_mat), ncol = ncol(exp_mat) - 3) exp_mat_missing = as.data.frame(exp_mat_missing) exp_mat_missing = cbind(identifiers, exp_mat_missing) colnames(exp_mat_missing) = colnames(exp_mat) - - expr_file_path <- file.path(data_dir, "expression.txt") - write.table(exp_mat_missing[, -c(2:3)], file = expr_file_path, - quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) + write.table(x = exp_mat_missing[, -c(2:3)], file = paste0(data_dir, "expression.txt"), quote = F, + sep = "\t", row.names = F, col.names = T) print("Finished simulating and saving expression file") - - clean_expr_file(expr_file_path) - print("Cleaned expression file for downstream compatibility") -} \ No newline at end of file +} From a1f615f33a791550fc9393bd5169e638abeaabe1 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Tue, 7 Oct 2025 14:53:53 -0700 Subject: [PATCH 30/45] debug --- R/eQTL_mapping.R | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index dbb5600..cba79fe 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -78,14 +78,12 @@ eQTL_mapping_step = function( ) } else if (method == "tensorQTL") { - # ✅ Expand all paths for Python compatibility SNP_file_name <- path.expand(SNP_file_name) snps_location_file_name <- path.expand(snps_location_file_name) gene_location_file_name <- path.expand(gene_location_file_name) expression_file_name <- path.expand(expression_file_name) out_dir <- path.expand(out_dir) - - # ✅ Define and register the Python TensorQTL helper function + py_run_string(" import os import torch @@ -106,12 +104,24 @@ def run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefi builtins.run_tensorqtl = run_tensorqtl ") - - # ✅ Load data from R → Python - phenotype_df <- read.table(expression_file_name, header = TRUE, row.names = 1) - phenotype_pos_df <- read.table(gene_location_file_name, header = TRUE, row.names = 1) - genotype_df <- read.table(SNP_file_name, header = TRUE, row.names = 1) - variant_df <- read.table(snps_location_file_name, header = TRUE, row.names = 1) + + expr <- read.table(expression_file_name, header = TRUE, sep = "\t", check.names = FALSE) + + rownames(expr) <- expr[, 1] + expr <- expr[, -1, drop = FALSE] + + write.table( + expr, + file = expression_file_name, + sep = "\t", + row.names = TRUE, + col.names = NA, + quote = FALSE + ) + phenotype_df <- suppressWarnings(read.table(expression_file_name, header = TRUE, row.names = 1)) + phenotype_pos_df <- suppressWarnings(read.table(gene_location_file_name, header = TRUE, row.names = 1)) + genotype_df <- suppressWarnings(read.table(SNP_file_name, header = TRUE, row.names = 1)) + variant_df <- suppressWarnings(read.table(snps_location_file_name, header = TRUE, row.names = 1)) py$phenotype_df <- phenotype_df py$phenotype_pos_df <- phenotype_pos_df @@ -120,7 +130,6 @@ builtins.run_tensorqtl = run_tensorqtl tensorqtl_prefix <- file.path(out_dir, paste0(context, "_", shared_specific)) py$prefix <- tensorqtl_prefix - # ✅ Run TensorQTL safely tryCatch({ py$run_tensorqtl( py$phenotype_df, @@ -134,16 +143,13 @@ builtins.run_tensorqtl = run_tensorqtl message(e$message) }) - # ✅ Validate output file parquet_path <- paste0(py$prefix, ".cis_qtl_pairs.chr1.parquet") if (!file.exists(parquet_path)) stop("TensorQTL failed: .parquet output not found") - # ✅ Load and convert output pd <- import("pandas", convert = FALSE) pq <- pd$read_parquet(parquet_path) py$pq <- pq - # ✅ Rename columns pq$rename(columns = dict( phenotype_id = "gene", variant_id = "SNP", @@ -151,7 +157,6 @@ builtins.run_tensorqtl = run_tensorqtl pval_nominal = "p-value" ), inplace = TRUE) - # ✅ Extract results and save pq_df <- py_eval("pq.loc[:, ['SNP', 'gene', 'beta', 'p-value']]", convert = TRUE) pq_df$FDR <- p.adjust(pq_df$`p-value`, method = "BH") pq_df <- pq_df[order(pq_df$`p-value`), ] From 186244a105fd1638895769a73abe0f4ed8b514f4 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Wed, 8 Oct 2025 08:44:01 -0700 Subject: [PATCH 31/45] Suppress Warnings --- R/eQTL_mapping.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index cba79fe..2109541 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -83,7 +83,7 @@ eQTL_mapping_step = function( gene_location_file_name <- path.expand(gene_location_file_name) expression_file_name <- path.expand(expression_file_name) out_dir <- path.expand(out_dir) - + suppressWarnings({ py_run_string(" import os import torch @@ -103,7 +103,7 @@ def run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefi cis.map_nominal(genotype_df, variant_df, phenotype_df, phenotype_pos_df, prefix=prefix) builtins.run_tensorqtl = run_tensorqtl -") +")}) expr <- read.table(expression_file_name, header = TRUE, sep = "\t", check.names = FALSE) From 79aacfa64d9c571d98c7f2973833bc4b2d228f58 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Wed, 8 Oct 2025 09:00:40 -0700 Subject: [PATCH 32/45] Update parameters and empty conditional --- R/simulate_data.R | 4 ++-- R/treeQTL.R | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/R/simulate_data.R b/R/simulate_data.R index 0e6586d..050bd73 100644 --- a/R/simulate_data.R +++ b/R/simulate_data.R @@ -24,9 +24,9 @@ #' #' @export simulate_data = function(data_dir, N = 300, n_genes = 100, n_snps_per_gene = 1000, - n_contexts = 10, maf = 0.2, w_corr = 0.2, + n_contexts, maf = 0.2, w_corr = 0.2, v_e = 1, missing = 0, - hsq = rep(0,n_contexts), + hsq = rep(0.2, n_contexts), mus = rep(0, n_contexts)) { if (!dir.exists(data_dir)) dir.create(data_dir) sigma = matrix(w_corr, nrow = n_contexts, ncol = n_contexts) diff --git a/R/treeQTL.R b/R/treeQTL.R index 40cbf78..1fd0f4f 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -151,10 +151,11 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na specific_eGenes = res$qvalue_table if (nrow(specific_eGenes) == 0) { - message("No specific eGenes discovered. Skipping downstream steps.") + message("No specific eGenes discovered.") + } + else { + write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') } - - write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') pattern = ("shared.all_pairs.txt") shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) @@ -173,8 +174,9 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na message("No shared eGenes discovered. Skipping shared association analysis.") return(NULL) } - - write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + else{ + write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + } eAssociations = get_eAssociations( eDiscoveries = shared_eGenes, From f83b89c239cccbff8684b2e44bd15aa5b78a4476 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Wed, 8 Oct 2025 09:05:17 -0700 Subject: [PATCH 33/45] Update treeQTL.R --- R/treeQTL.R | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index 1fd0f4f..3dab27e 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -42,7 +42,7 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na # shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) names(shared_n_tests_per_gene) = c("family", "n_tests") - get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = 0.05, level2 = 0.05, level3 = 0.05, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { + get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = level1, level2 = level2, level3 = level3, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { pattern <- paste0("context", 1:length(tissue_names), "_", exp_suffix, ".cis_pairs.txt") m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) print("Constructed MatrixEQTL output files:") @@ -152,6 +152,7 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na if (nrow(specific_eGenes) == 0) { message("No specific eGenes discovered.") + write.table(data.frame(), file = file.path(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') } else { write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') @@ -172,7 +173,8 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na if (nrow(shared_eGenes) == 0) { message("No shared eGenes discovered. Skipping shared association analysis.") - return(NULL) + write.table(data.frame(), file = file.path(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + return(invisible(NULL)) } else{ write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') From 841c700fc035429735c55b163d123bf6d5cb1549 Mon Sep 17 00:00:00 2001 From: Anthony Zhao Date: Mon, 13 Oct 2025 11:17:15 -0700 Subject: [PATCH 34/45] Git ignore --- .DS_Store | Bin 6148 -> 0 bytes R/.DS_Store | Bin 6148 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store delete mode 100644 R/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index e9df88fbf3c1b2fccd304d9be93effdb7476c11c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5T32oCWz33LXQhx12+8=@e*o%fkyP8QX3j-FlI}Wwue&4SzpK}@p+v6 zsc5Sg4=OqnX203pnS}Wgb}|6K+LM6`PzC@CRbs)$;RBKTQrDzlR*HyB-a`avJq4pU zO0zX@TKJ6&=y%r*X6Y!1-@dBAX!;m_X-aksF5wXk2HmMYPGXS^)eOLfDMT=Y1VYI0 z3L*XJTw68FuikQ1uC=Pe8}-%~a{VB)mE4!i5E28#05P!2fH_I6?bQvM69dG+zh^+6 z4;)pZXE4{Ojt(4D3xFtpBbA^ndkGoC4SEK1jktrtbSR<@Wv0boIvm%z@$(Gk8g)1@ z(|j=VWM(=Prk;-X=gJ+Jr;$ctfEaksz=ocdW&J<>y#Ie6L^EQ582D2RuwuvWv@s=9 zTi244wU(paph}T`xyIKJG*l@@Us;MPs7i31O9Rm}m}|rp6#5ZRG|)f{d@BPl2Fi!? diff --git a/R/.DS_Store b/R/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Mon, 13 Oct 2025 15:36:24 -0700 Subject: [PATCH 35/45] Added new treeBH implementations --- .gitignore | 1 + DESCRIPTION | 8 +- NAMESPACE | 2 + R/RcppExports.R | 34 +++ R/treeBH.R | 190 ++++++++++++- R/treeBH_helpers.R | 47 ++++ man/get_TreeBH_selections_cpp.Rd | 12 + man/get_TreeBH_selections_datatable.Rd | 12 + man/simulate_data.Rd | 4 +- man/treeBH_step.Rd | 19 +- src/FastGxC.so | Bin 0 -> 535096 bytes src/RcppExports.cpp | 66 +++++ src/RcppExports.o | Bin 0 -> 582816 bytes src/treeBH.cpp | 352 +++++++++++++++++++++++++ src/treeBH.o | Bin 0 -> 1040664 bytes 15 files changed, 736 insertions(+), 11 deletions(-) create mode 100644 R/RcppExports.R create mode 100644 R/treeBH_helpers.R create mode 100644 man/get_TreeBH_selections_cpp.Rd create mode 100644 man/get_TreeBH_selections_datatable.Rd create mode 100755 src/FastGxC.so create mode 100644 src/RcppExports.cpp create mode 100644 src/RcppExports.o create mode 100644 src/treeBH.cpp create mode 100644 src/treeBH.o diff --git a/.gitignore b/.gitignore index 5b6a065..7b732e7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .Rhistory .RData .Ruserdata +.DS_Store diff --git a/DESCRIPTION b/DESCRIPTION index 4bc193a..6c10e14 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -10,7 +10,6 @@ Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 Depends: R (>= 4.2.0) - Imports: devtools, dplyr, @@ -19,8 +18,10 @@ Imports: mvtnorm, reshape2, magrittr, - reticulate - + reticulate, + Rcpp +LinkingTo: + Rcpp Suggests: qvalue, TreeQTL, @@ -28,5 +29,4 @@ Suggests: knitr, rmarkdown, testthat (>= 3.0.0) - Config/testthat/edition: 3 diff --git a/NAMESPACE b/NAMESPACE index 6164fad..2bdc31f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -11,3 +11,5 @@ export(simulate_data) export(to_TreeBH_input) export(treeBH_step) export(treeQTL_step) +importFrom(Rcpp,sourceCpp) +useDynLib(FastGxC, .registration = TRUE) diff --git a/R/RcppExports.R b/R/RcppExports.R new file mode 100644 index 0000000..0c9b645 --- /dev/null +++ b/R/RcppExports.R @@ -0,0 +1,34 @@ +# Generated by using Rcpp::compileAttributes() -> do not edit by hand +# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +#' Check if groups are properly nested in hierarchy +#' @noRd +checkNested <- function(groups, L) { + .Call('_FastGxC_checkNested', PACKAGE = 'FastGxC', groups, L) +} + +#' Hierarchical Group P-value Calculation +#' The getGroupPvalues function computes aggregated p-values for each group in a hierarchical +#' structure by combining p-values from lower levels using specified aggregation methods. +#' @param pvals NumericVector containing p-values for individual hypotheses +#' @param groups CharacterMatrix defining the group hierarchy structure +#' @param N Integer specifying the number of hypotheses +#' @param L Integer specifying the number of levels in the hierarchy +#' @param test CharacterVector specifying the aggregation method(s) +#' @noRd +getGroupPvalues <- function(pvals, groups, N, L, test) { + .Call('_FastGxC_getGroupPvalues', PACKAGE = 'FastGxC', pvals, groups, N, L, test) +} + +#' Hierarchical Group Selection for Multiple Testing +#' The getGroupSelections function applies hierarchical multiple testing correction. +#' @param group_pvals NumericMatrix containing aggregated p-values +#' @param groups CharacterMatrix defining the group hierarchy structure +#' @param q NumericVector containing the q-value thresholds for each level +#' @param N Integer specifying the number of hypotheses +#' @param L Integer specifying the number of levels in the hierarchy +#' @noRd +getGroupSelections <- function(group_pvals, groups, q, N, L) { + .Call('_FastGxC_getGroupSelections', PACKAGE = 'FastGxC', group_pvals, groups, q, N, L) +} + diff --git a/R/treeBH.R b/R/treeBH.R index bd2054d..4ec4cfc 100644 --- a/R/treeBH.R +++ b/R/treeBH.R @@ -1,3 +1,7 @@ +#' @useDynLib FastGxC, .registration = TRUE +#' @importFrom Rcpp sourceCpp +NULL + #' Converting eQTL Mapping Output to TreeBH Input #' #' @param data_dir - full filepath of the directory where eQTL output files are stored. This function assumes that files are named as outputted by FastGxC's eQTL mapping function @@ -102,23 +106,60 @@ to_TreeBH_input <- function(data_dir, shared_file, context_names, out_dir) { #' @param matrix - output of to_TreeBH_Input, matrix with the groups and pvalues #' @param fdr_thres - value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. #' @param out_dir - full filepath of the output directory where the output of TreeBH can be stored +#' @param method - character string specifying which implementation to use: +#' - "original" (default): uses the TreeBH package implementation +#' - "datatable": uses data.table optimized R implementation +#' - "cpp": uses Rcpp C++ implementation for maximum performance +#' @param test - character string specifying the aggregation method for p-values: +#' - "simes" (default): uses Simes' method +#' - "fisher": uses Fisher's method #' @return A matrix with identification columns and output columns: #' - gene : gene name #' - snp : snp name #' - context : context name or "specific" #' - treeBH Output Columns : eGene, eQTL, Component, Context Specific #' @export -treeBH_step <- function(matrix, fdr_thres, out_dir) { +treeBH_step <- function(matrix, fdr_thres, out_dir, method = "original", test = "simes") { + + # Validate method parameter + method <- match.arg(method, c("original", "datatable", "cpp")) + # Extract components from input matrix id_mat <- matrix[, 1:3] groups <- matrix[, c(1, 4, 5, 6)] p_values <- matrix[, 7] |> as.vector() |> as.numeric() num_levels <- 4 - treeBH_results <- TreeBH::get_TreeBH_selections(pvals = p_values, - groups = groups, - q = rep(fdr_thres, num_levels)) + # Call appropriate implementation based on method parameter + treeBH_results <- switch(method, + original = { + # Original TreeBH package implementation + TreeBH::get_TreeBH_selections( + pvals = p_values, + groups = groups, + q = rep(fdr_thres, num_levels) + ) + }, + datatable = { + # Optimized R implementation using data.table + get_TreeBH_selections_datatable( + pvals = p_values, + groups = groups, + q = rep(fdr_thres, num_levels), + test = test + ) + }, + cpp = { + # C++ implementation using Rcpp + get_TreeBH_selections_cpp( + pvals = p_values, + groups = groups, + q = rep(fdr_thres, num_levels), + test = test + ) + } + ) colnames(treeBH_results) <- c("eGene", "eQTL", "Component", "ContextSpecific") @@ -132,4 +173,145 @@ treeBH_step <- function(matrix, fdr_thres, out_dir) { col.names = TRUE, quote = FALSE ) +} + +#' Optimized TreeBH Implementation using data.table +#' @keywords internal +get_TreeBH_selections_datatable <- function(pvals, groups, q, test = "simes") { + # Checks + N <- length(pvals) + L <- ncol(groups) + if (length(q) != L) { + stop("Must specify target q for each level of hierarchy") + } + if (min(q) < 0 || max(q) > 1) { + stop("Target q must be in the range 0 - 1") + } + if (min(pvals, na.rm = TRUE) < 0 || max(pvals, na.rm = TRUE) > 1) { + stop("P-values must be in the range 0 - 1") + } + if (length(pvals) != nrow(groups)) { + stop("Dimension mismatch between pvals and groups") + } + + # Convert to data.table for faster group operations + dt_groups <- data.table::as.data.table(as.data.frame(groups)) + data.table::setnames(dt_groups, paste0("Level", 1:L)) + + # Step 1: Check hierarchy nesting + for (cur_level in 2:L) { + cur_col <- paste0("Level", cur_level) + parent_col <- paste0("Level", cur_level - 1) + + check <- dt_groups[, .(parent_count = data.table::uniqueN(get(parent_col))), by = get(cur_col)] + + if (any(check$parent_count != 1)) { + stop("Groups must be nested within hierarchy") + } + } + + if (data.table::uniqueN(groups[, L]) != nrow(groups)) { + stop("Assumption is that lowest level in tree corresponds to individual hypotheses") + } + + # Initialization + sel <- matrix(0, nrow = N, ncol = L) + if (length(test) == 1) { + test <- rep(test, L - 1) + } + q_adj <- matrix(NA, nrow = N, ncol = L) + q_adj[, 1] <- q[1] + group_pvals <- matrix(NA, nrow = N, ncol = L) + group_pvals[, L] <- pvals + + # Step 3: Aggregate group-level p-values + for (cur_level in (L - 1):1) { + cur_groups <- unique(groups[, cur_level]) + for (cur_group in cur_groups) { + cur_inds <- which(groups[, cur_level] == cur_group) + + # Gets the children of all pvalues in the current group + child_pvals <- group_pvals[cur_inds, cur_level + 1] + agg_p <- switch(test[cur_level], + simes = get_simes_p(child_pvals), + fisher = get_fisher_p(child_pvals), + stop("Options for parameter test are 'simes' and 'fisher'")) + group_pvals[cur_inds[1], cur_level] <- agg_p + } + } + + for (cur_level in 1:L) { + if (cur_level > 1 && sum(sel[, cur_level - 1]) == 0) { + break + } + if (cur_level == 1) { + sel_prev <- 1 + } + else { + sel_prev <- which(sel[, cur_level - 1] == 1) + } + for (parent_sel in sel_prev) { + if (cur_level == 1) { + parent_group_ind <- 1 + child_inds <- which(!is.na(group_pvals[, cur_level])) + } + else { + parent_group_num <- groups[parent_sel, cur_level - 1] + parent_group_ind <- min(which(groups[, cur_level - 1] == parent_group_num)) + child_inds <- which(groups[, cur_level - 1] == parent_group_num & + !is.na(group_pvals[, cur_level])) + } + if (length(child_inds) > 1) { + sel_ind_within_group <- which(qvalue::qvalue(group_pvals[child_inds, cur_level], + lambda = 0)$qvalue <= + q_adj[parent_group_ind, cur_level]) + } + else { + sel_ind_within_group <- which(group_pvals[child_inds, cur_level] <= + q_adj[parent_group_ind, cur_level]) + } + sel[child_inds[sel_ind_within_group], cur_level] <- 1 + if (cur_level < L) { + R_parent_sel <- length(sel_ind_within_group) + n_parent_sel <- length(child_inds) + q_adj[child_inds[sel_ind_within_group], cur_level + 1] <- + q[cur_level + 1] * q_adj[parent_sel, cur_level]/q[cur_level] * + R_parent_sel/n_parent_sel + } + } + } + sel +} + +#' C++ TreeBH Implementation using Rcpp +#' @keywords internal +get_TreeBH_selections_cpp <- function(pvals, groups, q, test = "simes") { + N <- length(pvals) + L <- ncol(groups) + if (length(q) != L) { + stop("Must specify target q for each level of hierarchy") + } + if (min(q) < 0 || max(q) > 1) { + stop("Target q must be in the range 0 - 1") + } + if (min(pvals, na.rm = TRUE) < 0 || max(pvals, na.rm = TRUE) > 1) { + stop("P-values must be in the range 0 - 1") + } + if (length(pvals) != nrow(groups)) { + stop("Dimension mismatch between pvals and groups") + } + + # Check hierarchy structure using C++ function + error <- checkNested(groups = groups, L = L) + if(error != "") { + stop(error) + } + + # Get group p-values using C++ function + group_pvals <- getGroupPvalues(pvals, groups, N, L, test) + + # Get selections using C++ function + selections <- getGroupSelections(group_pvals, groups, q, N, L) + + return(selections) } \ No newline at end of file diff --git a/R/treeBH_helpers.R b/R/treeBH_helpers.R new file mode 100644 index 0000000..d54454d --- /dev/null +++ b/R/treeBH_helpers.R @@ -0,0 +1,47 @@ +# Helper functions for TreeBH +# These functions are used internally by the different TreeBH implementations + +#' Calculate Simes p-value +#' @param pvals Numeric vector of p-values +#' @return Simes combined p-value +#' @noRd +get_simes_p <- function(pvals) { + # Remove NA values + clean_pvals <- pvals[!is.na(pvals)] + + # If no valid p-values, return NA + if (length(clean_pvals) == 0) { + return(NA_real_) + } + + # Sort p-values + sorted_pvals <- sort(clean_pvals) + n <- length(sorted_pvals) + + # Calculate Simes p-value: min_i( n * p_(i) / i ) + adjusted <- sorted_pvals * n / seq_along(sorted_pvals) + min_val <- min(adjusted) + + return(min_val) +} + +#' Calculate Fisher's combined p-value +#' @param pvals Numeric vector of p-values +#' @return Fisher's combined p-value +#' @noRd +get_fisher_p <- function(pvals) { + # Remove NA values + clean_pvals <- pvals[!is.na(pvals)] + + # If no valid p-values, return NA + if (length(clean_pvals) == 0) { + return(NA_real_) + } + + # Calculate Fisher's statistic: -2 * sum(log(p)) + statistic <- -2 * sum(log(clean_pvals)) + + # Return p-value from chi-squared distribution with 2k degrees of freedom + return(pchisq(statistic, df = 2 * length(clean_pvals), lower.tail = FALSE)) +} + diff --git a/man/get_TreeBH_selections_cpp.Rd b/man/get_TreeBH_selections_cpp.Rd new file mode 100644 index 0000000..58256cc --- /dev/null +++ b/man/get_TreeBH_selections_cpp.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/treeBH.R +\name{get_TreeBH_selections_cpp} +\alias{get_TreeBH_selections_cpp} +\title{C++ TreeBH Implementation using Rcpp} +\usage{ +get_TreeBH_selections_cpp(pvals, groups, q, test = "simes") +} +\description{ +C++ TreeBH Implementation using Rcpp +} +\keyword{internal} diff --git a/man/get_TreeBH_selections_datatable.Rd b/man/get_TreeBH_selections_datatable.Rd new file mode 100644 index 0000000..446b1ea --- /dev/null +++ b/man/get_TreeBH_selections_datatable.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/treeBH.R +\name{get_TreeBH_selections_datatable} +\alias{get_TreeBH_selections_datatable} +\title{Optimized TreeBH Implementation using data.table} +\usage{ +get_TreeBH_selections_datatable(pvals, groups, q, test = "simes") +} +\description{ +Optimized TreeBH Implementation using data.table +} +\keyword{internal} diff --git a/man/simulate_data.Rd b/man/simulate_data.Rd index 10bcbaa..2b5846a 100644 --- a/man/simulate_data.Rd +++ b/man/simulate_data.Rd @@ -9,12 +9,12 @@ simulate_data( N = 300, n_genes = 100, n_snps_per_gene = 1000, - n_contexts = 10, + n_contexts, maf = 0.2, w_corr = 0.2, v_e = 1, missing = 0, - hsq = rep(0, n_contexts), + hsq = rep(0.2, n_contexts), mus = rep(0, n_contexts) ) } diff --git a/man/treeBH_step.Rd b/man/treeBH_step.Rd index cdd4ceb..211f2b8 100644 --- a/man/treeBH_step.Rd +++ b/man/treeBH_step.Rd @@ -5,7 +5,7 @@ \title{Multiple Testing Correction with TreeBH Function to adjust for hierarchical multiple testing correction using TreeBH.} \usage{ -treeBH_step(matrix, fdr_thres, out_dir) +treeBH_step(matrix, fdr_thres, out_dir, method = "original", test = "simes") } \arguments{ \item{matrix}{\itemize{ @@ -19,6 +19,23 @@ treeBH_step(matrix, fdr_thres, out_dir) \item{out_dir}{\itemize{ \item full filepath of the output directory where the output of TreeBH can be stored }} + +\item{method}{\itemize{ +\item character string specifying which implementation to use: +\itemize{ +\item "original" (default): uses the TreeBH package implementation +\item "datatable": uses data.table optimized R implementation +\item "cpp": uses Rcpp C++ implementation for maximum performance +} +}} + +\item{test}{\itemize{ +\item character string specifying the aggregation method for p-values: +\itemize{ +\item "simes" (default): uses Simes' method +\item "fisher": uses Fisher's method +} +}} } \value{ A matrix with identification columns and output columns: diff --git a/src/FastGxC.so b/src/FastGxC.so new file mode 100755 index 0000000000000000000000000000000000000000..39cb6713d20fb042661b17e01c4d6a296b20ae71 GIT binary patch literal 535096 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

UNG14Ckqb$V4fu#xrOT&g2FD@ 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�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 literal 0 HcmV?d00001 diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp new file mode 100644 index 0000000..6d2d1b9 --- /dev/null +++ b/src/RcppExports.cpp @@ -0,0 +1,66 @@ +// Generated by using Rcpp::compileAttributes() -> do not edit by hand +// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +#include + +using namespace Rcpp; + +#ifdef RCPP_USE_GLOBAL_ROSTREAM +Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); +Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); +#endif + +// checkNested +std::string checkNested(const CharacterMatrix& groups, int L); +RcppExport SEXP _FastGxC_checkNested(SEXP groupsSEXP, SEXP LSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const CharacterMatrix& >::type groups(groupsSEXP); + Rcpp::traits::input_parameter< int >::type L(LSEXP); + rcpp_result_gen = Rcpp::wrap(checkNested(groups, L)); + return rcpp_result_gen; +END_RCPP +} +// getGroupPvalues +NumericMatrix getGroupPvalues(const NumericVector& pvals, const CharacterMatrix& groups, int N, int L, CharacterVector test); +RcppExport SEXP _FastGxC_getGroupPvalues(SEXP pvalsSEXP, SEXP groupsSEXP, SEXP NSEXP, SEXP LSEXP, SEXP testSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const NumericVector& >::type pvals(pvalsSEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type groups(groupsSEXP); + Rcpp::traits::input_parameter< int >::type N(NSEXP); + Rcpp::traits::input_parameter< int >::type L(LSEXP); + Rcpp::traits::input_parameter< CharacterVector >::type test(testSEXP); + rcpp_result_gen = Rcpp::wrap(getGroupPvalues(pvals, groups, N, L, test)); + return rcpp_result_gen; +END_RCPP +} +// getGroupSelections +NumericMatrix getGroupSelections(const NumericMatrix& group_pvals, const CharacterMatrix& groups, const NumericVector& q, int N, int L); +RcppExport SEXP _FastGxC_getGroupSelections(SEXP group_pvalsSEXP, SEXP groupsSEXP, SEXP qSEXP, SEXP NSEXP, SEXP LSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< const NumericMatrix& >::type group_pvals(group_pvalsSEXP); + Rcpp::traits::input_parameter< const CharacterMatrix& >::type groups(groupsSEXP); + Rcpp::traits::input_parameter< const NumericVector& >::type q(qSEXP); + Rcpp::traits::input_parameter< int >::type N(NSEXP); + Rcpp::traits::input_parameter< int >::type L(LSEXP); + rcpp_result_gen = Rcpp::wrap(getGroupSelections(group_pvals, groups, q, N, L)); + return rcpp_result_gen; +END_RCPP +} + +static const R_CallMethodDef CallEntries[] = { + {"_FastGxC_checkNested", (DL_FUNC) &_FastGxC_checkNested, 2}, + {"_FastGxC_getGroupPvalues", (DL_FUNC) &_FastGxC_getGroupPvalues, 5}, + {"_FastGxC_getGroupSelections", (DL_FUNC) &_FastGxC_getGroupSelections, 5}, + {NULL, NULL, 0} +}; + +RcppExport void R_init_FastGxC(DllInfo *dll) { + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); +} diff --git a/src/RcppExports.o b/src/RcppExports.o new file mode 100644 index 0000000000000000000000000000000000000000..0cc5c24f1ad4fe957335e3d276f6358e66b89a98 GIT binary patch literal 582816 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 literal 0 HcmV?d00001 diff --git a/src/treeBH.cpp b/src/treeBH.cpp new file mode 100644 index 0000000..ef449fb --- /dev/null +++ b/src/treeBH.cpp @@ -0,0 +1,352 @@ +#include +#include +#include +#include +#include +using namespace Rcpp; +using namespace std; + +//' Check if groups are properly nested in hierarchy +// [[Rcpp::export]] +std::string checkNested(const CharacterMatrix& groups, int L) { + int nrow = groups.nrow(); + + // Step 1: Check hierarchy nesting + for (int cur_level = 1; cur_level < L; cur_level++) { + // Map to track parent to child relationships + map> parent_to_children; + + // Create the mapping from child to parent + for (int i = 0; i < nrow; i++) { + string child = as(groups(i, cur_level)); + string parent = as(groups(i, cur_level - 1)); + + // Add child to parent's set of children + parent_to_children[parent].insert(child); + } + + // Check if any child has multiple parents + map> child_to_parents; + for (int i = 0; i < nrow; i++) { + string child = as(groups(i, cur_level)); + string parent = as(groups(i, cur_level - 1)); + + child_to_parents[child].insert(parent); + + // If child has more than one parent, return error + if (child_to_parents[child].size() > 1) { + return "Groups must be nested within hierarchy"; + } + } + } + + // Step 2: Check if lowest level corresponds to individual hypotheses + set lowest_level_values; + for (int i = 0; i < nrow; i++) { + lowest_level_values.insert(as(groups(i, L - 1))); + } + + if (lowest_level_values.size() != nrow) { + return "Assumption is that lowest level in tree corresponds to individual hypotheses"; + } + + // All checks passed + return ""; +} + +// Calculate Simes p-value +double simesPvalue(const NumericVector& pvals) { + // Remove NA values + NumericVector clean_pvals; + for (int i = 0; i < pvals.size(); i++) { + if (!NumericVector::is_na(pvals[i])) { + clean_pvals.push_back(pvals[i]); + } + } + + // If no valid p-values, return NA + if (clean_pvals.size() == 0) { + return NA_REAL; + } + + // Sort p-values + std::sort(clean_pvals.begin(), clean_pvals.end()); + + // Calculate Simes p-value + double min_val = R_PosInf; + int n = clean_pvals.size(); + + for (int i = 0; i < n; i++) { + double adjusted = clean_pvals[i] / (i + 1); + if (adjusted < min_val) { + min_val = adjusted; + } + } + + return n * min_val; +} + +// Calculate Fisher's pvalue +double fisherPvalue(const NumericVector& pvals) { + // Remove NA values + NumericVector clean_pvals; + for (int i = 0; i < pvals.size(); i++) { + if (!NumericVector::is_na(pvals[i])) { + clean_pvals.push_back(pvals[i]); + } + } + + // If no valid p-values, return NA + if (clean_pvals.size() == 0) { + return NA_REAL; + } + + // Calculate Fisher's statistic: -2 * sum(log(p)) + double sum_log = 0.0; + for (int i = 0; i < clean_pvals.size(); i++) { + sum_log += log(clean_pvals[i]); + } + double statistic = -2 * sum_log; + + // Return p-value from chi-squared distribution with 2k degrees of freedom + // Using R's built-in function + return R::pchisq(statistic, 2 * clean_pvals.size(), false, false); +} + +//' Hierarchical Group P-value Calculation +//' The getGroupPvalues function computes aggregated p-values for each group in a hierarchical +//' structure by combining p-values from lower levels using specified aggregation methods. +//' @param pvals NumericVector containing p-values for individual hypotheses +//' @param groups CharacterMatrix defining the group hierarchy structure +//' @param N Integer specifying the number of hypotheses +//' @param L Integer specifying the number of levels in the hierarchy +//' @param test CharacterVector specifying the aggregation method(s) +// [[Rcpp::export]] +NumericMatrix getGroupPvalues(const NumericVector& pvals, const CharacterMatrix& groups, + int N, int L, CharacterVector test) { + // Initialize group_pvals matrix + NumericMatrix group_pvals(N, L); + + // Fill in initial values + std::fill(group_pvals.begin(), group_pvals.end(), NA_REAL); + + // Set initial values for group_pvals at the lowest level + for (int i = 0; i < N; i++) { + group_pvals(i, L-1) = pvals[i]; + } + + // Ensure test vector is of correct length + CharacterVector test_methods = test; + if (test_methods.size() == 1) { + test_methods = CharacterVector(L-1, test[0]); + } + + // Pre-compute group indices for each level + std::vector>> level_groups(L); + + // Build group index maps for each level + for (int level = 0; level < L; level++) { + for (int i = 0; i < N; i++) { + string group = as(groups(i, level)); + level_groups[level][group].push_back(i); + } + } + + // Step 3: Aggregate group-level p-values + for (int cur_level = L - 2; cur_level >= 0; cur_level--) { + // Get unique groups at the current level + const auto& groups_at_level = level_groups[cur_level]; + + // Cache test method for this level + string method = as(test_methods[cur_level]); + + // Process each group + for (const auto& group_entry : groups_at_level) { + const std::vector& cur_inds = group_entry.second; + + // Skip empty groups (shouldn't happen but check anyway) + if (cur_inds.empty()) continue; + + // Get child p-values + NumericVector child_pvals(cur_inds.size()); + for (size_t i = 0; i < cur_inds.size(); i++) { + child_pvals[i] = group_pvals(cur_inds[i], cur_level + 1); + } + + // Calculate aggregated p-value + double agg_p; + if (method == "simes") { + agg_p = simesPvalue(child_pvals); + } else if (method == "fisher") { + agg_p = fisherPvalue(child_pvals); + } else { + stop("Options for parameter test are 'simes' and 'fisher'"); + } + + // Set the aggregated p-value ONLY for the first index in the group + group_pvals(cur_inds[0], cur_level) = agg_p; + } + } + + // Return only the group_pvals matrix + return group_pvals; +} + +// Function to compute qvalues (simplified version using BH method) +NumericVector computeQValues(const NumericVector& pvals) { + int n = pvals.size(); + if (n == 0) return NumericVector(0); + + // Create index vector and sort by p-value + IntegerVector idx = seq(0, n-1); + std::sort(idx.begin(), idx.end(), [&pvals](int i, int j) { + return pvals[i] < pvals[j]; + }); + + // Calculate adjusted p-values + NumericVector adjusted(n); + adjusted[idx[n-1]] = std::min(1.0, pvals[idx[n-1]]); + + for (int i = n-2; i >= 0; i--) { + adjusted[idx[i]] = std::min(adjusted[idx[i+1]], pvals[idx[i]] * n / (i + 1)); + } + + return adjusted; +} + +//' Hierarchical Group Selection for Multiple Testing +//' The getGroupSelections function applies hierarchical multiple testing correction. +//' @param group_pvals NumericMatrix containing aggregated p-values +//' @param groups CharacterMatrix defining the group hierarchy structure +//' @param q NumericVector containing the q-value thresholds for each level +//' @param N Integer specifying the number of hypotheses +//' @param L Integer specifying the number of levels in the hierarchy +// [[Rcpp::export]] +NumericMatrix getGroupSelections(const NumericMatrix& group_pvals, + const CharacterMatrix& groups, + const NumericVector& q, int N, int L) { + NumericMatrix sel(N, L); + NumericMatrix q_adj(N, L); + + // Fill q_adj with NA + std::fill(q_adj.begin(), q_adj.end(), NA_REAL); + + // Set initial value for q_adj + for (int i = 0; i < N; i++) { + q_adj(i, 0) = q[0]; + } + + // Iterate through each level + for (int cur_level = 0; cur_level < L; cur_level++) { + // Check if we should break + if (cur_level > 0) { + bool any_selected = false; + for (int i = 0; i < N; i++) { + if (sel(i, cur_level - 1) == 1) { + any_selected = true; + break; + } + } + if (!any_selected) break; + } + + // Get selected parents from previous level + std::vector sel_prev; + if (cur_level == 0) { + // First level: select all + sel_prev.push_back(0); // We'll use a dummy index 0 for the root + } else { + // Later levels: get indices of selected items from previous level + for (int i = 0; i < N; i++) { + if (sel(i, cur_level - 1) == 1) { + sel_prev.push_back(i); + } + } + } + + // Process each selected parent + for (int parent_sel : sel_prev) { + std::vector child_inds; + int parent_group_ind; + + if (cur_level == 0) { + // First level: include all non-NA indices + parent_group_ind = 0; + for (int i = 0; i < N; i++) { + if (!NumericVector::is_na(group_pvals(i, cur_level))) { + child_inds.push_back(i); + } + } + } else { + // Later levels: include children of the current parent group + string parent_group_num = as(groups(parent_sel, cur_level - 1)); + + // Find the first index with this parent group + for (int i = 0; i < N; i++) { + if (as(groups(i, cur_level - 1)) == parent_group_num) { + parent_group_ind = i; + break; + } + } + + // Find all indices with this parent group and non-NA p-values + for (int i = 0; i < N; i++) { + if (as(groups(i, cur_level - 1)) == parent_group_num && + !NumericVector::is_na(group_pvals(i, cur_level))) { + child_inds.push_back(i); + } + } + } + + // Skip if no children found + if (child_inds.empty()) continue; + + // Select children based on p-values and thresholds + std::vector sel_ind_within_group; + + if (child_inds.size() > 1) { + // Multiple children: use q-value method + NumericVector child_pvals(child_inds.size()); + for (size_t i = 0; i < child_inds.size(); i++) { + child_pvals[i] = group_pvals(child_inds[i], cur_level); + } + + // Compute q-values + NumericVector qvals = computeQValues(child_pvals); + + // Select children with q-values <= threshold + for (size_t i = 0; i < child_inds.size(); i++) { + if (qvals[i] <= q_adj(parent_group_ind, cur_level)) { + sel_ind_within_group.push_back(i); + } + } + } else { + // Single child: use direct p-value comparison + if (group_pvals(child_inds[0], cur_level) <= q_adj(parent_group_ind, cur_level)) { + sel_ind_within_group.push_back(0); + } + } + + // Update selection matrix + for (int idx : sel_ind_within_group) { + sel(child_inds[idx], cur_level) = 1; + } + + // Update q_adj for the next level + if (cur_level < L - 1) { + double R_parent_sel = sel_ind_within_group.size(); + double n_parent_sel = child_inds.size(); + + if (R_parent_sel > 0) { + for (int idx : sel_ind_within_group) { + q_adj(child_inds[idx], cur_level + 1) = q[cur_level + 1] * + q_adj(parent_sel, cur_level) / q[cur_level] * + R_parent_sel / n_parent_sel; + } + } + } + } + } + + return sel; +} diff --git a/src/treeBH.o b/src/treeBH.o new file mode 100644 index 0000000000000000000000000000000000000000..4e71b0893fb254647c309a123eb08d55611fe590 GIT binary patch literal 1040664 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%0AjmtNTioEyGx1y&#MHto!mHylpVv|k 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 delta 124178 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 From d71183f548764eaae389f1493ae7f2561a5a892c Mon Sep 17 00:00:00 2001 From: Anthony Zhao Date: Mon, 13 Oct 2025 22:33:15 -0700 Subject: [PATCH 37/45] Fix bug --- R/treeBH.R | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/R/treeBH.R b/R/treeBH.R index 4ec4cfc..6ec560b 100644 --- a/R/treeBH.R +++ b/R/treeBH.R @@ -301,6 +301,15 @@ get_TreeBH_selections_cpp <- function(pvals, groups, q, test = "simes") { stop("Dimension mismatch between pvals and groups") } + # Convert groups to character matrix if it's not already + # This ensures compatibility with C++ CharacterMatrix type + if (!is.matrix(groups)) { + groups <- as.matrix(groups) + } + if (mode(groups) != "character") { + mode(groups) <- "character" + } + # Check hierarchy structure using C++ function error <- checkNested(groups = groups, L = L) if(error != "") { From eb3673b60126bcca5f0574d7dc6389d411ded7a6 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Sat, 25 Oct 2025 13:04:06 -0700 Subject: [PATCH 38/45] Update eQTL_mapping.R --- R/eQTL_mapping.R | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index 5574075..058ed82 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -42,7 +42,16 @@ eQTL_mapping_step = function( setDTthreads(1) expression_mat <- as.matrix(data.frame(fread(expression_file_name, header = TRUE), row.names = 1, check.names = FALSE)) - genepos <- read.table(gene_location_file_name, header = TRUE)[, c("geneid", "chr", "s1", "s2")] + genepos <- data.table::fread(gene_location_file_name, sep = NULL, header = TRUE, data.table = FALSE) + names(genepos) <- tolower(names(genepos)) + + genepos <- genepos |> + dplyr::rename( + geneid = dplyr::coalesce(names(genepos)[grepl("gene", names(genepos))][1], "geneid"), + s1 = dplyr::coalesce(names(genepos)[grepl("start|s1", names(genepos))][1], "s1"), + s2 = dplyr::coalesce(names(genepos)[grepl("end|s2", names(genepos))][1], "s2") + ) |> + dplyr::select(geneid, chr, s1, s2) snps <- SlicedData$new() snps$fileDelimiter <- "\t" From a3cabed437096bdcd7c713d29ea017d49f910d0a Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Sat, 25 Oct 2025 13:10:28 -0700 Subject: [PATCH 39/45] Update treeQTL.R --- R/treeQTL.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index cc92f87..5140bd8 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -48,7 +48,7 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na names(shared_n_tests_per_gene) = c("family", "n_tests") get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = level1, level2 = level2, level3 = level3, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { - pattern <- paste0("context", 1:length(tissue_names), "_", exp_suffix, ".cis_pairs.txt") + pattern <- paste0(tissue_names, "_", exp_suffix, ".cis_pairs.txt") m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) print("Constructed MatrixEQTL output files:") print(m_eqtl_outfiles) From 71d7830425ef8366ac2d8dea926cb2a8934345de Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Sun, 26 Oct 2025 18:22:49 -0700 Subject: [PATCH 40/45] Update treeQTL.R --- R/treeQTL.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/treeQTL.R b/R/treeQTL.R index 5140bd8..889e959 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -75,6 +75,7 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na colnames(context_eGenes)[1] <- "family" context_eGenes$pval <- 0 context_eGenes$n_sel <- 1 + dir.create(treeQTL_dir, recursive = TRUE, showWarnings = FALSE) eAssoc_file <- paste0(treeQTL_dir, "/eAssoc_by_gene.context_", cur_tissue_name, ".txt") get_eAssociations( From c6a02707295d5cf9dcaa1c0e9206fabfc30ebdfa Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 6 Nov 2025 14:35:53 -0800 Subject: [PATCH 41/45] Update treeQTL.R --- R/treeQTL.R | 145 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 117 insertions(+), 28 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index 889e959..4834adf 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -9,17 +9,18 @@ #' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) #' @param fdr_thresh - value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. #' @param four_level - boolean value (T or F) that signifies whether to use the 4-level hierarchy (set this parameter to R and test for a global eQTL across shared and specific components) or a 3-level hierarchy (this parameter is default set to F to test for shared vs specific eQTLs) +#' @param cis_dist - maximum genomic distance (in base pairs) between a SNP and a gene's transcription start site (TSS) to be considered a cis-association. #' @param treeBH_method - character string specifying which TreeBH implementation to use when four_level = TRUE. Options: "original" (TreeBH package), "datatable" (optimized R), "cpp" (fast C++ implementation, default). Ignored when four_level = FALSE. #' @param treeBH_test - character string specifying the p-value aggregation method for TreeBH when four_level = TRUE. Options: "simes" (Simes' method, default), "fisher" (Fisher's method). Ignored when four_level = FALSE. +#' @param qtl_type - string value "cis" or "trans" denoting the type of eQTL mapped. Default is set to "cis" #' @return outputs one file of specific eGenes across all contexts and one file of shared eGenes. Outputs an eAssociation file for each context and one for shared eQTLs with snp-gene pairs and FDR adjusted p-values. #' #' @importFrom data.table fread getDTthreads setDTthreads #' @importFrom dplyr select group_by mutate distinct #' @importFrom magrittr %>% #' @export -treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE, treeBH_method = "cpp", treeBH_test = "simes"){ - - suppressWarnings({ +treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE, cisDist = 1e6, treeBH_method = "cpp", treeBH_test = "simes"){ + print(paste0("data.table getDTthreads(): ", getDTthreads())) setDTthreads(1) print(paste0("after setting as 1 thread; data.table getDTthreads(): ", getDTthreads())) @@ -30,23 +31,77 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na level2 = fdr_thresh level3 = fdr_thresh - cisDist = 1e6; + # Distance for local gene-SNP pairs + nearby = TRUE + if(qtl_type != "cis"){ + nearby = FALSE + print(paste("Performing multiple testing adjustment for FastGxC trans-eQTLs.")) + }else{ + print(paste("Performing multiple testing adjustment for FastGxC cis-eQTLs.")) + } snpspos = fread(file = snps_location_file_name); genepos = fread(file = gene_location_file_name); + ## get context names + if (is.vector(context_names)) { + print(paste("Input for context names is a valid vector.")) + }else{ + stop(print(paste0("No valid input for context names."))) + } + # Use treeQTL to perform hierarchical FDR and get specific_eGenes, i.e. genes with at least one context-specific eQTL, and shared_eGenes, i.e. genes with at least one context-shared eQTL + + + names(genepos) <- tolower(names(genepos)) + names(snpspos) <- tolower(names(snpspos)) + + genepos <- genepos |> + dplyr::rename( + geneid = dplyr::coalesce(names(genepos)[grepl("gene", names(genepos))][1], "geneid"), + s1 = dplyr::coalesce(names(genepos)[grepl("start|s1", names(genepos))][1], "s1"), + s2 = dplyr::coalesce(names(genepos)[grepl("end|s2", names(genepos))][1], "s2") + ) + snpspos <- snpspos |> + dplyr::rename( + snpid = dplyr::coalesce(names(snpspos)[grepl("SNP|snp", names(snpspos))][1], "snpid"), + pos = dplyr::coalesce(names(snpspos)[grepl("position|pos", names(snpspos))][1], "pos") + ) + if (is.vector(context_names)) { print(paste("Input for context names is a valid vector.")) } else { stop(print(paste0("No valid input for context names."))) } + + expected_files <- paste0(context_names, "_specific.cis_pairs.txt") + missing_files <- setdiff(expected_files, list.files(data_dir)) + + if (length(missing_files) > 0) { + stop(paste0( + "Missing FastGxC output files for contexts: ", + paste(gsub("_specific.cis_pairs.txt", "", missing_files), collapse = ", ") + )) + } else { + message("All expected FastGxC eQTL mapping output files are present.") + } - shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos[,1:3], gene_map = genepos[,1:4], - nearby = TRUE, dist = cisDist) + shared_n_tests_per_gene = get_n_tests_per_gene( + snp_map = snpspos[,1:3], + gene_map = genepos[,1:4], + nearby = TRUE, # only look at local (cis) + dist = cisDist + ) shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) - # shared_n_tests_per_gene = data.frame(gene = rownames(shared_n_tests_per_gene), shared_n_tests_per_gene) - names(shared_n_tests_per_gene) = c("family", "n_tests") + if(ncol(shared_n_tests_per_gene) < 2){ + shared_n_tests_per_gene = data.frame( + gene = rownames(shared_n_tests_per_gene), + shared_n_tests_per_gene + ) + } + names(shared_n_tests_per_gene) = c("family", "n_tests") # sanity check + + # get rid of this later get_eGenes_multi_tissue_mod <- function(m_eqtl_out_dir, treeQTL_dir, tissue_names, level1 = level1, level2 = level2, level3 = level3, exp_suffix, four_level = FALSE, shared_n_tests_per_gene) { pattern <- paste0(tissue_names, "_", exp_suffix, ".cis_pairs.txt") m_eqtl_outfiles <- file.path(m_eqtl_out_dir, pattern) @@ -151,6 +206,7 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na level1 = level1, level2 = level2, level3 = level3, exp_suffix = "specific", four_level = four_level, + qtl_type = qtl_type, shared_n_tests_per_gene = shared_n_tests_per_gene ) @@ -158,32 +214,66 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na if (nrow(specific_eGenes) == 0) { message("No specific eGenes discovered.") - write.table(data.frame(), file = file.path(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + write.table( + data.frame(gene = character(), n_sel_tissues = numeric()), + file = file.path(out_dir, "specific_eGenes.txt"), + quote = FALSE, row.names = FALSE, sep = '\t' + ) } else { - write.table(x = specific_eGenes, file = paste0(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + write.table( + x = specific_eGenes, + file = paste0(out_dir, "specific_eGenes.txt"), + quote = FALSE, + row.names = FALSE, + col.names = TRUE, + sep = '\t' + ) } - pattern = ("shared.all_pairs.txt") - shared_file <- list.files(path = data_dir, pattern = "shared_shared.cis_pairs.txt", full.names = TRUE) - if (length(shared_file) != 1) stop("Expected one shared file but found: ", length(shared_file)) + pattern <- (paste0("shared.", qtl_type, "_pairs.txt")) + shared_file <- list.files(path = data_dir, pattern = pattern, full.names = TRUE) - shared_eGenes = get_eGenes( - n_tests_per_gene = shared_n_tests_per_gene, - m_eqtl_out = shared_file, - method = "BH", - level1 = level1, level2 = level2, - slice_size = 1e+05, - silent = FALSE - ) + if (length(shared_file) != 1) { + stop("Expected one shared file but found: ", length(shared_file)) + } + + if (file.size(shared_file) == 0) { + message("Shared cis-pairs file is empty. Skipping shared eGene discovery.") + shared_eGenes <- data.frame() + } else { + message("Running TreeQTL correction for shared eGenes...") + shared_eGenes <- get_eGenes( + n_tests_per_gene = shared_n_tests_per_gene, + m_eqtl_out = shared_file, + method = "BH", + level1 = level1, + level2 = level2, + slice_size = 1e+05, + silent = FALSE + ) + } if (nrow(shared_eGenes) == 0) { message("No shared eGenes discovered. Skipping shared association analysis.") - write.table(data.frame(), file = file.path(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') - return(invisible(NULL)) - } - else{ - write.table(x = shared_eGenes, file = paste0(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, sep = '\t') + write.table( + data.frame(), + file = file.path(out_dir, "shared_eGenes.txt"), + quote = FALSE, + row.names = FALSE, + col.names = TRUE, + sep = '\t' + ) + return(invisible(NULL)) # Skipping eAssociations + } else { + write.table( + x = shared_eGenes, + file = paste0(out_dir, "shared_eGenes.txt"), + quote = FALSE, + row.names = FALSE, + col.names = TRUE, + sep = '\t' + ) } eAssociations = get_eAssociations( @@ -194,6 +284,5 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na by_snp = FALSE, slice_size = 1e+05, silent = FALSE ) - } - }) + } } From 71d961892496ac9485a0e50063b913e31d875490 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 6 Nov 2025 17:37:51 -0800 Subject: [PATCH 42/45] Update treeQTL.R --- R/treeQTL.R | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index 4834adf..01d7a7a 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -9,7 +9,7 @@ #' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) #' @param fdr_thresh - value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. #' @param four_level - boolean value (T or F) that signifies whether to use the 4-level hierarchy (set this parameter to R and test for a global eQTL across shared and specific components) or a 3-level hierarchy (this parameter is default set to F to test for shared vs specific eQTLs) -#' @param cis_dist - maximum genomic distance (in base pairs) between a SNP and a gene's transcription start site (TSS) to be considered a cis-association. +#' @param cisDist - maximum genomic distance (in base pairs) between a SNP and a gene's transcription start site (TSS) to be considered a cis-association. #' @param treeBH_method - character string specifying which TreeBH implementation to use when four_level = TRUE. Options: "original" (TreeBH package), "datatable" (optimized R), "cpp" (fast C++ implementation, default). Ignored when four_level = FALSE. #' @param treeBH_test - character string specifying the p-value aggregation method for TreeBH when four_level = TRUE. Options: "simes" (Simes' method, default), "fisher" (Fisher's method). Ignored when four_level = FALSE. #' @param qtl_type - string value "cis" or "trans" denoting the type of eQTL mapped. Default is set to "cis" @@ -19,7 +19,7 @@ #' @importFrom dplyr select group_by mutate distinct #' @importFrom magrittr %>% #' @export -treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE, cisDist = 1e6, treeBH_method = "cpp", treeBH_test = "simes"){ +treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_name, context_names, out_dir, fdr_thresh = 0.05, four_level = FALSE, cisDist = 1e6, qtl_type = "cis", treeBH_method = "cpp", treeBH_test = "simes"){ print(paste0("data.table getDTthreads(): ", getDTthreads())) setDTthreads(1) @@ -66,12 +66,6 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na snpid = dplyr::coalesce(names(snpspos)[grepl("SNP|snp", names(snpspos))][1], "snpid"), pos = dplyr::coalesce(names(snpspos)[grepl("position|pos", names(snpspos))][1], "pos") ) - - if (is.vector(context_names)) { - print(paste("Input for context names is a valid vector.")) - } else { - stop(print(paste0("No valid input for context names."))) - } expected_files <- paste0(context_names, "_specific.cis_pairs.txt") missing_files <- setdiff(expected_files, list.files(data_dir)) @@ -86,11 +80,11 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na } shared_n_tests_per_gene = get_n_tests_per_gene( - snp_map = snpspos[,1:3], - gene_map = genepos[,1:4], - nearby = TRUE, # only look at local (cis) + snp_map = snpspos[, c("snpid","chr","pos")], + gene_map = genepos[, c("geneid","chr","s1","s2")], + nearby = nearby, dist = cisDist - ) + ) shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) if(ncol(shared_n_tests_per_gene) < 2){ @@ -223,7 +217,7 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na else { write.table( x = specific_eGenes, - file = paste0(out_dir, "specific_eGenes.txt"), + file = file.path(out_dir, "specific_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, @@ -268,7 +262,7 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na } else { write.table( x = shared_eGenes, - file = paste0(out_dir, "shared_eGenes.txt"), + file = file.path(out_dir, "shared_eGenes.txt"), quote = FALSE, row.names = FALSE, col.names = TRUE, @@ -280,8 +274,9 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na eDiscoveries = shared_eGenes, n_tests = shared_n_tests_per_gene, m_eqtl_out = shared_file, - out_file = paste0(out_dir, "eAssoc_by_gene.context_shared.txt"), - by_snp = FALSE, slice_size = 1e+05, + out_file = file.path(out_dir, "eAssoc_by_gene.context_shared.txt"), + by_snp = FALSE, + slice_size = 1e+05, silent = FALSE ) } From fe64164dc05855c6ebe7aecf5a442f1111355081 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Fri, 7 Nov 2025 12:27:15 -0800 Subject: [PATCH 43/45] Update treeQTL.R --- R/treeQTL.R | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/R/treeQTL.R b/R/treeQTL.R index 01d7a7a..3330ad2 100644 --- a/R/treeQTL.R +++ b/R/treeQTL.R @@ -6,13 +6,13 @@ #' @param snps_location_file_name - full filepath of the snpsloc file used in the eQTL mapping step #' @param gene_location_file_name - full filepath of the geneloc file used in the eQTL mapping step #' @param out_dir - full filepath of the output directory that FDR adjusted eQTLs should be written out to. +#' @param cisDist - numeric value of defined cis window. Note: this should match the cisDist set in the eQTL mapping step. #' @param context_names - vector of all context names in the format c("tissue1", "tissue2", ..., etc.) #' @param fdr_thresh - value between 0 and 1 that signifies what FDR threshold for multiple testing correction. The same value will be used across all hierarchical levels. #' @param four_level - boolean value (T or F) that signifies whether to use the 4-level hierarchy (set this parameter to R and test for a global eQTL across shared and specific components) or a 3-level hierarchy (this parameter is default set to F to test for shared vs specific eQTLs) -#' @param cisDist - maximum genomic distance (in base pairs) between a SNP and a gene's transcription start site (TSS) to be considered a cis-association. +#' @param qtl_type - string value "cis" or "trans" denoting the type of eQTL mapped. Default is set to "cis" #' @param treeBH_method - character string specifying which TreeBH implementation to use when four_level = TRUE. Options: "original" (TreeBH package), "datatable" (optimized R), "cpp" (fast C++ implementation, default). Ignored when four_level = FALSE. #' @param treeBH_test - character string specifying the p-value aggregation method for TreeBH when four_level = TRUE. Options: "simes" (Simes' method, default), "fisher" (Fisher's method). Ignored when four_level = FALSE. -#' @param qtl_type - string value "cis" or "trans" denoting the type of eQTL mapped. Default is set to "cis" #' @return outputs one file of specific eGenes across all contexts and one file of shared eGenes. Outputs an eAssociation file for each context and one for shared eQTLs with snp-gene pairs and FDR adjusted p-values. #' #' @importFrom data.table fread getDTthreads setDTthreads @@ -79,12 +79,8 @@ treeQTL_step = function(data_dir, snps_location_file_name, gene_location_file_na message("All expected FastGxC eQTL mapping output files are present.") } - shared_n_tests_per_gene = get_n_tests_per_gene( - snp_map = snpspos[, c("snpid","chr","pos")], - gene_map = genepos[, c("geneid","chr","s1","s2")], - nearby = nearby, - dist = cisDist - ) + shared_n_tests_per_gene = get_n_tests_per_gene(snp_map = snpspos %>% dplyr::select(snpid, chr, pos), gene_map = genepos %>% dplyr::select(geneid, chr, s1, s2), + nearby = nearby, dist = cisDist) shared_n_tests_per_gene = data.frame(shared_n_tests_per_gene) if(ncol(shared_n_tests_per_gene) < 2){ From ffab0ff42df9fa14d2e5d05db60209dac29e2619 Mon Sep 17 00:00:00 2001 From: Anthony Zhao Date: Wed, 26 Nov 2025 14:54:59 -0800 Subject: [PATCH 44/45] fread --- R/eQTL_mapping.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index 058ed82..09494fd 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -42,7 +42,7 @@ eQTL_mapping_step = function( setDTthreads(1) expression_mat <- as.matrix(data.frame(fread(expression_file_name, header = TRUE), row.names = 1, check.names = FALSE)) - genepos <- data.table::fread(gene_location_file_name, sep = NULL, header = TRUE, data.table = FALSE) + genepos <- data.table::fread(gene_location_file_name, sep = '\t', header = TRUE, data.table = FALSE) names(genepos) <- tolower(names(genepos)) genepos <- genepos |> @@ -175,4 +175,4 @@ builtins.run_tensorqtl = run_tensorqtl } else { stop("Invalid method. Use 'MatrixEQTL' or 'tensorQTL'") } -} \ No newline at end of file +} From eee400eb6f3a168f482478810f7e75fd8b66b3b6 Mon Sep 17 00:00:00 2001 From: charliewang123 Date: Thu, 19 Feb 2026 19:11:51 -0800 Subject: [PATCH 45/45] Update eQTL_mapping.R --- R/eQTL_mapping.R | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/R/eQTL_mapping.R b/R/eQTL_mapping.R index 058ed82..e15c7e0 100644 --- a/R/eQTL_mapping.R +++ b/R/eQTL_mapping.R @@ -42,7 +42,7 @@ eQTL_mapping_step = function( setDTthreads(1) expression_mat <- as.matrix(data.frame(fread(expression_file_name, header = TRUE), row.names = 1, check.names = FALSE)) - genepos <- data.table::fread(gene_location_file_name, sep = NULL, header = TRUE, data.table = FALSE) + genepos <- data.table::fread(gene_location_file_name, sep = '\t', header = TRUE, data.table = FALSE) names(genepos) <- tolower(names(genepos)) genepos <- genepos |> @@ -94,7 +94,7 @@ eQTL_mapping_step = function( expression_file_name <- path.expand(expression_file_name) out_dir <- path.expand(out_dir) suppressWarnings({ - py_run_string(" + py_run_string(" import os import torch import pandas as pd @@ -114,20 +114,25 @@ def run_tensorqtl(phenotype_df, phenotype_pos_df, genotype_df, variant_df, prefi builtins.run_tensorqtl = run_tensorqtl ")}) - + expr <- read.table(expression_file_name, header = TRUE, sep = "\t", check.names = FALSE) - rownames(expr) <- expr[, 1] expr <- expr[, -1, drop = FALSE] - + + expr <- t(apply(expr, 1, function(x) { + x[is.na(x)] <- mean(x, na.rm = TRUE) + x + })) + write.table( expr, file = expression_file_name, sep = "\t", row.names = TRUE, - col.names = NA, + col.names = NA, quote = FALSE ) + phenotype_df <- suppressWarnings(read.table(expression_file_name, header = TRUE, row.names = 1)) phenotype_pos_df <- suppressWarnings(read.table(gene_location_file_name, header = TRUE, row.names = 1)) genotype_df <- suppressWarnings(read.table(SNP_file_name, header = TRUE, row.names = 1))