生信从湿到干 · 交互式动画教程
⭑ 试用 OmicOne
第 9 章数据分析

聚类:在邻居网络里找群落

聚类把表达相似的细胞分到一组。Seurat 并不直接在坐标上划分细胞,而是先在 PC 空间里建一张“邻居网络”,再在网络里找连接紧密的群落。分辨率这个参数决定了群落分得多细。

从邻居到群落

第一步是 FindNeighbors:在前若干个 PC 构成的空间里,为每个细胞找到离它最近的 k 个细胞(Seurat 默认 k = 20),连成k 近邻图。Seurat 再按两个细胞的邻居有多少重叠,给连线加权,得到 SNN 图。两个细胞共享的邻居越多,它们之间的连接越强。

第二步是 FindClusters:在这张图上做社区发现,寻找内部连接密、彼此之间连接稀疏的细胞群落,目标是最大化“模块度”。常用算法有两种:Seurat 的默认算法是 Louvain;Leiden 是它的改进版,保证每个群落内部是连通的。Scanpy 和 OmicOne 默认使用 Leiden。

obj <- FindNeighbors(obj, dims = 1:10)
obj <- FindClusters(obj, resolution = 0.5)

分辨率决定簇的数量

分辨率与簇的数量真实数据
正在加载数据…

分辨率是模块度公式里的一个参数:越大,算法越倾向于把群落切小,得到的簇越多。在组件里把分辨率从 0.1 拖到 1.5,看 UMAP 上的簇怎样合并与分裂、簇的数量怎样变化。组件的簇和 Seurat 教程一样,用 Louvain 在前 10 个 PC 上计算,分辨率 0.5 时得到 9 个簇。常见的现象是:分辨率低时,T 细胞是一大片;分辨率升高后,逐渐分出初始 CD4、记忆 CD4、CD8 等亚群。

没有“正确”的分辨率。Seurat 教程建议约 3,000 个细胞的数据取 0.4–1.2,pbmc3k 教程用 0.5。实际选择取决于你的问题:只想区分大类就用低分辨率;关心亚群时,可以先在低分辨率下分出谱系,再对某一谱系单独重新聚类。一个实用的检查是看相邻分辨率之间簇的分裂是否稳定,以及每个新分出来的簇有没有自己的标志基因。

常见误区

  • 把簇等同于细胞类型。 连续变化的细胞状态也会被切成几段;簇是分析的工具,不是生物学结论。
  • 在 UMAP 坐标上聚类。 聚类应在 PC 空间的图上完成;UMAP 只是展示。
  • 为了得到想要的结果反复调分辨率。 选定分辨率的理由应当在看结果之前就说得清。
  • 对簇做“簇间差异”检验并当成独立证据。 簇本身就是从同一份数据里分出来的,再检验它们之间的差异必然显著(第 11 章)。
  • 忽视随机性。 不同算法或随机种子会让边界上的细胞换簇;报告时写明算法、PC 数、k 和分辨率。