この記事のゴール
RNA velocity の原理と scVelo の使い方、CellRank による運命予測を理解し、同時に velocity の限界と検証の必要性を押さえること。
RNA velocity の原理
新しく転写された mRNA は、まずイントロンを含む未スプライス(unspliced, u)として現れ、スプライシングを経て成熟 mRNA(spliced, s)になり、やがて分解されます。u は s より先に動くため、両者の比から「その遺伝子がこれから増えるのか減るのか」を推定できます。これを全遺伝子で束ねると、各細胞の方向ベクトル(velocity)が得られます。
scVelo の3モデル
scVelo には velocity 推定のモデルが3つあります。
- steady-state(定常状態):最も単純。定常を仮定して u–s の関係から推定(velocyto 由来)。
- stochastic(確率的):分布の二次モーメントも使い、steady-state を改良。
- dynamical(動的):遺伝子ごとに転写・スプライス・分解の動態を当てはめる。最も表現力が高く推奨(ただし計算は重い)。
入力の準備(spliced / unspliced)
RNA velocity には、通常のカウントとは別に spliced / unspliced のカウント行列が要ります。代表的な作り方は、velocyto・kallisto|bustools・STARsolo のいずれかで、リードをスプライス状態ごとに数える方法です。出力(loom など)を AnnData の layers["spliced"] / layers["unspliced"] として読み込みます。
順序も得られる ― RNA velocity から擬似時間(latent time)
ここまでは「方向」の話でしたが、同じ spliced/unspliced データと dynamical モデルから、順序(擬似時間)も得られます。scVelo の latent time は、細胞の「内部時計」を表す擬似時間で、転写動態だけに基づいて実時間を近似します。
軌道推定編の DPT との大きな違いは、起点の扱いです。DPT は根(起点)を手動で指定する必要がありましたが、latent time は velocity の向きから根を暗に推定します。つまり、起点が不明でも順序を付けられるのが実践上の強みです。
pythonimport scvelo as scv
# dynamical モデルの推定後(recover_dynamics 済み)に擬似時間(latent time)を計算
scv.tl.latent_time(adata)
adata.obs["latent_time"] # 細胞ごとの順序(0→1)
scv.pl.scatter(adata, color="latent_time", color_map="gnuplot")
💡 「方向」と「順序」は地続き
latent time は、velocity(方向)の情報を使って順序を付けたものです。全体像記事の「順序(擬時間)→ 方向(velocity)」の関係そのもので、velocity データは方向にも順序にも使えます。なお、類似性ベースの順序(PAGA/DPT/Palantir)は「軌道推定・擬似時間」の記事を参照してください。
⚠️ latent time も仮定に依存する
latent time も velocity と同じ仮定の上に立ちます。根の割り当てを誤ると順序が反転することがあります。既知のマーカー・既知の系統で向きを必ず確認してください(反転していれば、起点の指定や別手法での裏取りを)。
CellRank で運命へ
velocity は「方向」を出しますが、「どこへ行き着くか(運命)」までは出しません。全体像記事のとおり、CellRank が velocity をカーネルとして受け取り、Markov 連鎖から終着状態・運命確率を推定します。
コード(scVelo + CellRank)
pythonimport scvelo as scv
import cellrank as cr
# 前提:adata の layers に spliced / unspliced(velocyto 等で取得)
scv.pp.filter_and_normalize(adata, min_shared_counts=20, n_top_genes=2000)
scv.pp.moments(adata, n_pcs=30, n_neighbors=30)
# dynamical モデル(推奨)で velocity を推定
scv.tl.recover_dynamics(adata, n_jobs=8)
scv.tl.velocity(adata, mode="dynamical")
scv.tl.velocity_graph(adata)
scv.pl.velocity_embedding_stream(adata, basis="umap") # 方向の流れを可視化
# CellRank:velocity をカーネルに → 終着状態・運命確率
from cellrank.kernels import VelocityKernel
vk = VelocityKernel(adata).compute_transition_matrix()
from cellrank.estimators import GPCCA
g = GPCCA(vk)
g.fit(cluster_key="cell_type")
g.predict_terminal_states()
g.compute_fate_probabilities()
🔧 環境メモ:pip install scvelo cellrank。recover_dynamics(dynamical)は重いので n_jobs を活用。CellRank の API(kernels / estimators)はバージョンで変わるため公式チュートリアル参照。GPU は必須ではありません。
重大な注意 ― velocity は外れることがある
⚠️ 方向が逆になることもある
RNA velocity はモデルの仮定(転写・スプライス・分解の速度が一定など)に依存します。仮定が破れると、推定された方向が実際と逆になることがあります(成熟した細胞、複雑・バースト的なキネティクス、定常から外れた系など)。実際、velocity 由来の運命が既知の系統と矛盾する例が報告されています。
– 必ず既知のマーカー・既知の系統で方向を検証する。
– velocity が信頼できないときは、CellRank の PseudotimeKernel / CytoTRACEKernel など velocity に依存しないカーネルへ切り替える(CellRank 2)。
– 入力(spliced/unspliced の定量)の質も結果を大きく左右する。
ツール早見表
| ツール | 言語 | 役割 | ひとこと |
|---|---|---|---|
| scVelo | Python | velocity 推定 | dynamical モデルが推奨(本記事) |
| velocyto | Python/CLI | spliced/unspliced 定量・steady-state | 入力作成にも使う |
| veloVI | Python | 深層生成モデルで velocity | 不確実性も推定 |
| dynamo | Python | ベクトル場・代謝ラベル統合 | 速度場の解析を拡張 |
| CellRank | Python | 運命予測(カーネル統合) | velocity 以外のカーネルも(本記事) |
落とし穴
⚠️ つまずきやすい点
– 仮定への依存:方向が外れうる。既知の系統で必ず検証。
– 入力の質:spliced/unspliced の定量法(velocyto/kallisto|bustools/STARsolo)で結果が変わる。
– dynamical は重い:大規模データでは計算資源と時間に注意。
– velocity ≠ 運命:方向だけでは終着は決まらない。運命は CellRank で。
– 前段の品質依存:QC・統合・アノテーションが崩れると velocity も崩れる。
– 過信しない:複数の根拠(擬時間・マーカー・既知の生物学)と突き合わせる。
まとめ
- RNA velocity は u(未スプライス)と s(成熟)の比から各細胞の方向を推定する。scVelo の dynamical モデルが推奨。
- 入力に spliced / unspliced カウントが必要(velocyto / kallisto|bustools / STARsolo)。
- 同じデータから順序も得られる:dynamical モデルの latent time は、根を手で指定せず(velocity の向きから暗に推定)順序を付けられる。velocity データは方向にも順序にも使える。
- 「方向」から「運命(終着状態・運命確率)」へは CellRank で統合する。
- velocity は仮定に依存し外れることがある。既知の系統で検証し、怪しければ velocity 非依存のカーネルへ。
次の記事:細胞間相互作用 — リガンド–受容体から細胞どうしのシグナリングを推定する方法(LIANA / CellPhoneDB)に進みます。
関連記事
- 📖 軌道・擬時間と RNA velocity の全体像:順序・方向・運命の関係
- 📖 軌道推定・擬似時間(trajectory):類似性ベースの順序(本記事の前段)
- 📖 下流解析の全体像:下流解析全体の地図
参考文献
- La Manno, G., Soldatov, R., Zeisel, A., et al. (2018). RNA velocity of single cells. Nature, 560, 494–498. doi:10.1038/s41586-018-0414-6
- Bergen, V., Lange, M., Peidli, S., Wolf, F. A., & Theis, F. J. (2020). Generalizing RNA velocity to transient cell states through dynamical modeling. Nature Biotechnology, 38, 1408–1414. doi:10.1038/s41587-020-0591-3
- Bergen, V., Soldatov, R. A., Kharchenko, P. V., & Theis, F. J. (2021). RNA velocity—current challenges and future perspectives. Molecular Systems Biology, 17, e10282. doi:10.15252/msb.202110282
- Gorin, G., Fang, M., Chari, T., & Pachter, L. (2022). RNA velocity unraveled. PLOS Computational Biology, 18, e1010492. doi:10.1371/journal.pcbi.1010492
- Gayoso, A., Weiler, P., Lotfollahi, M., et al. (2024). Deep generative modeling of transcriptional dynamics for RNA velocity analysis in single cells. Nature Methods, 21, 50–59. doi:10.1038/s41592-023-01994-w
- Lange, M., Bergen, V., Klein, M., et al. (2022). CellRank for directed single-cell fate mapping. Nature Methods, 19, 159–170. doi:10.1038/s41592-021-01346-6
- Weiler, P., Lange, M., Klein, M., Pe’er, D., & Theis, F. J. (2024). CellRank 2: unified fate mapping in multiview single-cell data. Nature Methods, 21, 1196–1205. doi:10.1038/s41592-024-02303-9


コメント