シーケンス型 空間トランスクリプトーム:正規化とクラスタリング ─ 目的ごとに正規化を選ぶ

Spatial transcriptome
📚 この記事について
前処理の最後の工程です。なぜ空間データでは正規化が難しいのか、目的ごとにどの行列を渡せばよいのかを整理し、クラスタリングまで進めます。この記事で、シーケンス型の前処理は完結します。
🔙 前の記事:シーケンス型 空間トランスクリプトーム:解析単位の決め方
🔜 次の記事:シーケンス型 空間トランスクリプトーム:デコンボリューションの原理と手法分類
📌 前提scRNA-seq解析:正規化・特徴選択・次元削減・クラスタリングAnnData のデータ構造

空間トランスクリプトーム解析(spatial transcriptomics)のうちシーケンス型(Visium・Stereo-seq など NGS で読み出す方式)は、正規化のところで、scRNA-seq の常識がはっきり崩れます。scRNA-seq では、総カウントの差は技術的なノイズでした。だから割って揃えるのが正しかった。空間データでは、総カウントそのものが生物学の一部です。割って揃えると、組織構造の情報ごと消えます。この記事では、なぜそうなるのか、では何をすればよいのかを整理します。

1. 正規化は「1つの工程」ではない


最初に結論を書きます。正規化は、目的ごとに選ぶ工程です。「前処理でとりあえず正規化しておく」という発想が、空間データでは通用しません。

図:正規化は1つの工程ではない ─ 目的ごとに渡す行列が違う
図:正規化は1つの工程ではない ─ 目的ごとに渡す行列が違う
目的 渡す行列 なぜ
デコンボリューション 生のカウント カウントの分布そのものを確率モデルで扱うから
クラスタリング・可視化 対数正規化した行列 遺伝子どうしを同じ尺度で比べる必要があるから
空間ドメイン同定・SVG 空間を考慮した正規化、または正規化なし 大域的に割ると、領域の情報が消えるから
差次発現解析 生のカウント(手法による) 多くの手法がカウントモデルを前提にしているから
⚠️ だから、生のカウントを絶対に失わない
正規化は不可逆な操作です。対数正規化した行列から、生のカウントは復元できません。正規化する前に、必ず layers に生のカウントをコピーしてください。これを忘れると、あとからデコンボリューションを試したくなったときに、読み込みからやり直すことになります。
python
import scanpy as sc

# 大原則:生のカウントを、絶対に失わない
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.layers['counts']
#   クラスタリング・可視化 -> adata.layers['lognorm']
#   空間ドメイン同定       -> 両方を試して比べる

2. なぜ総カウントが「生物学」なのか


scRNA-seq では、1つの観測は1つの細胞です。同じ細胞型なら、持っている RNA の量もだいたい同じ。総カウントの差は、捕捉効率の違い、つまり技術的なノイズです。だから割って揃えるのが正しい。

シーケンス型では、1つの観測は組織のある場所です。そこに何個の細胞がいるかは、場所によって違います。そして、その細胞が活発に転写しているかどうかも、場所によって違います。

図:総カウントには、2つの生物学が入っている
図:総カウントには、2つの生物学が入っている

総カウントは、おおまかに「そこにいる細胞の数」×「1細胞あたりの RNA 量」です。どちらも生物学です。細胞が密に詰まった腫瘍の領域ではカウントが多く、細胞のまばらな白質や間質では少ない。これは測定の失敗ではなく、組織の性質です。

💡 細胞密度だけが原因ではない
「では、細胞数で割れば解決するのでは」と考えたくなります。しかし、4つの空間技術・25検体を調べた研究(Bhuva et al., Genome Biology, 2024)では、1細胞あたりの検出数でさえ、領域ごとに違いました。腫瘍領域では、1細胞あたりの検出数が高かったのです。つまり、細胞密度で説明しきれない領域固有の効果が存在します。総カウントは、割って消してよい量ではありません。

3. scRNA-seq 流の正規化を、そのままやるとどうなるか


scRNA-seq の代表的な正規化は2つあります。

  • 対数正規化:総カウントで割って、定数を掛けて、log を取る。単純で速い。
  • sctransform(Hafemeister & Satija, Genome Biology, 2019):シーケンス深度を共変量とする正規化された負の二項回帰をあて、その Pearson 残差を使う。深度の影響を取り除きつつ、生物学的な差を残す設計。

scRNA-seq ではどちらも有効です。ところが空間データでは、sctransform でライブラリサイズを明示的に補正すると、空間ドメイン同定の精度(ARI)がむしろ下がりました(Bhuva et al., 2024)。グラフベースのクラスタリングでも、空間を考慮する手法でも、同じ傾向でした。著者らは「空間データはライブラリサイズを特別に補正すべきでない」と結論しています。

理由は明快です。sctransform は「深度は技術ノイズである」という前提の上に立っています。空間データではその前提が成り立たないので、技術ノイズを消すつもりで、組織構造を消してしまうのです。

では、自分のデータでは総カウントが生物学なのか技術ノイズなのか。確かめる方法があります。

python
import numpy as np
import squidpy as sq

# 総カウントは、本当に技術ノイズなのか。空間の上で確かめる
sq.pl.spatial_scatter(adata, color="total_counts", shape=None)

# クラスタごとの総カウントを比べる(クラスタ = 組織の領域に対応しているはず)
print(adata.obs.groupby("leiden")["total_counts"].median())
# 領域ごとに中央値が大きく違うなら、
# 総カウントは組織構造の情報を持っている。技術ノイズではない

4. SpaNorm ─ 空間を考慮した正規化


この問題を正面から解いたのが SpaNorm(Salim et al., Genome Biology, 2025)です。空間情報を使う、初めての正規化手法です。

図:SpaNorm ─ 空間的に滑らかな変動を、2つに分ける
図:SpaNorm ─ 空間的に滑らかな変動を、2つに分ける

発想は次のとおりです。

  • 入力はカウントと空間座標の両方。
  • 遺伝子ごとに負の二項回帰をあてる。
  • 薄板スプラインで空間的に滑らかな関数を作り、位置ごと・遺伝子ごとのサイズ因子を推定する。
  • 空間的に滑らかな変動を、ライブラリサイズに関係する部分(技術)関係しない部分(生物学)に分解する。
  • 後者だけを残した行列を出力する。

ポイントは、技術と生物学を同時にモデル化して、分けてから片方だけを消すことです。scRNA-seq 流の正規化は、この分解をせずに両方まとめて割ります。だから領域の情報まで消える。

27 検体・6 データセット・4 プラットフォームでの評価では、SpaNorm は単一細胞向けの正規化手法を上回り、空間ドメインの情報を保ったまま、空間可変遺伝子(SVG)も検出できました。マルチセル解像度でもサブセル解像度でも同様に機能し、セグメンテーション手法が違っても性能は比較的安定していました。

⚠️ SpaNorm の現実的な制約
SpaNorm は R/Bioconductor のパッケージで、計算コストが高いです。大規模なデータにそのまま流すのは現実的ではないことがあります。Python 中心の解析をしているなら、「まず対数正規化で進め、空間ドメイン同定の段階で正規化なしと比較する」という運用のほうが現実的な場面も多いはずです。重要なのは正規化を無条件の前提にしないことであって、必ず SpaNorm を使うことではありません。

5. 特徴選択 ─ HVG は SVG ではない


高変動遺伝子(HVG)の選択は、scRNA-seq と同じ関数で行えます。ただし、意味が違います。

HVG(高変動遺伝子) SVG(空間可変遺伝子)
何を見るか 全フィーチャを通じた分散の大きさ 空間的なパターンの有無
空間座標 使わない 使う
拾うもの どこかで大きく変動する遺伝子 位置と結びついて変動する遺伝子
取りこぼすもの 分散は小さいが空間パターンを持つ遺伝子 空間パターンのない変動
💡 ここでは HVG で進めてよい
クラスタリングの前処理としては、HVG で十分です。SVG は「空間的なパターンを持つ遺伝子を見つける」という、それ自体が目的の解析であり、下流解析の段階で別に扱います。ただし、HVG で選んだ 2,000 遺伝子の中に、重要な SVG が入っていない可能性があることは覚えておいてください。

6. 次元削減 ─ PC1 が総カウントを拾っていないか


PCA をかけたら、必ず確認することがあります。第1主成分が、総カウントをそのまま反映していないか。

python
# 特徴選択 -> 次元削減
sc.pp.highly_variable_genes(adata, n_top_genes=2000, flavor="seurat")
sc.pp.pca(adata, n_comps=50)

# 第1主成分が、総カウントをそのまま拾っていないか
pc1 = adata.obsm["X_pca"][:, 0]
lib = np.log1p(adata.obs["total_counts"].to_numpy())
r = np.corrcoef(pc1, lib)[0, 1]
print("PC1 と 総カウント の相関:", round(float(r), 3))

# 相関が強いとき、可能性は2つ。空間プロットで見分ける
#   1. 正規化が効いていない(技術由来の勾配が残っている)
#   2. 総カウントが本当に組織構造を反映している(消してはいけない)

相関が強い場合、可能性は2つあります。

  • 正規化が効いていない:透過処理のムラのような、技術由来の勾配が残っている。
  • 総カウントが本当に組織構造を反映している:細胞密度の高い領域と低い領域が、そのまま PC1 に出ている。これは消してはいけない。

この2つを見分ける方法は1つしかありません。空間プロットで見る。PC1 の値を組織の上に描いて、それが組織の構造と一致するのか、それともスライドの軸に沿った勾配なのかを目で確かめます。

7. クラスタリング ─ ここではまだ空間を使わない


近傍グラフを作り、Leiden でクラスタリングします。scRNA-seq の手順と同じです。空間座標は、まだ使いません。

python
# ここではまだ空間情報を使わない。発現だけでクラスタリングする
sc.pp.neighbors(adata, n_neighbors=15, n_pcs=30)

# 解像度を振って、組織像と見比べる
for res in [0.5, 1.0, 1.5]:
    sc.tl.leiden(adata, resolution=res, key_added=f"leiden_{res}", flavor="igraph")

# 発現だけで作ったクラスタを、組織の上に描く
sq.pl.spatial_scatter(
    adata, color=["leiden_0.5", "leiden_1.0", "leiden_1.5"],
    shape=None, ncols=3,
)
# 組織構造と対応していれば、前処理は概ね成功している
💡 なぜ空間情報を使わないのか
「空間データなのに空間を使わないのか」と思うかもしれません。理由が2つあります。1つめは確認です。発現だけで作ったクラスタが組織構造と対応していれば、前処理は概ね成功しています。対応していなければ、どこかで失敗しています。2つめはベースラインです。空間情報を組み込んだ手法(空間ドメイン同定)が、本当に価値を足しているのかを判断するには、比較対象が要ります。最初から空間情報を入れてしまうと、この比較ができません。

解像度は1つに決めず、いくつか振って組織像と見比べます。「クラスタ数がいくつなら正しい」という基準は存在しません。組織のどの構造を分けたいのかで決めます。

8. 正規化の有無を比べる


空間ドメイン同定に進む前に、一度だけやっておくと得をする作業があります。正規化した行列と、生のカウントの両方でクラスタリングして、結果を比べる。

python
# 正規化の有無で、クラスタがどう変わるかを比べる
ad_raw = adata.copy()
ad_raw.X = ad_raw.layers["counts"].copy()

for ad, name in [(adata, "lognorm"), (ad_raw, "raw")]:
    sc.pp.pca(ad, n_comps=30)
    sc.pp.neighbors(ad, n_neighbors=15)
    sc.tl.leiden(ad, resolution=1.0, key_added="leiden")
    print(name, "クラスタ数:", ad.obs["leiden"].nunique())

# 組織像と照らして、どちらが組織構造をよく再現しているかを見る
# 「正規化するのが当たり前」ではないことを、自分のデータで確かめる

どちらが組織構造をよく再現しているかを、組織像と照らして判断します。「正規化するのが当たり前」という前提を、自分のデータで一度は疑ってください。この確認が、あとの空間ドメイン同定の質を大きく左右します。

9. 複数スライスがある場合


切片間・スライド間の差は、HarmonyscVI で補正できます。道具立ては scRNA-seq と同じです。

⚠️ バッチ補正と正規化を混同しない
バッチ補正はサンプル間の系統差を扱います。正規化は1枚の切片の中の、フィーチャ間の差を扱います。別の問題です。バッチ補正をかけても、1枚の中でライブラリサイズが組織構造と絡んでいる問題は解決しません。逆に、正規化を工夫しても、切片間の差は消えません。

10. 前処理の完了チェック


  • 生のカウントを layers に残したか
  • 総カウントを空間プロットで見て、組織構造と結びついているかを確認したか
  • PC1 と総カウントの相関を見たか
  • 発現だけで作ったクラスタを、組織の上に描いて確認したか
  • クラスタが組織構造と対応しているか
  • 解像度をいくつか振って比べたか
  • 正規化の有無で結果がどう変わるかを、一度は比べたか

ここまでできていれば、下流解析に進む準備は整っています。次は、フィーチャに細胞型を割り当てる工程です。

まとめ


  • 正規化は目的ごとに選ぶ工程。デコンボリューションには生のカウント、クラスタリングには対数正規化、空間ドメイン同定には正規化なしという選択肢もある。
  • 総カウント = 細胞の数 × 1細胞あたりの RNA 量。どちらも生物学。割って揃えると、両方まとめて消える。
  • 細胞密度で説明しきれない領域固有の効果がある。腫瘍領域では1細胞あたりの検出数が高い(Bhuva et al., 2024)。
  • sctransform で補正すると、空間ドメイン同定の精度が下がる。「深度は技術ノイズ」という前提が成り立たないから。
  • SpaNorm は、技術と生物学を同時にモデル化して分解し、片方だけを消す(Salim et al., 2025)。ただし計算コストは高い。
  • HVG は SVG ではない。空間パターンを持つ遺伝子は、下流で別に探す。
  • PC1 が総カウントを拾っていないかを必ず確認する。拾っているなら、それが技術なのか生物学なのかを空間プロットで見分ける。
  • クラスタリングでは、まだ空間情報を使わない。ベースラインとして残す

関連記事


参考文献


  • 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
  • Hafemeister, C., & Satija, R. (2019). Normalization and variance stabilization of single-cell RNA-seq data using regularized negative binomial regression. Genome Biology, 20(1), 296. doi:10.1186/s13059-019-1874-1
  • 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
  • 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
  • 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
  • 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

コメント

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