Visium技术背景与数据特点归纳总结
说实话,刚开始接触Visium这个平台时,我也是一头雾水。那时候市面上主流的单细胞测序已经挺成熟了,突然冒出个“空间转录组”,第一反应就是:这不就是在组织切片上做了个原位杂交的升级版吗?后来真正上手了几个项目,才意识到背后那套技术逻辑完全不一样。
我习惯把Visium理解为“带坐标的单细胞测量”,但这么说其实也不严谨。咱们先把这个背景捋清楚,因为你后面所有聚类参数调优,都是基于这个技术底子来设计的。
1.1 Visium的实验流程与核心设计
Visium的湿实验步骤,大致是这样走的:
- 取新鲜冰冻组织,做冷冻切片,厚度一般是10μm。
- 把切片贴在Visium捕获玻片上,进行H&E染色,拍一张高清明场图。
- 组织透化处理,让mRNA释放出来,扩散到玻片上的捕获点。
- 每个捕获点上有带空间条形码(Spatial Barcode)的poly-T探针,抓取mRNA。
- 建库、测序,拿到基因表达矩阵和空间坐标的对应关系。
嗯,这里要注意:捕获点不是连续的,也不是单细胞级别的分辨率。我一开始就犯过这个错误——以为Visium能直接画出单细胞的基因表达图谱,结果发现一个捕获点下覆盖了1到10个细胞。说白了,它是多细胞混合的斑块测量。
核心数字要记住:
- 捕获点直径:55μm
- 捕获点间距:100μm(中心到中心)
- 每个点覆盖细胞数:1~10个
- 一片标准玻片有约5000个捕获点
这个空间分辨率,决定了后续我们做聚类的时候,不能简单照搬单细胞RNA-seq那套流程。我在项目中踩过最大的坑,就是把单细胞的聚类参数直接扔到Visium数据上跑,结果稀碎。
1.2 Visium数据长什么样
数据拿到手里,核心就三个东西:
- 基因表达矩阵:行是基因,列是捕获点(spot),值是UMI计数。
- 空间坐标表:每个捕获点的像素坐标(在H&E图上的位置)。
- H&E全切片图像:高分辨率染色图,做组织形态学参考。
咱们直接看个实际的矩阵片段:
spot_1 spot_2 spot_3 spot_4 spot_5
GAPDH 152 89 210 45 176
ACTB 98 134 167 23 201
MALAT1 1203 987 1456 567 1345
TP53 0 2 1 0 0
EGFR 1 0 3 0 2
你看到了吧?稀疏性非常明显。很多点在很多基因上计数为0。为什么?因为一个点只覆盖几个细胞,而且组织不同区域的细胞类型差异巨大。我记得有一次处理小鼠脑组织数据,皮质区域的点富集了神经元的标记基因,而白质区域几乎全是少突胶质细胞的信号。这种空间异质性,就是Visium聚类的核心信号来源。
1.3 Visium数据与单细胞数据的三个本质差异
我列个表,你可以对比着看,这对我后面调参思路影响很大。
| 维度 | 单细胞RNA-seq | Visium空间转录组 |
|---|---|---|
| 基本单元 | 单个细胞 | 多细胞捕获点(1~10个细胞) |
| 数据量 | 数万个细胞 × 2万个基因 | 数千个点 × 2万个基因 |
| 稀疏程度 | 中等(每个细胞检测到2000~5000个基因) | 高(每个点检测到500~2000个基因) |
| 空间信息 | 无 | 有明确的二维坐标 |
| 数据分布 | 细胞间独立采样 | 点之间有空间自相关 |
我简单说下这个表格背后的意思。
单细胞数据,每个细胞是独立的样本。Visium数据,相邻的点基因表达是相关的——因为同一个组织区域,细胞类型组成相似。这种空间自相关性,既是聚类算法的辅助信号(相邻点应该归为一类),也会带来统计上的麻烦(样本不独立,传统假设检验会低估P值)。
避坑提醒: 我以前在做差异表达分析时,直接用单细胞的Wilcoxon秩和检验比较两个聚类簇,结果发现大量假阳性。原因很简单:同一个簇内的点,空间上靠近,基因表达本来就相似,被当作独立重复采样了。后来改用SpatialDE或SPARK这类考虑了空间位置的方法,情况才好转。
1.4 Visium数据的质量控制指标
拿到原始数据,我习惯先跑一遍QC。几个关键指标:
- 测序饱和度:一般要求>80%,低于这个值的文库复杂度不够。
- UMI中位数/点:好的数据集在2000~8000之间。低于1000的点,一般是组织边缘或坏死区域,建议过滤掉。
- 基因检测数/点:正常的在500~2500。太少可能透化不充分,太多可能RNA降解。
- 线粒体基因比例:超过20%的点,说明细胞膜破损,RNA泄漏了,要剔除。
举个例子,我在处理一批小鼠心脏数据时,发现一个奇怪的现象:心肌区域UMI中位数只有800,而心外膜区域却有5000。后来查实验记录,才发现那片心肌切片透化时间偏短,mRNA释放不充分。如果你不做QC,直接跑聚类,心肌和心外膜的差异会被严重扭曲。
1.5 空间信息的数学表达方式
你可能会问:Visium的空间信息,在算法层面怎么用?
每个捕获点有二维坐标,单位是像素。通常我们把它归一化到[0,1]区间。两个点的欧氏距离,直接反映了它们在组织上的物理远近。
最关键的一点是:空间邻接矩阵。每个点与其周围6个距离为100μm的点构成一个六边形网格。我一般用这个邻接关系来计算空间权重,或者作为图神经网络中的边结构。
一个小技巧: 在用Scanpy处理Visium数据时,可以这样构造邻接矩阵:
# adata是Anndata对象,包含spatial坐标
from scipy.spatial import KDTree
coords = adata.obsm['spatial']
tree = KDTree(coords)
# 寻找距离小于120μm的邻居(留一点容忍度)
adj_matrix = tree.sparse_distance_matrix(tree, max_distance=120)
这个邻接矩阵,在后面做空间约束聚类、Smooth聚类结果、甚至空间变异基因检测时,都会反复用到。这也是Visium数据和单细胞数据最根本的区别——你不能忽略“位置”。
1.6 对聚类参数调优的直接影响
写到这里,你可能已经猜到我后面要讲什么了。Visium的数据特点,对聚类参数提出了几个特殊要求:
- 稀疏性高 → PCA降维时,主成分数不能太少,否则信号会被噪音淹没。我一般选30~50个PC。
- 空间自相关 → 聚类算法不能只看表达谱相似性,还要考虑空间连续性。Leiden聚类时,可能需要调整分辨率来平衡空间紧致性和表达异质性。
- 点数量少 → 聚类参数对初值敏感。同一个数据集,换个随机种子可能跑出完全不同的结果。后面我们会讲怎么用稳定性投票来缓解这个问题。
- 细胞混合 → 一个点可能包含多种细胞类型,聚类时不能期望每个点只属于一个纯粹的细胞类型。软聚类或部分分配更符合生物学实际。
我把这些核心逻辑画了张图,方便你整体把握。
这张图其实概括了本章的核心逻辑。Visium数据不是单细胞数据的简单空间版,它有自己独特的稀疏性结构、点依赖关系和分辨率限制。后面所有聚类参数调优,本质上都是在回答一个问题:在兼顾空间连续性和表达异质性的前提下,怎么找到最可靠的细胞类型区划分?
一句话总结: Visium的55μm/100μm设计,决定了它是一个探索空间区域转录组差异的工具,而不是单细胞分辨率的分型器。你调参时,心里始终要有这根弦。