Comprehensive Analysis Suite for Cell-type specificity and Accessibility-Driven QTL Effects
CASCADE (Comprehensive Analysis Suite for Cell-type specificity and Accessibility-Driven QTL Effects) is an R package for systematically characterizing cell type specificity and regulatory mechanisms of molecular QTLs (molQTLs) from multiome analyses. It implements a hierarchical framework that operates at two levels:
CASCADE requires R 4.4 or newer.
pak resolves the Bioconductor dependencies automatically:
# install.packages("pak")
# pak::pkg_install("mkanai/cascade")
install.packages("cascade", repos = c('https://mkanai.r-universe.dev', 'https://cloud.r-project.org'))
remotes does not install Bioconductor dependencies, so install those first:
if (!requireNamespace("BiocManager", quietly = TRUE)) {
install.packages("BiocManager")
}
BiocManager::install(c("BiocGenerics", "S4Vectors", "IRanges", "GenomicRanges"))
# install.packages("remotes")
# remotes::install_github("mkanai/cascade")
install.packages("cascade", repos = c('https://mkanai.r-universe.dev', 'https://cloud.r-project.org'))
Required: cli, data.table (>= 1.12.0), digest, GenomicRanges, IRanges, jsonlite, memoise, parallel, qs2, R.utils, Rcpp, S4Vectors
Suggested: argparse (CLI script); knitr, rmarkdown (vignettes); testthat (tests)
library(cascade)
config <- create_config(
cell_types = c("Mono", "DC", "NK", "B", "CD4_T", "CD8_T", "other_T"),
chromosomes = paste0("chr", 1:22),
file_patterns = list(
# Per-cell-type ACAT significance
eqtl_acat = "data/eqtl/{CELL_TYPE}.acat.tsv.gz",
caqtl_acat = "data/caqtl/{CELL_TYPE}.acat.tsv.gz",
# Per-cell-type, per-chromosome SuSiE fine-mapping
eqtl_susie = "data/eqtl/{CELL_TYPE}.{CHR}.susie.tsv.gz",
caqtl_susie = "data/caqtl/{CELL_TYPE}.{CHR}.susie.tsv.gz",
# Mash LFSR matrices (one row per feature x variant, columns = cell types)
eqtl_lfsr = "data/eqtl.lfsr.tsv.gz",
caqtl_lfsr = "data/caqtl.lfsr.tsv.gz",
# Meta-analysis results (Cochran's Q heterogeneity)
eqtl_meta = "data/eqtl.meta.tsv.gz",
caqtl_meta = "data/caqtl.meta.tsv.gz",
# Peak coordinates and per-cell-type peak-gene links
peak_bed = "data/{CELL_TYPE}.peaks.bed",
peak_gene_links = "data/{CELL_TYPE}.peak_gene_links.tsv.gz"
)
)
results <- run_cascade(config, output_dir = "results/")
See docs/SPECIFICATION.md §7 for the full input schema.
CASCADE uses a configurable hierarchy to determine specificity categories. The package ships with DEFAULT_CELL_HIERARCHY for immune cells:
DEFAULT_CELL_HIERARCHY
#> CellTypeHierarchy
#> Lineages (2): myeloid, lymphoid
#> L1 cell types (7): Mono, DC, NK, B, CD4_T, CD8_T, other_T
#> T-cell subgroup: CD4_T, CD8_T, other_T
#> Bulk: PBMC
#> Categories (6): Cross-lineage shared | Likely shared but underpowered |
#> Lineage-specific | T-cell-specific | Single cell-type | No significance
Define a custom hierarchy for any tissue (the category count adapts to the number of grouping levels you supply):
brain_hierarchy <- create_cell_hierarchy(
lineages = list(
neuronal = c("Excitatory", "Inhibitory"),
glial = c("Astrocyte", "Oligodendrocyte", "Microglia", "OPC")
),
bulk = "BulkBrain"
)
| Category | Definition |
|---|---|
| Cross-lineage shared | Significant (FDR < 0.05) in ≥ 2 top-level lineages |
| Likely shared but underpowered | Apparent specificity demoted by LFSR gray-zone evidence (0.05 ≤ LFSR < 0.5) of hidden sharing |
| Lineage-specific | Significant in exactly one lineage, with high LFSR (≥ 0.5) elsewhere |
| T-cell-specific | Significant only within a defined subgroup (T-cell subgroup by default) |
| Single cell-type | Significant in exactly one L1 cell type |
| No significance | No significant effects detected |
Subgroup-specific categories are determined by the hierarchy. The default immune hierarchy yields one subgroup label (T-cell-specific); custom hierarchies may produce more.
Each variant is classified along four features (chromatin accessibility peak overlap, caQTL status, peak-gene links, and eQTL status), yielding 25 mutually exclusive patterns that collapse into 8 mechanism categories ordered by how directly the variant acts on its own regulatory sequence. The three cascade tiers are distinguished by where the causal chromatin accessibility peak sits relative to the variant.
| # | Mechanism | Definition |
|---|---|---|
| 1 | Local Cascade | Variant overlaps a peak, shows caQTL effects for that overlapping peak, the peak has a peak-gene link, and the variant shows eQTL effects for that linked gene |
| 2 | Positional Cascade | Variant overlaps a peak with a peak-gene link and shows eQTL effects for the linked gene, but lacks detectable caQTL effects at the overlapping peak |
| 3 | Distal Cascade | Variant does not overlap any peak, but shows caQTL effects for a non-overlapping peak that has a peak-gene link to a gene for which the variant is also an eQTL |
| 4 | caQTL + eQTL (No Link) | Variant shows both caQTL and eQTL effects, but the eQTL gene differs from the linked gene or no peak-gene link exists |
| 5 | Only caQTL (With Link) | Variant shows caQTL effects and the affected peak has peak-gene links, but no eQTL is detected for the linked gene |
| 6 | Only caQTL (No Link) | Variant shows caQTL effects but the affected peak lacks peak-gene links |
| 7 | Only eQTL | Variant shows eQTL effects but no detectable caQTL effects |
| 8 | No molQTL | No significant molecular QTL effects in any cell type |
See QTL_PATTERNS and QTL_MECHANISMS for the full enumeration.
run_cascade() writes the following to output_dir:
| File | Contents |
|---|---|
gene_categorization.tsv.gz |
Per-gene specificity categories with heterogeneity-derived columns (top variant, max PIP, Cochran's Q) |
gene_categorization.summary.tsv |
Tabular summary of gene categorization |
peak_categorization.tsv.gz |
Per-peak specificity categories (same schema as gene output) |
peak_categorization.summary.tsv |
Tabular summary of peak categorization |
variant_categorization.tsv.gz |
Per-variant cross-cell-type aggregate: QTL mechanism + three specificity columns (combined / gene / peak) |
variant_categorization.qtl_mechanism.summary.tsv |
Counts of variants per QTL mechanism category |
variant_categorization.cell_type_specificity.summary.tsv |
Counts of variants per cell type specificity category |
variant_categorization_per_celltype_{CELL_TYPE}.tsv.gz |
Per-variant Stage 1 output, one file per cell type |
See docs/SPECIFICATION.md §8 for the full column schema.
Kanai, M. et al. Population-scale multiome immune cell atlas reveals complex disease drivers. medRxiv (2025)
MIT License
Masahiro Kanai (mkanai@broadinstitute.org)