Was macht scVelo — RNA-Geschwindigkeitsanalyse?
Überblick
scVelo ist das führende Python-Paket für die RNA-Geschwindigkeitsanalyse in Einzelzell-RNA-seq-Daten. Es leitet Zellzustandsübergänge ab, indem es die Kinetik des mRNA-Spleißens modelliert – indem es das Verhältnis von ungespleißter (prä-mRNA) zu gespleißter (reifer mRNA) Häufigkeit verwendet, um zu bestimmen, ob ein Gen in jeder Zelle hoch- oder herunterreguliert wird. Dies ermöglicht die Rekonstruktion von Entwicklungstrajektorien und die Identifizierung von Zellschicksalentscheidungen, ohne dass Zeitreihendaten erforderlich sind.
Installation: uv pip install scvelo
Wichtige Ressourcen:
- Dokumentation: https://scvelo.readthedocs.io/
- GitHub: https://github.com/theislab/scvelo
- Paper: Bergen et al. (2020) Nature Biotechnology. PMID: 32747759
Wann man diese Fähigkeit einsetzen sollte
Verwenden Sie scVelo, wenn:
- Trajektorieninferenz aus Schnappschussdaten: Bestimmen Sie, in welche Richtung sich Zellen differenzieren
- Vorhersage des Zellschicksals: Identifizieren Sie Vorläuferzellen und ihre nachgeschalteten Schicksale
- Identifizierung von Treibergenen: Finden Sie Gene, deren Dynamik die beobachteten Trajektorien am besten erklärt
- Entwicklungsbiologie: Modellieren Sie Hämatopoese, Neurogenese, epithelial-mesenchymale Übergänge
- Schätzung der latenten Zeit: Ordnen Sie Zellen entlang einer aus der Spleißdynamik abgeleiteten Pseudozeit an
- Ergänzung zu Scanpy: Fügen Sie UMAP-Einbettungen Richtungsinformationen hinzu
Voraussetzungen
scVelo erfordert Zählmatrizen für sowohl ungespleißte als auch gespleißte RNA. Diese werden generiert durch:
- STARsolo oder kallisto|bustools mit dem Modus
lamanno - velocyto CLI:
velocyto run10x/velocyto run - alevin-fry / simpleaf mit gespleißtem/ungespleißtem Output
Die Daten werden in einem AnnData-Objekt mit layers["spliced"] und layers["unspliced"] gespeichert.
Standard RNA-Geschwindigkeits-Workflow
1. Einrichtung und Datenladen
import scvelo as scv
import scanpy as sc
import numpy as np
import matplotlib.pyplot as plt
# Einstellungen konfigurieren
scv.settings.verbosity = 3 # Berechnungsschritte anzeigen
scv.settings.presenter_view = True
scv.settings.set_figure_params('scvelo')
# Daten laden (AnnData mit gespleißten/ungespleißten Schichten)
# Option A: Aus loom laden (velocyto-Output)
adata = scv.read("cellranger_output.loom", cache=True)
# Option B: Velocyto-loom mit Scanpy-verarbeitetem AnnData zusammenführen
adata_processed = sc.read_h5ad("processed.h5ad") # Hat UMAP, Cluster
adata_velocity = scv.read("velocyto.loom")
adata = scv.utils.merge(adata_processed, adata_velocity)
# Schichten überprüfen
print(adata)
# obs × var: N × G
# layers: 'spliced', 'unspliced' (erforderlich)
# obsm['X_umap'] (erforderlich für die Visualisierung)
2. Vorverarbeitung
# Filtern und normalisieren. Seit scVelo 0.3 filtert filter_and_normalize() nur
# Gene und normalisiert pro Zelle – es nimmt kein n_top_genes mehr und
# log-transformiert nicht mehr, daher kommen der log-Schritt und die HVG-Auswahl von Scanpy.
scv.pp.filter_and_normalize(
adata,
min_shared_counts=20 # Mindestanzahl an Counts in gespleißt+ungespleißt
)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000, subset=True)
# Momente erster und zweiter Ordnung berechnen (Mittelwerte und Varianzen)
# knn_connectivities müssen zuerst berechnet werden
sc.pp.neighbors(adata, n_neighbors=30, n_pcs=30)
scv.pp.moments(
adata,
n_pcs=30,
n_neighbors=30
)
3. Geschwindigkeitsschätzung — Stochastisches Modell
Das stochastische Modell ist schnell und geeignet für explorative Analysen:
# Stochastische Geschwindigkeit (schneller, weniger genau)
scv.tl.velocity(adata, mode='stochastic')
scv.tl.velocity_graph(adata)
# Visualisieren
scv.pl.velocity_embedding_stream(
adata,
basis='umap',
color='leiden',
title="RNA-Geschwindigkeit (Stochastisch)"
)
4. Geschwindigkeitsschätzung — Dynamisches Modell (Empfohlen)
Das dynamische Modell passt die vollständige Spleißkinetik an und ist genauer:
# Dynamik wiederherstellen (rechenintensiv; ~10-30 Min. für 10K Zellen)
scv.tl.recover_dynamics(adata, n_jobs=4)
# Geschwindigkeit aus dem dynamischen Modell berechnen
scv.tl.velocity(adata, mode='dynamical')
scv.tl.velocity_graph(adata)
5. Latente Zeit
Das dynamische Modell ermöglicht die Berechnung einer gemeinsamen latenten Zeit (Pseudozeit):
# Latente Zeit berechnen
scv.tl.latent_time(adata)
# Latente Zeit auf UMAP visualisieren
scv.pl.scatter(
adata,
color='latent_time',
color_map='gnuplot',
size=80,
title='Latente Zeit'
)
# Top-Gene identifizieren, geordnet nach latenter Zeit
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. Treibergen-Analyse
# Gene mit der höchsten Geschwindigkeitsanpassung identifizieren
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))
# Geschwindigkeit und Kohärenz
scv.tl.velocity_confidence(adata)
scv.pl.scatter(
adata,
c=['velocity_length', 'velocity_confidence'],
cmap='coolwarm',
perc=[5, 95]
)
# Phasenporträts für bestimmte Gene
scv.pl.velocity(adata, ['Cpe', 'Gnao1', 'Ins2'],
ncols=3, figsize=(16, 4))
7. Geschwindigkeitspfeile und Pseudozeit
# Pfeilplot auf UMAP
scv.pl.velocity_embedding(
adata,
arrow_length=3,
arrow_size=2,
color='leiden',
basis='umap'
)
# Stromlinienplot (sauberere Visualisierung)
scv.pl.velocity_embedding_stream(
adata,
basis='umap',
color='leiden',
smooth=0.8,
min_mass=4
)
# Geschwindigkeits-Pseudozeit (Alternative zur latenten Zeit)
scv.tl.velocity_pseudotime(adata)
scv.pl.scatter(adata, color='velocity_pseudotime', cmap='gnuplot')
8. PAGA-Trajektoriengraph
# PAGA-Graph mit geschwindigkeitsinformierten Übergängen
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}')
# PAGA mit Geschwindigkeit plotten
scv.pl.paga(
adata,
basis='umap',
size=50,
alpha=0.1,
min_edge_width=2,
node_size_scale=1.5
)
Vollständiges Workflow-Skript
import scvelo as scv
import scanpy as sc
def run_rna_velocity(adata, n_top_genes=2000, mode='dynamical', n_jobs=4):
"""
Vollständiger RNA-Geschwindigkeits-Workflow.
Args:
adata: AnnData mit 'spliced'- und 'unspliced'-Schichten, UMAP in obsm
n_top_genes: Anzahl der Top-HVGs für die Geschwindigkeit
mode: 'stochastic' (schnell) oder 'dynamical' (genau)
n_jobs: Parallele Jobs für das dynamische Modell
Returns:
Verarbeitetes AnnData mit Geschwindigkeitsinformationen
"""
scv.settings.verbosity = 2
# 1. Vorverarbeitung (scVelo 0.3 hat log/HVG aus filter_and_normalize entfernt)
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. Geschwindigkeitsschätzung
if mode == 'dynamical':
scv.tl.recover_dynamics(adata, n_jobs=n_jobs)
scv.tl.velocity(adata, mode=mode)
scv.tl.velocity_graph(adata)
# 3. Nachgelagerte Analysen
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
Wichtige Ausgabefelder in AnnData
Nach Ausführung des Workflows werden die folgenden Felder hinzugefügt:
| Ort | Schlüssel | Beschreibung |
|---|---|---|
adata.layers | velocity | RNA-Geschwindigkeit pro Gen pro Zelle |
adata.layers | fit_t | Angepasste latente Zeit pro Gen pro Zelle |
adata.obsm | velocity_umap | 2D-Geschwindigkeitsvektoren auf UMAP |
adata.obs | velocity_pseudotime | Pseudozeit aus der Geschwindigkeit |
adata.obs | latent_time | Latente Zeit aus dem dynamischen Modell |
adata.obs | velocity_length | Geschwindigkeit jeder Zelle |
adata.obs | velocity_confidence | Konfidenzwert pro Zelle |
adata.var | fit_likelihood | Güte der Modellanpassung auf Genebene |
adata.var | fit_alpha | Transkriptionsrate |
adata.var | fit_beta | Spleißrate |
adata.var | fit_gamma | Abbaurate |
adata.uns | velocity_graph | Zell-Zell-Übergangswahrscheinlichkeitsmatrix |
Vergleich der Geschwindigkeitsmodelle
| Modell | Geschwindigkeit | Genauigkeit | Wann verwenden |
|---|---|---|---|
stochastic | Schnell | Mittel | Explorative Analyse; große Datensätze |
deterministic | Mittel | Mittel | Einfache lineare Kinetik |
dynamical | Langsam | Hoch | Publikationsqualität; identifiziert Treibergene |
Best Practices
- Beginnen Sie mit dem stochastischen Modus zur Exploration; wechseln Sie für die finale Analyse zum dynamischen Modell
- Benötigen gute Abdeckung der ungespleißten Reads: Kurze Reads (< 100 bp) können die Intronabdeckung verpassen
- Mindestens 2.000 Zellen: RNA-Geschwindigkeit ist bei weniger Zellen verrauscht
- Die Geschwindigkeit sollte kohärent sein: Pfeile sollten der bekannten Biologie folgen; Zufälligkeit weist auf Probleme hin
- k-NN-Bandbreite ist wichtig: Zu wenige Nachbarn → verrauschte Geschwindigkeit; zu viele → überglättet
- Plausibilitätsprüfung: Wurzelzellen (Vorläufer) sollten hohe ungespleißte/gespleißte Verhältnisse für Markergene aufweisen
- Das dynamische Modell erfordert verschiedene kinetische Zustände: Funktioniert am besten für klare Differenzierungsprozesse
Fehlerbehebung
| Problem | Lösung |
|---|---|
| Fehlende ungespleißte Schicht | Führen Sie velocyto erneut aus oder verwenden Sie STARsolo mit --soloFeatures Gene Velocyto |
| Sehr wenige Geschwindigkeitsgene | Verringern Sie min_shared_counts; überprüfen Sie die Sequenziertiefe |
| Zufällig aussehende Pfeile | Versuchen Sie andere n_neighbors oder ein anderes Geschwindigkeitsmodell |
| Speicherfehler bei dynamischem Modell | Setzen Sie n_jobs=1; reduzieren Sie n_top_genes |
| Negative Geschwindigkeit überall | Überprüfen Sie, ob die gespleißten/ungespleißten Schichten nicht vertauscht sind |
Zusätzliche Ressourcen
- scVelo-Dokumentation: https://scvelo.readthedocs.io/
- Tutorial-Notebooks: https://scvelo.readthedocs.io/tutorials/
- GitHub: https://github.com/theislab/scvelo
- Paper: Bergen V et al. (2020) Nature Biotechnology. PMID: 32747759
- velocyto (Vorverarbeitung): http://velocyto.org/
- CellRank (Schicksalsvorhersage, erweitert scVelo): https://cellrank.readthedocs.io/
- dynamo (Alternative zur metabolischen Markierung): https://dynamo-release.readthedocs.io/