scRNA-seq解析:RNA velocity と運命予測 ― spliced/unspliced から方向を推定する

scRNA-seq

📚 この記事について:「scRNA-seq解析 実践シリーズ」下流解析編。未スプライス(新規転写)と成熟 mRNA の比から細胞の方向を推定する RNA velocity(scVelo)と、それを統合して運命を出す CellRank を解説します。velocity の重大な注意点も明記します。

🔙 前の記事軌道推定・擬似時間(trajectory) / 🔜 次の記事細胞間相互作用

🧩 前提spliced / unspliced カウントが用意できること(後述)。アノテーション済みデータ。Python の基本。


この記事のゴール

RNA velocity の原理scVelo の使い方CellRank による運命予測を理解し、同時に velocity の限界と検証の必要性を押さえること。


RNA velocity の原理

新しく転写された mRNA は、まずイントロンを含む未スプライス(unspliced, u)として現れ、スプライシングを経て成熟 mRNA(spliced, s)になり、やがて分解されます。u は s より先に動くため、両者の比から「その遺伝子がこれから増えるのか減るのか」を推定できます。これを全遺伝子で束ねると、各細胞の方向ベクトル(velocity)が得られます。

RNA velocity の原理。未スプライス mRNA(u, イントロンあり・新規転写)はスプライシングで成熟 mRNA(s)になり分解される。u が成熟より多ければ遺伝子はこれから増える(誘導中)、少なければ減る(抑制中)。全遺伝子の u/s から各細胞の方向ベクトルを求め、UMAP 上の流れとして可視化する。
RNA velocity の原理。未スプライス mRNA(u, イントロンあり・新規転写)はスプライシングで成熟 mRNA(s)になり分解される。u が成熟より多ければ遺伝子はこれから増える(誘導中)、少なければ減る(抑制中)。全遺伝子の u/s から各細胞の方向ベクトルを求め、UMAP 上の流れとして可視化する。

scVelo の3モデル

scVelo には velocity 推定のモデルが3つあります。

  • steady-state(定常状態):最も単純。定常を仮定して u–s の関係から推定(velocyto 由来)。
  • stochastic(確率的):分布の二次モーメントも使い、steady-state を改良。
  • dynamical(動的):遺伝子ごとに転写・スプライス・分解の動態を当てはめる。最も表現力が高く推奨(ただし計算は重い)。

入力の準備(spliced / unspliced)

RNA velocity には、通常のカウントとは別に spliced / unspliced のカウント行列が要ります。代表的な作り方は、velocytokallisto|bustoolsSTARsolo のいずれかで、リードをスプライス状態ごとに数える方法です。出力(loom など)を AnnDatalayers["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 cellrankrecover_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)に進みます。


関連記事


参考文献

  • 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

コメント

タイトルとURLをコピーしました