2. Visium 数据分析流程概述
做空间转录组的人都知道,Visium 的数据分析跟普通单细胞还真不一样。它多了一层空间坐标信息,处理起来既要有 scRNA-seq 的功底,又要懂图像对齐。我个人习惯把整个流程拆成三个大阶段:**数据预处理 → 核心分析 → 空间解读**。下面我一步步拆开讲,顺便把我踩过的坑也说一下。
2.1 数据预处理:从 FASTQ 到基因表达矩阵
Visium 的数据通常包括两大部分:FASTQ 文件(测序 read)和组织图像(H&E 或荧光)。Space Ranger 是 10x 官方的处理管线,我们可以在容器中跑它。但要注意——它依赖参考基因组和探针集,这俩都得提前准备好。
| 处理步骤 | 输入 | 输出 | 关键参数 |
|---|---|---|---|
| FASTQ 纠错 | 原始 FASTQ | 校正后 BAM | --barcode-mismatches=1 |
| UMI 去重 | BAM | 基因-斑点计数矩阵 | --umi-dedup=auto |
| 空间定位 | 图像 + 斑点索引 | 空间坐标文件 (tissue_positions_list.csv) | --slide=V1, --area=A1 |
| 矩阵合并 | 计数矩阵 + 空间坐标 | 过滤后的 HDF5 / MEX | --expect-cells=5000 |
我最初做 Visium 项目时,曾经因为 FASTQ 的 barcode 错配率设置太低(默认 0)丢了一半的斑点。后来我习惯调整到 1 或 2,数据回收率提升明显。不过别为了回收率瞎放参数,否则噪音也进来了。嗯,这个平衡点需要你根据测序质量来试。
小贴士:如果你在容器里跑 Space Ranger,记得挂载 reference 目录和 slide 目录的卷。我自己一般这样启动:
docker run --rm -v /data/ref:/ref -v /data/fastq:/fastq \
-v /data/output:/out 10xgenomics/spaceranger:3.1.0 \
spaceranger count --id=sample1 \
--transcriptome=/ref/refdata-gex-GRCh38-2020-A \
--fastqs=/fastq \
--image=/data/images/tissue_hires_image.png \
--slide=V11J25-043 --area=A1 \
--localcores=8 --localmem=64
2.2 空间对齐与质量控制
空间对齐是 Visium 区别于单细胞的核心。说白了,就是把测序得到的每个“斑点”的坐标,跟组织切片的高清图像匹配上。图像处理这一步,我强烈推荐用 Loupe Browser 手动核对一下自动对齐结果。我有一次自动对齐偏移了 2 个像素,导致十几个斑点位置错了,最后聚类出来一团浆糊。
质量控制阶段会过滤掉低质量的斑点。常用的指标包括:
- UMI 计数:低于 500 的斑点通常噪声较多,建议去掉。
- 基因检出数:少于 200 个基因的斑点可能是空斑点。
- 线粒体比例:超过 20% 可能细胞死亡。
- 组织覆盖面积:图像中组织空白区域的斑点要剔除。
⚠️ 注意:QC 参数的阈值没有标准答案。我见过肿瘤样本的 UMI 中位数只有 800,却比正常组织更值得分析。别盲目套公式,结合图像和生物学背景来判断。
筛选后,我们会得到一个干净的 filtered_feature_bc_matrix.h5 文件。这个文件就是后续分析的基础。
2.3 核心分析:降维、聚类与差异表达
拿到表达矩阵后,其实就跟单细胞分析很像了。但别高兴太早——空间数据的批次效应比单细胞更隐秘,因为不同切片之间的背景染色、组织厚度都不一样。我建议在归一化时使用 SCTransform 或 log-normalize + scale,然后 PCA 降维。这里有张常见的参数对比表:
| 归一化方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| LogNormalize | 速度快,经典 | 高表达基因压制不够 | 快速探索 |
| SCTransform | 去除测序深度影响好 | 内存占用大,慢 | 多切片整合 |
| Pearson residuals | 统计严谨,适合大矩阵 | 需要 GPU 加速 | 百万级斑点 |
降维后我一般选 30 个主成分做 UMAP,然后用 Leiden 或 Louvain 聚类。这里有个我个人觉得挺实用的做法:调整分辨率时,先试试 0.5、0.8、1.2 三个值,然后在空间图上看看分团是否跟组织形态一致。如果你的聚类结果把同一个腺体结构切成两半,说明分辨率高了。
差异表达分析我就不多说了,常用 Wilcoxon 秩和检验或 MAST。关键是要记得同时输出 空间可视化图,比如 Feature Plot 叠加到 H&E 图像上。这对生物学解读帮助巨大。
一个典型的 Seurat 分析流程(R 语言):
library(Seurat)
library(SeuratData)
# 加载空间数据
brain <- Load10X_Spatial(data.dir = "./filtered_feature_bc_matrix",
filename = "filtered_feature_bc_matrix.h5",
image = "tissue_hires_image.png")
# 标准化与降维
brain <- SCTransform(brain, assay = "Spatial", verbose = FALSE)
brain <- RunPCA(brain, npcs = 30, verbose = FALSE)
brain <- FindNeighbors(brain, dims = 1:30)
brain <- FindClusters(brain, resolution = 0.8)
brain <- RunUMAP(brain, dims = 1:30)
# 差异表达
markers <- FindAllMarkers(brain, only.pos = TRUE, logfc.threshold = 0.25)
# 空间绘图
SpatialDimPlot(brain, pt.size.factor = 1.6)
2.4 空间模式与功能解读
聚类只是第一步。真正的价值在于识别组织区域的生物学功能。比如,你可以用 空间自相关分析(Moran's I)找出在组织中呈现区域性表达的基因;或者做 配体-受体相互作用 来推断细胞通讯。
我经历过一个案例:肿瘤切片中一个聚类正好位于坏死区边缘,差异表达分析里富集了缺氧信号通路。如果我们只看单细胞数据,这个空间位置信息就完全丢失了。所以,我建议分析流程里至少包含以下两个附加步骤:
- 空间变量基因鉴定——用 SpatialDE 或 SPARK-X;
- 空间富集分析——结合组织切片的分区(皮层、髓质等)做 GO/KEGG。
嗯,这些步骤计算量不小,尤其当你有多个切片时。容器化部署的价值就在这里——我们可以把分析环境固定,然后横向扩展。下一节(第 3 章)咱们再深入讲容器构建。
总得来说,Visium 的数据分析不是一条直线,而是一个迭代过程:先快跑一版,看图像和聚类是否吻合,再调整参数,直到你觉得“对,这片子就该长这样”。我个人习惯把每次调参的命令和中间结果存到 Git,方便回滚和复现。这一点在容器化部署中也同样重要。