scVelo — RNA速度解析 は何をしますか?
概要
scVeloは、シングルセルRNA-seqデータにおけるRNA速度解析のための主要なPythonパッケージです。スプライシングされていない(pre-mRNA)とスプライシングされた(成熟mRNA)の存在比を用いてmRNAスプライシングの動態をモデル化し、各細胞で遺伝子がアップレギュレーションされているかダウンレギュレーションされているかを判定することで、細胞状態遷移を推論します。これにより、時間経過データを必要とせずに発生軌道の再構築や細胞運命決定の特定が可能になります。
インストール: uv pip install scvelo
主要リソース:
- ドキュメント: https://scvelo.readthedocs.io/
- GitHub: https://github.com/theislab/scvelo
- 論文: Bergen et al. (2020) Nature Biotechnology. PMID: 32747759
このスキルを使用すべき場合
scVeloは以下のような場合に使用します:
- スナップショットデータからの軌道推論: 細胞がどの方向に分化しているかを判定する
- 細胞運命予測: 前駆細胞とその下流の運命を特定する
- ドライバー遺伝子の同定: 観測された軌道を最もよく説明する動態を持つ遺伝子を見つける
- 発生生物学: 造血、神経発生、上皮間葉転換をモデル化する
- 潜在時間推定: スプライシング動態に基づく擬時間に沿って細胞を順序付ける
- Scanpyの補完: UMAP埋め込みに方向情報を追加する
前提条件
scVeloには、Unspliced(未スプライシング)とSpliced(スプライシング済み)両方のRNAのカウント行列が必要です。これらは以下によって生成されます:
- STARsolo または kallisto|bustools(
lamannoモード) - velocyto CLI:
velocyto run10x/velocyto run - alevin-fry / simpleaf(Spliced/Unspliced出力)
データは layers["spliced"] と layers["unspliced"] を含む AnnData オブジェクトに格納されます。
標準的なRNA速度ワークフロー
1. セットアップとデータ読み込み
import scvelo as scv
import scanpy as sc
import numpy as np
import matplotlib.pyplot as plt
# 設定の構成
scv.settings.verbosity = 3 # 計算手順を表示
scv.settings.presenter_view = True
scv.settings.set_figure_params('scvelo')
# データの読み込み(Spliced/Unsplicedレイヤーを持つAnnData)
# オプションA: loomファイルから読み込み(velocyto出力)
adata = scv.read("cellranger_output.loom", cache=True)
# オプションB: velocytoのloomとScanpyで処理済みのAnnDataをマージ
adata_processed = sc.read_h5ad("processed.h5ad") # UMAP、クラスタあり
adata_velocity = scv.read("velocyto.loom")
adata = scv.utils.merge(adata_processed, adata_velocity)
# レイヤーの確認
print(adata)
# obs × var: N × G
# layers: 'spliced', 'unspliced' (必須)
# obsm['X_umap'] (可視化に必須)
2. 前処理
# フィルタリングと正規化。scVelo 0.3以降、filter_and_normalize()は
# 遺伝子のフィルタリングと細胞ごとの正規化のみを行い、n_top_genesや
# 対数変換は行わないため、対数変換とHVG選択はScanpyで行います。
scv.pp.filter_and_normalize(
adata,
min_shared_counts=20 # Spliced+Unsplicedの最小カウント数
)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000, subset=True)
# 一次および二次モーメント(平均と分散)の計算
# knn_connectivitiesを先に計算する必要があります
sc.pp.neighbors(adata, n_neighbors=30, n_pcs=30)
scv.pp.moments(
adata,
n_pcs=30,
n_neighbors=30
)
3. 速度推定 — 確率的モデル
確率的モデルは高速で、探索的分析に適しています:
# 確率的速度(高速、精度は低い)
scv.tl.velocity(adata, mode='stochastic')
scv.tl.velocity_graph(adata)
# 可視化
scv.pl.velocity_embedding_stream(
adata,
basis='umap',
color='leiden',
title="RNA Velocity (Stochastic)"
)
4. 速度推定 — 動的モデル(推奨)
動的モデルは完全なスプライシング動態を適合させ、より高精度です:
# 動態の復元(計算負荷が高い;10K細胞で約10~30分)
scv.tl.recover_dynamics(adata, n_jobs=4)
# 動的モデルからの速度計算
scv.tl.velocity(adata, mode='dynamical')
scv.tl.velocity_graph(adata)
5. 潜在時間
動的モデルにより、共有された潜在時間(擬時間)の計算が可能になります:
# 潜在時間の計算
scv.tl.latent_time(adata)
# UMAP上に潜在時間を可視化
scv.pl.scatter(
adata,
color='latent_time',
color_map='gnuplot',
size=80,
title='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. ドライバー遺伝子解析
# 速度適合度が最も高い遺伝子の特定
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))
# 速度と一貫性
scv.tl.velocity_confidence(adata)
scv.pl.scatter(
adata,
c=['velocity_length', 'velocity_confidence'],
cmap='coolwarm',
perc=[5, 95]
)
# 特定遺伝子のフェーズポートレート
scv.pl.velocity(adata, ['Cpe', 'Gnao1', 'Ins2'],
ncols=3, figsize=(16, 4))
7. 速度矢印と擬時間
# UMAP上の矢印プロット
scv.pl.velocity_embedding(
adata,
arrow_length=3,
arrow_size=2,
color='leiden',
basis='umap'
)
# ストリームプロット(よりクリーンな可視化)
scv.pl.velocity_embedding_stream(
adata,
basis='umap',
color='leiden',
smooth=0.8,
min_mass=4
)
# 速度擬時間(潜在時間の代替)
scv.tl.velocity_pseudotime(adata)
scv.pl.scatter(adata, color='velocity_pseudotime', cmap='gnuplot')
8. PAGA軌道グラフ
# 速度情報に基づくPAGAグラフ
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のプロット
scv.pl.paga(
adata,
basis='umap',
size=50,
alpha=0.1,
min_edge_width=2,
node_size_scale=1.5
)
完全なワークフロースクリプト
import scvelo as scv
import scanpy as sc
def run_rna_velocity(adata, n_top_genes=2000, mode='dynamical', n_jobs=4):
"""
完全なRNA速度ワークフロー。
Args:
adata: 'spliced' および 'unspliced' レイヤー、obsmにUMAPを持つAnnData
n_top_genes: 速度に使用する上位HVGの数
mode: 'stochastic'(高速)または 'dynamical'(高精度)
n_jobs: 動的モデル用の並列ジョブ数
Returns:
速度情報が追加された処理済みAnnData
"""
scv.settings.verbosity = 2
# 1. 前処理(scVelo 0.3ではfilter_and_normalizeから対数変換とHVG選択が削除されました)
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. 速度推定
if mode == 'dynamical':
scv.tl.recover_dynamics(adata, n_jobs=n_jobs)
scv.tl.velocity(adata, mode=mode)
scv.tl.velocity_graph(adata)
# 3. 下流解析
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
AnnDataの主要出力フィールド
ワークフロー実行後、以下のフィールドが追加されます:
| 場所 | キー | 説明 |
|---|---|---|
adata.layers | velocity | 細胞ごと・遺伝子ごとのRNA速度 |
adata.layers | fit_t | 細胞ごと・遺伝子ごとの適合潜在時間 |
adata.obsm | velocity_umap | UMAP上の2D速度ベクトル |
adata.obs | velocity_pseudotime | 速度からの擬時間 |
adata.obs | latent_time | 動的モデルからの潜在時間 |
adata.obs | velocity_length | 各細胞の速度 |
adata.obs | velocity_confidence | 各細胞の信頼度スコア |
adata.var | fit_likelihood | 遺伝子レベルのモデル適合品質 |
adata.var | fit_alpha | 転写速度 |
adata.var | fit_beta | スプライシング速度 |
adata.var | fit_gamma | 分解速度 |
adata.uns | velocity_graph | 細胞間遷移確率行列 |
速度モデルの比較
| モデル | 速度 | 精度 | 使用すべき状況 |
|---|---|---|---|
stochastic | 高速 | 中程度 | 探索的分析;大規模データセット |
deterministic | 中程度 | 中程度 | 単純な線形動態 |
dynamical | 低速 | 高 | 出版品質;ドライバー遺伝子の特定 |
ベストプラクティス
- 探索的には確率的モードから開始し、最終解析では動的モデルに切り替える
- Unsplicedリードの十分なカバレッジが必要:短いリード(< 100 bp)ではイントロンカバレッジが不足する可能性あり
- 最低2,000細胞:RNA速度は細胞数が少ないとノイズが多くなる
- 速度は一貫しているべき:矢印は既知の生物学に従うべきで、ランダム性は問題を示す
- k-NN帯域幅に注意:近傍数が少なすぎるとノイズの多い速度、多すぎると過度に平滑化される
- 健全性チェック:ルート細胞(前駆細胞)はマーカー遺伝子に対して高いUnspliced/Spliced比を示すべき
- 動的モデルには異なる動態状態が必要:明確な分化プロセスに最も適している
トラブルシューティング
| 問題 | 解決策 |
|---|---|
| Unsplicedレイヤーがない | velocytoを再実行するか、--soloFeatures Gene Velocyto 付きでSTARsoloを使用する |
| 速度遺伝子が非常に少ない | min_shared_counts を下げる;シーケンシング深度を確認する |
| 矢印がランダムに見える | 異なる n_neighbors または速度モデルを試す |
| 動的モデルでメモリエラー | n_jobs=1 に設定;n_top_genes を減らす |
| どこでも負の速度 | Spliced/Unsplicedレイヤーが入れ替わっていないか確認する |
追加リソース
- scVeloドキュメント: https://scvelo.readthedocs.io/
- チュートリアルノートブック: https://scvelo.readthedocs.io/tutorials/
- GitHub: https://github.com/theislab/scvelo
- 論文: Bergen V et al. (2020) Nature Biotechnology. PMID: 32747759
- velocyto(前処理): http://velocyto.org/
- CellRank(運命予測、scVeloを拡張): https://cellrank.readthedocs.io/
- dynamo(代謝ラベリングの代替): https://dynamo-release.readthedocs.io/