Trajectory Inference Methods

A comprehensive guide to computational tools for reconstructing cellular developmental trajectories

23
Methods Covered
5
Method Categories
2017–2025
Publication Years
Jul 2026
Last Updated
Healshu as a red Formula 1 driver reading sector timing, telemetry, and a branching racing line
Scuderia Ferrari lens ยท trajectory inference

็œ‹ไธ่งๆ•ดๅœบๆฏ”่ต›๏ผŒๅฐฑไปŽ่ฎกๆ—ถๆ•ฐๆฎ้‡Œ่ฏปๅ‡บ่ต›่ฝฆ็บฟใ€‚

The Scuderia is the oldest garage on the grid โ€” and its archive holds seventy years of sector times, telemetry streams, and result sheets. ไปŽ่ฟ™ไธช็บข่‰ฒ่ฝฆๅบ“็š„ๆ–นๆณ•่ฎบๅผ€ๅง‹๏ผšno race is ever watched whole; it is reconstructed from the data, one sector at a time. That is trajectory inference from a single-cell snapshot.

Healshu as an F1 driver in a red racing suit, helmet tucked under one arm, pointing at a timing screen of sector dots on the pit wall while a red F1 car passes behind

๐Ÿ The Race You Never Watch, in Six Reads

ใ€Œๆ•ดๅœบๆฏ”่ต›๏ผŒๅชๆœ‰่ฎกๆ—ถๅก”็œ‹ๅพ—่งใ€‚ใ€

In the red garage, a grand prix is never one movie โ€” it is thousands of sector times and telemetry messages streaming past the pit wall. Reconstructing the race from that data is the exact shape of trajectory inference: one snapshot of thousands of cells, no timelapse of any single one. Six reads from the Scuderia's pit wall, re-read as the concepts this module's methods formalize.

Read 1 ยท ่ฎกๆ—ถๅก” The timing tower

Pseudotime

The tower never shows the race; it posts sector times, car by car. Order the field by sector and the running order appears โ€” nobody had to watch a single lap.

Pseudotime. Rank cells by progression, not by timestamps: a position along the course, inferred from state, not read off a clock.

Read 2 ยท ้ฅๆต‹ Telemetry

RNA velocity

Every car streams speed, gear, and throttle at each meter. Current velocity is a free prediction of the next sector โ€” if the channel is honest.

RNA velocity. Unspliced and spliced counts are a cell's telemetry channel: where it is headed next, read off the current stream.

Read 3 ยท ่ต›่ฝฆ็บฟ The racing line

Trajectory manifold

Through any corner there is one fast line, and every car approximates it. Stray off it and you are slow, not creative.

Trajectory as a manifold. Cells move along low-dimensional lines through state space; the methods below differ in how they draw that line โ€” trees, curves, graphs, or optimal-transport flows.

Read 4 ยท ๅˆ†ๅ‰ๅผฏ The fork

Branching, verified

Some circuits offer two lines through the same complex โ€” and both can win. But a careful steward asks whether the fork is real asphalt or a mirage in the spray.

Branching, verified. Bifurcations are real biology โ€” yet a smoother will happily draw a fork through discrete populations. Check the split exists before publishing it.

Read 5 ยท ๅ‘่ฝฆๆ ผ The starting grid

Root selection

Hand the wrong car pole position and the whole result sheet reads backwards. The grid is declared before the race, by the rules โ€” not inferred from it.

Root selection. The algorithm does not know where the trajectory starts; biology declares it (progenitors, marker genes, velocity). A wrong root silently runs time in reverse.

Read 6 ยท ๆˆ็ปฉๅฎก่ฎก The results audit

Benchmark before belief

Before the sheet is official, the FIA audits the telemetry โ€” sensor by sensor, sector by sector. A beautiful reconstruction with no audit is a rumor, not a result.

Benchmark before belief. Validate reconstructions against held-out timepoints and known biology (the Saelens et al. TI benchmark is the canonical audit) โ€” then publish the line.

ใ€Œ็œ‹ไธ่งๆ•ดๅœบๆฏ”่ต›๏ผŒๅฐฑไปŽ่ฎกๆ—ถๆ•ฐๆฎ้‡Œ่ฏปๅ‡บ่ต›่ฝฆ็บฟใ€‚ใ€ โ€” you never watch the race; you read it.

๐Ÿ“‹ Overview

Trajectory inference (TI) methods reconstruct the dynamic processes of cellular differentiation, development, and state transitions from single-cell data. These computational approaches allow researchers to understand how cells progress through different states over time, identify key transition points, and discover the genes that drive these changes.

๐ŸŽฏ Key Considerations

Selecting the right trajectory inference method depends on several factors:

  • Dataset size: From thousands to millions of cells
  • Data type: Standard scRNA-seq, spatial, multimodal, or temporal
  • Experimental design: Single snapshot vs. multiple timepoints
  • Biological complexity: Linear, branching, cyclical, or disconnected trajectories
  • Computational resources: Available memory and processing power

๐Ÿ• Recent Developments (2023–2025)

  • CytoTRACE 2 (2025, Nat Methods) — predicts developmental potential from a single snapshot with no velocity data and no declared root, filling the "how progenitor-like is this cell?" gap before committing to a full trajectory run.
  • PHLOWER (2025, Nat Methods) — Hodge Laplacian tree structure resolving up to 26 branches with built-in uncertainty quantification.
  • dynamo (Cell, 2022) — the vector-field reformulation of RNA velocity keeps gaining adoption as metabolic-labeling data (SLAM-seq, sci-fate) becomes standard alongside splicing-based velocity.
  • MOSCOT (Nature, published online Jan 2025) — multi-omic optimal transport now demonstrated at the 1.7M-cell, 20-timepoint mouse-embryo scale.

๐Ÿ”ฌ Major Method Categories

1. RNA Velocity-Based Methods

These methods infer future cell states by modeling the relationship between unspliced and spliced mRNA:

velocyto

2018

Nature

The pioneering RNA velocity method that introduced the concept of using splicing dynamics to predict future cell states.

  • First RNA velocity implementation
  • Steady-state model assumption
  • Works with standard scRNA-seq protocols
Algorithm: Estimates RNA velocity by modeling splicing kinetics under steady-state assumptions. Calculates velocity as v = u - ฮณs where u is unspliced mRNA, s is spliced mRNA, and ฮณ is the degradation rate fitted via linear regression. Projects velocities onto PCA/t-SNE/UMAP embeddings to visualize cell state transitions.

scVelo

2020

Nature Biotechnology

An improved RNA velocity framework with dynamical modeling that accounts for transcriptional induction, repression, and steady-state. Most widely used velocity method.

  • Dynamical and stochastic models
  • Improved accuracy over velocyto
  • Latent time estimation
  • Driver gene identification
  • Compatible with Scanpy ecosystem
Algorithm: Models RNA velocity using dynamical system of unspliced (u) and spliced (s) mRNA: du/dt = ฮฑ - ฮฒu, ds/dt = ฮฒu - ฮณs, where ฮฑ is transcription rate, ฮฒ is splicing rate, and ฮณ is degradation rate. Learns gene-specific kinetic parameters via expectation-maximization, then projects velocity vectors onto low-dimensional embeddings.

veloVI

2024

Nature Methods

Probabilistic RNA velocity inference using variational inference with uncertainty quantification.

  • Deep generative modeling framework
  • Accounts for technical noise
  • Uncertainty estimates for velocity
  • Better handling of low counts
Algorithm: Uses variational autoencoders (VAEs) to model splicing dynamics probabilistically. Learns latent variables for transcriptional state and kinetic parameters while accounting for technical noise. Provides uncertainty quantification by sampling from posterior distributions of both velocity direction (intrinsic) and future states (extrinsic).

UniTVelo

2022

Nature Communications

Unified RNA velocity framework using unified latent time modeling across the transcriptome via Radial Basis Functions.

  • Unified latent time estimation
  • Phase portraits for visualization
  • Top-down time modeling approach
  • Improved stability in velocity estimates
Algorithm: Uses Radial Basis Functions (RBFs) to learn a unified latent time shared across all genes, moving from gene-specific to transcriptome-wide temporal modeling. Fits splicing dynamics to this shared time coordinate, improving consistency across genes and reducing over-fitting from noisy gene-specific estimates.

dynamo

2022

Cell

The most systematic extension of the RNA velocity framework: upgrades per-gene velocity estimates into a single continuous, transcriptome-wide vector field, and extends beyond the steady-state/dynamical splicing model to metabolically labeled data (SLAM-seq, sci-fate, NASC-seq).

  • Continuous vector field, not per-gene velocity arrows
  • Supports metabolic-labeling data, not just splicing ratios
  • Derives acceleration and curvature from the learned field
  • Least-action-path analysis for optimal reprogramming routes
  • In silico perturbation via the vector field's Jacobian
Algorithm: Where scVelo estimates velocity gene-by-gene and reads off arrows in a fixed low-dimensional embedding, dynamo fits a single continuous vector field function over the full expression manifold using kernel/sparse regression, then differentiates it analytically for acceleration, curvature, and divergence. This resolves a reference-frame inconsistency that per-gene velocity estimates otherwise leave uncorrected, and supports labeling-based (not just splicing-based) velocity when metabolic labeling data is available.

MultiVelo

2023

Nature Biotechnology

Extends RNA velocity to multi-omic (RNA + ATAC) data, modeling the temporal relationship between chromatin accessibility and transcription rather than inferring velocity from splicing alone.

  • Joint chromatin-accessibility + transcription differential-equation model
  • Estimates switch times for both modalities, not just spliced/unspliced
  • Distinguishes genes where chromatin closes before vs. after transcription stops
  • Improves cell-fate prediction over RNA-only velocity, especially at low sequencing depth
Algorithm: Probabilistic latent-variable model that fits a differential-equation system over chromatin accessibility and spliced/unspliced RNA jointly, estimating per-gene switch times and rate parameters for both the epigenomic and transcriptomic layers. Because it uses accessibility as an upstream signal, it degrades more gracefully than RNA-only scVelo on cells with low sequencing depth, where splicing ratios alone are noisy.

2. Optimal Transport-Based Methods

These methods use optimal transport theory to match cells across conditions or timepoints:

Waddington-OT

2019

Cell

Uses optimal transport to infer developmental trajectories and fate probabilities across timepoints.

  • Temporal trajectory reconstruction
  • Fate probability predictions
  • Perturbation analysis
  • Requires multiple timepoints
Algorithm: Computes optimal transport maps between consecutive time points by minimizing Wasserstein distance with entropy regularization (Sinkhorn algorithm). Models development as a sequence of transport maps, allowing computation of cell fate probabilities and ancestor/descendant relationships across temporal data.

MOSCOT

2025

Nature (published online Jan 2025; bioRxiv preprint 2023)

Multi-Omics Single-Cell Optimal Transport - the most scalable OT framework, handling over 1.7 million cells with linear time complexity.

  • Atlas-scale: handles 500K+ cells efficiently
  • Multi-omics integration (RNA, ATAC, protein)
  • Spatial and spatiotemporal mapping
  • Temporal trajectory inference
  • Neural OT solvers for speed
  • Handles unbalanced problems (growth/death)
Algorithm: Uses entropic Gromov-Wasserstein optimal transport with low-rank factorizations for linear time/memory complexity. Employs neural network parameterizations for transport maps and integrates multiple modalities through fused optimal transport. Supports unbalanced formulations via Kullback-Leibler divergence for modeling cell proliferation/death.

GENOT

2024

NeurIPS 2024

Gene-regulated neural optimal transport with uncertainty quantification for trajectory inference using flow matching.

  • Stochastic OT framework
  • Gene regulatory modeling
  • Handles unbalanced transport
  • Cross-modality translation
  • Uncertainty quantification
Algorithm: Learns stochastic transport plans using entropic Wasserstein and Gromov-Wasserstein flow matching. Neural networks parameterize velocity fields that interpolate between distributions. Provides uncertainty estimates through stochastic sampling and supports unbalanced formulations for modeling growth dynamics.

3. Graph-Based & Pseudotime Methods

Traditional approaches that construct trajectories using dimensionality reduction and graph structures:

Monocle 3

2019

Nature

Advanced trajectory inference framework using UMAP and principal graphs, designed to scale to millions of cells and handle discontinuous trajectories. Used to analyze the Mouse Organogenesis Cell Atlas (2 million cells).

  • Ultra-scalable: handles millions of cells efficiently
  • UMAP-based dimensionality reduction
  • Discontinuous trajectories and convergent fates
  • Louvain partitioning for cell communities
  • Principal graph learning with SimplePPT
  • Loop detection for cyclical trajectories
  • Moran's I test for spatial autocorrelation
  • Pseudotime via geodesic distance
  • Integrated with Seurat/Scanpy
Algorithm: (1) Dimensionality reduction via UMAP for fast embedding of large datasets, (2) Louvain clustering for initial partitioning, (3) Enhanced SimplePPT algorithm learns principal graphs allowing disconnected components and convergent paths, (4) Pseudotime computed as geodesic distance along learned graph from root cells, (5) Differential expression via Moran's I statistic for spatial autocorrelation.

Monocle 2

2017

Nature Methods

Earlier version using reversed graph embedding for trajectory reconstruction. Still widely used for smaller datasets.

  • DDRTree algorithm
  • Branch point identification
  • Differential expression testing along pseudotime
  • Works well for less than 50K cells
Algorithm: Uses DDRTree (Discriminative Dimensionality Reduction via Tree) algorithm which performs reversed graph embedding. Constructs a principal tree in reduced dimensional space that captures branching differentiation paths. Assumes continuous manifold structure without allowing convergence or disconnected components.

Slingshot

2018

BMC Genomics

Flexible trajectory inference using cluster-based minimum spanning trees and principal curves.

  • Works with any dimensionality reduction
  • Cluster-based approach
  • Multiple lineage support
  • Well-integrated with Bioconductor
Algorithm: Two-stage approach: (1) Constructs minimum spanning tree on cluster centroids to identify lineage structure, (2) Fits simultaneous principal curves through low-dimensional space for each lineage, allowing shared early segments. Assigns cells pseudotime along curves and lineage weights based on proximity.

PAGA

2019

Genome Biology

Partition-based graph abstraction that creates coarse-grained trajectory representations. Exceptionally scalable: 1.3M cells in 90 seconds.

  • Graph abstraction approach
  • Handles complex topologies
  • Integrated with Scanpy
  • Good for exploratory analysis
  • PAGA-initialized UMAP embeds faster than UMAP alone; PAGA's own cluster-level graph abstraction is a different, much cheaper computation than a cell-level embedding, benchmarked on datasets up to ~1M neurons
Algorithm: Creates partition-based graph where nodes represent cell clusters and edges represent connectivity strength. Computes edge weights using statistical tests on inter-cluster vs. intra-cluster distances. Preserves global topology while allowing multi-resolution analysis through hierarchical clustering. Can initialize UMAP for faster embedding.

Palantir

2019

Nature Biotechnology

Models differentiation as a multi-step diffusion-like process over a Markov chain, outputting a probabilistic fate โ€” not a single deterministic branch assignment โ€” for every cell. One of the most widely cited single-cell trajectory methods.

  • Fate probabilities per cell, not hard branch labels
  • Diffusion-map-based Markov chain over cell states
  • Entropy measures cell plasticity along the trajectory
  • Terminal-state identification without manual branch curation
  • Kernel used by CellRank's pseudotime-based transition matrix
Algorithm: Builds a diffusion map over cell-cell similarity, then defines a Markov chain where transition probabilities decay with diffusion distance from a user-specified early cell. Computes each cell's absorption probability into every terminal state by solving the chain to convergence โ€” so a single cell can carry, say, 60% probability toward an erythroid fate and 40% toward myeloid, rather than being assigned to one branch. Differs from Monocle's deterministic tree assignment by keeping fate genuinely probabilistic.

4. Hybrid & Multi-Method Approaches

Methods that combine multiple signals or integrate different trajectory inference approaches:

CellRank 2

2024

Nature Methods

Unified framework combining RNA velocity, pseudotime, gene expression, and experimental time for robust fate predictions. Scales to millions of cells.

  • Multi-view learning approach
  • Combines velocity, pseudotime, and real time
  • Handles multimodal data
  • Terminal state identification
  • Driver gene discovery
  • Integrated with Scanpy ecosystem
Algorithm: Modular framework with kernels for different data views (velocity, pseudotime, real time, metabolic labeling). Combines kernels via weighted aggregation into cell-cell transition matrix. Computes fate probabilities using Markov chain analysis and identifies terminal states via eigenvector decomposition. 30ร— faster than CellRank 1.

DELVE

2024

Nature Communications

Feature selection for trajectory analysis that identifies genes driving dynamic processes.

  • Dynamic feature selection
  • Identifies trajectory-driving genes
  • Works with velocity or pseudotime
  • Removes redundant features
  • Improves downstream analysis
Algorithm: Unsupervised bottom-up approach identifying dynamic gene/protein modules. Uses graph-based methods to find features that robustly recapitulate cellular trajectories while removing redundancy. Works across modalities (scRNA-seq, mass cytometry, imaging) by evaluating feature contribution to trajectory preservation.

5. Specialized Methods

Purpose-built tools for specific biological questions or data types:

CASi

2024

Scientific Reports

Discovers novel cell types and subpopulations along developmental trajectories using cross-timepoint analysis.

  • Novel cell type discovery
  • Temporal single-cell data
  • Handles rare populations
  • Annotates discovered types
Algorithm: Neural network architecture for cross-timepoint annotation and automatic feature selection. Detects potentially novel cell types that emerge over developmental time by comparing cell type distributions across timepoints. Uses attention mechanisms to identify discriminative features for each discovered population.

sciCSR

2024

Nature Methods (online Nov 2023)

Specialized method for B cell development using class-switch recombination as molecular clock.

  • B cell trajectory inference
  • Uses CSR as temporal marker
  • High temporal resolution
  • Links phenotype to maturation
Algorithm: Leverages class-switch recombination (CSR) events as intrinsic molecular timestamps. Constructs Markov state model of B cell differentiation states based on immunoglobulin isotype expression patterns. Achieves ~0.9 cosine similarity in BCR isotype predictions by modeling CSR dynamics.

TIGON

2023

Nature Machine Intelligence

Models growth dynamics explicitly during trajectory inference to account for proliferation using dynamic unbalanced optimal transport.

  • Growth rate modeling
  • Proliferation-aware trajectories
  • Birth/death process integration
  • Corrects for cell cycle effects
  • Infers gene regulatory networks
Algorithm: Uses dynamic unbalanced optimal transport based on Wasserstein-Fisher-Rao distance to simultaneously reconstruct trajectories AND model population growth/death. Employs neural ODEs implemented in PyTorch. Learns cell-cell communication and gene regulatory networks while accounting for proliferation dynamics.

PRESCIENT

2021

Nature Communications

Learns potential landscapes from temporal single-cell data to predict differentiation trajectories. Developed by Gifford lab at MIT CSAIL.

  • Potential landscape modeling
  • Trajectory perturbation analysis
  • In silico perturbations
  • Requires temporal data
  • Waddington landscape framework
Algorithm: Models cell differentiation as diffusion over Waddington potential landscapes. Neural networks parameterize potential functions, learning landscape geometry from temporal data. Predicts cell trajectories through gradient descent on learned potentials. Enables in silico perturbation analysis by modifying landscape topography.

FLOW-MAP

2020

Nature Protocols

Trajectory visualization tool optimized for flow and mass cytometry data using force-directed graph layouts.

  • Graph-based layout
  • Optimized for flow/CyTOF
  • Interactive visualization
  • Handles large datasets
  • Force-directed embedding
Algorithm: Constructs k-nearest neighbor graph with edges constrained to sequential timepoints. Applies ForceAtlas2 force-directed layout algorithm to create 2D visualization preserving temporal ordering. Supports density-dependent downsampling and hierarchical clustering for scalability across variable dataset sizes.

PHLOWER

2025

Nature Methods

Hierarchical lineage tree inference with probabilistic modeling for complex multi-branching developmental systems using Hodge Laplacian decomposition.

  • Hierarchical tree structures
  • Probabilistic framework
  • Handles uncertainty
  • Complex lineage relationships (up to 26 branches)
  • Multimodal RNA+ATAC support
Algorithm: Uses Hodge Laplacian decomposition on simplicial complexes to infer hierarchical lineage trees. Decompose cell-cell relationships into gradient (hierarchical), curl (cyclical), and harmonic (equilibrium) components. Provides uncertainty quantification through probabilistic modeling. Works with multimodal data (RNA+ATAC).

CytoTRACE 2

2025

Nature Methods

Predicts absolute developmental potential (a "how progenitor-like is this cell" score, from 1 = totipotent to 0 = fully differentiated) directly from a single-snapshot transcriptome โ€” no unspliced/spliced reads, no defined root, no trajectory algorithm required.

  • Interpretable deep-learning framework, not a velocity or graph method
  • Continuous 0โ€“1 potency score enabling cross-dataset comparison
  • Resolves six potency categories from totipotent to differentiated
  • Useful as a fast pre-check before committing to RNA velocity or trajectory reconstruction
Algorithm: Trains an interpretable deep-learning model on transcriptional diversity features (gene-count-based and other unsupervised signatures correlated with stemness) across a large reference compendium, then predicts each query cell's absolute developmental potential on a continuous scale. Unlike velocity or graph-based trajectory methods, it needs neither spliced/unspliced counts nor a user-declared root โ€” making it a cheap way to sanity-check "which cells are plausibly progenitors" before running a full trajectory pipeline.

๐Ÿ“Š Detailed Method Comparison

This table provides a comprehensive comparison of key features across different trajectory inference methods:

Method Year Max Scale Multiple Timepoints Single Snapshot Spatial Data Multimodal Growth/Death Key Strength
Monocle 3 2019 2M+ cells โœ“ โœ“ โœ— โœ“ โœ— Ultra-scalable, discontinuous trajectories, convergent fates
Monocle 2 2017 ~50K cells โœ“ โœ“ โœ— โœ— โœ— DDRTree algorithm, well-established
MOSCOT 2025 1.7M+ cells โœ“ โœ— โœ“ โœ“ โœ“ Most scalable OT, spatial, multimodal
scVelo 2020 ~100K cells โœ— โœ“ โœ— โœ— โœ— Dynamic velocity, most popular
GENOT 2024 Variable โœ“ โœ— โœ— โœ“ โœ“ Stochastic OT, uncertainty quantification
CellRank 2 2024 1.3M+ cells โœ“ โœ“ โœ— โœ“ โœ— Multi-view integration
veloVI 2024 ~50K cells โœ— โœ“ โœ— โœ— โœ— Uncertainty quantification
UniTVelo 2022 ~100K cells โœ— โœ“ โœ— โœ— โœ— Batch integration
CASi 2024 ~100K cells โœ“ โœ— โœ— โœ— โœ— Novel cell type discovery
sciCSR 2024 ~50K cells โœ“ โœ— โœ— โœ— โœ— B cell specialization
Slingshot 2018 ~50K cells โœ“ โœ“ โœ— โœ— โœ— Flexible, Bioconductor integration
PAGA 2019 ~200K cells โœ“ โœ“ โœ— โœ— โœ— Graph abstraction, exploratory
Waddington-OT 2019 Variable (temporal timecourse) โœ“ โœ— โœ— โœ— โœ“ Foundational temporal OT, fate probabilities
DELVE 2024 Variable โœ“ โœ“ โœ— โœ“ โœ— Feature selection layer, cross-modality
TIGON 2023 Variable โœ“ โœ— โœ— โœ— โœ“ Growth-aware unbalanced OT + GRN inference
PRESCIENT 2021 Variable โœ“ โœ— โœ— โœ— โœ— Waddington potential landscape, in silico perturbation
FLOW-MAP 2020 Variable (cytometry-scale) โœ“ โœ— โœ— โœ— โœ— Flow/CyTOF-optimized force-directed visualization
PHLOWER 2025 Variable โœ— โœ“ โœ— โœ“ โœ— Up to 26 branches, uncertainty quantification
Palantir 2019 Variable โœ— โœ“ โœ— โœ— โœ— Probabilistic multi-fate absorption, not hard branches
dynamo 2022 Variable โœ— โœ“ โœ— Metabolic labeling optional โœ— Continuous vector field, acceleration/curvature
MultiVelo 2023 Variable (10x Multiome scale) โœ— โœ“ โœ— โœ“ โœ— RNA + ATAC joint velocity
CytoTRACE 2 2025 Variable (broad platform validation) โœ— โœ“ โœ— โœ— โœ— No-velocity, no-root developmental potential score

๐Ÿ—บ๏ธ Method Selection Guide

๐ŸŒณ Start Here: Walk the Tree

Q1: Do you have multiple experimental timepoints (temporal data)?

If yes โ†’ go to Q2. If no (a single snapshot) โ†’ skip to Q3.

Q2 (temporal data): Is the dataset larger than ~200K cells?

Yes, large-scale: MOSCOT (multimodal/spatial, atlas-scale) or Monocle 3 (complex topologies, discontinuous trajectories).

No, smaller-scale: Waddington-OT (foundational OT) | PRESCIENT (Waddington landscape) | TIGON (proliferation-aware, unbalanced OT) | GENOT (stochastic/cross-modality) | PRESCIENT and TIGON if you need growth/death modeled explicitly.

Q3 (single snapshot): Is sequencing depth sufficient for RNA velocity (roughly >2,000 UMI/cell, with clear unspliced/spliced signal)?

If no (low depth, or you just want a fast pre-check) โ†’ CytoTRACE 2 (no-velocity developmental potential score) or PAGA (graph abstraction, exploratory). If yes โ†’ go to Q4.

Q4 (sufficient depth): Do you need uncertainty quantification on the velocity itself?

Yes: veloVI (variational, posterior-sampled uncertainty).

No: scVelo (standard, most widely used) | dynamo (continuous vector field, metabolic-labeling-aware) | UniTVelo (unified latent time) | MultiVelo (if you have paired RNA+ATAC) | Palantir (if you want probabilistic multi-fate absorption instead of a velocity vector) | CellRank 2 (to combine velocity + pseudotime + real time into one fate model).

๐ŸŽฏ Quick Reference Summary

  • Single snapshot: scVelo (development) | veloVI (uncertainty) | UniTVelo (unified time) | dynamo (vector field)
  • <200K cells + temporal: GENOT (stochastic/unbalanced) | PRESCIENT (landscape) | Monocle 2
  • 200K-1M cells: MOSCOT (multimodal/spatial) | Monocle 3 (complex topologies)
  • >1M cells: MOSCOT, Monocle 3, CellRank 2, or PAGA (atlas-scale options)
  • B cells: sciCSR | Novel types: CASi | Drivers: DELVE + scVelo
  • Cross-modality: GENOT (OT) | MultiVelo (RNA+ATAC velocity) | Multi-method: CellRank 2
  • Growth dynamics: TIGON or GENOT (unbalanced) | Visualization: FLOW-MAP
  • Complex branching/discontinuous: Monocle 3 | Convergent fates: Monocle 3
  • Probabilistic multi-fate scoring: Palantir | No-velocity potency check: CytoTRACE 2

๐Ÿ’ก Best Practices

General Recommendations

When to Use RNA Velocity vs Optimal Transport vs Graph-Based Methods

RNA Velocity (scVelo, veloVI):

Optimal Transport (MOSCOT, GENOT):

Graph-Based (Monocle 3, PAGA, Slingshot):

๐Ÿ› ๏ธ Hands-On Practice

The walkthrough below takes a QC'd AnnData object end to end through a standard Python trajectory stack: neighbor graph and UMAP, Leiden clusters, PAGA for coarse topology, diffusion pseudotime for a continuous ordering, RNA velocity with scVelo, and finally CellRank to turn velocity plus connectivity into terminal states and fate probabilities. Every step is retrospective and computational โ€” the point is to interrogate an existing dataset, not to generate new material.

Environment & packages

Scanpy, scVelo, and CellRank evolve quickly and pin overlapping dependencies, so install them into one dedicated environment rather than adding them to a general analysis env. CellRank 2 expects scvelo >= 0.3 and scanpy >= 1.9; installing all three in a single pip call lets the resolver pick a mutually consistent set.

# conda / mamba recommended
conda create -n traj python=3.10 -y
conda activate traj

# install together so the resolver reconciles shared pins
pip install "scanpy>=1.9" "scvelo>=0.3" "cellrank>=2.0" leidenalg igraph

# only needed if you must GENERATE spliced/unspliced counts yourself
# pip install velocyto scvelo[louvain] loompy
# (alternative: STARsolo --soloFeatures Gene Velocyto, or kb-python with --workflow lamanno)

Hardware. A laptop with 16 GB RAM comfortably handles ~50k cells through PAGA, DPT, and the stochastic velocity model. The scVelo dynamical model is the bottleneck: it fits a full splicing ODE per gene by EM and can take hours on 100k cells, so run it on a compute node with n_jobs set to the available cores. CellRank's kernels and GPCCA decomposition are sparse-matrix operations and stay cheap by comparison. No GPU is required anywhere in this pipeline.

Data structures & formats

Minimal code walkthrough

Start from the QC-filtered object, build the graph, run PAGA for topology, anchor a root cell using biology and compute diffusion pseudotime, then bring in the spliced/unspliced layers for velocity and hand both signals to CellRank.

import scanpy as sc
import scvelo as scv
import cellrank as cr
import numpy as np

# 1. Start from a QC'd object (doublets removed, ambient corrected).
#    Trajectory methods are extremely sensitive to junk cells: a stray
#    doublet sits "between" two clusters and looks exactly like a
#    transitional state to any graph-based method.
adata = sc.read_h5ad("adata_qc.h5ad")
adata.layers["counts"] = adata.X.copy()          # keep raw counts for later

# 2. Standard normalisation -> HVGs -> PCA
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
adata.raw = adata                                 # log-norm values for plots/markers
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
adata = adata[:, adata.var.highly_variable].copy()
sc.pp.scale(adata, max_value=10)
sc.tl.pca(adata, n_comps=50, svd_solver="arpack")

# 3. Neighbour graph -> UMAP -> Leiden.
#    n_neighbors is the single most consequential knob downstream: PAGA,
#    DPT and CellRank's connectivity kernel all read this same graph.
sc.pp.neighbors(adata, n_neighbors=15, n_pcs=30)
sc.tl.umap(adata)
sc.tl.leiden(adata, resolution=1.0, key_added="leiden")

# 4. PAGA: coarse-grained topology between clusters. Read this BEFORE
#    committing to a pseudotime -- it tells you whether the data is one
#    connected continuum or several disconnected islands.
sc.tl.paga(adata, groups="leiden")
sc.pl.paga(adata, threshold=0.05, show=False)     # prune weak edges
sc.tl.umap(adata, init_pos="paga")                # PAGA-initialised embedding

# 5. Diffusion pseudotime. The root must come from BIOLOGY, not convenience:
#    pick the cluster expressing your known progenitor/stem markers, then
#    take an extreme cell within it along the first diffusion component.
sc.tl.diffmap(adata)
root_cluster = "3"                                 # e.g. HSC/progenitor cluster
mask = (adata.obs["leiden"] == root_cluster).values
dc1 = adata.obsm["X_diffmap"][:, 1]
adata.uns["iroot"] = np.flatnonzero(mask)[np.argmin(dc1[mask])]
sc.tl.dpt(adata, n_dcs=15)                         # writes adata.obs["dpt_pseudotime"]

# Sanity check: pseudotime should INCREASE away from the progenitors.
# If your known mature markers sit at low pseudotime, the root is wrong
# and the whole trajectory is silently reversed.
print(adata.obs.groupby("leiden")["dpt_pseudotime"].median())

# 6. RNA velocity. This step REQUIRES spliced/unspliced layers -- they come
#    from velocyto/STARsolo/kb-python, and cannot be recovered from a plain
#    filtered count matrix. Merge the loom onto the QC'd object by barcode.
ldata = scv.read("sample.loom", cache=True)
ldata.var_names_make_unique()
adata = scv.utils.merge(adata, ldata)              # intersects on barcodes
assert "spliced" in adata.layers and "unspliced" in adata.layers

scv.pp.filter_and_normalize(adata, min_shared_counts=20, n_top_genes=2000)
scv.pp.moments(adata, n_pcs=30, n_neighbors=30)    # kNN-smoothed first/second moments

# stochastic: seconds-to-minutes, assumes a common steady state
scv.tl.velocity(adata, mode="stochastic")

# dynamical: fits the full splicing ODE per gene by EM. Much slower
# (hours at 100k cells) but relaxes the steady-state assumption and is the
# only mode that yields latent time.
# scv.tl.recover_dynamics(adata, n_jobs=8)
# scv.tl.velocity(adata, mode="dynamical")
# scv.tl.latent_time(adata)                        # adata.obs["latent_time"]

scv.tl.velocity_graph(adata, n_jobs=8)
scv.pl.velocity_embedding_stream(adata, basis="umap", color="leiden")

# Confidence diagnostics -- low values mean the arrows are not trustworthy.
scv.tl.velocity_confidence(adata)
scv.pl.scatter(adata, c=["velocity_length", "velocity_confidence"], cmap="coolwarm")

# 7. CellRank: combine a directional signal (velocity) with a similarity
#    signal (connectivity). The connectivity kernel regularises velocity,
#    which is noisy at the single-cell level.
vk = cr.kernels.VelocityKernel(adata).compute_transition_matrix()
ck = cr.kernels.ConnectivityKernel(adata).compute_transition_matrix()
combined = 0.8 * vk + 0.2 * ck                     # weights are a real choice

g = cr.estimators.GPCCA(combined)
g.compute_schur(n_components=20)
g.compute_macrostates(n_states=6, cluster_key="leiden")
g.predict_terminal_states()                        # inspect against known endpoints
g.compute_fate_probabilities()                     # adata.obsm["lineages_fwd"]
g.plot_fate_probabilities(same_plot=False)

# 8. Genes correlated with commitment to one fate
drivers = g.compute_lineage_drivers(lineages=["Erythroid"])
print(drivers.head(20))

adata.write_h5ad("adata_trajectory.h5ad")

Common pitfalls & tips