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——明显溢漏了。

避坑指南:透化时间需要针对每种组织类型做预实验。我曾经做过一次小鼠脾脏,默认的12分钟导致信号非常弱,后来发现脾脏细胞膜更致密,需要20分钟才行。别信推荐值,一定做时间梯度测试(6/12/18/24分钟)再决定。

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图帮你理清从组织切片到数据表格的完整流程:

Visium技术原理与数据结构流程 组织切片 厚度10μm,贴到捕获玻片上 H&E染色 + 明场成像 获得组织切片显微图像 透化 蛋白酶打孔,释放mRNA mRNA捕获 poly(dT)探针 + 空间条形码 + UMI 文库构建 + 测序 Illumina测序,获得FASTQ 数据矩阵 .h5文件 + spatial文件夹 核心数据结构: 每个捕获点 → 一个条形码 → 一个UMI计数向量 → 对应一个基因表达谱 空间坐标由 tissue_positions_list.csv 提供,与图像像素对齐

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环境,开始做质量控制和归一化。