シーケンス型 空間トランスクリプトーム:複数スライスの統合

Spatial transcriptome
📚 この記事について
複数のスライドやサンプルを一緒に解析する工程を扱います。「統合」という言葉が2つのまったく違う操作を指していること、何をバッチとみなすべきか、そして比べられる形にどうそろえるかを整理します。
🔙 前の記事:シーケンス型 空間トランスクリプトーム:空間 CNV と腫瘍微小環境
🔜 次の記事:シーケンス型 空間トランスクリプトーム:スライス整列と 3D 再構成
📌 前提scRNA-seq解析:サンプル統合とバッチ補正 ─ Harmony空間ドメイン同定

空間トランスクリプトーム解析(spatial transcriptomics)のうちシーケンス型(Visium・Stereo-seq など NGS で読み出す方式)は、複数のスライドを扱う場面がすぐに来ます。そこで「統合する」と言ったとき、まったく違う2つの操作のどちらを指しているのかを、はっきりさせておく必要があります。混同すると、やったつもりのことができていない状態になります。

1. 「統合」には2つの意味がある


図:「統合」には、まったく別の2つの意味がある
図:「統合」には、まったく別の2つの意味がある
発現空間での統合 物理空間での整列
やること 同じ細胞型が重なるようにそろえる 切片どうしを位置として重ねる
道具 Harmony、scVI など 最適輸送による整列手法
変わるもの 潜在空間の座標 物理座標
つながる先 共通のクラスタリング、条件間比較 3D 再構成
⚠️ バッチ補正をしても、座標は揃わない
補正されるのは発現の潜在空間だけです。スライドごとの物理座標には、何も起きません。スライドAの (100, 200) とスライドBの (100, 200) は、補正後もまったく無関係な場所のままです。この記事で扱うのは前者です。後者はスライス整列と 3D 再構成で扱います。
python
import anndata as ad
import scanpy as sc

# スライドごとの AnnData を、1つにまとめる
adatas = {"slide_A": ad_a, "slide_B": ad_b, "slide_C": ad_c}
adata = ad.AnnData.concatenate(*adatas.values(), label="slide", index_unique="-", join="inner")

# 座標はスライドごとに原点が違う。混ざらないよう obs に印を残す
print(adata.obs["slide"].value_counts())
print(adata.obsm["spatial"].min(axis=0), adata.obsm["spatial"].max(axis=0))
# この座標を、そのまま距離として使ってはいけない

2. 何をバッチとみなすか


図:何をバッチとみなすかで、消える差が変わる
図:何をバッチとみなすかで、消える差が変わる
粒度 消える差 注意点
実験日・ロット 日をまたいだ差だけ スライド間の差は残る
スライド スライド間の差 多くの場合、これで足りる
捕捉領域・切片 切片ごとの差まで 細かくするほど生物学も消える
⚠️ 条件をバッチに含めてはいけない
腫瘍のスライドと正常のスライドを別々のバッチとして補正すれば、見たかった差がまるごと消えます。バッチの定義に、比較したい条件が含まれていないかを必ず確認してください。補正の前後で条件間の差が保たれているかを見れば、その場で気づけます。
python
import numpy as np

# 補正の前に、スライドごとの QC を並べて原因を見分ける
cols = ["total_counts", "n_genes_by_counts"]
print(adata.obs.groupby("slide")[cols].median())

# 補正する
adata.layers["counts"] = adata.X.copy()
sc.pp.normalize_total(adata); sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000, batch_key="slide")
sc.pp.pca(adata, n_comps=30)
sc.external.pp.harmony_integrate(adata, key="slide")

# 補正の前後で、条件間の差が保たれているかを確かめる
#   条件をバッチに含めていないかの確認でもある
sc.pp.neighbors(adata, use_rep="X_pca_harmony")
sc.tl.umap(adata)
sc.pl.umap(adata, color=["slide", "condition"])
# slide が混ざり、condition が分かれていれば、意図どおり
💡 差の原因を、先に見分ける
スライド間で細胞あたりのカウントが違うとき、原因は複数考えられます。実験のばらつき切片の質組織の組成そのものの違い。最後のものは補正すべきではありません。スライドごとの QC 指標を並べ、組織像も見てから、補正の要否を判断してください。

3. ラベルをそろえる


図:スライドごとに解析すると、ラベルが対応しない
図:スライドごとに解析すると、ラベルが対応しない

スライドごとに別々でクラスタリングすると、スライドAのドメイン1とスライドBのドメイン1が、別のものを指します。この状態では比較になりません。細胞型のラベルも、ニッチも、同じです。

python
# まとめてクラスタリングする。別々にやるとラベルが対応しない
sc.tl.leiden(adata, resolution=1.0, key_added="domain", flavor="igraph")

# スライドごとに、ドメインの構成比を比べる
import pandas as pd
tab = pd.crosstab(adata.obs["slide"], adata.obs["domain"], normalize="index")
print(tab.round(3))

# 各スライドを、別々に描いて確かめる
for sl in adata.obs["slide"].unique():
    sub = adata[adata.obs["slide"] == sl]
    sq.pl.spatial_scatter(sub, color="domain", title=sl)
# 同じドメインが、どのスライドでも同じ場所に出るか
💡 空間を考慮したバッチ補正
BANKSY(Singhal et al., Nature Genetics, 2024)の原論文は、この手法が空間を考慮したバッチ効果の補正にも使えると報告しています。近傍の情報を含んだ特徴空間の上で補正すれば、組織構造を保ったまま系統差を減らせる可能性があります。

4. 組成を比べる ─ 合計 1 の制約を忘れない


条件間で細胞型の構成が違うかを調べるとき、ニッチ・近傍解析で見た制約が、そのまま効いてきます。

⚠️ 「増えた」のか「他が減った」のかは、割合からは決められない
腫瘍で T細胞の割合が高かったとして、T細胞が増えたのか、他の細胞型が減っただけなのかは、割合の比較からは区別できません。合計が 1 になるからです。絶対量(推定された細胞数)が得られているなら、そちらでも比べてください。得られていないなら、結論の書き方に注意が要ります。

もう1つ、フィーチャ数がスライドごとに違うという問題もあります。組織の載った面積が違えば、フィーチャの総数も変わります。総数ではなく割合や密度で比べる必要があります。

5. 統合してから、もう一度確かめる


  • UMAP でスライドが混ざっているか。分かれていれば、補正が足りていない。
  • 条件は分かれているか。混ざっていれば、補正しすぎている。
  • 同じドメインが、どのスライドでも同じ場所に出るか。各スライドを別々に描いて確かめる。
  • QC 指標の差が説明できるか。残っている差の原因を、言葉にできるか。
⚠️ 補正しすぎのほうが、気づきにくい
補正が足りなければ UMAP でスライドが分かれるので、すぐ分かります。しかし補正しすぎは、きれいに混ざった図に見えるので気づきません。条件間の差が保たれているかを、必ず別に確認してください。既知の差(腫瘍と正常など)が消えていないかが、最も分かりやすい指標です。

6. チェックリスト


  • 「統合」が発現空間か物理空間かを意識しているか
  • スライドごとの座標を、そのまま距離として使っていないか
  • バッチの粒度を決め、条件を含めていないか
  • スライド間の差の原因を見分けたか
  • まとめてクラスタリングして、ラベルをそろえたか
  • 組成を比べるとき、合計 1 の制約を考慮したか
  • フィーチャ数の違いを、割合や密度で吸収したか
  • 補正の前後で、条件間の差が保たれているかを確かめたか

まとめ


  • 「統合」には発現空間と物理空間の2つの意味がある。混同しない。
  • バッチ補正をしても、座標は揃わない。潜在空間だけが変わる。
  • 条件をバッチに含めてはいけない。見たかった差が消える。
  • スライド間の差の原因を先に見分ける。組織の組成の違いは補正すべきでない
  • 比べたいならまとめてクラスタリングする。別々ではラベルが対応しない。
  • 組成の比較では合計 1 の制約を忘れない。可能なら絶対量でも比べる。
  • 補正しすぎのほうが気づきにくい。条件間の差が保たれているかを別に確認する。

関連記事


参考文献


  • 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
  • Lopez, R., Regier, J., Cole, M. B., Jordan, M. I., & Yosef, N. (2018). Deep generative modeling for single-cell transcriptomics. Nature Methods, 15(12), 1053–1058. doi:10.1038/s41592-018-0229-2
  • Singhal, V., Chou, N., Lee, J., et al. (2024). BANKSY unifies cell typing and tissue domain segmentation for scalable spatial omics data analysis. Nature Genetics, 56(3), 431–441. doi:10.1038/s41588-024-01664-3
  • Zeira, R., Land, M., Strzalkowski, A., & Raphael, B. J. (2022). Alignment and integration of spatial transcriptomics data. Nature Methods, 19(5), 567–575. doi:10.1038/s41592-022-01459-6
  • 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
  • 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
  • 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
  • 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

コメント

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