Optional parameters are passed by name: sc.standard(obj, resolution: 1.0),
sc.paired_pseudobulk_de(obj, donors, conditions, cell_types, target_type: "T", condition_a: "control", condition_b: "treated"). Positional calls still work,
but sc.standard() takes eight numbers and paired_pseudobulk_de() takes three
consecutive strings — transposing two of them yields a different analysis with
no error. Name them.
cluster_diagnostics() is also quadratic, and much more expensive in
practice: roughly 23 seconds for 220 cells, growing as n². cluster_stability()
runs it once per resolution. Subsample before using either on a real dataset.
cluster_diagnostics() returns mean_score: nil when a silhouette is
undefined (one cluster, or every cell its own), and cluster_stability()
returns ari_previous: nil on the first row. Neither substitutes a number
that would read as a real result.
gsea() p-values come from a permutation test. It uses a fixed default seed
so runs reproduce; pass seed: to vary it, and record the value.
scale() is dense-only and raises on an object loaded from a 10x directory,
because centering would materialize every zero. Use run_pca().
HVG ranking is global CV² with no binning by mean expression, so it favors
low-expression genes more than Scanpy’s seurat flavor or Seurat VST.
Integration is PCA batch centering, not a full atlas-mapping method.
marker_table() is exploratory and cell-level. It is not replicate-aware
condition DE — use pseudobulk() and a count model for that.
paired_pseudobulk_de() uses a paired test on log2 CPM for transparent
exploration. Publication-grade count inference should use the raw
pseudobulk profiles with a validated negative-binomial model and explicit
study design.
sctransform() returns a dense matrix; Pearson residuals are nonzero where
counts were zero, so there is no sparse result to preserve.
AnnData Zarr metadata interchange is currently limited.