1、Visium技术原理简介与数据特点
刚开始接触Visium的时候,我也觉得不就是个空间转录组嘛,跟单细胞差不太多。做了几个项目之后才发现,它背后的探针设计逻辑和组织切片处理,直接决定了你能从数据里挖出什么。这一章我带你走一遍整个流程——从探针怎么设计,到组织切片怎么上芯片,再到你手头那个.h5文件和spatial文件夹里到底放了啥。
1.1 探针设计:捕获mRNA的关键
Visium用的是空间条形码(spatial barcode)技术。每一张捕获玻片上,密密麻麻排着数千个捕获点(spots),每个点的直径55μm,点间距100μm。每个点上面都连着一段DNA探针。这段探针的结构很有意思:
- 最外面:一段通用引物(可以用来建库)
- 中间:一个空间条形码(唯一标识该点位的坐标)
- 再里面:一个UMI(Unique Molecular Identifier),用于去除PCR重复
- 最末端:一段poly(dT)序列,用来捕获带有poly(A)尾巴的mRNA
我有个项目做小鼠脑组织,当时没注意探针的物种兼容性,直接用人的探针去跑——结果信号极低。后来才搞清楚,Visium的探针设计是针对特定物种的mRNA poly(A)尾巴的,虽然不同物种poly(A)尾巴保守,但探针的捕获效率和背景噪音差别很大。
1.2 组织切片与上芯片
组织切片是这个流程里最容易翻车的环节。我自己第一次做的时候,切出来的厚度是15μm,结果组织碎片一堆,渗透效率极差。Visium官方推荐的厚度是10μm,对于大部分组织(脑、肿瘤、肝脏)都适用。太厚了,mRNA渗透不进去;太薄了,组织容易破损。
切片之后,组织被贴到捕获玻片上。注意:不是随便贴。你得在透化(permeabilization)之前,用H&E染色或者免疫荧光给组织拍一张明场图像。这张图后面要做两个事:一是用来给组织区域做手动/自动对齐,二是作为基因表达热图的背景参考。
透化步骤很关键:用蛋白酶把细胞膜打孔,让mRNA释放出来,向下扩散到捕获点上。透化时间如果太短,mRNA出不来;太久,mRNA会扩散到相邻的点,造成空间溢漏(spillover)。我记得有个肿瘤样本,透化时间从12分钟延长到18分钟,结果相邻基因的表达相关性从0.3飙到0.7——明显溢漏了。
1.3 原始数据到底长什么样?
做完测序下来,你拿到的东西大概长这样:
- 一个
filtered_feature_bc_matrix.h5或raw_feature_bc_matrix.h5 - 一个
spatial文件夹,里面包含tissue_hires_image.png、tissue_positions_list.csv、scalefactors_json.json等文件 - 可能的还有
aligned_fiducials.jpg
我习惯把.h5文件理解成一张稀疏矩阵表:行是基因,列是捕获点的条形码(barcode),值是UMI计数。注意,每个捕获点对应一个条形码,而不是像10x单细胞那样一个条形码对应一个细胞。这一点经常有人混淆。
下面这张SVG图帮你理清从组织切片到数据表格的完整流程:
1.4 理解tissue_positions_list.csv和scalefactors_json.json
这两个文件是你把基因表达“贴”回到组织图像上的桥梁。我简单拆解一下:
| 文件 | 内容 | 关键字段 |
|---|---|---|
| tissue_positions_list.csv | 每个捕获点的7列信息 | barcode, in_tissue, row, col, imagerow, imagecol, pixel_x, pixel_y |
| scalefactors_json.json | 图像缩放比例等元数据 | tissue_hires_scalef, spot_diameter_fullres, fiducial_diameter_fullres |
举个例子:in_tissue是0或1,1表示这个点落在组织区域内。我遇到过一批数据,组织切片没贴好,in_tissue有80%是0,结果有效点只有200个——这种样本基本没法做下游聚类。
# tissue_positions_list.csv 示例(前3行)
AAACCCAAGAAACACA-1,1,39,12,86.2,115.8,86.2,115.8
AAACCCAAGAAACAGG-1,1,39,13,86.2,116.8,86.2,116.8
AAACCCAAGAAACTAC-1,0,39,14,86.2,117.8,86.2,117.8
// scalefactors_json.json 示例
{
"tissue_hires_scalef": 0.170,
"spot_diameter_fullres": 89.32,
"fiducial_diameter_fullres": 106.0,
"tissue_lowres_scalef": 0.042
}
1.5 数据特点影响后续分析策略
明白了原始数据的结构,你就能预见到几个重要特点:
- 稀疏性:每个捕获点覆盖多个细胞(大约1~10个细胞,取决于组织类型),所以表达矩阵比单细胞更稀疏,基因检出率低。我习惯用过滤标准:保留至少在10个点中有表达的基因,并且每个点至少检测到100个UMI。
- 空间自相关:相邻捕获点的表达模式相似,这是空间聚类的基础。但也是假阳性空间信号的来源——比如透化时间过长导致的溢漏。
- 批次效应:不同切片、不同芯片、不同测序批次之间,技术差异很明显。我有个项目让同一个实验室做了两批,结果UMI中位数差了3倍,必须在聚类前用harmony或scVI做批次校正。
tissue_positions_list.csv中in_tissue为1的点位比例(应>60%),再画一个总UMI的空间分布图——如果某个区域的UMI突然断崖式下降,很可能那个区域组织脱离或者透化失败。
嗯,这一章就到这里。你心里大概对Visium的“物理”部分和数据源头有个概念了。下一部分我们真正动手,把原始.h5数据读进Python环境,开始做质量控制和归一化。