Methods
How a result is produced, end to end, written as a methods section. The methods are organ-agnostic; the parameters that vary per atlas are listed in Per-atlas parameters.
Overview
A query dataset is encoded into a reference atlas's latent space by the reference's trained scANVI model, labelled by that model's classifier head, and passed to the downstream analyses selected for the run. The reference is built once from the CZI CELLxGENE Census [10] and is not retrained or fine-tuned for a query. Every parameter that varies between atlases comes from that atlas's own build record and is listed in the per-atlas table.
Reference data & cohort selection
Each reference is carved from a fixed Census snapshot (census.census_version,
2025-11-08 for all fourteen live references), so the reference does not change
under results already produced. Four filters are applied at load, and each is recorded:
- Condition. Only cells whose
donor_statusequalsnormalare kept (filtering.condition_filter). The reference is a healthy backbone; disease is a property of the query, never of the reference, and queries are not filtered. - Developmental stage. A denylist of HsapDv / MmusDv ontology ids
(
filtering.dev_stage_filter). It is deliberately lenient: it drops cells with a known non-adult stage and keeps cells whose stage is unlabelled or coarse, so a zero count means no cell carried a denied stage, not that every cell was checked. - Tissue. An UBERON id allowlist [24] (
filtering.tissue_filter), used to carve a region reference out of a broader cohort without admitting adjacent tissue. It is an id allowlist, not a name pattern. - Cell type. An optional CL id allowlist
(
filtering.cell_type_filter), unset on most references.
Cohorts contain both integrated atlases and the studies those atlases re-publish, so cells
are de-duplicated on observation_joinid, keeping
is_primary_data == True first (filtering.deduplication).
The one exception is cortex, built before this step and left as built: it holds 8
duplicated cells in 6.48 million.
Genes are reconciled by a strict inner join across the constituent datasets
(gene_space.strategy), so no gene is zero-padded into training. The
constituent dataset ids for each reference are listed in the manifest's
cohort_datasets, and the per-dataset citations, DOIs and licences are
published on the attribution page. All Census source data
is CC BY 4.0. A cohort containing a dataset that does not permit commercial use stops the build;
nothing is dropped silently.
Quality control
Per-cell quality metrics (total counts, genes detected, mitochondrial fraction) are
recomputed on every cell to verify the data as received. They are not used to re-filter it.
The applied thresholds are recorded per build (qc.thresholds_applied) and are
min_genes = 0, min_counts = 1 (which only prevents a
divide-by-zero in normalization) and max_pct_mt = 20.
Two steps a reader would reasonably expect are deliberately off, and the manifest records both as off:
- Median-absolute-deviation filtering: off (
qc.mad_filtering.ran). Census submissions are already quality-controlled by their depositors; recomputing the metrics verifies that, while re-filtering would reshape a published population. - Scrublet [5] doublet removal: off
(
qc.scrublet.ran). CELLxGENE submissions are typically already doublet-depleted, and running Scrublet on doublet-depleted data distorts its simulated-doublet distribution and over-flags real cells (a sample with 24% false positives was observed). The decision is made per dataset, and is also negative for plate-based protocols.
Consequently every live reference records qc.cells_kept_fraction = 1.0: the
population in the reference is the population the depositors published, minus the cohort
filters above. So the cohort filters, not QC, decide what the reference contains.
Gene & feature selection
The latent model trains on 5,000 highly variable genes selected at the atlas level
(build.n_model_genes_hvg), with the dispersion-based seurat
flavor [4] on normalized, log1p-transformed counts, batch-aware
with batch_key = dataset_id (gene_space.hvg) so that no single
study drives selection. A per-dataset pre-filter of 8,000 genes
(gene_space.hvg.per_dataset_n) runs earlier in the build and is not the atlas
panel.
At atlas size, averaging over millions of cells per gene already stabilizes the variance
estimate, so no variance-stabilizing transform precedes selection. The full inner-join gene space
(build.n_inner_join_genes, listed per atlas below) is
retained in the reference and is what marker scoring and differential expression read; the
HVG panel shapes the embedding only.
Label harmonization
Each cell's cell_type_ontology_term_id is mapped through a per-reference
subclass map to a coarse label in obs["cell_type"]
(labels.coarse_built_by). A CL id coarser than any anchor in the map, and any
label in labels.junk_labels (the depositor catch-all bins such as
Miscellaneous and unannoted), becomes the unlabeled category
Unknown (labels.unlabeled). The original study label and the CL
id are preserved verbatim in the reference. The full crosswalk from original label to CL id
to harmonized type ships with the reference as a per-organ label registry
(labels.label_registry_file).
This affects every reported rate. Junk labels and labels outside the reference vocabulary are excluded from the accuracy and macro-F1 denominators, and the excluded fraction is reported separately as coverage; see Model selection & benchmarking. Harmonization stops at that subclass level: finer cross-dataset harmonization is not attempted, so two studies' fine distinctions are collapsed rather than reconciled.
Latent model: scVI / scANVI
The embedding is a single-cell variational inference model [1]
over raw counts held in layers["counts"], with a negative-binomial likelihood
(gene_likelihood="nb", dispersion="gene") and a batch covariate
sample_ID (batch_key). Note that the batch key for the model is
the sample, while the batch key for gene selection is the dataset. Architecture is 30
latent dimensions (training_contract.n_latent), 2 layers, 128 hidden units;
optimization is batch size 2,048, learning rate 1e-3, gradient clipping at 1.0, and a KL
target of 0.1 reached by linear warm-up over
round(10/45 × scvi_epochs) epochs. Covariates are not encoded into the
posterior (encode_covariates = False), which is what makes the zero-shot query
read in Reference mapping valid.
Cell types are added with scANVI [2], seeded from the scVI epoch
with the lowest validation ELBO. It trains with labels_key = "cell_type",
unlabeled_category = "Unknown", a class-balanced cross-entropy loss [30]
(β = 0.999999) so that rare types are not swamped by abundant ones, and a constant KL
of 0.1 with no warm-up.
Epochs are not a fixed number. Both phases are trained to a constant gradient-update
budget, so an atlas of 400k cells and one of 15M cells receive comparable numbers of
updates: epochs = clip(round(budget / round(n_cells / 2048)), floor, cap),
with budget = 323,730 for scVI (floor 10, cap 400) and 73,575 for
scANVI (floor 5, cap 200). The budgets are asymmetric because the two phases converge in
different regimes: measured across three references, scVI's minimum validation loss lands
at 93 to 98 percent of its budget while scANVI's lands at 10 to 17 percent, so a symmetric
budget spent most scANVI epochs overfitting. There is no early stopping; every epoch is
validated and checkpointed, and the epoch that ships is chosen afterwards
(below). Per-atlas epoch counts are in the
per-atlas table.
Reference mapping & label transfer
A query is encoded zero-shot: the reference's trained scANVI model encodes the query cells into the existing latent space, with no fine-tuning and no query-side training. This is the only mapping path in the product. Three details determine what the result means:
- Genes are aligned to the model's expected variables by scvi-tools'
prepare_query_anndata[29]. Genes the model never saw are dropped and genes the query lacks are zero-filled; the resulting coverage is recorded on the run and shown in the report. - Every query cell is pinned to one batch value from the trained vocabulary. The query's batch column is overwritten with that value, so the mapping leans on the reference's own batch correction rather than estimating a new batch effect. For queries close to the reference this is accurate; a strongly platform-shifted query is surfaced by the OOD score rather than silently mislabelled.
- The cell-type call is the scANVI classifier head, applied on every run. The label is the argmax of the head's softmax and the per-cell confidence is that softmax maximum.
If you supply your own cell-type labels, they are adopted as the primary labels and drive every downstream analysis; the classifier head's calls are not used for that. The head still runs, which is what makes the optional agreement report possible: it compares your labels with the model's calls after aligning your vocabulary to the reference's.
Out-of-distribution scoring
The OOD score measures how far a query cell sits from the reference cells the model learned. The scANVI encoder gives a diagonal Gaussian posterior per cell, \(q(z \mid x_i) = \mathcal{N}(z; \mu_i, \sigma_i^2)\). Averaging those posteriors over the reference gives the reference aggregate posterior, a mixture with one component per reference cell:
A query cell is scored by evaluating that density at its posterior mean \(z_q := \mu_q\),
giving novelty_logp \(= \log q_{\mathrm{ref}}(z_q)\). High means the cell
lands where the reference is dense; low means it lands where the reference is sparse.
Evaluating the exact sum is linear in the reference size, so the mixture is truncated to
the \(k = 200\) components nearest \(z_q\) (an approximate nearest-neighbour search over an inverted-file,
product-quantized index)
and summed with logsumexp:
Truncation is a lower bound, since every dropped component would add a positive term; at \(k = 200\) the log error is below 1e-6 in practice.
Each cell's score is that log density placed against the reference's own values: every reference cell is scored the same way when the reference is built, and a query cell's value is expressed as the fraction of reference cells it sits further out than, from 0 to 1. Rankings are unchanged by this step. The share shown as out-of-distribution in the report is the fraction of query cells that sit further out than every reference cell.
How to read that share. Each cell's score says how similar it is to the cells the model was trained on. Low similarity can reflect biology the reference lacks, technical differences such as chemistry or quality, or both. A high share means the reference does not cover this sample well: a clue about where to look, not a verdict. A query from a tissue, protocol or age range the reference does not span will read as largely out-of-distribution while being ordinary. The score is an approximation in one respect: the density is evaluated at the cell's posterior mean rather than integrated over its posterior, which would need Monte Carlo samples and is not implemented.
Model selection & benchmarking
Every epoch of both phases is validated and checkpointed. Selection is then explicit:
- scANVI is seeded from the scVI checkpoint with the lowest validation ELBO.
- The deployed scANVI checkpoint is the one with the lowest validation
class-balanced cross-entropy loss (
validation_classification_loss). It is not chosen on macro-F1. The selected epoch is shown in each atlas report, linked from the model weights page.
Label-transfer quality is reported as accuracy and macro-F1 (the unweighted mean of
per-class F1, so a rare type counts as much as an abundant one) on a validation split
held out from training: a random tenth of the reference's cells, capped at 50,000, drawn
before training and never trained on. The denominator is published with the number: accuracy and macro-F1
are computed only over cells whose ground-truth label is in the reference vocabulary and is
not a junk label; the remaining cells are reported as coverage rather than scored.
Integration quality is reported with scib-metrics [8] on a seeded
50,000-cell random subsample of the reference, against an inline PCA baseline and a seeded
Harmony [13] baseline computed on the same cells. Each reference
build produces a benchmark card (varnaops.reference_benchmark_card/v1) holding
the checkpoint-selection record, the validation results and the scib metrics, cross-linked
to the manifest.
The validation split is by cell, not by donor, so validation cells share donors and studies with the training cells, and no reference has yet been scored on an independent held-out dataset. The reported accuracy and macro-F1 are therefore in-distribution values, an upper bound on what a new dataset will get. Donor-disjoint splits and independent held-out datasets are planned.
The training-loss curves for both phases are shown in each atlas report; the scib panels and the per-epoch label-transfer scores stay in the benchmark card. A validation split drawn from the training corpus is an easier test than an independent dataset.
Marker-gene validation
Predicted cell types are checked against per-type marker panels keyed by Cell Ontology id [9]. A panel is resolved by walking the label's own CL id and then its ancestors, with a curated block list of ancestors that are too generic to discriminate, applied when the panel catalog is built: without it, an over-generic ancestor lends a panel that several sibling types would share, which once gave microglia a T-cell panel.
How panels are built. The design is hybrid, not purely canonical. Where a canonical (literature-derived) panel has at least four genes, its gene membership is taken and the genes are ordered by their contrast ranking, computed within one of the reference's own tissues where CellGuide [27] has enough genes there and against a whole-body comparison otherwise; the split between the two is printed in each atlas report. Where the canonical panel is too thin, the panel is contrast-only. A panel from an unrelated tissue is never substituted; the build fails instead. For the mouse reference, panels are the human panels mapped to mouse symbols through Ensembl orthologs [28], which is a biological assumption rather than a mapping fact and a weaker validation than a species-native panel.
Sourcing and attribution. Panels are assembled from data republished by CZ CellGuide. Canonical gene membership originates in the HuBMAP ASCT+B tables [14], which are CC BY 4.0 and are the licensor to credit; CellGuide is credited as the source and no licence is asserted on its behalf, because no grant covering the marker data was located. The gene ordering is CellGuide's own computational output, credited as provenance with no licence claimed. The per-resource position is published on the attribution page.
Each panel is scored per cell with scanpy's score_genes
[3], a module score against a matched control gene set.
It carries no p-value, and none is invented for it. Agreement between the panels and
the labels is reported as a pair over the same denominator, the cell types that have a
panel and at least 20 cells in a balanced subsample capped at 3,000 cells per type: the
fraction whose own panel scores highest for them (top-1) and the fraction where it is in
the top three (top-3). In an atlas report the labels scored are the reference's own curated
types, so that pair is the ceiling a query run is read against; in a run report they are
the predicted labels. The pair is reported because sibling cell types share panel genes,
so a moderate top-1 with a high top-3 is the normal signature of related types rather than
a failure.
Differential expression
Per-cell-type differential expression within the query is ranked with a regularized
logistic regression [3], one cell type against the rest. It returns a per-gene coefficient as
score and runs no statistical test, so no log fold-change and no p-value
exists for it; those columns are omitted from the results table rather than shipped
empty, and results are ranked on the coefficient. An absent p-value column therefore
means nothing was tested, not that nothing was significant.
The fit is binary one-vs-rest per cell type, with at most 50,000 cells per side. Genes detected in fewer than a minimum number of cells across the whole query are dropped before the fit, in union with the curated marker genes so that a panel gene is never dropped by the filter. This ranking treats individual cells as replicates, which is appropriate for describing a population and not for a between-donor claim. That claim is made separately, below and in Disease-state analysis.
Donor-level significance. When the query carries a donor column, the per-cell-type ranking gets a companion test that asks whether the difference reproduces across donors. Counts are summed per donor into pseudobulk profiles, and for each cell type every donor contributes two profiles, its cells of that type and the sum of its remaining cells; these are modelled with pyDESeq2 [7][25] in a paired design, a donor term plus a group term, so per-donor library size, composition and batch offsets are absorbed by the donor term and the group effect is estimated within donor. It needs at least 4 donors with that cell type; below that the cell type has no test and the reason is recorded. The result adds a log fold-change and a Benjamini-Hochberg adjusted p-value [21] beside the ranking; it never reorders it.
Per-cluster and within-type differential expression. The same one-vs-rest ranking is also run on the Leiden clusters at each resolution, and, for a cluster that is at least 98.5% one predicted cell type, on that cluster against the other cells of the same type, which is where a subpopulation inside a type shows up. Neither carries a p-value, by design rather than omission: the clusters are derived from the expression matrix being tested, and no test on them, pseudobulk included, escapes that circularity.
Cluster analysis
Query cells are clustered in the reference model's latent space, the scANVI embedding that the cell-type call and the OOD score also read. A k-nearest-neighbour graph (30 neighbours) is built once on the query in that space, and communities are detected with Leiden [6]. The query is shown on its own UMAP [20] of the same latent, computed on a random subsample of 100,000 cells when the query is larger. Because the latent is the reference's, a population the reference does not cover forms a coherent cluster whose cells score as out-of-distribution, rather than scattering.
Clustering runs across a range of resolutions and two diagnostics are reported per resolution: silhouette width [22] on the latent, computed on a seeded subsample capped at 5,000 cells because the metric is quadratic in cell count; and adjusted Rand index against the predicted cell types [23] with junk labels excluded, which measures how far a clustering reproduces the annotation. The ARI is an anchor, not a target: a genuinely novel population lowers it by construction, since it disagrees with the known labels by definition. Normalized mutual information and between-resolution comparisons are not computed.
Pathway & transcription-factor activity
Functional activity is inferred with decoupler [12]
in three layers, each a specific method with a specific prior:
- univariate linear model over CollecTRI [15], for transcription-factor activity;
- multivariate linear model over PROGENy [16], for signaling-pathway activity;
- AUCell [17] over Gene Ontology biological process [18], for broad processes.
Each method scores every cell of a per-group subsample of the query on raw counts; the per-cell scores are then summarised per predicted cell type as the mean activity, and the same per-cell scores are summarised again per cluster for the cluster views. Sources are ranked within each group one-vs-rest on those scores, and the per-type activity is shown as a z-scored heatmap. Priors are pinned by checksum and read offline; MSigDB Hallmark is not used.
Disease-state analysis
When a condition column and a donor column are assigned, conditions are compared at the donor level. Contrasts are one-vs-rest: each condition against the pooled others, so N conditions give N contrasts, except that two conditions give the single contrast between them. Three analyses share that structure:
- Differential abundance. Each cell type's share of every donor's cells is the observation, and the shares are compared between the two sides of each contrast with the propeller test [19], a moderated t-test on transformed proportions, run through its scanpro implementation [26]; the report gives the signed shift in percentage points, the proportion ratio and the adjusted p-value per cell type and contrast.
- Differential expression. Counts are summed per donor into pseudobulk profiles, per cell type and once pooled across all cells, then modelled with pyDESeq2 [7][25], the negative-binomial GLM with a Wald test, one fit per cell type and contrast plus the pooled one; this avoids treating individual cells as replicates. Covariate columns you assign (sex, sequencing technology, study, region) enter the design as factors, each only where enough donors remain to estimate it. Results are shown as volcano plots with protein-protein interaction context from STRING [11].
- Disease-state activity. The transcription-factor and pathway layers of the activity section are scored on each contrast's per-gene Wald statistic rather than on expression, so their scores carry the same donor-level significance; the gene-set layer stays a ranking.
Guards and thresholds, all of which change what you get: the input must be integer counts (normalized input is refused, since the model assumes counts); a donor contributing fewer than 10 cells to a cell type is dropped from that cell type's pseudobulk; and a contrast needs at least 3 donors per group to run unflagged. With exactly 2 donors per group the test still runs and is flagged provisional in the report rather than hidden. Below that it does not run.
Report & interpretation
Each run ships an Analysis report, a self-contained HTML file with that run's figures, tables and provenance, and the Reference atlas report of the reference it used, as it stood when the run was made.
Statistical conventions. Wherever a p-value is shown it is the value the named test
returned, and any value at or below 2.2e-16 is printed as < 2.2e-16 rather
than as a smaller number or as zero, because double-precision arithmetic cannot resolve
below that. Multiple testing is corrected only where a test was run: the donor-level
disease contrast reports Benjamini-Hochberg adjusted p-values (padj) and its
volcano marks a gene as significant at padj < 0.05, and the donor-level
companion of the per-cell-type ranking reports the same adjusted p-value where it ran.
Marker scores, the per-cell-type ranking itself and the per-cluster and within-type
rankings carry no p-value at all, and none is invented for them.
Language model. Five steps can call a language model, all through one structured interface that forces a JSON schema and all on the same model, Claude Opus 5:
- the written interpretation of the computed results, which describes them and never changes them;
- the alignment of your own labels to the reference vocabulary, confirmed by you in the app;
- the suggestion of column roles, which pre-fills a form you confirm;
- the orientation of a flat table when it cannot be determined otherwise, re-validated before use;
- a plain-language explanation of an upload error, off by default.
No expression matrix and no per-cell measurement reaches the model on the analysis path; what each call sends is listed on the data-handling page.
What you get back
A finished run returns the Analysis report and a results archive. The archive holds your own cells, your predictions and the analyses run on them; no reference data and no reference labels are in it.
annotated.h5ad.Xholds your own expression values for the genes the model read, which is the reference atlas gene panel in the model's order;var["present_in_query"]is false for a panel gene your file did not contain, and those columns are zeros that the model read as "not expressed" rather than as "not measured".obscarries the classifier callhead_pred_cell_typeand its confidence, the out-of-distribution columnsnovelty_logpandnovelty_score(kept under their original names), the cluster columns and, where they ran, the secondary label spaces and your own supplied labels.obsmcarries the latent representation and the joint UMAP. There is no neighbour graph: it is derived, it dominates the file size, andsc.pp.neighborson the latent representation rebuilds it.- Your own metadata comes back unchanged. Every column of your
obsis returned with its original values, dtype and order, read back from your own file rather than rebuilt. The batch token pinned during mapping is internal and lives in one column of its own; the all-Unknownplaceholder the model needs while mapping is not shipped at all, and the prediction ishead_pred_cell_type. If one of your columns has the same name as one of ours and different values, yours keeps the name and ours ships beside it asvarnaops_<name>. predictions.csv. One row per cell, three columns: your original barcode, the classifier-head call, and that call's max-softmax confidence. The out-of-distribution score is not in this file; it is inannotated.h5ad.- The tables behind the figures. The differential-expression ranking, the donor-level disease results with their fold changes and adjusted p-values, the marker and activity scores, and a run-level summary with the predicted-label distribution, confidence quantiles and the pointer to the reference model, including its build commit. Every figure in the report is also in the archive as an image file.
- The Reference atlas report for the atlas your cells were compared against, as that atlas was when the run was made, plus the attribution file listing the public resources the analysis used and who licenses each one.
Reproducibility & provenance
Every reference carries a build record. It states the Census snapshot the reference was built from, the constituent dataset ids, the filters applied, the gene space and the highly variable gene panel, the quality-control thresholds and the fraction of cells retained, the label maps, the model contract, and the version of the code that produced the build.
Results reproduce at the level of method and version rather than bit-identically: the numerical kernels are not deterministic, so a rerun of the same input on the same version can differ in the last digits and, at a boundary, in a marginal call.
The deployed checkpoint for each reference is on the model weights page, and the epoch that was promoted is in that reference's Reference atlas report.
Per-atlas parameters
Fourteen references are live. Each row states what that reference shipped with, taken from its own build record, rather than what was intended.
| Reference | Species | Census | Datasets | Cells | Genes | HVG | Latent | Cell types | Epochs (scVI / scANVI) |
|---|---|---|---|---|---|---|---|---|---|
| Human immune v1 | human | 2025-11-08 | 45 | 15,340,405 | 12,348 | 5,000 | 30 | 20 | 43 / 10 |
| Human cortex v1 | human | 2025-11-08 | 58 | 6,477,429 | 14,808 | 5,000 | 30 | 19 | 102 / 23 |
| Human eye v1 | human | 2025-11-08 | 25 | 6,806,918 | 22,625 | 5,000 | 30 | 36 | 97 / 22 |
| Human lung v1 | human | 2025-11-08 | 26 | 2,706,526 | 13,672 | 5,000 | 30 | 47 | 245 / 56 |
| Human gut v1 | human | 2025-11-08 | 21 | 1,680,016 | 14,411 | 5,000 | 30 | 37 | 395 / 90 |
| Human breast v1 | human | 2025-11-08 | 9 | 2,406,758 | 15,012 | 5,000 | 30 | 21 | 276 / 63 |
| Human heart v1 | human | 2025-11-08 | 14 | 2,487,523 | 17,379 | 5,000 | 30 | 21 | 266 / 61 |
| Human liver v1 | human | 2025-11-08 | 13 | 436,315 | 28,013 | 5,000 | 30 | 16 | 400 / 200 |
| Human kidney v1 | human | 2025-11-08 | 11 | 421,107 | 20,687 | 5,000 | 30 | 24 | 400 / 200 |
| Human skin v1 | human | 2025-11-08 | 8 | 475,731 | 15,294 | 5,000 | 30 | 26 | 400 / 200 |
| Human adipose v1 | human | 2025-11-08 | 5 | 413,164 | 27,531 | 5,000 | 30 | 17 | 400 / 200 |
| Human muscle v1 | human | 2025-11-08 | 4 | 445,607 | 29,115 | 5,000 | 30 | 25 | 400 / 200 |
| Human female reproductive v1 | human | 2025-11-08 | 10 | 525,606 | 23,924 | 5,000 | 30 | 20 | 400 / 200 |
| Mouse brain v1 | mouse | 2025-11-08 | 12 | 2,949,387 | 12,567 | 5,000 | 30 | 25 | 225 / 51 |
The epoch column is the training budget, not the epoch that ships: the deployed scANVI checkpoint is chosen afterwards on validation loss (above) and the epoch that shipped is stated in that reference's Reference atlas report. The training budget is set from the atlas's cell count.
Versions
Two version numbers govern what a result means, and they move independently.
| Version | Current | What it pins |
|---|---|---|
| Reference version | v1, all fourteen live references | The atlas and the model trained on it. A bump means a rebuild or a retrain, so labels from two versions are not interchangeable. |
| Census snapshot | 2025-11-08 | The upstream data the reference was built from. Fixed per build, recorded per reference. |
Changes to the pipeline and to the published references are listed in the changelog.
References
- Lopez R, Regier J, Cole MB, Jordan MI, Yosef N. Deep generative modeling for single-cell transcriptomics. Nat Methods 2018.
- Xu C, Lopez R, Mehlman E, Regier J, Jordan MI, Yosef N. Probabilistic harmonization and annotation of single-cell transcriptomics data with deep generative models. Mol Syst Biol 2021.
- Wolf FA, Angerer P, Theis FJ. SCANPY: large-scale single-cell gene expression data analysis. Genome Biol 2018.
- Satija R, Farrell JA, Gennert D, Schier AF, Regev A. Spatial reconstruction of single-cell gene expression data. Nat Biotechnol 2015.
- Wolock SL, Lopez R, Klein AM. Scrublet: computational identification of cell doublets in single-cell transcriptomic data. Cell Syst 2019.
- Traag VA, Waltman L, van Eck NJ. From Louvain to Leiden: guaranteeing well-connected communities. Sci Rep 2019.
- Muzellec B, Telenczuk M, Cabeli V, Andreux M. PyDESeq2: a Python package for bulk RNA-seq differential expression analysis. Bioinformatics 2023.
- Luecken MD, et al. Benchmarking atlas-level data integration in single-cell genomics. Nat Methods 2022.
- Diehl AD, et al. The Cell Ontology 2016: enhanced content, modularization, and ontology interoperability. J Biomed Semantics 2016.
- CZI Single-Cell Biology Program. CELLxGENE Discover and the CELLxGENE Census. Chan Zuckerberg Initiative.
- Szklarczyk D, et al. The STRING database in 2023. Nucleic Acids Res 2023.
- Badia-i-Mompel P, et al. decoupleR: ensemble of computational methods to infer biological activities from omics data. Bioinformatics Advances 2022.
- Korsunsky I, et al. Fast, sensitive and accurate integration of single-cell data with Harmony. Nat Methods 2019.
- Börner K, et al. Anatomical structures, cell types and biomarkers of the Human Reference Atlas. Nat Cell Biol 2021.
- Müller-Dott S, et al. Expanding the coverage of regulons from high-confidence prior knowledge for accurate estimation of transcription factor activities. Nucleic Acids Res 2023.
- Schubert M, et al. Perturbation-response genes reveal signaling footprints in cancer gene expression. Nat Commun 2018.
- Aibar S, et al. SCENIC: single-cell regulatory network inference and clustering. Nat Methods 2017.
- Ashburner M, et al. Gene Ontology: tool for the unification of biology. Nat Genet 2000.
- Phipson B, Sim CB, Porrello ER, Hewitt AW, Powell J, Oshlack A. propeller: testing for differences in cell type proportions in single cell data. Bioinformatics 2022.
- McInnes L, Healy J, Melville J. UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction. arXiv 1802.03426, 2018.
- Benjamini Y, Hochberg Y. Controlling the false discovery rate: a practical and powerful approach to multiple testing. J R Stat Soc B 1995.
- Rousseeuw PJ. Silhouettes: a graphical aid to the interpretation and validation of cluster analysis. J Comput Appl Math 1987.
- Hubert L, Arabie P. Comparing partitions. J Classif 1985.
- Mungall CJ, Torniai C, Gkoutos GV, Lewis SE, Haendel MA. Uberon, an integrative multi-species anatomy ontology. Genome Biol 2012.
- Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol 2014.
- Alayoubi Y, Bentsen M, Looso M. Scanpro is a tool for robust proportion analysis of single-cell resolution data. Sci Rep 2024.
- CZ CellGuide. Chan Zuckerberg Initiative. cellxgene.cziscience.com/cellguide.
- Ensembl. European Molecular Biology Laboratory, European Bioinformatics Institute. ensembl.org.
- Gayoso A, Lopez R, Xing G, et al. A Python library for probabilistic analysis of single-cell omics data. Nat Biotechnol 2022.
- Cui Y, Jia M, Lin T-Y, Song Y, Belongie S. Class-balanced loss based on effective number of samples. CVPR 2019.