一个 MRM 浓度值需要哪些前提:Linux 上的安捷伦 QqQ 定量实践
摘要
上一篇解决了数据入口问题:不依赖 MassHunter,直接解析安捷伦 .d 中的 MSScan.bin 与 MSPeak.bin,并以 TIC ≡ Σ intensity 做零残差自检。本文转向分析化学问题:一个报出去的浓度值,需要满足哪些前提才站得住。
在一批真实的 GC-QqQ MRM 数据(1 个空白、10 个标准水平、8 针待测样,共 19 次进样)中,有三处尤其容易出错,而错误结果往往仍“看起来正常”:把交替采集的全扫描帧混入离子对通道,把方法声明的子离子顺序当成二进制存储顺序,以及在约 500 倍的浓度范围内误选加权方式。三者都会给出量级合理的错误数值,既不报错,也不会在色谱图上显形。
同一批数据的回算偏差还把问题指回了实验端:按 ±20% 回算判据,10 个标准水平中只有 4 个合格;两组相邻的两倍稀释点,响应比仅为 1.03 和 1.10。这不是积分或拟合的缺陷,而是标准系列需要复核的证据。
代码开源于 agilent-d-toolkit 的 mrm_quant/,含 121 项测试,其中 28 项是先于实现写定的接口契约。本文所有数值均由同一套代码在本地实际运行并复核;样品身份与标准配制明细不在本文列出。
1. 一个浓度值需要哪些前提
MRM 定量在方法建立时就把问题收窄了:目标物由预设的离子对代表,浓度由同批工作曲线换算。因此,报出一个浓度,至少要能回答四个问题。
第一,这条离子对是否真的被采集过。方法文件里写了三条通道,不代表某一针数据中三条都在;若软件在通道缺失时退回“同一标称质量的全扫描提取离子流”,得到的数字便与该离子对无关。第二,积分的峰是否就是目标物。保留时间窗、伴峰与共洗脱都可能使“最高峰”并非“目标峰”。第三,工作曲线是否覆盖样品浓度,并且在该区间内能够通过回算。第四,条件不满足时,软件是否给出状态而不是浓度值。
下面按这四点,用实测结果说明本批数据暴露的具体风险。
2. 采集语义:MRM 与全扫描交替采集
这台 QqQ 在 MRM 采集中同时保留了全扫描:每个循环先采一帧 MRM,再采一帧全扫描。其中一针标准品共 4908 帧,两种模式各 2454 帧,严格交替并共享同一 cycle 编号。
| 帧类型 | ScanType | MSLevel | ScanMethodID | 母离子 | 每帧质心点数 |
|---|---|---|---|---|---|
| MRM | 256 | 2 | 1 | 有 | 3 |
| 全扫描 | 1 | 1 | 2 | 无 | 数百 |
原有的全扫描管线以 ±0.3 u 窗口提取子离子质量时,在这份数据上返回全部 4908 个点,且在 MSLevel = 1 的帧上存在非零值。它把两种物理量拼成一条曲线:一半来自目标离子对,一半来自全扫描中所有落入该窗口的共存离子。
这种混入对定量的影响具有明确方向。全扫描窗口不具备 Q1 选择性,基质贡献相对固定,在高浓度端占比可忽略,在低浓度端却与目标信号处于同一量级,于是曲线低端被抬平、斜率被压低、截距被抬高——最需要准确性的区间反而受到系统性污染。真正的离子对通道只有 2454 个原生采样点,不多不少,也不补零。
3. 通道身份:方法声明顺序不等于二进制存储顺序
MRM 帧的质心点数等于该方法段声明的离子对数量。本方法段按方法元素顺序声明三条通道,而二进制峰数组按 m/z 升序存储,两者顺序正好相反。若按数组位置把强度分配给通道,三条通道会整体错位。
实测同一帧内三个子离子的强度相差约四个数量级,最弱的一条在小数量级,最强的一条在千量级。错位之所以危险,正在于三个值都是量级合理的正数:定量离子对拿到了定性离子对的响应,定性离子对拿到了另一条通道的响应,离子比检查一并失效,而结果表上没有任何异常特征。
稳妥的做法是先按帧筛选(ScanType、MS level、母离子、碰撞能量、极性、时间段、方法段),再按实际 m/z 值在容差内匹配子离子。这里的质量容差用于“识别已采集通道”,与仪器隔离窗无关,也不应沿用全扫描 EIC 常用的 ±0.3 u;若容差宽到能同时覆盖两条离散通道,程序应报错而不是合并。方法未采集的离子对同样按错误处理,不允许退回同标称质量的全扫描 EIC。
一帧内某个已声明子离子缺失时记为缺失并标注,仪器测得的零保持为零。二者在低浓度端含义完全不同:前者是数据缺口,后者是有效观测值。
4. 峰归属:保留时间漂移与伴峰
积分本身很朴素:在采样点上做梯形积分,时间以分钟计;窗口端点不落在采样点上时采用线性插值,不向数据范围之外外推。基线可设为无基线或窗口两端连线,扣除基线后的残差保留正负号。逐点截零会使每次噪声起伏都贡献正面积,从而在低浓度端造成正偏。
需要规则约束的是峰归属。本批数据中,目标峰顶随浓度在约 0.09 min 的范围内漂移,主峰右侧约 0.05 min 处还有一个峰高为主峰 3%–6% 的伴峰。把保留时间容差放宽到 ±0.15 min 时,十个标准水平中有七个在窗口内出现两个候选峰。
处理方式是:只在预期保留时间容差内选峰;窗口内无峰记为 no_peak,多峰记为 ambiguous_peak 并交由人工复核,不按“全程最高峰”或“面积最大”自动决定。将伴峰并入主峰所需的峰分辨参数(最小相对峰高 0.05、最小峰间距 0.10 min)写入配置并随结果归档,而不是藏在代码默认值中——这两个参数直接决定最终报告哪个面积。
5. 校准模型:加权方式改变结论
标准系列为 10 级两倍逐级稀释,跨度约 500 倍;进样顺序依次为空白、由低到高的标准和样品,这一顺序本身有利于抑制携带污染。定量通道面积随浓度单调下降。
曲线为 A = a·C_vial + b,采用加权最小二乘,权重与截距模式由方法预先指定。在跨度约 500 倍的范围内,不同选择造成的差异远不止小数位:
| 权重 | r²(非加权) | r²(加权) | 截距相对水平 |
|---|---|---|---|
| none | 0.981918 | 0.981918 | 最高,约为 1/x 拟合截距的 6.6 倍 |
| 1/x | 0.946973 | 0.911935 | 中等 |
| 1/x² | 0.090549 | 0.818623 | 最低,接近零 |
非加权拟合的 r² 最高,但其截距高于两针样品的实测峰面积(相当于这两针面积的 1.15 与 1.35 倍),于是这两针回算为负浓度。色谱图上它们都有清晰的目标峰,负值只能来自模型:非加权最小二乘让高浓度点主导拟合,截距被抬到低端信号之上。改用 1/x 权重后截距下降约 6.6 倍,四针样品全部落入校准范围,状态为 ok。
这也说明不能按 r² 自动选择模型:1/x² 的非加权 r² 只有 0.09,若据此判为“拟合失败”便是误读——它的加权 r² 为 0.82,低端回算偏差反而最小。工具同时报告两种 r² 并写明定义:不同权重下的 r² 不可直接比较,也不能作为选模依据;模型应由方法预先规定,回算偏差才是判据。作为冗余校验,非加权自由截距拟合的 r² 与 numpy.polyfit 及皮尔逊 r² 在真实数据上逐位一致。
6. 曲线还告诉了我们标准系列的问题
按配置模型逐点回算后,若采用常见的 ±20%(最低点 ±25%)判据,十个标准水平中只有四个合格。这条曲线不适用于其配制的全量程,而工具把每一点的偏差、残差与状态都摆了出来,没有替使用者剔除任何点。
三个统计特征把问题指向实验端,而不是数据处理过程。
其一,两组相邻水平的配制浓度均相差两倍,但面积比只有 1.03 和 1.10,即两次两倍稀释的响应几乎无法区分。其二,响应因子(面积/浓度)在系列内波动约 3.5 倍,两个孤立高点之后的相邻水平又回到整体趋势;若是串联稀释中某一级配错,误差会向后逐级传递,不会只影响单点后立即恢复。因此,更可能是这两个标准瓶在单独配制或转移时出错,或相应的两针进样异常。其三,在最高浓度的 4 个水平中,响应因子单调上升约 55%,说明量程上端响应低于比例关系,这是检测器饱和或柱容量超载的典型表现。
结论是工作范围的上下限都需要在复核标准后重新划定,而不是沿用配制范围;两个可疑水平应复核后重配,而不是靠更换加权方式掩盖。
7. 何时不给数字
回算 C_vial = (A − b)/a,再乘以稀释倍数得到原液浓度;若标准浓度已经折算为瓶中浓度,则不再重复相乘。工具的其余逻辑几乎都在回答另一个问题:什么时候不该给出数字。
状态包括 no_peak、ambiguous_peak、insufficient_points、non_positive_area、negative_backcalc、below_calibration_range、above_calibration_range、below_validated_loq、calibration_failed、quantification_failed、internal_standard_failed、ion_ratio_fail、rt_mismatch、blank_contamination、qc_fail。在这些情况下,面积、峰顶与瓶中浓度回算值等诊断量全部保留,但报告浓度留空,不外推、不截零,也不一律写作 ND。“未检出”“该通道未采集”“低于校准范围”“低于已验证定量下限”是四类不同结论,合并为 ND 就会丢失这些区别。
本批 19 行结果的分布为:12 行 ok、4 行 ambiguous_peak、2 行 negative_backcalc、1 行 below_calibration_range。目标窗口内未能选出唯一可用峰的 4 针进样,没有被强行赋予数值。
有效性也不能默认通过:只有配置了空白限值与独立 QC 且二者都通过,validated 才为真;未配置就是未验证。本批两项均未配置,因此 19 行全部为 validated = False——这比在缺少验证证据时默认“通过”更接近实验室的真实状态。
工作曲线绑定批次与方法指纹。指纹由解析后的采集方法计算,涵盖通道表、Q1/Q3、碰撞能量、极性、dwell、gain、分辨率、时间段与源参数。因此,一个批次的曲线不能用于计算另一个批次的样品;出现 batch_mismatch 或 method_mismatch 时,程序会直接拒绝计算。方法文件名相同不等于方法一致,所以指纹不取文件名。
8. 换一批数据:诚实的失败
另一个时期的批次采用了不同的离子表。同一套代码只需更换配置即可完成提取与积分,8 针都在预期窗口内选到唯一峰;但这一批没有任何标准,定量命令以“可用校准点为 0”失败,写出失败记录并返回非零退出码。同批曲线定量的前提是该批次包含标准,工具不应使用其他批次的曲线凑出一个数字。
这次失败还暴露了另一个问题:该批沿用了前一批的保留时间窗,而其最强信号实际落在窗外约 0.9 min 处。没有标准锚定保留时间,就不能确认窗口内的峰是目标物;这一限制写在配置文件的备注字段里,而不是留给读结果的人猜。
9. 与方法验证之间还差什么
工具目前的定位很明确:它保证从原始二进制到浓度的每一步都可追溯、可复算,并在条件不足时拒绝报数;它没有、也不能替代方法验证。
尚未完成的验证要素包括:在相同 Q1/Q3、碰撞能量与积分设置下,与 MassHunter 对照通道、时间轴、峰面积和浓度;实测确定 LOD 与 LOQ(校准范围下限不等于已验证 LOQ);评估重复性与中间精密度;评估加标回收与基质效应;建立定性离子比参考值。本批三条通道是否属于同一物质尚未确认,因此定性通道只提取,不做离子比判定。强度单位仍标为仪器存储值 stored_intensity,未按 dwell 换算为 counts 或 counts/s,面积单位相应为 stored_intensity*min。因此,面积只在批内可比,不能视为绝对量。
在这些工作完成前,本批样品结果的正确用法是作为待复核的估计值:先复核两个可疑标准水平与量程上端的线性,再重新划定工作范围。
结语
把浓度算出来是最容易的一步。难的是能说清这个数字来自哪一种扫描、哪一条真实采集的通道、哪一个峰、哪一种加权与截距假设,以及在什么条件下它应当被拒绝。工具能做的是让这些前提显式、可配置、可追溯;剩下的判断仍然属于分析者。