New: Earn 20% as an AgentAlley affiliate. Share your link and earn on every sale you refer. Join now New: Earn 20% as an affiliate. Join now

RNA velocity analysis with scVelo

scVelo — RNA Velocity Analysis

by K-Dense-AI · MIT license · ★ 45,977 on GitHub · updated Sep 21

scVelo — RNA Velocity Analysis cover

RNA velocity analysis with scVelo. Estimate cell state transitions from unspliced/spliced mRNA dynamics, infer trajectory directions, compute latent time, and identify driver genes in single-cell RNA-seq data.

---
name: scvelo
description: RNA velocity analysis with scVelo. Estimate cell state transitions from unspliced/spliced mRNA dynamics, infer trajectory directions, compute latent time, and identify driver genes in single-cell RNA-seq data. Complements Scanpy/scVI-tools for trajectory inference.
license: BSD-3-Clause
compatibility: Requires Python 3.10+ with scvelo, scanpy, and anndata. Verified against scvelo 0.3.4, whose dynamical model and pl.scatter need pandas<3 and whose stochastic estimator needs numpy<2; the deterministic estimator works on current releases.
metadata:
  version: "1.2"
  skill-author: Kuan-lin Huang
---

# scVelo — RNA Velocity Analysis

## Overview

scVelo is the leading Python package for RNA velocity analysis in single-cell RNA-seq data. It infers cell state transitions by modeling the kinetics of mRNA splicing — using the ratio of unspliced (pre-mRNA) to spliced (mature mRNA) abundances to determine whether a gene is being upregulated or downregulated in each cell. This allows reconstruction of developmental trajectories and identification of cell fate decisions without requiring time-course data.

**Installation:** `uv pip install scvelo`

Overview

scVelo is the leading Python package for RNA velocity analysis in single-cell RNA-seq data. It infers cell state transitions by modeling the kinetics of mRNA splicing — using the ratio of unspliced (pre-mRNA) to spliced (mature mRNA) abundances to determine whether a gene is being upregulated or downregulated in each cell. This allows reconstruction of developmental trajectories and identification of cell fate decisions without requiring time-course data.

Manual install (npx, ZIP)
Claude Codenpx skills add K-Dense-AI/scientific-agent-skills --skill scvelo -g -a claude-code
Claude Code (manual)mkdir -p ~/.claude/skills && curl -sL https://codeload.github.com/K-Dense-AI/scientific-agent-skills/tar.gz/49c6e97775ea \ | tar -xz -C ~/.claude/skills --strip-components=2 scientific-agent-skills-49c6e97775ea/skills/scvelo
Windows (PowerShell)New-Item -ItemType Directory -Force "$HOME\.claude\skills" | Out-Null; Invoke-WebRequest "https://m.agentalley.io/zip/018bebf90ba63720b9fd/scvelo.zip" -OutFile "$env:TEMP\scvelo.zip"; Expand-Archive "$env:TEMP\scvelo.zip" -DestinationPath "$HOME\.claude\skills" -Force
Claude.ai / desktopDownload the ZIP and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md10.6 KB
  • references/1 file · 4.9 KB
  • scripts/1 file · 8.2 KB
Read the files here
K-Dense-AI/49c6e973 files
SKILL.md
Show the full text329 lines

scVelo — RNA Velocity Analysis

Overview

scVelo is the leading Python package for RNA velocity analysis in single-cell RNA-seq data. It infers cell state transitions by modeling the kinetics of mRNA splicing — using the ratio of unspliced (pre-mRNA) to spliced (mature mRNA) abundances to determine whether a gene is being upregulated or downregulated in each cell. This allows reconstruction of developmental trajectories and identification of cell fate decisions without requiring time-course data.

Installation: uv pip install scvelo

Key resources:

When to Use This Skill

Use scVelo when:

  • Trajectory inference from snapshot data: Determine which direction cells are differentiating
  • Cell fate prediction: Identify progenitor cells and their downstream fates
  • Driver gene identification: Find genes whose dynamics best explain observed trajectories
  • Developmental biology: Model hematopoiesis, neurogenesis, epithelial-to-mesenchymal transitions
  • Latent time estimation: Order cells along a pseudotime derived from splicing dynamics
  • Complement to Scanpy: Add directional information to UMAP embeddings

Prerequisites

scVelo requires count matrices for both unspliced and spliced RNA. These are generated by:

  1. STARsolo or kallisto|bustools with lamanno mode
  2. velocyto CLI: velocyto run10x / velocyto run
  3. alevin-fry / simpleaf with spliced/unspliced output

Data is stored in an AnnData object with layers["spliced"] and layers["unspliced"].

Standard RNA Velocity Workflow

1. Setup and Data Loading
import scvelo as scv
import scanpy as sc
import numpy as np
import matplotlib.pyplot as plt

# Configure settings
scv.settings.verbosity = 3       # Show computation steps
scv.settings.presenter_view = True
scv.settings.set_figure_params('scvelo')

# Load data (AnnData with spliced/unspliced layers)
# Option A: Load from loom (velocyto output)
adata = scv.read("cellranger_output.loom", cache=True)

# Option B: Merge velocyto loom with Scanpy-processed AnnData
adata_processed = sc.read_h5ad("processed.h5ad")  # Has UMAP, clusters
adata_velocity = scv.read("velocyto.loom")
adata = scv.utils.merge(adata_processed, adata_velocity)

# Verify layers
print(adata)
# obs × var: N × G
# layers: 'spliced', 'unspliced' (required)
# obsm['X_umap'] (required for visualization)
2. Preprocessing
# Filter and normalize. As of scVelo 0.3, filter_and_normalize() only filters
# genes and normalizes per cell -- it no longer takes n_top_genes and no longer
# log-transforms, so the log step and HVG selection come from Scanpy.
scv.pp.filter_and_normalize(
    adata,
    min_shared_counts=20    # Minimum counts in spliced+unspliced
)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000, subset=True)

# Compute first and second order moments (means and variances)
# knn_connectivities must be computed first
sc.pp.neighbors(adata, n_neighbors=30, n_pcs=30)
scv.pp.moments(
    adata,
    n_pcs=30,
    n_neighbors=30
)
3. Velocity Estimation — Stochastic Model

The stochastic model is fast and suitable for exploratory analysis:

# Stochastic velocity (faster, less accurate)
scv.tl.velocity(adata, mode='stochastic')
scv.tl.velocity_graph(adata)

# Visualize
scv.pl.velocity_embedding_stream(
    adata,
    basis='umap',
    color='leiden',
    title="RNA Velocity (Stochastic)"
)

The dynamical model fits the full splicing kinetics and is more accurate:

# Recover dynamics (computationally intensive; ~10-30 min for 10K cells)
scv.tl.recover_dynamics(adata, n_jobs=4)

# Compute velocity from dynamical model
scv.tl.velocity(adata, mode='dynamical')
scv.tl.velocity_graph(adata)
5. Latent Time

The dynamical model enables computation of a shared latent time (pseudotime):

# Compute latent time
scv.tl.latent_time(adata)

# Visualize latent time on UMAP
scv.pl.scatter(
    adata,
    color='latent_time',
    color_map='gnuplot',
    size=80,
    title='Latent time'
)

# Identify top genes ordered by latent time
top_genes = adata.var['fit_likelihood'].sort_values(ascending=False).index[:300]
scv.pl.heatmap(
    adata,
    var_names=top_genes,
    sortby='latent_time',
    col_color='leiden',
    n_convolve=100
)
6. Driver Gene Analysis
# Identify genes with highest velocity fit
scv.tl.rank_velocity_genes(adata, groupby='leiden', min_corr=0.3)
df = scv.DataFrame(adata.uns['rank_velocity_genes']['names'])
print(df.head(10))

# Speed and coherence
scv.tl.velocity_confidence(adata)
scv.pl.scatter(
    adata,
    c=['velocity_length', 'velocity_confidence'],
    cmap='coolwarm',
    perc=[5, 95]
)

# Phase portraits for specific genes
scv.pl.velocity(adata, ['Cpe', 'Gnao1', 'Ins2'],
               ncols=3, figsize=(16, 4))
7. Velocity Arrows and Pseudotime
# Arrow plot on UMAP
scv.pl.velocity_embedding(
    adata,
    arrow_length=3,
    arrow_size=2,
    color='leiden',
    basis='umap'
)

# Stream plot (cleaner visualization)
scv.pl.velocity_embedding_stream(
    adata,
    basis='umap',
    color='leiden',
    smooth=0.8,
    min_mass=4
)

# Velocity pseudotime (alternative to latent time)
scv.tl.velocity_pseudotime(adata)
scv.pl.scatter(adata, color='velocity_pseudotime', cmap='gnuplot')
8. PAGA Trajectory Graph
# PAGA graph with velocity-informed transitions
scv.tl.paga(adata, groups='leiden')
df = scv.get_df(adata, 'paga/transitions_confidence', precision=2).T
df.style.background_gradient(cmap='Blues').format('{:.2g}')

# Plot PAGA with velocity
scv.pl.paga(
    adata,
    basis='umap',
    size=50,
    alpha=0.1,
    min_edge_width=2,
    node_size_scale=1.5
)

Complete Workflow Script

import scvelo as scv
import scanpy as sc

def run_rna_velocity(adata, n_top_genes=2000, mode='dynamical', n_jobs=4):
    """
    Complete RNA velocity workflow.

    Args:
        adata: AnnData with 'spliced' and 'unspliced' layers, UMAP in obsm
        n_top_genes: Number of top HVGs for velocity
        mode: 'stochastic' (fast) or 'dynamical' (accurate)
        n_jobs: Parallel jobs for dynamical model

    Returns:
        Processed AnnData with velocity information
    """
    scv.settings.verbosity = 2

    # 1. Preprocessing (scVelo 0.3 dropped log/HVG from filter_and_normalize)
    scv.pp.filter_and_normalize(adata, min_shared_counts=20)
    sc.pp.log1p(adata)
    sc.pp.highly_variable_genes(adata, n_top_genes=n_top_genes, subset=True)

    if 'neighbors' not in adata.uns:
        sc.pp.neighbors(adata, n_neighbors=30)

    scv.pp.moments(adata, n_pcs=30, n_neighbors=30)

    # 2. Velocity estimation
    if mode == 'dynamical':
        scv.tl.recover_dynamics(adata, n_jobs=n_jobs)

    scv.tl.velocity(adata, mode=mode)
    scv.tl.velocity_graph(adata)

    # 3. Downstream analyses
    if mode == 'dynamical':
        scv.tl.latent_time(adata)
        scv.tl.rank_velocity_genes(adata, groupby='leiden', min_corr=0.3)

    scv.tl.velocity_confidence(adata)
    scv.tl.velocity_pseudotime(adata)

    return adata

Key Output Fields in AnnData

After running the workflow, the following fields are added:

Location Key Description
adata.layers velocity RNA velocity per gene per cell
adata.layers fit_t Fitted latent time per gene per cell
adata.obsm velocity_umap 2D velocity vectors on UMAP
adata.obs velocity_pseudotime Pseudotime from velocity
adata.obs latent_time Latent time from dynamical model
adata.obs velocity_length Speed of each cell
adata.obs velocity_confidence Confidence score per cell
adata.var fit_likelihood Gene-level model fit quality
adata.var fit_alpha Transcription rate
adata.var fit_beta Splicing rate
adata.var fit_gamma Degradation rate
adata.uns velocity_graph Cell-cell transition probability matrix

Velocity Models Comparison

Model Speed Accuracy When to Use
stochastic Fast Moderate Exploratory; large datasets
deterministic Medium Moderate Simple linear kinetics
dynamical Slow High Publication-quality; identifies driver genes

Best Practices

  • Start with stochastic mode for exploration; switch to dynamical for final analysis
  • Need good coverage of unspliced reads: Short reads (< 100 bp) may miss intron coverage
  • Minimum 2,000 cells: RNA velocity is noisy with fewer cells
  • Velocity should be coherent: Arrows should follow known biology; randomness indicates issues
  • k-NN bandwidth matters: Too few neighbors → noisy velocity; too many → oversmoothed
  • Sanity check: Root cells (progenitors) should have high unspliced/spliced ratios for marker genes
  • Dynamical model requires distinct kinetic states: Works best for clear differentiation processes

Troubleshooting

Problem Solution
Missing unspliced layer Re-run velocyto or use STARsolo with --soloFeatures Gene Velocyto
Very few velocity genes Lower min_shared_counts; check sequencing depth
Random-looking arrows Try different n_neighbors or velocity model
Memory error with dynamical Set n_jobs=1; reduce n_top_genes
Negative velocity everywhere Check that spliced/unspliced layers are not swapped

Additional Resources

1---
2name: scvelo
3description: RNA velocity analysis with scVelo. Estimate cell state transitions from unspliced/spliced mRNA dynamics, infer trajectory directions, compute latent time, and identify driver genes in single-cell RNA-seq data. Complements Scanpy/scVI-tools for trajectory inference.
4license: BSD-3-Clause
5compatibility: Requires Python 3.10+ with scvelo, scanpy, and anndata. Verified against scvelo 0.3.4, whose dynamical model and pl.scatter need pandas<3 and whose stochastic estimator needs numpy<2; the deterministic estimator works on current releases.
6metadata:
7 version: "1.2"
8 skill-author: Kuan-lin Huang
9---
10 
11# scVelo — RNA Velocity Analysis
12 
13## Overview
14 
15scVelo is the leading Python package for RNA velocity analysis in single-cell RNA-seq data. It infers cell state transitions by modeling the kinetics of mRNA splicing — using the ratio of unspliced (pre-mRNA) to spliced (mature mRNA) abundances to determine whether a gene is being upregulated or downregulated in each cell. This allows reconstruction of developmental trajectories and identification of cell fate decisions without requiring time-course data.
16 
17**Installation:** `uv pip install scvelo`
18 
19**Key resources:**
20- Documentation: https://scvelo.readthedocs.io/
21- GitHub: https://github.com/theislab/scvelo
22- Paper: Bergen et al. (2020) Nature Biotechnology. PMID: 32747759
23 
24## When to Use This Skill
25 
26Use scVelo when:
27 
28- **Trajectory inference from snapshot data**: Determine which direction cells are differentiating
29- **Cell fate prediction**: Identify progenitor cells and their downstream fates
30- **Driver gene identification**: Find genes whose dynamics best explain observed trajectories
31- **Developmental biology**: Model hematopoiesis, neurogenesis, epithelial-to-mesenchymal transitions
32- **Latent time estimation**: Order cells along a pseudotime derived from splicing dynamics
33- **Complement to Scanpy**: Add directional information to UMAP embeddings
34 
35## Prerequisites
36 
37scVelo requires count matrices for both **unspliced** and **spliced** RNA. These are generated by:
381. **STARsolo** or **kallisto|bustools** with `lamanno` mode
392. **velocyto** CLI: `velocyto run10x` / `velocyto run`
403. **alevin-fry** / **simpleaf** with spliced/unspliced output
41 
42Data is stored in an `AnnData` object with `layers["spliced"]` and `layers["unspliced"]`.
43 
44## Standard RNA Velocity Workflow
45 
46### 1. Setup and Data Loading
47 
48```python
49import scvelo as scv
50import scanpy as sc
51import numpy as np
52import matplotlib.pyplot as plt
53 
54# Configure settings
55scv.settings.verbosity = 3 # Show computation steps
56scv.settings.presenter_view = True
57scv.settings.set_figure_params('scvelo')
58 
59# Load data (AnnData with spliced/unspliced layers)
60# Option A: Load from loom (velocyto output)
61adata = scv.read("cellranger_output.loom", cache=True)
62 
63# Option B: Merge velocyto loom with Scanpy-processed AnnData
64adata_processed = sc.read_h5ad("processed.h5ad") # Has UMAP, clusters
65adata_velocity = scv.read("velocyto.loom")
66adata = scv.utils.merge(adata_processed, adata_velocity)
67 
68# Verify layers
69print(adata)
70# obs × var: N × G
71# layers: 'spliced', 'unspliced' (required)
72# obsm['X_umap'] (required for visualization)
73```
74 
75### 2. Preprocessing
76 
77```python
78# Filter and normalize. As of scVelo 0.3, filter_and_normalize() only filters
79# genes and normalizes per cell -- it no longer takes n_top_genes and no longer
80# log-transforms, so the log step and HVG selection come from Scanpy.
81scv.pp.filter_and_normalize(
82 adata,
83 min_shared_counts=20 # Minimum counts in spliced+unspliced
84)
85sc.pp.log1p(adata)
86sc.pp.highly_variable_genes(adata, n_top_genes=2000, subset=True)
87 
88# Compute first and second order moments (means and variances)
89# knn_connectivities must be computed first
90sc.pp.neighbors(adata, n_neighbors=30, n_pcs=30)
91scv.pp.moments(
92 adata,
93 n_pcs=30,
94 n_neighbors=30
95)
96```
97 
98### 3. Velocity Estimation — Stochastic Model
99 
100The stochastic model is fast and suitable for exploratory analysis:
101 
102```python
103# Stochastic velocity (faster, less accurate)
104scv.tl.velocity(adata, mode='stochastic')
105scv.tl.velocity_graph(adata)
106 
107# Visualize
108scv.pl.velocity_embedding_stream(
109 adata,
110 basis='umap',
111 color='leiden',
112 title="RNA Velocity (Stochastic)"
113)
114```
115 
116### 4. Velocity Estimation — Dynamical Model (Recommended)
117 
118The dynamical model fits the full splicing kinetics and is more accurate:
119 
120```python
121# Recover dynamics (computationally intensive; ~10-30 min for 10K cells)
122scv.tl.recover_dynamics(adata, n_jobs=4)
123 
124# Compute velocity from dynamical model
125scv.tl.velocity(adata, mode='dynamical')
126scv.tl.velocity_graph(adata)
127```
128 
129### 5. Latent Time
130 
131The dynamical model enables computation of a shared latent time (pseudotime):
132 
133```python
134# Compute latent time
135scv.tl.latent_time(adata)
136 
137# Visualize latent time on UMAP
138scv.pl.scatter(
139 adata,
140 color='latent_time',
141 color_map='gnuplot',
142 size=80,
143 title='Latent time'
144)
145 
146# Identify top genes ordered by latent time
147top_genes = adata.var['fit_likelihood'].sort_values(ascending=False).index[:300]
148scv.pl.heatmap(
149 adata,
150 var_names=top_genes,
151 sortby='latent_time',
152 col_color='leiden',
153 n_convolve=100
154)
155```
156 
157### 6. Driver Gene Analysis
158 
159```python
160# Identify genes with highest velocity fit
161scv.tl.rank_velocity_genes(adata, groupby='leiden', min_corr=0.3)
162df = scv.DataFrame(adata.uns['rank_velocity_genes']['names'])
163print(df.head(10))
164 
165# Speed and coherence
166scv.tl.velocity_confidence(adata)
167scv.pl.scatter(
168 adata,
169 c=['velocity_length', 'velocity_confidence'],
170 cmap='coolwarm',
171 perc=[5, 95]
172)
173 
174# Phase portraits for specific genes
175scv.pl.velocity(adata, ['Cpe', 'Gnao1', 'Ins2'],
176 ncols=3, figsize=(16, 4))
177```
178 
179### 7. Velocity Arrows and Pseudotime
180 
181```python
182# Arrow plot on UMAP
183scv.pl.velocity_embedding(
184 adata,
185 arrow_length=3,
186 arrow_size=2,
187 color='leiden',
188 basis='umap'
189)
190 
191# Stream plot (cleaner visualization)
192scv.pl.velocity_embedding_stream(
193 adata,
194 basis='umap',
195 color='leiden',
196 smooth=0.8,
197 min_mass=4
198)
199 
200# Velocity pseudotime (alternative to latent time)
201scv.tl.velocity_pseudotime(adata)
202scv.pl.scatter(adata, color='velocity_pseudotime', cmap='gnuplot')
203```
204 
205### 8. PAGA Trajectory Graph
206 
207```python
208# PAGA graph with velocity-informed transitions
209scv.tl.paga(adata, groups='leiden')
210df = scv.get_df(adata, 'paga/transitions_confidence', precision=2).T
211df.style.background_gradient(cmap='Blues').format('{:.2g}')
212 
213# Plot PAGA with velocity
214scv.pl.paga(
215 adata,
216 basis='umap',
217 size=50,
218 alpha=0.1,
219 min_edge_width=2,
220 node_size_scale=1.5
221)
222```
223 
224## Complete Workflow Script
225 
226```python
227import scvelo as scv
228import scanpy as sc
229 
230def run_rna_velocity(adata, n_top_genes=2000, mode='dynamical', n_jobs=4):
231 """
232 Complete RNA velocity workflow.
233 
234 Args:
235 adata: AnnData with 'spliced' and 'unspliced' layers, UMAP in obsm
236 n_top_genes: Number of top HVGs for velocity
237 mode: 'stochastic' (fast) or 'dynamical' (accurate)
238 n_jobs: Parallel jobs for dynamical model
239 
240 Returns:
241 Processed AnnData with velocity information
242 """
243 scv.settings.verbosity = 2
244 
245 # 1. Preprocessing (scVelo 0.3 dropped log/HVG from filter_and_normalize)
246 scv.pp.filter_and_normalize(adata, min_shared_counts=20)
247 sc.pp.log1p(adata)
248 sc.pp.highly_variable_genes(adata, n_top_genes=n_top_genes, subset=True)
249 
250 if 'neighbors' not in adata.uns:
251 sc.pp.neighbors(adata, n_neighbors=30)
252 
253 scv.pp.moments(adata, n_pcs=30, n_neighbors=30)
254 
255 # 2. Velocity estimation
256 if mode == 'dynamical':
257 scv.tl.recover_dynamics(adata, n_jobs=n_jobs)
258 
259 scv.tl.velocity(adata, mode=mode)
260 scv.tl.velocity_graph(adata)
261 
262 # 3. Downstream analyses
263 if mode == 'dynamical':
264 scv.tl.latent_time(adata)
265 scv.tl.rank_velocity_genes(adata, groupby='leiden', min_corr=0.3)
266 
267 scv.tl.velocity_confidence(adata)
268 scv.tl.velocity_pseudotime(adata)
269 
270 return adata
271```
272 
273## Key Output Fields in AnnData
274 
275After running the workflow, the following fields are added:
276 
277| Location | Key | Description |
278|----------|-----|-------------|
279| `adata.layers` | `velocity` | RNA velocity per gene per cell |
280| `adata.layers` | `fit_t` | Fitted latent time per gene per cell |
281| `adata.obsm` | `velocity_umap` | 2D velocity vectors on UMAP |
282| `adata.obs` | `velocity_pseudotime` | Pseudotime from velocity |
283| `adata.obs` | `latent_time` | Latent time from dynamical model |
284| `adata.obs` | `velocity_length` | Speed of each cell |
285| `adata.obs` | `velocity_confidence` | Confidence score per cell |
286| `adata.var` | `fit_likelihood` | Gene-level model fit quality |
287| `adata.var` | `fit_alpha` | Transcription rate |
288| `adata.var` | `fit_beta` | Splicing rate |
289| `adata.var` | `fit_gamma` | Degradation rate |
290| `adata.uns` | `velocity_graph` | Cell-cell transition probability matrix |
291 
292## Velocity Models Comparison
293 
294| Model | Speed | Accuracy | When to Use |
295|-------|-------|----------|-------------|
296| `stochastic` | Fast | Moderate | Exploratory; large datasets |
297| `deterministic` | Medium | Moderate | Simple linear kinetics |
298| `dynamical` | Slow | High | Publication-quality; identifies driver genes |
299 
300## Best Practices
301 
302- **Start with stochastic mode** for exploration; switch to dynamical for final analysis
303- **Need good coverage of unspliced reads**: Short reads (< 100 bp) may miss intron coverage
304- **Minimum 2,000 cells**: RNA velocity is noisy with fewer cells
305- **Velocity should be coherent**: Arrows should follow known biology; randomness indicates issues
306- **k-NN bandwidth matters**: Too few neighbors → noisy velocity; too many → oversmoothed
307- **Sanity check**: Root cells (progenitors) should have high unspliced/spliced ratios for marker genes
308- **Dynamical model requires distinct kinetic states**: Works best for clear differentiation processes
309 
310## Troubleshooting
311 
312| Problem | Solution |
313|---------|---------|
314| Missing unspliced layer | Re-run velocyto or use STARsolo with `--soloFeatures Gene Velocyto` |
315| Very few velocity genes | Lower `min_shared_counts`; check sequencing depth |
316| Random-looking arrows | Try different `n_neighbors` or velocity model |
317| Memory error with dynamical | Set `n_jobs=1`; reduce `n_top_genes` |
318| Negative velocity everywhere | Check that spliced/unspliced layers are not swapped |
319 
320## Additional Resources
321 
322- **scVelo documentation**: https://scvelo.readthedocs.io/
323- **Tutorial notebooks**: https://scvelo.readthedocs.io/tutorials/
324- **GitHub**: https://github.com/theislab/scvelo
325- **Paper**: Bergen V et al. (2020) Nature Biotechnology. PMID: 32747759
326- **velocyto** (preprocessing): http://velocyto.org/
327- **CellRank** (fate prediction, extends scVelo): https://cellrank.readthedocs.io/
328- **dynamo** (metabolic labeling alternative): https://dynamo-release.readthedocs.io/
329 
View all files on GitHub →

Details

Updated
Sep 21, 2026
License
MIT
Stars on the repo
★ 45,977
Checked
Source
K-Dense-AI/scientific-agent-skills ↗
Creator
K-Dense-AI · 168 listings
View creator

Similar skills

See all →
SkillData structure for annotated matrices in single-cellAnndataK-Dense-AI/scientific-agent-skills · by K-Dense-AIData structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.★ 46k GitHub starsSkillInfer gene regulatory networks from gene expression dataArboretoK-Dense-AI/scientific-agent-skills · by K-Dense-AIInfer gene regulatory networks (GRNs) from gene expression data using scalable algorithms (GRNBoost2, GENIE3). Use when analyzing transcriptomics data (bulk RNA-seq, single-cell RNA-seq) to identify transcription factor-target gene relationships and regulatory interactions. Supports distributed computation for large-scale datasets.★ 46k GitHub starsSkillComprehensive molecular biology toolkitBiopython: Computational Molecular Biology in PythonK-Dense-AI/scientific-agent-skills · by K-Dense-AIComprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.★ 46k GitHub starsSkillEnd-to-end bulk RNA-seq orchestratorBulk rnaseqK-Dense-AI/scientific-agent-skills · by K-Dense-AIEnd-to-end bulk RNA-seq orchestrator — takes raw FASTQ reads through QC and trimming (FastQC, fastp/Trim Galore), alignment and quantification (STAR, Salmon, featureCounts), assembles a gene-level counts matrix, then hands off to differential expression (pydeseq2), pathway/GSEA enrichment (pathway-enrichment), and publication figures (scientific-visualization). Use whenever the user has bulk RNA-seq reads or quant output and wants a complete, reproducible differential-expression workflow — e.g. "analyze my RNA-seq", "FASTQ to DESeq2", "run nf-core/rnaseq", "STAR/Salmon quantification", "build a counts matrix for DESeq2", or "go from reads to differentially expressed genes and enriched pathways". Routes between an nf-core/rnaseq (Nextflow) path and a standalone STAR/Salmon path, and covers experimental design, strandedness, and QC gates. For single-cell RNA-seq use the scanpy skill instead.★ 46k GitHub starsSkillConstraint-based metabolic modelingCOBRApy - Constraint-Based Reconstruction and AnalysisK-Dense-AI/scientific-agent-skills · by K-Dense-AIConstraint-based metabolic modeling (COBRA). FBA, FVA, gene knockouts, flux sampling, SBML models, for systems biology and metabolic engineering analysis.★ 46k GitHub starsSkillQuery the CZ CELLxGENE Census programmatically for versionedK-Dense-AI/scientific-agent-skills · by K-Dense-AIQuery the CZ CELLxGENE Census programmatically for versioned public single-cell and spatial transcriptomics data. Use when you need population-scale cell metadata, gene expression slices, Census summary counts, source H5AD URIs/downloads, embeddings, spatial Census data, or reference atlas comparisons across organisms, tissues, diseases, assays, and cell types. For analyzing your own local single-cell data use scanpy, anndata, or scvi-tools.★ 46k GitHub stars

More from K-Dense-AI

SkillHow to use the Adaptyv Bio Foundry API and Python SDKK-Dense-AI/scientific-agent-skills · by K-Dense-AIHow to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user mentions Adaptyv, Foundry API, protein binding assays, protein screening experiments, BLI/SPR assays, thermostability assays, or wants to submit protein sequences for experimental characterization. Also trigger when code imports `adaptyv`, `adaptyv_sdk`, or `FoundryClient`, or references `foundry-api-public.adaptyvbio.com`.★ 46k GitHub starsSkillAeon Time Series Machine LearningK-Dense-AI/scientific-agent-skills · by K-Dense-AIThis skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search. Use when working with temporal data, sequential patterns, or time-indexed observations requiring specialized algorithms beyond standard ML approaches. Particularly suited for univariate and multivariate time series analysis with scikit-learn compatible APIs.★ 46k GitHub starsSkillPlan, execute, and document validation, verificationAnalytical method validationK-Dense-AI/scientific-agent-skills · by K-Dense-AIPlan, execute, and document validation, verification, and transfer of analytical procedures under the governing framework - ICH Q2(R2) and Q14, USP <1220>/<1225>/<1226>, ICH M10 bioanalytical, CLSI EP, or ISO/IEC 17025. Use for HPLC, LC-MS/MS, GC, CE, ICP-MS, dissolution, qNMR, qPCR, NIR, and ligand binding or cell-based assays whenever the question is whether a procedure is fit for its intended purpose. Triggers include "method validation", "analytical method validation", "AMV", "validation protocol", "acceptance criteria", "linearity", "reportable range", "accuracy and precision", "repeatability", "intermediate precision", "recovery", "LOD", "LOQ", "detection limit", "quantitation limit", "specificity", "robustness", "method transfer", "method comparison", "Deming", "Passing-Bablok", "Bland-Altman", "equivalence testing", "OOS investigation", "ICH Q2", "Q2(R2)", "Q14", "USP 1225", "ICH M10", "incurred sample reanalysis", "ISR", "CLSI EP", and any request to show that an assay works.★ 46k GitHub starsSkillData structure for annotated matrices in single-cellAnndataK-Dense-AI/scientific-agent-skills · by K-Dense-AIData structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.★ 46k GitHub starsSkillAutonomously improve a real artifact against an objectiveArbor — Autonomous Optimization via Hypothesis Tree RefinementK-Dense-AI/scientific-agent-skills · by K-Dense-AIAutonomously improve a real artifact (code, training recipe, agent harness, data pipeline, prompt) against an objective and an evaluator, using Hypothesis Tree Refinement (HTR) from the Arbor paper. Use this whenever someone wants to iteratively optimize something over many experiments without overfitting — e.g. "get my model's eval score up", "improve this agent/harness", "tune this pipeline", "beat the baseline on this benchmark", "run a search over approaches and keep the best", "do an MLE-bench / Kaggle-style optimization", or any long-horizon "make this artifact better and don't just memorize the dev set" task. Trigger it even when the user doesn't say "Arbor" or "hypothesis tree" but describes repeated experiment-and-evaluate loops, branching exploration of competing ideas, or worries about a dev/test gap. Runs Claude itself as the coordinator with subagent executors in isolated git worktrees; for the standalone `arbor` CLI tool see references/arbor-upstream.md.★ 46k GitHub starsSkillInfer gene regulatory networks from gene expression dataArboretoK-Dense-AI/scientific-agent-skills · by K-Dense-AIInfer gene regulatory networks (GRNs) from gene expression data using scalable algorithms (GRNBoost2, GENIE3). Use when analyzing transcriptomics data (bulk RNA-seq, single-cell RNA-seq) to identify transcription factor-target gene relationships and regulatory interactions. Supports distributed computation for large-scale datasets.★ 46k GitHub stars