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-"
3.3 质量控制:别让坏数据浪费你的时间
我见过不少项目,一上来就急着跑差异分析,结果跑出来全是假阳性。后来一查,原来是某个样品采集的时候液相出了问题,色谱峰乱得跟涂鸦似的。所以预处理阶段,我建议你先做一轮快速质控。
质控看什么?核心是三个维度:
- TIC 总离子流图:检查色谱峰形状是否正常,有无气泡或漏液
- Base Peak 色谱图:查看主要肽段的信号强度分布
- 鉴定数量:蛋白和肽段的鉴定数量是否在合理范围
你可以用 PTMiner 或者 OpenMS 里的 QualityControl 模块来做这件事。我个人习惯先看 TIC,如果某个样品的 TIC 曲线出现大段空白或剧烈波动,我会优先排查样品制备或液相的问题,而不是把头埋进数据处理里。
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。
3.6 缺失值处理:蛋白表的“黑洞”怎么填
定量矩阵里肯定有一堆空值。为什么会有缺失?两个原因:一是真缺失(蛋白没检测到),二是假缺失(检出了但定量值不稳定被过滤了)。你要根据情况分别处理。
常用的策略:
- 只保留完整行:删掉任何有缺失的蛋白。简单粗暴,但会丢很多生物学信息。
- KNN(K近邻)插补:基于相似蛋白的定量值来估计缺失值。适用于随机缺失。
- 最小值替换:用全局最小值或该行最小值的某个比例(如 1/10)替换。适用于“未检到但理论上存在”的情况。
- MLE 或 Bayesian 方法:基于统计模型估计缺失值。计算量较大但结果更稳健。
一次性总结我的选择:如果缺失率小于 10%,我会用 KNN;如果缺失率在 10%-30% 之间,我会用最小值替换;超过 30%,我建议你先检查数据质量,而不是盲目插补。你想想看,一个蛋白在大部分样品里都是空的,硬补出来也是瞎猜。
3.7 预处理流程:把这些步骤串起来
讲了这么多,我觉得你需要一张图把整个流程串起来,这样在实际项目中才不会漏掉任何一步。
这张图把预处理拆成了六个步骤。从原始数据出发,先做格式转换,然后质量控制。通过质控的数据分别走蛋白推断和定量归一化两条路径,最后合并到缺失值处理,输出完整的定量矩阵。虚线表示 QC 和最终结果之间的相互校验——很多时候你会从最终矩阵里发现新的批次效应,这时候得回头调整归一化策略,形成一个迭代闭环。
嗯,把这六个步骤走通,你的数据就准备好进入下一阶段的差异分析了。说白了,预处理做得好,差异分析就成功了一半。我见过太多人把精力全放在后面的 P 值计算上,结果数据质量本身不行,再怎么跑也是白搭。老老实实把这一步做扎实,你的结论才会经得起推敲。