如何用 analytical-method-validation 技能按 ICH Q2(R2) 检查校准曲线线性
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
做方法验证时,"r² 很高"常常被直接当作线性合格的证据,但 r² 会随量程拉大而升高,对弯曲几乎不敏感。scientific-agent-skills 仓库中的 analytical-method-validation 技能把 ICH Q2(R2) 3.2.2.1 对线性响应的要求落成了一个纯 Python 脚本 check_response.py:它在报告斜率、截距、决定系数之外,还做失拟 F 检验、残差符号游程检验和逐浓度水平回算误差——后几项才是真正能发现模型不适合的统计量。本文的任务是:给定一组校准数据,用这个脚本按 ICH Q2(R2) 完成一次可复核的校准曲线线性检查,并知道输出里每一项如何判读。
前提只有一条:Python 3.11+。按技能 frontmatter 的说明,脚本只用标准库实现,不依赖 numpy、scipy,也不访问网络,统计分布从第一原理计算,保证在任何合规解释器下可复现。
先确认"响应"是必测特性
Q2(R2) 的必测项由被测属性决定,而不是由仪器决定。技能随附的 plan_validation.py 可以直接列出某个属性需要哪些特性:
cd skills/analytical-method-validation/scripts python3 plan_validation.py --framework ich-q2r2 --attribute assay --technique hplc --range-use assay对含量测定(assay),ich-q2r2.md 中引用的 Q2(R2) Table 1 给出的必测项是:专属性、响应(校准模型)、准确度、重复性、中间精密度。也就是说含量测定必须报告校准模型;而限度试验只需要专属性和 DL,不涉及本文的线性检查。可报告范围本身来自质量标准,Table 2 的示例是 assay 取标示含量的 80–120%。
准备校准数据
输入文件需要两列:level(名义浓度或 %)和response(信号),每次进样一行。同一个浓度水平的重复进样写成重复行即可——这些重复是失拟检验的纯误差来源,不提供重复行,失拟检验就无法进行。脚本支持 CSV/TSV/JSON,也接受-从 stdin 读取;可选的replicate列会被忽略。
不想自己造数据时,仓库测试目录自带三组校准曲线 fixture,可直接用:
- calibration_good.csv:5 个水平 × 3 重复,行为良好的线性曲线;
- calibration_curved.csv:5 个水平 × 2 重复,含弯曲的曲线;
- calibration_three_levels.csv:只有 3 个水平的薄设计。
执行线性检查
SKILL.md 给出的主命令形式是:
cd skills/analytical-method-validation/scripts python3 check_response.py -i calibration.csv --max-back-calc-error 2其中-i指向你的校准数据文件;--max-back-calc-error是逐水平回算相对误差的判限,单位 %。注意 Q2(R2) 本身几乎不给数值判限——判限必须来自质量标准、分析目标档案(ICH Q14 第 3 节)或开发数据,并且按技能的两条规则,判限要在收集数据之前写进方案。文档示例里的2只是示例值,请替换为你方案中预先声明的数值。
从仓库根目录跑自带的 fixture,可以直接执行:
python3 skills/analytical-method-validation/scripts/check_response.py \ -i tests/analytical-method-validation/fixtures/calibration_good.csv \ --max-back-calc-error 2输出分两路:数据(汇总表 + 逐水平表)走 stdout,溯源说明和 findings 走 stderr,所以> out.tsv重定向不会污染数据。--format可选table(默认)、tsv、json。退出码是 0(无发现)、1(有发现)、2(输入有误),可以直接用来给工作流把关。
读输出:哪些是证据
汇总表包含:不同水平数、权重方案、斜率及其 95% CI、截距及其 95% CI、截距 CI 是否包含 0、决定系数 r²、相关系数 r、残差 SD、失拟 F 值与 p 值、游程检验 p 值、高/低三段残差 SD 比。随后是按水平的回算表,每行给出level、重复数 n、平均响应、平均回算值和relative_error_pct。
判读时对应 Q2(R2) 3.2.2.1 的要求——报告图、相关系数或决定系数、y 截距、斜率,以及实际数据点偏离回归线的分析;对线性响应要评估残差图中非随机模式的影响。具体到脚本的 findings(打印在 stderr,前缀finding:):
- 失拟 F 检验(p <
--alpha,默认 0.05):直线在重复进样散度之外仍不能描述数据,即模型失拟; - 游程检验:残差符号非随机,提示检查残差图有无弯曲;
- 异方差检查:量程上三分之一的残差方差超过下三分之一 10 倍且未加权时,低端的回算结果有偏,建议加权;
- 逐水平回算误差:某水平平均回算值偏离名义值超过
--max-back-calc-error,单独报一条 finding。
文档中记录了一段真实输出,来自一条 r² 看似过关、实际不可用的曲线(示例结果,数值不要当成固定预期):
statistic value distinct levels 5 slope 166.6000 intercept 2495.0000 intercept CI includes 0 no coefficient of determination (r2) 0.9830 lack-of-fit F 469.5294 lack-of-fit p 1.5139e-06 runs test p 0.0492 level n mean_response mean_back_calculated relative_error_pct 50.0000 2 10075.0000 45.4982 -9.0036 75.0000 2 15150.0000 75.9604 1.2805 100.0000 2 20050.0000 105.3721 5.3721 125.0000 2 24050.0000 129.3818 3.5054 150.0000 2 26450.0000 143.7875 -4.1417r² = 0.983,但量程底端回算误差 −9.0%、失拟 p = 1.5 × 10⁻⁶、残差符号非随机——模型不可用。这正是技能明确要防止的错误第 3 条:把 r² 当线性证据。
可选分支:加权拟合
宽量程曲线可以加--weight 1/x2(也支持1/x):
python3 check_response.py -i calibration.csv --weight 1/x2两点限制要留意:加权要求所有水平非零,出现零水平会直接报输入错误;且加权后失拟 F 检验仍基于未加权残差计算,其零分布只是近似的——脚本会在 stderr 的note:中提示这一点,此时应结合逐水平回算误差一起读,后者不受加权影响。
其他可用参数:--levels-required(默认 5,对应 Q2(R2) "至少 5 个浓度、适当分布"的推荐);--alpha(默认 0.05);--through-origin-tolerance(截距超过最高水平响应的给定百分比时报警,作为 y 截距显著性检查的近似)。
用自带 fixture 验证脚本行为
tests/analytical-method-validation/test_scripts.py 固化了三组 fixture 的预期行为,可以当作验证方式:
| 输入 | 预期退出码 | 预期现象 |
|---|---|---|
calibration_good.csv+--max-back-calc-error 2 | 0 | 无 findings |
calibration_curved.csv | 1 | stderr 出现 lack-of-fit finding;JSON 输出中 r² > 0.98 而失拟 p < 0.001,且最差水平回算误差绝对值 > 5% |
calibration_three_levels.csv | 1 | stderr 出现 "recommends at least 5" 的级别数不足 finding |
输入列名缺失、数值非数值、文件不存在等情况退出码为 2;某个水平有重复时失拟检验才适用,否则输出会写明lack-of-fit test: not run,并在 note 中提示"至少一个水平做重复才能进行线性检验"。
边界
最后一条 stderr note 是固定输出的:this tool does not decide that the calibration model is acceptable。脚本报告、不做结论——它不判定程序已验证、不放行批次,替代不了分析人员、技术审核和质量部门。另外,对免疫分析、细胞实验等合理非线性的响应(3.2.2.2),Q2(R2) 不要求浓度–响应线性,应改用非线性回归评估,这个脚本的线性检验不适用于该类曲线。
线性检查通过后,同一技能按 Q2(R2) 特性继续走即可:check_accuracy_precision.py评估准确度与精密度,check_detection_limits.py评估 DL/QL,compare_methods.py做方法转移的等价性检验,用法均在 SKILL.md 的 Workflow 一节。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考