# 第 04 章 空间生态位与通讯推断方法学总览

> 本章是全书方法学的“地图”。从第 10 章到第 13 章的所有实操，都在这张地图上展开。你不需要现在就记住每个工具的参数，只需要建立三个东西：概念框架、方法谱系、选择逻辑。

## 本章目标

学完本章，你应该能够：

1. 准确区分**空间生态位（spatial niche）**、**空间域（spatial domain）**、**邻域（neighborhood）**三个概念，并说清它们的关系；
2. 说出生态位识别三大类方法（空间聚类、邻域分析、隐变量/多视图）各自由哪些代表工具构成、分别适合什么场景；
3. 区分“无空间约束”与“空间感知”两类细胞通讯推断方法，知道 CellChat、NicheNet、CellPhoneDB、COMMOT、Giotto 各是什么；
4. 用一张决策树为自己的课题选择方法组合；
5. 理解“先分生态位、再做通讯”为什么比全局通讯更有生物学意义。

## 4.1 三个核心概念：生态位、空间域与邻域

空间转录组文献里你几乎每天都会撞见 niche、domain、neighborhood 三个词，它们常被混用，但含义不同，先分清它们后面才不会糊涂。

**空间生态位（spatial niche）**。“生态位”一词借自生态学：物种在生态系统中扮演的角色与位置。在空间转录组里，生态位指组织切片上由**特定细胞组成与微环境特征**反复出现的空间单位，强调**生物学功能**。本书的四个教学生态位——肿瘤核心、侵袭前沿（invasive front）、免疫浸润区、基质区——各有标志性细胞组合：肿瘤核心以肿瘤细胞为主，侵袭前沿是肿瘤细胞与成纤维细胞（CAF）交界、带 EMT 特征，免疫浸润区富集 T/B 细胞与巨噬细胞，基质区富集 CAF 与细胞外基质（ECM）。生态位是**解读性**概念：来自数据，但名字与含义需要人来赋予。

**空间域（spatial domain）**。更“计算”的词：指算法直接从数据划分出的、**转录组特征一致的连续空间区块**，是算法的直接产物（BayesSpace 聚类得到的第 1 到第 q 个域）。很多文献把二者互换（本书 00-SPEC 亦注明），严格区分时：domain 强调“怎么算出来的”，niche 强调“是什么生物学结构”——domain 是 niche 的“计算候选”。

**邻域（neighborhood）**。与前两个词不在一个尺度上：指**以某个 spot（或细胞）为中心、一定半径内的 spot（或细胞）集合**，是微观、局部的概念，回答“谁经常挨着谁”——肿瘤细胞 spot 的邻居里，CAF 出现频率是否显著高于随机？邻域分析不直接分区，而是刻画**局部共定位模式**，为生态位组成提供证据。

| 概念 | 尺度 | 回答的问题 | 典型方法 | 强调 |
| --- | --- | --- | --- | --- |
| 空间生态位（niche） | 宏观区域 | 这块区域是什么生物学结构？ | 聚类 + 人工解读命名 | 生物学功能与组成 |
| 空间域（domain） | 宏观区域 | 哪些 spot 转录组相似且空间连续？ | BayesSpace、SpaGCN、STAGATE | 计算划分 |
| 邻域（neighborhood） | 微观局部 | 什么和什么经常挨在一起？ | Squidpy nhood enrichment、co-occurrence | 局部共定位 |

三者关系一句话概括：**邻域是微观证据，空间域是计算分区，生态位是有生物学解释的分区**。本书工作流：先空间聚类划出空间域，再邻域富集验证组成，最后结合先验知识把域命名为生态位——第 10 章会完整走一遍。

![图 4-1 空间生态位概念示意图：组织切片上四个生态位（肿瘤核心/侵袭前沿/免疫浸润区/基质区）的空间分布，右侧为各生态位的细胞组成饼图。](figures/fig06_niche_concept.png){width=85%}

## 4.2 生态位识别方法谱系

生态位识别有三条技术路线，按“用什么信息、产出什么”区分。

### 4.2.1 空间聚类：把“相邻”写进模型

普通聚类（如 Leiden）只认表达矩阵，会把相邻但表达略异的 spot 分开、把不相邻但表达相似的 spot 合并；空间聚类则在模型里加入**空间先验**：相邻 spot 更可能属于同一区域。代表工具各一句话：

- **BayesSpace**（R，Bioconductor）：在聚类模型中加马尔可夫随机场式空间平滑先验，把“相邻 spot 倾向同类”编进贝叶斯框架，内置低分辨率增强。**适用场景**：要统计严谨的分区，想直接得到带空间先验的聚类标签。
- **SpaGCN**（Python）：图卷积网络联合**基因表达 + 空间坐标 + 组织学图像**学习，自动寻找“与组织学结构对齐的”域。**适用场景**：想利用 H&E 图像信息、组织结构清晰。
- **STAGATE**（Python）：图注意力自编码器，用空间自注意力学习 spot 间权重再聚类划分域。**适用场景**：通用首选之一，效果稳健、社区活跃。

三者输入相同（spot×基因矩阵 + 坐标），差异主要在模型假设（贝叶斯先验/图卷积/注意力）与是否利用图像。先用 BayesSpace 预览这类方法的调用形态（完整实操见第 10 章）：

```r
# 预览（第 10 章详解）：BayesSpace 空间聚类最小流程
library(BayesSpace); library(SingleCellExperiment)
sce <- spatialPreprocess(sce, platform = "Visium", n.PCs = 15)
sce <- spatialCluster(sce, q = 7, platform = "Visium", d = 15)
clusterPlot(sce)
```

### 4.2.2 邻域分析：从“组成”验证“分区”

邻域分析不分区，而是统计**细胞类型之间的空间共定位**。Squidpy 的 `nhood_enrichment` 是代表作：对每一对细胞类型，检验“某类型的 spot 邻居中出现另一类型的次数”是否显著高于随机期望，输出 z 分数并做排列检验（permutation test），正 z = 共定位富集（红）、负 z = 互斥（蓝）。`co-occurrence` 则算共现分数随距离的衰减曲线，看两类细胞在多大距离内倾向共现。邻域分析是第 10 章生态位验证与全书空间证据的来源。

![图 4-2 邻域共现富集热图（Squidpy nhood_enrichment 风格，模拟数据演示）：细胞类型对之间的 z 分数，红色表示共定位富集，蓝色表示互斥，可据此判断生态位的典型细胞组合。](figures/fig11_nhood.png){width=70%}

先用代码看一眼邻域富集与共现的调用方式（预览，第 10 章详解）：

```python
# 预览（第 10 章详解）：Squidpy 邻域富集与共现
import squidpy as sq
sq.gr.spatial_neighbors(adata, coord_type="generic", n_neighs=6)
sq.gr.nhood_enrichment(adata, cluster_key="celltype")  # 类型对共定位 z 分数
sq.pl.nhood_enrichment(adata, cluster_key="celltype")  # 富集热图（图 4-2 风格）
sq.gr.co_occurrence(adata, cluster_key="celltype")     # 共现分数随距离衰减
```

### 4.2.3 隐变量/多视图：解释“谁驱动了谁”

**Misty**（R 包 mistyR）不划区域，而是把每个基因的表达方差分解到**自身视图（intraview）、邻域视图（paraview）、旁区视图（juxtaview）**，用回归估计各视图解释的方差，回答“哪些基因的表达受空间环境驱动”。本书只介绍不实操（见 00-TECH 第 3 节），适合作为生态位发现后的“机制追问”工具。

| 方法 | 类型 | 语言 | 一句话原理 | 适用场景 |
| --- | --- | --- | --- | --- |
| BayesSpace | 空间聚类 | R | 贝叶斯框架 + 空间平滑先验分区 | 统计严谨、需控制聚类不确定性 |
| SpaGCN | 空间聚类 | Python | 图卷积联合表达/坐标/H&E 图像 | 组织结构清晰、想用图像信息 |
| STAGATE | 空间聚类 | Python | 图注意力自编码器学空间权重再聚类 | 通用首选、效果稳健 |
| Squidpy nhood_enrichment | 邻域分析 | Python | 排列检验统计类型对共定位 z 分数 | 验证生态位组成、找共定位证据 |
| Squidpy co-occurrence | 邻域分析 | Python | 共现分数随距离衰减曲线 | 看共定位随距离变化 |
| Misty | 隐变量/多视图 | R | 多视图回归分解表达方差 | 追问空间环境对基因表达的贡献 |

## 4.3 细胞通讯推断方法谱系

细胞通讯（cell-cell communication, CCC）推断的基本思路：**配体-受体（ligand-receptor, L-R）数据库**（如 CellChatDB）给出“谁和谁能对话”，表达矩阵给出“双方在不在场”，据此计算通讯概率或活性分数。请记住：**这是计算预测，不是直接测量**——两个 spot 表达了配体和受体，不等于细胞真的在通信，须有共定位等空间证据佐证（见 4.4 与第 13 章）。

### 4.3.1 无空间约束：只看“谁在表达什么”

这类方法只输入表达矩阵与细胞类型标签，**完全不用空间坐标**，可直接用于单细胞数据。

- **CellChat**（R）：基于质量作用定律（mass action）估计配体-受体互作的通讯概率，用排列检验评估显著性，再聚合到通路（pathway）层面。**下游分析完备**（网络、气泡图、差异比较），本书主线工具；v2 增加了空间模式（见下）。
- **NicheNet**（R）：走“配体→受体→下游靶基因”调控链，从**受配体影响的靶基因表达**反推哪些配体最活跃，回答“哪个配体驱动了细胞状态变化”而非仅“谁在对话”。
- **CellPhoneDB**（Python）：统计检验配体-受体对（支持异源复合物）的表达共现，输出显著互作对，数据库由原研团队维护。轻量、直接，适合快速筛选候选互作。

以 CellChat 为例预览通讯分析主流程（第 11 章详解）：

```r
# 预览（第 11 章详解）：CellChat v2 最小流程
cellchat <- createCellChat(object = obj, group.by = "celltype")
cellchat@DB <- CellChatDB.human
cellchat <- subsetData(cellchat)
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
cellchat <- computeCommunProb(cellchat, type = "triMean")
cellchat <- computeCommunProbPathway(cellchat)
cellchat <- aggregateNet(cellchat)
```

### 4.3.2 空间感知：让“距离”参与计算

空间感知方法把坐标纳入模型，回答“哪些通讯在空间上真的可能发生”。

- **COMMOT**（Python）：用**最优传输（optimal transport）**把配体-受体信号在空间扩散，输出逐 spot 的**空间通信活性**（spatial communication score）与信号方向，直接给出“通讯发生在组织哪个位置”，是空间验证利器（第 13 章可选实操）。
- **CellChat v2 空间模式**（R）：createCellChat 识别含坐标的对象，提供 cell groups（按区域聚合）与 cell-spot（逐 spot）两种模式，把通讯信号**投影回组织切片**。本书第 11–13 章用它做生态位内通讯与差异比较。
- **Giotto**（R/Python）：一体化空间分析套件，内含空间通讯模块（表达加权 + 距离约束），适合想在一个框架内完成全流程的用户。

| 方法 | 语言 | 输入 | 输出 | 是否用空间信息 | 一句话定位 |
| --- | --- | --- | --- | --- | --- |
| CellChat | R | 表达矩阵 + 细胞类型 | 通讯概率/通路活性/网络 | 否（v2 可启用） | 主流通讯分析全套工具 |
| NicheNet | R | 表达矩阵 + 靶基因 | 配体活性排序 | 否 | 从下游靶基因反推驱动配体 |
| CellPhoneDB | Python | 表达矩阵 + 细胞类型 | 显著 L-R 互作对 | 否 | 快速筛选候选互作 |
| COMMOT | Python | 表达矩阵 + 坐标 + L-R 库 | 逐 spot 空间通信活性 | 是 | 把通讯定位到组织位置 |
| CellChat v2 空间模式 | R | 含坐标对象 + 细胞类型 | 空间通讯模式图 | 是 | 分区/逐 spot 通讯投影 |
| Giotto | R/Python | 表达矩阵 + 坐标 | 分区/通讯一体化结果 | 是 | 一体化空间分析平台 |

## 4.4 方法选择决策树：本书推荐组合

新手最容易犯的错是“全都要”。方法选择其实是一棵很短的决策树：

1. **第一步要什么？** 要分区 → 空间聚类（BayesSpace/SpaGCN/STAGATE 三选一）；要先看组成 → 邻域富集。
2. **用哪个聚类？** 想在 R 生态里顺手、要统计框架 → BayesSpace；想用深度学习 → STAGATE；想融合 H&E 图像 → SpaGCN。
3. **分区之后验证什么？** 细胞共定位 → Squidpy nhood_enrichment。
4. **通讯怎么做？** 生态位内网络与差异比较 → CellChat v2（分区模式）；想定位通讯发生位置 → COMMOT 空间活性。

本书推荐组合（也是第 10–13 章的执行顺序）：

| 环节 | 推荐方法 | 理由 | 对应章节 |
| --- | --- | --- | --- |
| 定生态位 | BayesSpace + Squidpy 聚类/可视化 | R 生态顺手、空间先验严谨 | 第 10 章 |
| 验证组成 | Squidpy nhood_enrichment | 提供共定位的统计证据 | 第 10 章 |
| 生态位内通讯 | CellChat v2 分区模式 | 全套通讯分析 + 空间投影 | 第 11–12 章 |
| 差异/重编程 | CellChat compareInteractions | 生态位间系统比较 | 第 13 章 |
| 空间活性验证 | COMMOT（可选） | 把通讯定位到组织位置 | 第 13 章 |

伪代码把决策树翻译成逻辑（可运行代码见第 10–13 章）：

```python
# 伪代码：方法选择决策树（仅示意逻辑，不可直接运行）
if 目标 == "划出空间区域":
    工具 = {"想融合H&E图像": "SpaGCN",
            "想要统计框架": "BayesSpace",
            "想用深度学习": "STAGATE"}
    标签 = 运行空间聚类(工具)
elif 目标 == "验证细胞组成":
    z分数 = squidpy.nhood_enrichment(邻域图)
    热图(z分数)   # 红=富集，蓝=互斥
elif 目标 == "生态位内通讯":
    通讯概率 = CellChat.computeCommunProb(按生态位分组)
    网络图(通讯概率)
elif 目标 == "空间活性验证":
    commot.tl.spatial_communication(坐标, 距离阈值)
    空间散点(活性分数)
```

## 4.5 两张图读懂本书的生态位视角

图 4-1 展示“**生态位长什么样**”：切片被划分成四个生态位，每个右侧配细胞组成饼图。注意划分依据不只是“表达相似”，还包括**空间连续性**（相邻 spot 倾向同一生态位）与**生物学组成**（每个生态位的细胞组合可解读）——这就是生态位 ≠ 普通聚类的含义。

图 4-2 展示“**如何用证据支撑生态位**”：热图里细胞类型对的红蓝 z 分数显示哪些细胞倾向共聚，“肿瘤细胞×CAF”显著偏红即为“侵袭前沿由肿瘤与 CAF 交界构成”提供共定位证据。两张图合起来正是本书方法论闭环：**宏观分区（生态位）+ 微观证据（邻域富集）**。

## 4.6 为什么“先分生态位、再做通讯”更有生物学意义

你可能想问：直接在整个组织上跑一遍 CellChat 不就行了，为什么先分生态位？

因为**全局分析会把空间异质性“平均掉”**：肿瘤核心的肿瘤-肿瘤通讯、免疫浸润区的 T-B 互作、侵袭前沿的肿瘤-CAF 交界信号，在全局网络里混成一张“什么都有但什么都不突出”的大网，侵袭前沿特异的免疫抑制信号（PD-L1/PD-1、TGF-β）被肿瘤核心稀释，检验可能不显著。先按生态位分区、再在每个生态位内独立分析，相当于把镜头从“整座城市”拉近到“每个街区”——每个街区的通讯模式是自己的，差异（“重编程”）才可见。这正是本书核心卖点（communication reprogramming），第 12、13 章会反复回到这个逻辑。

## 本章小结

- 生态位（生物学分区）、空间域（计算分区）、邻域（局部共定位）是三个不同尺度的概念，全书主线是“邻域证据 → 空间域 → 生态位”。
- 生态位识别三路线：空间聚类（BayesSpace/SpaGCN/STAGATE）、邻域分析（nhood enrichment、co-occurrence）、隐变量/多视图（Misty）。
- 通讯推断两路线：无空间约束（CellChat、NicheNet、CellPhoneDB）与空间感知（COMMOT、CellChat v2 空间模式、Giotto）。
- 本书组合：BayesSpace/Squidpy 定生态位 + CellChat v2 分区通讯 + Squidpy 共定位验证 + COMMOT 空间活性。
- 通讯推断是计算预测，须配合空间共定位证据解读。

## 练习与思考

1. **概念题**：分别解释 spatial niche、spatial domain、neighborhood，各回答什么问题。
2. **判断题**：（a）nhood_enrichment 能直接输出生态位分区？（b）BayesSpace 属于空间感知通讯方法？（c）Misty 把表达方差分解到不同空间视图？
3. **选择题**：数据带清晰 H&E 图像且想利用图像信息分区，首选哪个工具？为什么？
4. **动手题**：安装 squidpy，用 `sq.datasets.visium_hne()` 加载示例数据，运行 `sq.gr.nhood_enrichment` 画富集热图，对照图 4-2 观察红蓝分布。
5. **讨论题**：为什么“两个 spot 分别表达配体与受体”不等于“细胞真的在通讯”？还能补充哪些证据？
