2、空间转录组数据预处理流程概览:从fastq到表达矩阵的完整链路
拿到Visium下机的fastq数据,第一件事是什么?不是急着开跑,而是先搞清楚这些文件里到底藏了什么。我个人习惯先把原始数据拉出来看一眼,确认barcode和UMI的长度对不对——我在项目中遇到过好几次客户给的测序数据参数和标准版Space Ranger默认参数对不上,白白浪费半天跑任务然后报错。
这章咱们把从fastq到表达矩阵的整个链路串一遍。说白了就是四个大步骤:质控 → 比对 → 计数 → 矩阵生成。你想想看,Visium芯片每个spot捕获的RNA本就不多,预处理环节要是漏掉一步坑,最后聚类结果可能全是假阳性。
2.1 原始数据长什么样?
Visium测序数据一般是双端fastq:R1读barcode+UMI,R2读转录本cDNA。具体格式取决于建库方式——我自己最常用的是10x Genomics官方格式:R1 28bp,其中前16bp是spot barcode,后12bp是UMI;R2 90bp是基因序列。
zcat sample_R1.fastq.gz | head -n 4
# 第一行 @设备名:...
# 序列行,长度固定
@A01623:123 H7LCXDSX2:1:1101:10000:12345 1:N:0:1
CCGTCCCAATGCGCTGTCTCTTATACATCT
+
###########FFFFFFFFFFFFF
数一下序列长度,和预计的barcode+UMI长度(28bp)一致吗?不一致?那后面的参数铁定要改。
2.2 第一步:质量控制和修剪
别看这一步基础,但也最容易漏。我见过有人直接拿原始fastq丢给Space Ranger,结果Q30低于70%,比对率只有30%多。Visium的spot直径才55微米,RNA捕获效率有限,低质量数据白干不说,还会引入大量噪音。
我个人习惯先用fastp或Trimmomatic做一轮基础质控:
- 去除adapter(接头)污染
- 滑窗裁剪低质量碱基(Phred < 20)
- 丢弃太短的reads(比如<50bp)
fastp -i sample_R1.fastq.gz -I sample_R2.fastq.gz \
-o sample_R1_clean.fastq.gz -O sample_R2_clean.fastq.gz \
--detect_adapter_for_pe --length_required 50
2.3 第二步:比对与定位
这一步是Space Ranger的核心。它把R2的cDNA片段比对到参考基因组(人或小鼠),同时通过R1的barcode反推该read来自哪个spot。
具体流程我简化成三个子任务:
- index构建——用STAR建立参考基因组索引
- 比对——STAR把R2序列mapping到基因组
- spot-barcode解复用——根据R1的16bp白名单鉴定spot身份
嗯,这里小白最容易踩的坑是参考基因组版本。比如人就用GRCh38(+对应的GTF注释),小鼠用mm10。我遇到过项目里用了GRCh37,结果大量基因名称对不上,表达矩阵全是零。
Space Ranger的标准命令长这样:
spaceranger count --id=sample_output \
--fastqs=fastq_dir \
--transcriptome=/ref/refdata-gex-GRCh38-2020-A \
--sample=sample_name \
--image=./tissue_image.tif \
--slide=V11T05-123 \
--area=A1
--slide和--area决定了barcode白名单文件。如果你用的不是10x官方预定义slider(比如自己做的适配),得手工提供--slidefile或--barcode-whitelist。
2.4 第三步:基因计数与UMI校正
比对上的reads,Space Ranger会按照 barcode → UMI → 基因 三重层级去重计数。为什么要去重?因为同一个mRNA分子可能被多次测序(PCR扩增导致的重复)。UMI就是这个分子的身份证——同一spot内,相同UMI只计1次。
我记得第一次看Space Ranger的UMI校正逻辑时觉得挺绕,其实原理简单:
- 同spot、同基因、同UMI的reads → 合并成1条
- 同spot、同基因、不同UMI → 视为不同分子
- UMI编辑距离1以内且出现在相近位置 → 可能测序错误,需校正
# 最终生成的文件之一:raw_feature_bc_matrix.h5
# HDF5格式,包含三个矩阵:barcode x feature(基因)
# 以及barcode序列列表、基因名称列表
spaceranger count输出的web_summary.html里看“Sequencing Saturation”曲线。如果饱和度超过80%,说明测序深度足够了;低于50%,考虑加测。
2.5 第四步:生成表达矩阵与初步过滤
Space Ranger跑完后,会在outs/目录下产出三个关键文件:
| 文件/目录 | 内容 | 用途 |
|---|---|---|
filtered_feature_bc_matrix.h5 | 已过滤的UMI计数矩阵(去除了组织边缘气泡等无效spot) | 下游分析标准输入 |
raw_feature_bc_matrix.h5 | 全spot原始计数(含背景) | 诊断用 |
spatial/ | 组织图像、spot坐标、scale factor | 空间可视化 |
这里的“过滤”指什么?Space Ranger默认做两步:
- 仅保留与组织图像重叠的spot(靠荧光图像判别)
- 去除低质量spot(总UMI过低,或基因数太少)
我个人建议:不要完全信赖默认过滤。我在项目中曾遇到一个脂肪组织,背景荧光偏强,Space Ranger错误地把一半组织spot当背景滤掉了。后来我手动保留raw矩阵,加一层自定义过滤(比如UMI > 500且基因数 > 200),才保住有效信号。
2.6 完整流程一览:一步一坑
下面这张图把整条链路浓缩了一下,每个节点都标注了最容易翻车的环节。建议你贴在工位上——
这张图里从左到右是数据流,从上到下是空间信息流。两条线在表达矩阵处汇合——没有空间坐标的矩阵,充其量只是个普通的scRNA-seq。有了坐标,你才能把每个spot的基因表达“贴”回组织切片上。
2.7 避坑总结(我踩过的那些坑)
- barcode白名单版本:不同Visium试剂盒(v1/v2)的barcode白名单不一样。我曾经拿v1白名单跑v2数据,结果匹配率不到5%。
- 内存不够:STAR比对阶段推荐至少32GB RAM。我在一台16GB的笔记本上试过,swap吃得飞起,一个样本跑了36小时还没完。
- 图像分辨率:Space Ranger要求原始scanner图像分辨率在0.2–0.3 μm/pixel。如果扫描仪设错了,Louvain聚类的位置偏差大到离谱。