3. 原始谱图 → 定量矩阵:CV 是怎么一步步被“制造”出来的?

好,聊到数据预处理,我得先跟你透个底。我以前刚做蛋白质组学那会儿,总觉得“原始谱图”是神圣不可侵犯的,恨不得把所有信号都保留下来。结果呢?定量矩阵出来,CV 高得吓人,一堆假阳性。后来摔过几次跟头,才明白一个道理:预处理不只是“清理数据”,它本质上是在“制造”CV——每一步选择,都会放大或缩小最终矩阵的变异系数。

今天我们就从头捋一遍,看看一个原始谱图,是怎么变成一张定量矩阵的,以及这中间,CV 到底是怎样被一步步“驯化”或“引爆”的。

3.1 预处理管线:5 个关键阶段

我个人习惯把整个流程拆成 5 个阶段。每个阶段对 CV 的贡献都不一样。

阶段 核心操作 对 CV 的作用 典型 CV 范围(我取的经验值)
1. 谱图预处理 基线校正、平滑、去噪 降低系统噪声导致的假阳性,但过度平滑会抹掉低丰度蛋白信号 5-15%
2. 峰检测与提取 质心提取、同位素簇合并、峰面积/峰高计算 决定一个肽段能否被定量;参数窗口设太大,混入杂峰,CV 飙升 10-30%
3. 保留时间对齐 非线性校正(如 LOESS)、全局位移调整 消除批次间保留时间漂移;对齐不准,同一肽段在不同批次被错认 5-20%
4. 峰匹配与定量矩阵生成 跨样本匹配、填充缺失值 匹配算法决定矩阵完整性;缺失值填充方式直接拉高或拉低 CV 15-40%
5. 归一化与校正 总离子流校正、中位数归一化、内参标定 消除上样量差异、仪器漂移;归一化不做,批次效应全写在 CV 里 5-15%(归一化后理想值)

你想想看,如果前 4 步都没控制好,到第 5 步归一化的时候,你的 CV 已经是一个“垃圾进垃圾出”的状态了。所以我的原则是:宁可多花时间在谱图预处理阶段,也不靠归一化去“擦屁股”。

3.2 谱图预处理:第一个“红绿灯”

原始谱图拿到手,第一件事不是急着提取峰,而是看基线漂不漂。我曾经在一个时间序列项目里,碰到一个奇怪的现象:同一批样品,第一天和第三天的基线信号差了一倍多。原因是质谱仪刚做完维护,热平衡没完全稳定。你猜怎么着?

如果不做基线校正,后面提取的峰面积,第三天会比第一天普遍高 20%-30%。那 CV 直接翻倍。所以,我建议至少做以下三个动作:

  • 基线扣除:用局部最小值或多项式拟合,把基线拉平。
  • 平滑去噪:我一般用 Savitzky-Golay 滤波器,窗口宽度 5-7 点。窗口设太大,低丰度峰信号被抹平,CV 会“虚低”。
  • 信噪比过滤:只保留 S/N > 3 的特征。低于这个线的,大概率是噪点。
实战参数参考(以典型 DDA 数据为例):
基线校正:局部最小值,窗口 100 m/z
平滑:Savitzky-Golay,宽度 5,多项式阶数 2
信噪比阈值:3.0

3.3 峰提取:你的参数窗口,决定 CV 精度

说完预处理,我们来到最关键的环节——峰提取。这一步我的经验是:参数设得“宽容”,CV 会“爆炸”;设得太“严格”,很多真实蛋白被丢弃。

举个例子,我做过一个跨批次的血浆项目。第一批次的峰提取窗口设的是 ±5 ppm,第二批次的质谱仪温度没控制好,质量漂移到了 ±10 ppm。结果同一肽段在第一批次被检出,第二批次直接被当成“未检测到”,于是定量矩阵里出现大量缺失值。你想想看,缺失值一多,CV 能不高吗?

所以我建议至少做两件事:

  • 先跑一个质量偏差诊断,看仪器实际漂移是多少。
  • 允许批次级质量容差自适应,比如以每个批次的实测偏差中位数作为容差基准。
注意: 峰提取时不要轻易使用“默认参数”。我见过很多项目,仅仅因为用了软件默认的 +10 ppm 窗口,而实际仪器漂移只有 ±2 ppm,结果匹配时大量假阳性混入,矩阵填得“假满”,CV 倒是不高,但全是错的。

提取完的峰,我们通常会得到一个像这样的中间文件,记录了每个特征在不同样本中的响应强度:

特征ID    m/z      保留时间  样本A_intensity  样本B_intensity  样本C_intensity
F001      502.103   12.45    1.23e6          0.98e6          1.45e6
F002      504.251   14.02    0.45e6          NA              0.52e6
F003      508.779   15.33    2.10e6          2.34e6          2.01e6

看到「NA」了吗?这就是 CV 的潜在火山口。如果某个样本里这个肽段缺失,你怎么处理它,会直接影响 CV 的最终数值。

3.4 缺失值填充:CV 的“放大器”

说到缺失值,我跟你讲个经验教训。我以前有个项目,为了“矩阵完整性”,把所有缺失值都填充为 0。结果呢?低丰度蛋白的 CV 直接被拉到 100% 以上。为什么?因为填充 0 相当于把一个本来就不高的信号,强行变成 0,然后归一化时又把它拉高,计算出来的 CV 毫无意义。

现在业内比较公认的做法是:

  • 近邻填充:用这个肽段在其他样本中的响应值分布的最低 10% 分位数来填充,模拟“在检测限附近”的情况。
  • 小值填充:直接填充一个全局最小值的 1/10。
  • 模型预测填充:用其他归一化后的特征做回归预测填充。我个人不太常用,因为容易引入结构偏差。
填充方式 对 CV 的影响 我个人的推荐度
填充 0 CV 虚高(尤其低丰度) ❌ 不推荐
全局最小值 / 10 CV 会接近真实,不会爆炸 ✅ 常用
KNN 近邻填充 CV 偏保守,接近中位数 ✅ 如果样本量小,是个好选择
不填充,只分析完整行 样本量少时,代表性差 ⚠️ 只在样本足够多时用

3.5 归一化:最后一道“CV 矫正”护栏

终于走到归一化这一步了。很多人以为归一化是“万能药”,其实不是。它只能消除全局的系统性偏差——比如上样量差异、离子化效率波动——但不能修复前面几步造成的特异性偏差。

我一般用 中位数归一化,因为它对异常值稳健。具体怎么做?很简单:

# 伪代码逻辑
global_median = median(all_peptide_intensities)

for each_sample in samples:
    sample_median = median(each_sample.intensities)
    correction_factor = global_median / sample_median
    each_sample.intensities = each_sample.intensities * correction_factor

这个步骤做完,如果前面各步都控制好了,定量矩阵的 CV 分布应该会收敛到 5%-15% 之间。如果发现归一化后某个批次的 CV 反而变大了——别慌,这说明那个批次本身的偏差模式不是全局性的,而是蛋白特异性的。这时候,我们就得进入下一节要讲的内容:如何用 CV 分布去识别这种“异常批次”。

不过先打住,我们把今天的核心流程串联一下。下面这张图,我把它叫做“预处理与 CV 的关系图”,你一看就明白。

原始谱图 → 定量矩阵:预处理管线与 CV 的关系 1. 谱图预处理 2. 峰检测提取 3. 保留时间对齐 4. 峰匹配+填充 5. 归一化校正 定量矩阵 + CV 关键风险点 过度平滑 → 低丰度 CV 虚低 参数窗口不当 → 缺失值激增 填充策略错误 → CV 失真 CV 理想范围 全局偏差消除后:5%-15% 批次特异性偏差:15%-40% 异常批次:>50%

这张图我画了很久,核心想表达的是:CV 不是在最后归一化时才产生的,它是在每一道流程里被逐步构建的。前一步的微小误差,会在后一步被放大。所以,评估批次特异性蛋白时,不要只看最终矩阵的 CV,而要去回溯它的预处理路径,看看到底是哪一步让 CV “跑偏”了。

我的一个小习惯: 每次拿到一份定量矩阵,我会先做一个“预处理谱系图”——把每个样本从原始谱图到矩阵的每一步参数都记录下来。这样,当发现某个蛋白的 CV 异常时,我可以快速定位是峰提取窗口的问题,还是保留时间对齐的误差。

好,关于数据预处理与 CV 的关系,我们就聊到这里。记住:预处理不是“清洁工”,它是“建筑师”——你建的每一层,都在决定最终 CV 的形态。