ComBat多批次质谱数据校正与验证 - 第1节

为什么我们要从质谱数据讲起?

做ComBat校正之前,你得先搞明白一件事——你在跟什么样的数据打交道。

我第一次接触多批次质谱数据时,差点被各种格式搞疯。z这玩意儿跟测序数据完全是两码事。质谱仪出来的原始数据,说白了就是一堆离子信号的记录。你得知道它怎么来的、长什么样、用什么工具打开,才能谈得上后面的批次校正。

我个人习惯把质谱数据产生到解析的过程,看作一条流水线。从样本进仪器,到最终拿到定量矩阵,中间每个环节都会埋下「批次效应」的种子。不理解这些环节,ComBat用得再好也是盲人摸象。

质谱仪是怎么工作的?

质谱仪的核心原理,根本不复杂。三句话就能说清楚:

  • 离子化:把样本里的分子带上电荷,变成离子
  • 质量分离:根据质荷比(m/z)把这些离子分开
  • 检测:记录每个质荷比对应的离子数量

我在项目中遇到过一种情况:两台同型号的质谱仪,设置的离子源温度差了5°C,出来的肽段谱图就明显不一样。你看,这就是批次效应的源头之一——仪器参数哪怕微调,数据都会变。

常用的质谱仪类型,我按工作场景列了个表:

类型 原理 常见应用
四极杆 (Q) 电场筛选特定m/z离子 靶向定量
离子阱 (IT) 捕获离子并逐级释放 DDA鉴定
飞行时间 (TOF) 测量离子飞行速度 DIA全扫描
Orbitrap 轨道阱高分辨检测 高精度定性与定量

你想想看,如果第一个批次用Orbitrap跑,第二个批次换成Q-TOF,那数据还能直接合并吗?答案显然是否定的。这就是为什么理解仪器原理,是做ComBat校正的前置条件。

DDA与DIA:两种完全不同的采集哲学

数据采集模式直接决定了你拿到的「原始数据」长什么样。这一点我吃了不少亏,当初刚开始做质谱分析时,搞混了DDA和DIA的输出格式,把DDA的结果当成DIA去处理,结果定量矩阵全是错的。

DDA模式(数据依赖采集)

DDA的思路很简单:先扫一张全谱(MS1),挑出信号最强的几个母离子,再逐个打碎做二级谱(MS2)。

  • 优点:谱图干净,鉴定率高
  • 缺点:随机采样,低丰度肽段容易被漏掉
  • 输出:每个样本的MS2谱图数量有限

DIA模式(数据非依赖采集)

DIA换个玩法:不管信号强弱,把整个质荷比范围切成若干窗口,每个窗口内的所有离子一起打碎。

  • 优点:全覆盖,可回溯,适合大样本队列
  • 缺点:谱图复杂,解析难度大
  • 输出:每个样本的MS2谱图爆炸式增长

核心区别:DDA是你让质谱仪「自己选」哪些离子去做二级;DIA是你「强行规定」哪些窗口内的离子全部去做二级。后者产生的数据,批次之间的可比性天然更好——但也更需要ComBat来消除残留的系统误差。

绕不开的三种数据格式

质谱数据的格式,经常让新手头皮发麻。嗯,这里要注意:不同格式存储的信息层面完全不一样。我个人最喜欢用mzML做分析,因为它兼顾了完整性和可读性。

mzML

HUPO PSI社区推出,专门为了统一质谱数据存储。它把每个扫描周期的信息都保留下来,包括峰列表、保留时间、仪器参数。说白了,这是最「信息无损」的格式。

mzXML

比mzML早一些,功能类似,但现在社区更推荐mzML。我在项目中遇到很多历史数据是mzXML格式,需要转换才能进入统一分析流程。

MGF

MGF只存谱图信息,不包含原始峰形和仪器参数。它轻量、易读,但信息丢失较多。我曾经因为直接用MGF做多批次合并,忽略了仪器状态字段的缺失,导致后期校正时找不到批次来源——这个坑大家一定要绕过去。

给个简单对比:

格式 信息完整度 文件大小 推荐场景
mzML 高 大 正式分析、归档
mzXML 较高 较大 兼容旧流程
MGF 低 小 简单鉴定、快速浏览

千万不要因为MGF文件小就只保留它。做批次校准时,你需要知道每个谱图来自哪个批次、哪台仪器、什么参数——这些信息在MGF里可能一个都没有。

解析工具:打开质谱数据的钥匙

拿到raw文件或者mzML之后,怎么变成能喂给ComBat的定量矩阵?我列几个常用的工具,都是自己用过至少三年以上的:

OpenMS

开源界的扛把子。Pipeline式的处理,从峰检测到定量矩阵输出,一步到位。推荐用TOPPView看谱图质量,再用FeatureFinderIdentification做峰对齐。

ProteoWizard (msconvert)

格式转换的瑞士军刀。我建议任何质谱分析流程的第一步,都先用msconvert把原始raw转成mzML。命令行操作很简单:

msconvert input.raw --mzML --filter "peakPicking true 1-"
--filter "msLevel 1-2" --output output.mzML

pymzML

Python直接操作mzML的利器。适合写自定义脚本做数据质量检查。

from pymzml import run
reader = run.Reader('output.mzML')
for spectrum in reader:
    print(spectrum['ms level'], len(spectrum.peaks))

我个人习惯:先用msconvert统一转成mzML,用pymzML快速扫描一遍数据完整性,再用OpenMS做定性与定量。这套流程在多批次项目中跑了不下百次,非常稳。

从样本到定量矩阵:一次完整的知识串联

我把上面讲的东西串成一张图,这能帮你理清整个第一章的知识骨架:

质谱数据产生到解析的知识骨架 原始样本 离子化 → 质量分离 → 检测 DDA 采集 DIA 采集 mzML / mzXML MGF 原始厂商格式 (raw) OpenMS ProteoWizard pymzML 定量矩阵 (送ComBat校正) 核心流程 样本 → 离子化 → 采集 → 格式 → 解析 → 定量

这张图把从样本到定量矩阵的整个流程跑了一遍。你会发现,每个环节都可能引入批次差异。比如:今天用的色谱柱跟上次不同,DDA采集时选峰的阈值有偏差,甚至解析软件版本升级了,定量结果都会漂移。

我建议你把这张图保存下来,之后讲到ComBat校正的每个步骤时,随时回看它是处于流程的哪个位置。

好了,第一章就到这里。你如果现在去检查手头的质谱数据,能分清哪个是DDA哪个是DIA了,也能说出mzML比MGF多存了哪些信息——那这章没白看。记得,理解数据本身,永远比直接跑模型更重要。这是我一贯的做事原则。