3. 质谱数据格式与预处理:从原始信号到定量矩阵

数据处理的第一步,往往也是最让人头疼的一步。质谱仪吐出来的原始文件,各家厂商各有各的格式,你拿到的数据文件后缀可能是 .raw、.wiff、.d 或者 .mzML。我个人习惯把这一步叫作“数据破冰”——不把这些文件搞明白,后面的差异分析根本无从谈起。

今天咱们就聊聊,怎么把这些“天书”一样的原始信号,变成一张规整的定量矩阵表。说白了,就是从质谱的原始数据出发,一路走到可以塞进统计软件的表格。

3.1 原始数据格式:你得知道你的对手长什么样

质谱仪厂商很多,Thermo、SCIEX、Bruker、Agilent……每家都有自己的“加密”格式。我刚开始做蛋白质组学的时候,接过一个项目,对方甩给我一堆 .wiff 文件,我那会儿连 SCIEX 的仪器都没摸过,折腾了三天才把数据读出来。嗯,踩过的坑现在都记着呢。

厂商 原始格式 特点
Thermo Fisher .raw 封闭格式,需专用 SDK 读取
SCIEX .wiff / .wiff.scan 双文件结构,.scan 包含谱图索引
Bruker .d (文件夹形式) 实际上是目录结构,内含多个二进制文件
Agilent .d (文件夹形式) 也是目录结构,与 Bruker 不兼容
开放格式 .mzML / .mzXML HUPO PSI 标准,跨平台通用

你可能会问,为什么要搞这么多格式?说白了,这是厂商的护城河,也是我们做数据分析的人最烦的东西。但现实就是这样,你得学会跟它们打交道。

3.2 数据格式转换:从封闭走向开放

几乎所有主流的蛋白质组学分析软件,都能直接处理 .mzML 格式。所以第一步,我通常建议你把厂商格式转成 .mzML。为啥?因为后面所有的工具——搜库、定量、质控——都对 .mzML 支持最好。

工具的话,我常用的是 ProteoWizard 里的 msConvert。命令行模式下,你只需要几行代码就能批量转换:

msconvert *.raw --mzML --zlib --filter "peakPicking true 1-"

这条命令干了三件事:一是把所有 .raw 转换;二是用 zlib 压缩减少存储;三是做峰检测,把 profile 数据变成 centroided 数据。你要是 .wiff 文件,也差不多:

msconvert *.wiff --mzML --zlib --filter "peakPicking true 1-"
注意:如果原始数据是 profile 模式(连续信号),转换时务必加上 peakPicking 参数。不做这一步,后续的匹配效率会极低,速度可能差 10 倍以上。

3.3 质量控制:别让坏数据浪费你的时间

我见过不少项目,一上来就急着跑差异分析,结果跑出来全是假阳性。后来一查,原来是某个样品采集的时候液相出了问题,色谱峰乱得跟涂鸦似的。所以预处理阶段,我建议你先做一轮快速质控。

质控看什么?核心是三个维度:

  • TIC 总离子流图:检查色谱峰形状是否正常,有无气泡或漏液
  • Base Peak 色谱图:查看主要肽段的信号强度分布
  • 鉴定数量:蛋白和肽段的鉴定数量是否在合理范围

你可以用 PTMiner 或者 OpenMS 里的 QualityControl 模块来做这件事。我个人习惯先看 TIC,如果某个样品的 TIC 曲线出现大段空白或剧烈波动,我会优先排查样品制备或液相的问题,而不是把头埋进数据处理里。

经验之谈:对于 DIA(数据非依赖性采集)数据,质控时需要额外关注“谱图库匹配率”。如果匹配率低于 60%,大概率是谱图库构建有问题,或者色谱条件漂移严重。

3.4 蛋白推断与定量:从肽段到蛋白的映射

你搜库跑完了,会得到一张肽段-谱图匹配(PSM)表。但这还不是最终结果——你需要把肽段映射到蛋白上,然后做定量。这一块有个经典问题:“肽段共享”——同一个肽段可能对应多个蛋白,这时候怎么分配定量值?

主流原则是 “简约性原则”(Occam's Razor):能用最少蛋白解释的,就别多推理。具体做法:

  • Unique peptides:只拿蛋白特异的肽段做定量,最保守也最可靠
  • Razor peptides:在组内按最大可能性分配共享肽段
  • Maximal Quanti:把所有共享肽段都用上,适合高丰度蛋白

我自己的项目里,一般先用 unique 肽段定一个 base,再用 razor 肽段补一些低丰度蛋白。你想想看,如果你完全抛弃 shared peptides,很多重要的调控蛋白(比如转录因子、激酶)可能根本定不出来——因为这些蛋白的特异肽段往往很少。

关键指标:报告上必须标清楚用的是哪种肽段策略。我见过审稿人专门盯着这个问题问,如果回答不清晰,文章可能会被直接打回。

3.5 数据归一化:抹平实验之间的系统偏差

归一化是预处理里最容易“出戏”的一步。说白了,就是用数学手段把不同样品之间因上样量、离子化效率、仪器状态差异造成的系统偏差抹平。但不是所有情况都适合归一化——如果你预期大部分蛋白在实验组和对照组之间都不变,那全局归一化就没问题;但如果你知道很多蛋白都显著变化了,那用全局归一化反而会引入假阴性。

常用方法有几类:

方法 原理 适用场景
Total Intensity Normalization 将所有样品的总信号强度对齐 上样量差异大时
Median Normalization 将各样品的中位数强度对齐 大部分蛋白不变时的主流选择
Quantile Normalization 强行让各样品的强度分布一致 分布有明显批次效应时
VSN (Variance Stabilizing Normalization) 同时稳定方差和消除偏差 低丰度蛋白噪音大时优先使用

哪种最好?其实没有“万能”的。我建议你选归一化方法之前,先做个 PCA 或 层次聚类,看看数据里是否存在明显的批次效应。如果 PCA 图上实验组内聚而组间分离,那你用中位数归一化就够;如果各个板之间出现分离,那可能得用 quantile 或更复杂的批次校正方法,比如 ComBat。

千万别做的事:做完归一化后,一定要检查归一化后的强度和原始强度分布。如果归一化后某个样品的分布被严重扭曲,比如被拉伸得不成形,那说明这个方法不适合你的数据。我曾经见过一个案例,quantile 归一化把一个样品里本来应该是高表达的蛋白全部“削平”了,结果差异分析出来全错。这种事经历过一次就再也不敢粗心了。

3.6 缺失值处理:蛋白表的“黑洞”怎么填

定量矩阵里肯定有一堆空值。为什么会有缺失?两个原因:一是真缺失(蛋白没检测到),二是假缺失(检出了但定量值不稳定被过滤了)。你要根据情况分别处理。

常用的策略:

  • 只保留完整行:删掉任何有缺失的蛋白。简单粗暴,但会丢很多生物学信息。
  • KNN(K近邻)插补:基于相似蛋白的定量值来估计缺失值。适用于随机缺失。
  • 最小值替换:用全局最小值或该行最小值的某个比例(如 1/10)替换。适用于“未检到但理论上存在”的情况。
  • MLE 或 Bayesian 方法:基于统计模型估计缺失值。计算量较大但结果更稳健。

一次性总结我的选择:如果缺失率小于 10%,我会用 KNN;如果缺失率在 10%-30% 之间,我会用最小值替换;超过 30%,我建议你先检查数据质量,而不是盲目插补。你想想看,一个蛋白在大部分样品里都是空的,硬补出来也是瞎猜。

经验:永远不要把缺失值填成 0。质谱定量数据的分布是对数正态的,填 0 会严重扭曲后续的统计检验。至少填一个很小的正数,比如原始强度最小值的十分之一。

3.7 预处理流程:把这些步骤串起来

讲了这么多,我觉得你需要一张图把整个流程串起来,这样在实际项目中才不会漏掉任何一步。

质谱数据预处理全流程 原始数据文件 格式转换 (→ mzML) 质量控制 (QC) 搜库 → 蛋白推断 定量 & 归一化 缺失值处理 完整定量矩阵 虚线:后处理与结果互检

这张图把预处理拆成了六个步骤。从原始数据出发,先做格式转换,然后质量控制。通过质控的数据分别走蛋白推断和定量归一化两条路径,最后合并到缺失值处理,输出完整的定量矩阵。虚线表示 QC 和最终结果之间的相互校验——很多时候你会从最终矩阵里发现新的批次效应,这时候得回头调整归一化策略,形成一个迭代闭环。

嗯,把这六个步骤走通,你的数据就准备好进入下一阶段的差异分析了。说白了,预处理做得好,差异分析就成功了一半。我见过太多人把精力全放在后面的 P 值计算上,结果数据质量本身不行,再怎么跑也是白搭。老老实实把这一步做扎实,你的结论才会经得起推敲。