シーケンス型 空間トランスクリプトーム:解析単位の決め方 ─ ビンのまま進むか、細胞に組み立てるか

Spatial transcriptome
📚 この記事について
サブセル解像度のデータを、どの単位で解析するかを決めます。カウントがどれだけ足りているのかを数字で確かめ、細胞に組み立てる場合は bin2cell や CellBin をどう使うかまでを扱います。
🔙 前の記事:シーケンス型 空間トランスクリプトーム:QC と組織検出
🔜 次の記事:シーケンス型 空間トランスクリプトーム:正規化とクラスタリング
📌 前提scRNA-seq解析:データの読み込みと品質管理(QC)AnnData のデータ構造

空間トランスクリプトーム解析(spatial transcriptomics)のうちシーケンス型(Visium・Stereo-seq など NGS で読み出す方式)は、測定の単位(フィーチャ)と細胞の単位が一致しません。Visium HD の 2 µm ビンや Stereo-seq のネイティブ解像度では、1つの細胞が何十個ものビンに分かれています。そのまま解析するのか、それとも細胞に組み立て直すのか。この判断を先に済ませないと、そのあとの QC もクラスタリングも、何を数えているのか分からないものになります。

1. 選べる単位は、プラットフォームで決まっている


プラットフォーム 選べる単位 判断の余地
Visium v1 / v2 55 µm スポットのみ なし。デコンボリューションへ進む
Curio Seeker 10 µm ビーズのみ なし。ビーズのまま進む
Visium HD 2 / 8 / 16 µm ビン、または細胞 ここが判断のしどころ
Stereo-seq bin1〜bin200、または cellbin 同上

Visium と Curio Seeker には選択肢がありません。フィーチャが細胞より大きい(または同程度)なので、細胞型を割り当てるにはデコンボリューションを使います。判断が必要なのは、フィーチャが細胞より小さいプラットフォームです。

2. カウントは、面積の分だけ減る


判断の土台になるのは、単純な事実です。1つのフィーチャで捕まえられる転写産物の量は、その面積に比例する。

図:ビンを小さくすると、カウントは面積の分だけ減る
図:ビンを小さくすると、カウントは面積の分だけ減る

2 µm ビンの面積は 4 µm²、8 µm ビンは 64 µm²。一辺が 4 倍なら面積は 16 倍です。総カウントも、おおよそこの比で変わります。

💡 検出遺伝子数は、カウントより急に落ちる
総カウントが 1/16 になると、検出できる遺伝子数はそれ以上に減ります。カウントが薄くなるほど、多くの遺伝子が「0 回」になるからです。たとえば 8 µm ビンで遺伝子数の中央値が 80 でも、2 µm ビンでは 80/16 = 5 ではなく、もっと小さい値に落ち込みます。「解像度を上げれば情報が増える」わけではないのは、これが理由です。

自分のデータで確かめるのが確実です。3つのビンサイズを同じ物差しで比べます。

python
import numpy as np
import scanpy as sc

# 3つのビンサイズを、同じ物差しで比べる
for key in ["square_002um", "square_008um", "square_016um"]:
    ad = sdata[key]
    sc.pp.calculate_qc_metrics(ad, inplace=True, log1p=False)
    print(
        key,
        "フィーチャ数:", ad.n_obs,
        "総カウント中央値:", int(np.median(ad.obs["total_counts"])),
        "遺伝子数中央値:", int(np.median(ad.obs["n_genes_by_counts"])),
    )

# square_002um  総カウント中央値: 6    遺伝子数中央値: 6
# square_008um  総カウント中央値: 95   遺伝子数中央値: 79
# square_016um  総カウント中央値: 380  遺伝子数中央値: 262
# 総カウントは おおよそ 16 倍・64 倍。遺伝子数はそこまで増えない

3. 判断の条件は2つ ─ カウントと画像


細胞に組み立てるには、次の2つが両方必要です。

  • 核が見える画像がある:Visium HD なら H&E や DAPI、Stereo-seq なら ssDNA か DAPI。核が写っていなければ、どこが細胞かを決める手がかりがない。
  • カウントが足りている:組み立てた細胞1個あたりのカウントが、下流の解析に耐えるだけ残っていること。

STOmics は Stereo-seq について、具体的な目安を出しています。bin20 あたりの遺伝子数の中央値が 200 を超え、かつ核染色画像の品質が良いとき、細胞単位(cellbin)での解析を勧めています。どちらかが欠けるなら、bin50 や bin100 に下げます。

python
# Stereo-seq:bin20 の遺伝子数中央値が判断材料になる
med = np.median(adata_bin20.obs["n_genes_by_counts"])
print("bin20 の遺伝子数中央値:", med)

if med > 200 and has_good_nuclear_image:
    print("cellbin へ進める")
else:
    print("bin50 または bin100 に下げる")

# 判断は2つの条件の AND。片方でも欠けたら、細胞単位には進まない
⚠️ 解像度は、上げられるだけ上げるものではない
サブセル解像度のデータを手にすると、「せっかくだから一番細かい単位で解析したい」と考えたくなります。しかし単位を細かくするほど、1個あたりのカウントは薄くなり、クラスタリングもデコンボリューションも不安定になります。解像度は、カウントが許す範囲で上げる。組織によっては、8 µm ビンや bin50 が最適解であることは珍しくありません。

4. 細胞に組み立てる ─ Visium HD の場合


bin2cell(Polański et al., Bioinformatics, 2024)は、2 µm ビンを細胞にまとめ直すための Python パッケージです。Scanpy と互換で、GPU なしで動きます。論文によれば、マウス脳のデモデータで生の入力から細胞オブジェクトまでCPU で 15 分、メモリは 10 GB 以内です。

図:2 µm ビンを細胞に組み立てる ─ bin2cell の流れ
図:2 µm ビンを細胞に組み立てる ─ bin2cell の流れ
⚠️ destripe ─ 2 µm ビンの大きさは、揃っていない
これは Visium HD 固有の、あまり知られていない技術的な問題です。チップを印刷する工程で、2 µm ビンの幅と高さに、ばらつきが生じます。その結果、総カウントを描くと行と列に縞模様が現れます。ある行やある列だけが、系統的に転写産物を取り逃がすのです。これは生物学ではありません。bin2cell の destripe() は、行と列ごとに分位点(既定 0.99)を求めて、この縞を補正します。補正後の値は整数ではなくなるので、整数が必要な下流処理では丸めてください。
python
import bin2cell as b2c

# 2 µm ビンを読む
adata = b2c.read_visium(
    "data/visium_hd/binned_outputs/square_002um",
    source_image_path="data/tissue_image.btf",
    spaceranger_image_path="data/visium_hd/spatial",
)
adata.var_names_make_unique()

# チップ印刷のばらつきで、行と列に縞が出る。これを補正する
b2c.destripe(adata)

# H&E 画像をセグメンテーション用の解像度にそろえる
mpp = 0.3   # microns per pixel
b2c.scaled_he_image(adata, mpp=mpp, save_path="stardist/he.tiff")

# StarDist で核を検出する。prob_thresh は既定より下げる
b2c.stardist(
    image_path="stardist/he.tiff",
    labels_npz_path="stardist/he.npz",
    stardist_model="2D_versatile_he", prob_thresh=0.01,
)
b2c.insert_labels(adata, labels_npz_path="stardist/he.npz", mpp=mpp, labels_key="labels_he")

# 核を膨張させて細胞にする(既定は 2 ビン分)
b2c.expand_labels(adata, labels_key="labels_he", expanded_labels_key="labels_he_expanded")

# ビンを細胞にまとめる
cdata = b2c.bin_to_cell(adata, labels_key="labels_he_expanded")
print(cdata.shape)   # (細胞数, 遺伝子数)

核の膨張には2つの方法があります。既定では、核から外へ最大 2 ビン分ひろげます。もう一方は、細胞と核の体積比(bin2cell の既定は 4)を使って、核の大きさに応じた膨張距離を決める方法です。大きい核には大きい細胞を、小さい核には小さい細胞を割り当てます。

💡 どちらの核にも等距離のビンは、どうなるのか
2つの核から同じ距離にあるビンは、機械的に決められません。bin2cell は、こうしたビンを発現の近さで割り当てます。PCA 空間で、どちらの細胞に近いかを見るのです。形態だけでも、発現だけでもなく、両方を使うのがこの手法の要点です。

核が切片の断面に写っていない細胞や、モデルが検出できない形をした核は、H&E からは拾えません。bin2cell はこれを救うために、総カウントを画像として描き、StarDist の蛍光モデルにかけます。この二次セグメンテーションは形態ベースより不安定で、細胞が密な領域では苦戦しますが、取りこぼしを補う役には立ちます。

⚠️ Space Ranger v4 との関係
2025 年 6 月に公開された Space Ranger v4.0 以降、H&E 画像があれば核ベースの細胞セグメンテーションが自動で行われます。手軽ですが、bin2cell のように destripe や二次セグメンテーションを挟むわけではありません。まず Space Ranger の結果を見て、取りこぼしや過剰な膨張が気になるなら bin2cell を試す、という順序が現実的です。なお、関数の引数名はバージョンで変わります。実行前に公式のデモノートブックを確認してください。

5. 細胞に組み立てる ─ Stereo-seq の場合


Stereo-seq では、SAW パイプラインの CellBin が同じ役割を担います。ssDNA または DAPI の核染色画像から核の輪郭を検出し、一定の距離だけ外へ広げて細胞の範囲とします。考え方は bin2cell と同じです。

⚠️ 格子は、細胞の境界を無視して切る
マウス脳の Stereo-seq データでは、bin20(10 µm × 10 µm、哺乳類の細胞とほぼ同じ大きさ)で切ると約 90% の細胞が複数のビンに分断されました。一方、核染色画像からセグメンテーションした cellbin では、分断は約 2% でした。「ビンの大きさが細胞と同じくらいだから、細胞として扱ってよい」とはなりません。格子は、細胞がどこにあるかを知らないからです。

6. 組み立てない道 ─ segmentation-free


核染色画像が使えない。カウントも足りない。それでも粗いビンに落としたくない。そういう場面があります。

FICTURE(Si et al., Nature Methods, 2024)は、細胞という単位を仮定せずに、サブミクロン解像度のデータから直接、組織の構造を取り出します。転写産物の分布を因子分解して、空間的に連続した「発現のまとまり」を見つける発想です。細胞の境界を決める必要がないので、セグメンテーション誤差も入りません。

図:サブセル解像度のデータを、どう扱うか
図:サブセル解像度のデータを、どう扱うか
⚠️ 単位が違えば、結果は比較できない
8 µm ビンで見つけたクラスタと、組み立てた細胞で見つけたクラスタは、同じ名前が付いていても別の対象です。ビンのクラスタは「その場所にある発現の混合」を表し、細胞のクラスタは「1個の細胞の状態」を表します。論文や発表では、どの単位で解析したのかを必ず明記してください。書かれていない論文を読むときは、まずそこを疑ってください。

7. 決めたあと、正しいかを確かめる


細胞に組み立てたら、そのまま先へ進まず、まともな結果になっているかを確認します。

python
# 組み立てた細胞が、まともかどうかを確かめる
sc.pp.calculate_qc_metrics(cdata, inplace=True, log1p=False)

# 1. 細胞あたりのカウントと遺伝子数
print(cdata.obs[["total_counts", "n_genes_by_counts"]].describe())

# 2. 細胞の面積(=まとめられたビンの数)
#    極端に大きい細胞があるなら、膨張しすぎている
print(cdata.obs["bin_count"].describe())

# 3. 8 µm ビンでの結果と比べる
print("8 µm ビン数:", sdata["square_008um"].n_obs)
print("組み立てた細胞数:", cdata.n_obs)
#    細胞数がビン数より極端に多いなら、核を過剰に検出している
確認すること 見るもの おかしい場合
細胞あたりのカウント total_counts の分布 極端に少ないなら、単位を粗くし直す
細胞の面積 1細胞にまとめられたビンの数 極端に大きい細胞があるなら、膨張しすぎている
細胞の数 8 µm ビンの数と比べる ビン数より極端に多いなら、核を過剰に検出している
クラスタと組織像 クラスタを組織の上に描く 組織構造と対応しないなら、どこかで失敗している
💡 細胞に組み立てても、デコンボリューションが不要になるわけではない
セグメンテーションは完璧ではありません。隣の細胞の転写産物が混ざり込むこと(spillover)は必ず起きます。組み立てた細胞に対しても、参照 scRNA-seq を使った細胞型の割り当てや、混合を明示的に扱う手法(cell2location、RCTD)が有効な場面があります。「細胞に組み立てたから、あとは scRNA-seq と同じ」とは考えないでください。

8. 判断のまとめ


状況 選ぶ単位 次にやること
Visium v1 / v2 55 µm スポット デコンボリューション
Curio Seeker 10 µm ビーズ デコンボリューション(doublet モード)
Visium HD + H&E あり + カウント十分 細胞(bin2cell / Space Ranger v4) 細胞型アノテーション
Visium HD + 画像かカウントが不足 8 µm ビン デコンボリューション
Stereo-seq + 核染色あり + bin20 で遺伝子数中央値 200 超 cellbin 細胞型アノテーション
Stereo-seq + カウント不足 bin50 / bin100 デコンボリューション
画像が使えず、粗いビンにも落としたくない segmentation-free(FICTURE) 因子として組織構造を読む

まとめ


  • 解析単位は、QC より先に決める。決めないと、その先が全部意味を失う。
  • カウントは面積に比例して減る。8 µm ビンから 2 µm ビンにすると、総カウントは おおよそ 1/16。検出遺伝子数はそれより急に落ちる。
  • 細胞に組み立てるには、核が見える画像足りるカウントの両方が要る。片方でも欠けたら、粗いビンに下げる。
  • Stereo-seq の目安は、bin20 の遺伝子数中央値が 200 超かつ画像が良好であること。
  • Visium HD の 2 µm ビンは、物理的な大きさが揃っていない。総カウントに行と列の縞が出る。bin2cell の destripe で補正する。
  • 格子は細胞の境界を知らない。bin20 では約 90% の細胞が分断される(cellbin なら約 2%)。
  • 単位が違えば結果は比較できない。どの単位で解析したかを必ず明記する。

関連記事


参考文献


  • Polański, K., Bartolomé-Casado, R., Sarropoulos, I., et al. (2024). Bin2cell reconstructs cells from high resolution Visium HD data. Bioinformatics, 40(9), btae546. doi:10.1093/bioinformatics/btae546
  • Schmidt, U., Weigert, M., Broaddus, C., & Myers, G. (2018). Cell detection with star-convex polygons. In Medical Image Computing and Computer Assisted Intervention (MICCAI) 2018, 265–273. doi:10.1007/978-3-030-00934-2_30
  • 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
  • Si, Y., Lee, C., Hwang, Y., et al. (2024). FICTURE: scalable segmentation-free analysis of submicron-resolution spatial transcriptomics. Nature Methods, 21(10), 1843–1854. doi:10.1038/s41592-024-02415-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
  • 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
  • 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
  • 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

コメント

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