从原始数据到聚类结果:Visium分析全流程概览

老实说,刚接触Visium数据的人,最容易被各种文件格式和参数搞晕。我在新手期就吃过这个亏——对着bam文件和loupe文件发愁,不知道从哪下手。这一章我带你把整条链路跑一遍,心里有个谱。

核心一句话:Visium分析就是把空间位置信息加到单细胞转录组分析里。多了一个坐标,少了很多猜测。

整体数据流

一条典型的Visium数据分析管线,说白了就是四步走:

  1. 原始数据处理——从测序仪出来的FASTQ文件,加上一个关键的HE染色图像
  2. 表达定量——把reads比对到参考基因组,生成基因表达矩阵
  3. 降维与聚类——常规scRNA-seq那套方法,加上空间坐标约束
  4. 结果验证——用病理图像做视觉校验

我个人习惯把这四步看作“生产-验证”闭环。你想想看,没有图像验证,你的聚类可能只是统计上的假象。

原始数据处理

这一步由Space Ranger完成。输入和输出长这样:

输入:
  FASTQ文件(测序数据)
  参考基因组(GRCh38或mm10)
  探针集文件(Visium特有)

输出:
  raw_feature_bc_matrix.h5         # 原始表达矩阵
  filtered_feature_bc_matrix.h5    # 过滤后矩阵
  spatial/tissue_hires_image.png   # 高分辨率组织图像
  spatial/tissue_lowres_image.png  # 低分辨率图像
  spatial/scalefactors_json.json   # 尺度系数
  spatial/tissue_positions.csv     # 每个spot的空间坐标
  analysis/clustering/             # 预计算的聚类结果

嗯,这里要注意的是raw_feature_bc_matrix.h5和filtered_feature_bc_matrix.h5的区别。我在项目中遇到过有人直接用raw matrix做降维,结果组织背景里的残留RNA全被纳入了分析,聚类效果惨不忍睹。

别踩这个坑:Space Ranger默认使用组织检测算法来判断哪些spot落在组织区域内。如果你的切片质量差(比如有褶皱、气泡),这个检测可能会失败。我曾经在一次肝脏样本中因为气泡太多,导致一半的spot被错误排除。手动调整tissue_positions.csv里的in_tissue标志是唯一的抢救方案。

表达定量核心命令

跑一条完整的Space Ranger命令,大概长这样:

spaceranger count \
  --id=sample1 \
  --transcriptome=/data/references/GRCh38 \
  --fastqs=/data/fastqs \
  --sample=SAMPLE1 \
  --image=/data/images/SAMPLE1.tif \
  --slide=V10M30-004 \
  --area=A1 \
  --loupe-alignment=/data/alignments/SAMPLE1.json \
  --localcores=16 \
  --localmem=64

这里--loupe-alignment文件是你在Loupe Browser里手动对齐图像和阵列得到的。我个人强烈建议这一步别偷懒,自动对齐经常对不准,尤其是针对脂肪组织或纤维化组织——图像特征太少,算法容易漂。

降维与聚类管线

拿到filtered_feature_bc_matrix.h5之后,后面的分析逻辑和单细胞非常接近。我用一个表格帮你对比一下:

步骤方法/工具输入输出
质量控制过滤低质量spot(UMI数、基因数、线粒体比例)filtered h5clean h5
标准化SCTransform或LogNormalizeclean h5归一化矩阵
特征选择高变基因(top 2000-5000)归一化矩阵基因子集
降维PCA(默认50个主成分)归一化矩阵PC score矩阵
聚类Leiden或Louvain算法PC scores聚类标签
空间可视化对接组织图像坐标聚类标签+spatial/tissue_positions.csv空间映射图

你可以看到,聚类这一步本质上和单细胞没有区别。真正让Visium独特的地方在于最后一步——把你的聚类结果绘制到组织切片上。我见过太多人做完聚类就收工了,但如果你不回到组织图像上去验证,你永远不知道你的聚类是否具有生物学意义。

为什么需要Singularity容器

你想想看,上面这条管线依赖的软件环境有多复杂:

  • Space Ranger需要特定版本的Python、GCC和R
  • Scanpy/Seurat又对库版本有严格依赖
  • GPU加速需要CUDA和cuDNN的精确组合

我最初处理Visium数据时,光是配环境就花了整整两天。更别说换一台机器重装一次了。Singularity容器就是用来干这个的——把整个环境打包成一个.sif文件,别人拿到手直接跑。

一个小建议:不要试图把整条管线塞进一个容器里。我更推荐按阶段拆分——Space Ranger一个容器,scanpy/Seurat分析一个容器。这样每次升级某个组件时,重新构建成本低得多。

SVG:全流程概览图

Visium数据分析全流程(第4章概览) 第一阶段:原始数据处理(Space Ranger) 输入:FASTQ、参考基因组、HE图像、Loube Alignment 输出:filtered_feature_bc_matrix.h5、spatial/目录 第二阶段:降维与聚类(Scanpy/Seurat) QC & 过滤 归一化 + 特征选择 PCA降维 Leiden聚类 关键参数:n_top_genes=3000, n_pcs=50, resolution=0.8 第三阶段:结果输出与验证 输出:聚类标签 + 空间可视化(t-SNE/UMAP + 组织切片覆盖图) 验证:对比聚类边界和HE染色组织学结构 Singularity 容器打包 可复现环境

本章小结

整个Visium数据分析核心就是:Space Ranger加工原始数据 → 经典单细胞工具做降维聚类 → 用组织图像做空间验证。这四步跑通之后,你就拿到了带有空间坐标的聚类结果。

记住这个原则:空间转录组学不是单纯把单细胞分析的标签贴到图上。你需要在每次聚类后,回到HE图像上看——这个cluster是不是正好对应一个解剖结构?如果边界和实际组织学边界不一致,说明你的参数或预处理有问题。