シーケンス型 空間トランスクリプトーム 前処理の全体像 ─ 読み込みからクラスタリングまで

Spatial transcriptome
📚 この記事について
シーケンス型の前処理を、順番と理由の両方から通しで説明します。scRNA-seq の手順がそのまま使えるところと、持ち込むと壊れるところを、はっきり分けます。個別の手順は、ここから各記事へ分かれます。
🔙 前の記事シーケンス型 空間トランスクリプトーム解析の全体像
🔜 次の記事:シーケンス型 空間トランスクリプトーム:データ読み込みとデータ構造
📌 前提scRNA-seqの前処理 入門AnnData のデータ構造

空間トランスクリプトーム解析(spatial transcriptomics)のうちシーケンス型(Visium・Stereo-seq など NGS で読み出す方式)は、前処理の段階から scRNA-seq とは別の判断を求められます。指標も関数もほとんど同じものを使うのに、途中で2か所だけ、scRNA-seq の手順をそのまま持ち込むと結果が壊れる場所があります。この記事では、前処理の全体を順番に追いながら、その2か所がどこで、なぜそうなるのかを説明します。

1. 前処理のゴール


前処理のゴールは、下流解析に渡せる「解析単位 × 遺伝子」のカウント行列を1つ作ることです。

scRNA-seq なら、この行列は「細胞 × 遺伝子」で、行が何を指すかは考えるまでもありません。シーケンス型では違います。行が何を指すか(55 µm のスポットか、8 µm のビンか、再構成した細胞か)は、自分で決めるものです。ここが最初の分かれ道になります。

2. 前処理の順番と、その順番でなければならない理由


図:前処理の順番と、その順番でなければならない理由
図:前処理の順番と、その順番でなければならない理由

7つの手順のうち、3(解析単位の決定)と 6(正規化)だけが、scRNA-seq の常識をそのまま当てはめると失敗します。残りはほぼ同じ考え方で通ります。以下、順に見ていきます。

3. 手順1 ─ 読み込みとデータ構造


Space Ranger(Visium 系)や SAW(Stereo-seq)が出力したファイル群を、SpatialData(Marconato et al., Nature Methods, 2025)に読み込みます。SpatialData は、発現行列・組織画像・フィーチャの輪郭を同じ座標系の上にそろえて保持する枠組みです。

図:SpatialData の中身 ─ 何がどこに入るか
図:SpatialData の中身 ─ 何がどこに入るか
python
import spatialdata_io as sdio
import squidpy as sq

sdata = sdio.visium_hd("data/visium_hd_run")

# 何がどこに入っているかを確認する
print(list(sdata))   # ['square_002um', 'square_008um', 'square_016um']
print(list(sdata.images))   # CytAssist 画像・顕微鏡画像
print(list(sdata.shapes))   # 各ビンの正方形
print(sdata.coordinate_systems)  # 共通座標系
💡 共通座標系がなぜ効くのか
画像と発現が同じ座標に載っていると、「H&E 画像の上で、どのフィーチャが組織の中にあるか」を判定できます(手順2)。また「核染色画像で核を見つけ、その核の中に入るビンを1細胞にまとめる」ことができます(手順3)。座標をそろえる作業を自前でやらずに済むのが、SpatialData を使う最大の理由です。

4. 手順2 ─ 組織検出


捕捉基板は組織より広いので、組織が載っていない場所のフィーチャも出力されます。これを先に外さないと、QC の分布が「ほぼ空のフィーチャ」に引っ張られ、閾値の判断ができなくなります。

組織検出は Space Ranger や SAW が自動で行いますが、組織の縁、切片の折れ込み、気泡、色の薄い領域では誤ることがあります。必ず画像に重ねて目で確認してください。自動判定が組織の一部を落としている場合は、手動でマスクを修正します。

5. 手順3 ─ 解析単位の決定(最初の落とし所)


ここが1つめの「scRNA-seq の手順が通じない場所」です。解析単位は QC より先に決めなければなりません

⚠️ 2 µm ビンのまま QC すると、ほぼ全部が落ちる
Visium HD の 2 µm ビンは、1個あたりのカウントが極端に少なくなります。細胞1つ分のRNAが、何十個ものビンに分散するからです。この状態で scRNA-seq の感覚で「総カウントが少ないものを除く」と実行すると、これから細胞に組み立てるはずのビンを、組み立てる前に捨ててしまいます。QC は、最終的に使う解析単位の上で行ってください。
プラットフォーム 選べる解析単位 実務上の出発点
Visium v1 / v2 55 µm スポットのみ スポットのまま
Visium HD 2 / 8 / 16 µm ビン、または細胞 8 µm ビンで全体像を見る
Curio Seeker 10 µm ビーズのみ ビーズのまま
Stereo-seq bin1〜bin200、または cellbin bin50 で全体像を見る

bin20 は 10 µm × 10 µm で、哺乳類の細胞とほぼ同じ大きさです。STOmics は、bin20 あたりの遺伝子数の中央値が 200 を超え、かつ核染色画像の品質が良いときに、細胞単位(cellbin)での解析を勧めています。カウントが足りなければ bin50 や bin100 に下げます。細胞単位への再構成は、Visium HD なら bin2cell(Polański et al., Bioinformatics, 2024)が担当します。

6. 手順4 ─ QC は、指標は同じ、解釈が違う


計算する指標は scRNA-seq の QCと同じです。総カウント、検出遺伝子数、ミトコンドリア率。関数もそのまま使えます。違うのは、その数字をどう読むかです。

python
import scanpy as sc
import numpy as np

# 解析単位を決めてから QC する(ここでは 8 µm ビン)
adata = sdata["square_008um"].copy()

# 指標の計算は scRNA-seq と同じ
adata.var["mt"] = adata.var_names.str.startswith("MT-")
sc.pp.calculate_qc_metrics(adata, qc_vars=["mt"], inplace=True, log1p=False)

# 違うのはここから。必ず空間の上で見る
sq.pl.spatial_scatter(
    adata,
    color=["total_counts", "n_genes_by_counts", "pct_counts_mt"],
    shape=None, size=1,
)

# 分布を見てから閾値を決める(先に決めない)
print(np.percentile(adata.obs["total_counts"], [1, 5, 25, 50, 75]))
  • フィーチャは細胞ではない。「低カウント=壊れた細胞」という読み替えができない。
  • 低カウントの領域が、生物学的に正しいことがある。脂肪組織、壊死巣、線維化した領域、軟骨、白質などは、もともと細胞密度も RNA 量も少ない。
  • ミトコンドリア率が高いのが正常な組織がある。心筋、肝、褐色脂肪など。組織を見ずに「20% 以上を除く」と決めると、心筋細胞をまるごと消すことになる。
  • 技術由来の空間的な勾配がある。透過処理のムラ、切片の端、スライドの位置による差。これは生物学ではないので、空間プロットで見分ける。
⚠️ 閾値を先に決めない
scRNA-seq の感覚で「総カウント 500 未満を除く」と機械的に設定すると、自分が組織のどの領域を捨てたのかが分からなくなります。必ず空間プロットで低カウント領域の位置を確認し、それが組織学的に説明できるかを見てから閾値を決めてください。説明できるなら、それは残すべきデータです。

7. 手順5 ─ 捨ててよいもの、捨ててはいけないもの


遺伝子側は迷う必要がありません。どのフィーチャでも検出されない遺伝子は落として構いません。問題はフィーチャ側です。

python
# 遺伝子側:どのフィーチャでも 0 の遺伝子は落としてよい
sc.pp.filter_genes(adata, min_cells=10)

# フィーチャ側:閾値は空間プロットを見てから。組織学的に説明できるかを確認する
keep = adata.obs["total_counts"] >= 100
print("除外されるフィーチャの割合:", 1 - keep.mean())
adata = adata[keep].copy()

フィーチャを落とすときは、必ず「落とした結果、組織のどこが欠けたか」を空間プロットで確認してください。組織の一部が丸ごと消えているなら、それは技術的な不良ではなく生物学的な特徴を消してしまった可能性があります。

8. 手順6 ─ 正規化(2つめの落とし所)


ここが2つめの、そして最も重要な「scRNA-seq の手順が通じない場所」です。

scRNA-seq では、総カウント(ライブラリサイズ)の差は技術的なノイズだと考えます。同じ細胞型でも捕捉効率が違うだけなので、総カウントで割って揃えるのが正しい。シーケンス型では、この前提が成り立ちません。

図:総カウントは技術ノイズであると同時に、組織の情報でもある
図:総カウントは技術ノイズであると同時に、組織の情報でもある

1つのフィーチャに何個の細胞が入っているかは、組織の場所によって違います。細胞が密に詰まった腫瘍の領域ではカウントが多く、細胞のまばらな間質や白質では少ない。つまり総カウントそのものが、組織構造を反映した生物学的な信号です。これを技術ノイズとみなして割ってしまうと、組織構造の情報ごと消えます。

この問題は実際に測定されています。4つの空間技術・25検体を調べた研究(Bhuva et al., Genome Biology, 2024)では、ライブラリサイズが組織の領域と強く結びついていました。しかも、細胞数で割った「1細胞あたりの検出数」でさえ領域ごとに違い、腫瘍領域では1細胞あたりの検出数が高いという結果でした。細胞密度だけでは説明できない、領域固有の効果があるということです。

そして肝心なのは結果のほうです。同研究では、sctransform でライブラリサイズを明示的に補正すると、空間ドメイン同定の精度(ARI)がむしろ下がりました。グラフベースのクラスタリングでも、空間を考慮する手法でも、同じ傾向でした。著者らは「空間データはライブラリサイズを特別に補正すべきでない」と結論しています。

python
# 生のカウントを必ず取っておく。デコンボリューションはこれを使う
adata.layers["counts"] = adata.X.copy()

# 正規化は「クラスタリングと可視化のため」の工程だと割り切る
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
adata.layers["lognorm"] = adata.X.copy()

# 空間ドメインを見たいときは、正規化しない側とも比べる
# adata.X = adata.layers['counts'] に戻せるようにしておく
⚠️ デコンボリューションには生のカウントを渡す
cell2location(Kleshchevnikov et al., Nature Biotechnology, 2022)も RCTD(Cable et al., Nature Biotechnology, 2022)も、カウントの分布そのものを確率モデルで扱う手法です。1つのフィーチャに何個の細胞がいるかを推定するのが仕事なので、総カウントの大小はむしろ必要な情報です。正規化・対数変換した行列を渡すと、モデルの前提が崩れます。必ず生のカウントを渡してください。
💡 では正規化はいつするのか
正規化は「やる/やらない」の二択ではなく、目的ごとに選ぶ工程です。クラスタリングや可視化、遺伝子どうしの比較には、対数正規化した行列が要ります。一方、デコンボリューションには生のカウント、空間ドメイン同定には正規化しない選択肢も検討します。SpaNorm(Salim et al., Genome Biology, 2025)は、ライブラリサイズの効果と生物学的な効果を同時にモデル化して分離する、空間を考慮した正規化手法です。空間ドメイン同定や空間可変遺伝子の検出では、単一細胞向けの正規化より良い結果が報告されています。だからこそ、生のカウントは必ず layers に残してください。あとから選び直せます。

9. 手順7 ─ 特徴選択・次元削減・クラスタリング


ここから先は scRNA-seq の手順とほとんど同じです。高変動遺伝子を選び、PCA で次元を落とし、近傍グラフを作り、Leiden でクラスタリングする。

python
# ここから先は scRNA-seq とほぼ同じ。空間情報はまだ使わない
sc.pp.highly_variable_genes(adata, n_top_genes=2000, flavor="seurat")
sc.pp.pca(adata, n_comps=50)
sc.pp.neighbors(adata, n_neighbors=15)
sc.tl.leiden(adata, resolution=1.0, key_added="leiden")

# 発現だけで作ったクラスタを、空間の上に描いて確かめる
sq.pl.spatial_scatter(adata, color="leiden", shape=None)
# 組織構造と対応していれば、前処理は概ね成功している
💡 ここではまだ空間情報を使わない
この段階のクラスタリングは、発現だけを見ています。空間座標は使っていません。「空間データなのに空間を使わないのか」と思うかもしれませんが、これには理由があります。得られたクラスタを組織の上に描いたとき、それが組織構造と対応していれば、発現の情報だけで組織が読めているということです。これが前処理が成功したかどうかの確認になり、同時に、空間情報を組み込んだ手法(空間ドメイン同定)と比べるためのベースラインになります。最初から空間情報を入れてしまうと、この比較ができません。

10. 複数のスライスがある場合


切片が複数ある場合、切片間・スライド間・ロット間の差が出ます。透過処理の条件、RNA の品質、実験日。これらは HarmonyscVI で補正できます。scRNA-seq と同じ道具立てです。

⚠️ 座標系は共有されない
バッチ補正は発現の空間(PCA の潜在空間)で行われるもので、物理的な座標は揃いません。切片ごとに座標の原点も向きも違うからです。複数スライスを空間的に重ね合わせるには、スライス整列(registration)という別の工程が必要です。これは下流解析の話題なので、統合・3D の記事で扱います。

11. 前処理チェックリスト


  • 解析単位を決めてから QC したか(2 µm ビンのまま QC していないか)
  • 組織検出の結果を画像に重ねて確認したか
  • 低カウント領域の位置を空間プロットで見たか
  • その低カウントが組織学的に説明できるかを考えたか
  • ミトコンドリア率の閾値を、組織の種類を踏まえて決めたか
  • 生のカウントを layers[“counts”] に残したか
  • デコンボリューションに正規化済みの行列を渡していないか
  • 発現だけで作ったクラスタを、組織の上に描いて確認したか

まとめ


  • 前処理のゴールは「解析単位 × 遺伝子」の行列を1つ作ること。行が何を指すかは自分で決める。
  • 解析単位は QC より先に決める。2 µm ビンのまま QC すると、これから細胞に組み立てるビンを捨ててしまう。
  • QC の指標は scRNA-seq と同じでよいが、解釈が違う。低カウント領域は生物学的に正しいことがある。閾値は空間プロットを見てから決める。
  • 総カウントには組織の情報が入っている。ライブラリサイズを scRNA-seq 流に補正すると、空間ドメイン同定の精度が下がる(Bhuva et al., 2024)。
  • 生のカウントは必ず残す。デコンボリューションはカウントの分布そのものを使う。
  • 正規化は必須の儀式ではなく、目的ごとに選ぶ工程。あとから選び直せるようにしておく。
  • 次元削減・クラスタリングでは、まだ空間情報を使わない。これがベースラインになる。

関連記事


参考文献


  • Bhuva, D. D., Tan, C. W., Salim, A., et al. (2024). Library size confounds biology in spatial transcriptomics data. Genome Biology, 25, 99. doi:10.1186/s13059-024-03241-7
  • Salim, A., Bhuva, D. D., Chen, C., et al. (2025). SpaNorm: spatially-aware normalization for spatial transcriptomics data. Genome Biology, 26, 109. doi:10.1186/s13059-025-03565-y
  • Marconato, L., Palla, G., Yamauchi, K. A., et al. (2025). SpatialData: an open and universal data framework for spatial omics. Nature Methods, 22(1), 58–62. doi:10.1038/s41592-024-02212-x
  • Palla, G., Spitzer, H., Klein, M., et al. (2022). Squidpy: a scalable framework for spatial omics analysis. Nature Methods, 19(2), 171–178. doi:10.1038/s41592-021-01358-2
  • Wolf, F. A., Angerer, P., & Theis, F. J. (2018). SCANPY: large-scale single-cell gene expression data analysis. Genome Biology, 19, 15. doi:10.1186/s13059-017-1382-0
  • Traag, V. A., Waltman, L., & van Eck, N. J. (2019). From Louvain to Leiden: guaranteeing well-connected communities. Scientific Reports, 9, 5233. doi:10.1038/s41598-019-41695-z
  • Korsunsky, I., Millard, N., Fan, J., et al. (2019). Fast, sensitive and accurate integration of single-cell data with Harmony. Nature Methods, 16(12), 1289–1296. doi:10.1038/s41592-019-0619-0
  • Kleshchevnikov, V., Shmatko, A., Dann, E., et al. (2022). Cell2location maps fine-grained cell types in spatial transcriptomics. Nature Biotechnology, 40(5), 661–671. doi:10.1038/s41587-021-01139-4
  • Cable, D. M., Murray, E., Zou, L. S., et al. (2022). Robust decomposition of cell type mixtures in spatial transcriptomics. Nature Biotechnology, 40(4), 517–526. doi:10.1038/s41587-021-00830-w
  • Polański, K., Bartolomé-Casado, R., Sarropoulos, I., et al. (2024). Bin2cell reconstructs cells from high resolution Visium HD data. Bioinformatics, 40, btae546. doi:10.1093/bioinformatics/btae546
  • Chen, A., Liao, S., Cheng, M., et al. (2022). Spatiotemporal transcriptomic atlas of mouse organogenesis using DNA nanoball-patterned arrays. Cell, 185(10), 1777–1792. doi:10.1016/j.cell.2022.04.003
  • You, Y., Fu, Y., Li, L., et al. (2024). Systematic comparison of sequencing-based spatial transcriptomic methods. Nature Methods, 21(9), 1743–1754. doi:10.1038/s41592-024-02325-3

コメント

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