Visium空间聚类算法选型与质量评估 - 第1节

1.1 空间转录组学是什么

空间转录组学,说白了就是给基因表达加上一个位置坐标。传统转录组学把组织磨碎了测,所有细胞混在一起,你不知道哪个基因在哪表达。我刚开始接触这个领域时,最头疼的就是这个问题——明明病理切片上看到肿瘤和正常组织挨在一起,但差异基因分析完全看不出空间关系。

Visium 技术解决了这个痛点。它在一块玻片上排布了数千个带有空间条形码的捕获点,每个点直径 55 微米,覆盖大约 1-10 个细胞。组织切片贴上去后,mRNA 会扩散到对应的捕获点,反转录后带上位置标签。测序回来,每个基因的表达量就有了一个精确的坐标。

一句话总结:Visium = 组织形态 + 基因表达 + 空间位置。

1.1.1 Visium 能做什么

我见过很多新手拿到数据后一头雾水。其实可以先把应用场景分成三类:

  • 区域标记:识别肿瘤边缘、免疫浸润区、神经斑块等具有空间特异性的结构
  • 邻域分析:研究细胞之间的通讯模式,比如免疫细胞是否集中在肿瘤周围
  • 轨迹推断:从组织边缘到中心,细胞状态是否存在连续变化

举个例子,我在一个胶质瘤项目中,用 Visium 数据做空间聚类,发现一类巨噬细胞亚型只出现在肿瘤浸润前沿。常规 scRNA-seq 根本看不到这种空间分布规律。空间聚类算法,就是帮你把这些有意义的区域自动找出来。

1.2 Visium 技术原理与数据产出

理解了能做什么,再来看看数据是怎么来的。我不会把 10x Genomics 的官方文档搬过来,只讲你最需要关心的三个环节。

1.2.1 从组织切片到基因矩阵

整个流程大致分为五步:

  1. 组织切片:新鲜冰冻或 FFPE 样本,切成 10 μm 薄片,贴到 Visium 玻片上
  2. HE 染色:获取组织形态学图像,用于后续配准
  3. 透化与捕获:组织中的 mRNA 释放出来,与玻片上带有空间条形码的探针结合
  4. 文库构建 + 测序:每个捕获点独立建库,测序深度通常每个点 1-5 万 reads
  5. 数据下机:得到两个核心文件——基因表达矩阵和空间坐标文件

实战建议:拿到数据后,先检查空间坐标文件和表达矩阵的行数是否一致。我在项目中发现过几次因为软件版本问题导致坐标错位,那叫一个折腾。

1.2.2 关键技术参数

下面这个表格我建议你打印出来贴在桌前。选算法时这些参数直接决定你的分析策略。

参数 数值 对分析的影响
捕获点直径 55 μm 每个点可能包含多个细胞,不是单细胞分辨率
点间距(中心到中心) 100 μm 相邻点之间有重叠信息,但不足以覆盖所有细胞
捕获点总数(标准玻片) ~5000 数据量不算大,适合用桌面级服务器处理
组织覆盖面积 6.5 × 6.5 mm 适合中小尺寸组织,大器官可能需要多次捕获

我刚开始做时也被这些参数折磨过。你以为抓住了 55 μm 就能精确对应一个细胞?实际上肿瘤区域细胞密集,一个点可能包进去 10 个肿瘤细胞和几个免疫细胞。空间聚类算法就是要处理这种混合信号的问题。

1.3 Visium 数据的基本结构

数据下机后,你看到的通常是一个 Visium 目录,里面最重要的就两个东西:

  • filtered_feature_bc_matrix.h5:HDF5 格式的基因表达矩阵,行是基因,列是捕获点
  • spatial/tissue_positions_list.csv:每个捕获点的像素坐标和玻片上的物理坐标

怎么加载?如果你用 Scanpy,一两行就搞定:

import scanpy as sc
adata = sc.read_visium(path="your_data_dir")

返回的是一个 AnnData 对象。我习惯先看一下 adata.obsm['spatial'],确认坐标数据是像素坐标(通常是),还是有人手滑转换成了微米值。这坑我踩过两次。

1.3.1 数据量与内存预估

很多人一上来就抱怨内存不够。其实 Visium 的数据量很温和:

  • 每个样本约 5000 个点 × 20000 个基因 ≈ 1.5 GB(稀疏矩阵格式更小)
  • 常见的分析流程(标准化、降维、聚类)在 16 GB 内存的机器上就能跑
  • 如果你的数据集包含 30 个样本,建议至少 64 GB

注意:空间聚类算法中,有些方法会构建图结构,比如使用 kNN 或 图卷积,这时候内存消耗会翻倍。我曾在一个 50 样本的项目中,跑 BayesSpace 时内存飙到了 100 GB。提前规划资源会让你少很多麻烦。

1.4 空间聚类:核心目标与挑战

好了,现在你有基因表达数据和空间坐标了。下一步就是找到那些在空间上有意义的区域。空间聚类,本质上是在做两件事:

  • 利用基因表达相似性给每个捕获点分组
  • 利用空间距离约束保证分出来的组是连续的

为什么不能直接拿普通聚类算法做?我可以给你讲个真实案例。有次我拿 Louvain 算法直接对 Visium 数据做聚类,结果分出来 12 个 cluster,但画在组织切片上一看——这些 cluster 像芝麻一样撒得到处都是,完全没有空间连续性。当时的 PI 看了一眼图,问我:“你确定这是同一个组织?” 从那以后,我再也不敢忽略空间信息的约束了。

1.4.1 空间聚类的特有挑战

我个人总结出三大挑战:

  1. 分辨率不是单细胞:每个捕获点包含多个细胞,你拿到的是一个混合表达谱。算法必须能处理这种混合信号。
  2. 大尺度变化:组织中心区域细胞核密集,边缘稀疏。同一个空间聚类算法在不同区域表现可能完全不同。
  3. 批次效应:多张玻片之间、不同的染色时间、不同的透化条件都会引入系统性偏差。

嗯,记住一点,没有万能的算法。后面的章节我会带你一个个拆解。

1.5 Visium 技术的应用场景与选算法前的准备

在开始选算法之前,我建议你先问自己三个问题:

  • 我的组织样本有多大?是否包含多个解剖结构?
  • 预期空间结构是层级式(如大脑皮层)还是离散式(如肿瘤浸润)?
  • 计算资源和时间要求有多严格?

举个例子,如果你做的是神经科学,涉及大脑皮层分层,那你可能需要保留精细的空间层级,这时候简单的聚类方法往往不够。我倾向于用基于图的方法或贝叶斯方法。但如果你只是想把肿瘤区域和正常区域分开,简单方法可能更快。

1.5.1 数据质量检查清单

每次新项目我第一步都是跑一遍这个清单:

  1. 查看捕获点总数,确认没有过多质量低的点(< 1000 counts/点)
  2. 检查组织切片图像是否与坐标对齐——用 Spotlight 可视化快速看一眼
  3. 记录测序饱和度,低于 1 million reads 的样本考虑过滤

实用技巧:在正式跑聚类前,先用一个简单的 K-means(k=5~10)跑一遍,看结果是否出现大面积的不连续区域。如果出现大量孤立点,说明你的数据噪声可能偏大,或者组织切片质量有问题。

Visium 技术给了我们一张带有基因表达的地图。接下来,我们要选对地图上的画笔——空间聚类算法。从第二章开始,我会逐步讲解每种方法的原理、参数调整和实战案例。这部分先到这里,把基础打牢,后面才不容易被各种算法绕晕。

开始分析前的黄金时间:我个人的习惯是,数据加载完后的 15 分钟不做任何分析。只看三样东西——组织切片、总 UMI 分布、基因数分布。有时候问题就藏在这些简单的可视化里。