Statistical Guidance & Reporting Checklist#
Read this before writing a paper or supplement. scATrans combines several heuristics; not every output column is a calibrated statistical claim.
Output |
Safe use |
Do not use it for |
|---|---|---|
|
Ranking and visualization within one analysis |
p-values, FDR, or “statistically significant activation” on its own |
|
Exploratory signal for group-contrast nascent excess (after reference γ) |
Literal transcription rates, causal claims, or equivalence to dynamical RNA velocity |
|
Standard DE reporting (with usual pseudoreplication caveats) |
— |
|
Primary active-gene significance filter (one-sided, conditional null) |
Claims without inspecting diagnostics and replicate structure |
Reporting checklist#
Rank genes with
active_score; state clearly that it is a composite heuristic, not a test statistic.For significance, use DE
p_adjand/orunspliced_excess_fdr(permutation). The built-insignificantlist is intentionally strict and often empty.Describe the unspliced excess term as a reference-gamma group contrast, not full stochastic velocity inference.
When
use_permutation=True, note the conditional permutation (labels shuffled; layers and γ fixed) in methods — see diagnosticspermutation_approximation_note.Cross-check top hits with raw spliced/unspliced counts, phase portraits, and (when possible) orthogonal DE or replicate-aware models.
The simple wrappers (active_score_simple, run_default_pipeline) keep
permutation off by default so new users explore ranked tables first; enable
use_permutation=True explicitly when you need FDR on unspliced excess.
Quick reference (one page)#
Step |
Function |
Key outputs |
|---|---|---|
0. Pre-flight |
|
|
1. Score |
|
|
2. Filter |
|
candidate gene list for plots / enrichment |
3. Enrich |
|
ORA table; cite |
4. Plot |
|
|
Workflow presets (via recommend_workflow → WORKFLOW_PRESETS):
explore— ranking only, no permutation (fast)report—use_permutation=True,n_perm=500,perm_de_backend="same"pseudobulk_report— multi-replicate pseudobulk + permutationnascent_focus—ranking_mode="nascent_excess"(residual-only ranking)
Paper checklist (minimal):
State that
active_scoreis a composite heuristic rank, not a p-value.Report DE with
p_adj; report nascent excess significance withunspliced_excess_fdrwhenuse_permutation=True.Describe unspliced excess as a reference-gamma group contrast (not full dynamical velocity).
Enrichment: name bundled library (
Hs/Mm_*_2026) andp_adjust_method; seesrc/scatrans/data/README.md.Plots: note
adjustTextis optional (label_repel=Falseto skip); label density viamin_label_score/label_fontsize.
Result interpretation#
Column naming (v0.9+)#
Primary result columns use unspliced / nascent excess terminology (not RNA velocity):
Primary column |
Legacy alias (deprecated) |
Meaning |
|---|---|---|
|
|
Raw U − γ_ref·S in target group |
|
|
Bias-corrected excess residual |
|
— |
One-sided permutation p-value on residual |
|
— |
BH-FDR on |
active_score (0–100) is a heuristic ranking score (weighted
soft-scaled composite of logFC + unspliced excess residual + -log p_adj). It
is intended for ranking and visualization only and should not be
interpreted or reported as a p-value or statistical significance measure.
Use the permutation-derived unspliced_excess_fdr (when enabled) or your
own post-hoc statistics for claims.
Built-in significant gene list#
When use_permutation=True, the built-in mask uses the same default
thresholds as filter_active_genes(..., preset="heuristic") (see
HEURISTIC_FILTER_DEFAULTS in tl.py). To recover that exact list later
from all_results, use filter_active_genes(all_results, preset="significant") — it reads the stored filter context rather than
re-guessing cutoffs.
Under default parameters the built-in mask requires all of:
logFC > logfc_cutoff(default 0.35)p_adj < pval_cutoff(default 0.05)unspliced_excess_residual > 1.0(default residual magnitude cutoff)active_score >= 55.0active_score_fdr < 0.25(when permutation computed composite-score FDR)unspliced_excess_fdr < unspliced_excess_fdr_cutoff(default 0.05)
Without use_permutation=True, the built-in significant list is empty
(FDR on unspliced excess cannot be computed). Use all_results +
filter_active_genes for custom thresholds.
On low-signal data the built-in list may still be small. Use the full table
in all_results, sorted by active_score descending. If you need different
cutoffs, pass explicit arguments to filter_active_genes rather than
assuming the built-in list matches a custom logfc_cutoff override on
active_score().
After each run inspect the diagnostics:
meta = adata_res.uns["scatrans"]
print(meta["diagnostics"]["unspliced_global_fraction"])
print(meta["diagnostics"]["bias_correction"])
print(meta.get("permutation_approximation_note"))
Global unspliced fractions above ~50% frequently indicate technical issues. Bias-correction diagnostics report the number of genes used and any fallback behavior. The permutation note records that unspliced/spliced layers and the reference gamma were fixed for speed while labels were shuffled.
Limitations#
The unspliced excess term (used by the primary active_score workflow) is
a group-contrast proxy derived from a reference-group gamma calculation. It
is not a full stochastic or dynamical model.
The unspliced excess term is most directly applicable to binary group
contrasts. Within-group heterogeneity can reduce observed signal. When
use_permutation=True, labels are shuffled while unspliced/spliced layers
and the reference gamma remain fixed; this is noted in the results. Global
unspliced fractions above ~50% are reported in diagnostics. Bias correction
effectiveness depends on annotation coverage. Small replicate numbers limit
power for the unspliced excess term and FDR estimates. Mixed-model results
tend to be conservative with large between-sample variation.
When used purely as a differential expression + enrichment toolkit (via
differential_expression, run_enrichment, etc.), scATrans relies on
established backends (scanpy, PyDESeq2, etc.) whose standard statistical
caveats apply.
Always examine diagnostics, score distributions, and (when available) the original spliced/unspliced counts before biological interpretation.