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 的特征。低于这个线的,大概率是噪点。
基线校正:局部最小值,窗口 100 m/z
平滑:Savitzky-Golay,宽度 5,多项式阶数 2
信噪比阈值:3.0
3.3 峰提取:你的参数窗口,决定 CV 精度
说完预处理,我们来到最关键的环节——峰提取。这一步我的经验是:参数设得“宽容”,CV 会“爆炸”;设得太“严格”,很多真实蛋白被丢弃。
举个例子,我做过一个跨批次的血浆项目。第一批次的峰提取窗口设的是 ±5 ppm,第二批次的质谱仪温度没控制好,质量漂移到了 ±10 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 不是在最后归一化时才产生的,它是在每一道流程里被逐步构建的。前一步的微小误差,会在后一步被放大。所以,评估批次特异性蛋白时,不要只看最终矩阵的 CV,而要去回溯它的预处理路径,看看到底是哪一步让 CV “跑偏”了。
好,关于数据预处理与 CV 的关系,我们就聊到这里。记住:预处理不是“清洁工”,它是“建筑师”——你建的每一层,都在决定最终 CV 的形态。