mcpField
P
pkpd-modeling

pkpd-modeling

github.com/kalarislabs其他7940 次安装6 天前更新
代码仓库

关于 pkpd-modeling

此技能提供药代动力学与药效学分析脚本及指南,面向研究人员和药物计量学家。涵盖暴露量计算、模型拟合与诊断、模拟及相关分析;报告分析发现,不作临床决策。

主要功能

  1. 01非房室暴露量分析
  2. 02房室模型拟合
  3. 03群体数据集检查
  4. 04给药方案模拟
  5. 05暴露-反应与生物等效性分析

适用场景

  1. 01根据浓度-时间数据计算暴露指标
  2. 02在群体 PK 分析前检查数据集
  3. 03模拟群体中的给药方案
  4. 04评估暴露-反应或生物等效性标准

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill pkpd-modeling

安装后在 Claude Code 中输入/pkpd-modeling确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
nca-reporting-checklist.md
popk-analysis-plan.md
references/
antimicrobial-and-tdm.md
bioequivalence.md
dataset-standards.md
ddi-and-qt.md
nca-conventions.md
pbpk.md
pd-and-exposure-response.md
population-pk.md
regulatory-guidance.md
software-ecosystem.md
source-ledger.md
special-populations.md
structural-models.md
tmdd-and-biologics.md
scripts/
_common.py
_models.py
allometry_and_fih.py
bioequivalence.py
check_popk_dataset.py
ddi_static.py
exposure_response.py
fit_compartmental.py
nca.py
simulate_regimen.py
tdm_bayes.py

详细介绍

药代动力学和药效动力学建模

适用场景

任何关于身体如何处理药物,或药物如何影响身体的问题:从浓度-时间数据推导 暴露指标、拟合结构模型、构建或检查群体分析、选择剂量或给药方案、关联暴露与效应、 比较制剂,或将结果外推到新群体。

三条规则

1. 在进行任何计算前,确定暴露指标和分析人群。 AUC(0-t)、 AUC(0-inf)、稳态下的 AUC(0-tau) 和 Cavg 是不同的量,回答的问题也不同。基于实测 Clast 与预测 Clast 计算的 AUCinf 也是如此。看过结果后再做选择,正是把阴性研究变成阳性的做法。

2. 结构模型、变异模型和协变量模型是三个独立的决策。 它们 经常被混为一谈——增加一个房室来吸收实际属于未建模的给药间变异,或添加协变量来修正实际属于错误设定的吸收 模型。在更改任何模型前,先诊断究竟是哪一个出了问题。

3. 收敛不等于可辨识性。 如果拟合收敛了,但某个参数的相对标准误为 200%,或两个参数的相关性为 0.99,这说明数据无法将它们区分开。这里的每个拟合脚本都会同时报告这两项并标记异常,因为在这种情况下,单看参数表会显得一切正常。

范围

此技能用于计算、诊断和构建模型。它不会判定某种制剂是否具有 生物等效性、为试验选择剂量、为患者推荐剂量、得出药物没有 QT 风险的结论,也不会 取代具备资质的药理计量学家、临床药理学家或监管审评。脚本只报告结果,不会得出结论。尤其是,tdm_bayes.py 只是建模辅助工具——任何患者给药方案的更改都应由其主治临床医生决定。

脚本

cd skills/pkpd-modeling/scripts
脚本回答的问题
nca.py暴露指标是什么,终末相是否足够可靠,可以报告这些指标?
fit_compartmental.py这些数据支持哪种结构模型,其参数是否可辨识?
simulate_regimen.py此给药方案在稳态下会产生什么结果,适用于人群中的多大比例?
check_popk_dataset.pyNONMEM 读取此数据集的方式是否符合我的预期?
exposure_response.py是否存在暴露-效应关系,数据是否涵盖平台期?
bioequivalence.py90% CI 是否符合标准,适用的是哪项标准?
allometry_and_fih.py起始剂量是多少,或较小/较年轻人群的剂量是多少?
ddi_static.py体外数据是否触发了 ICH M12 要求的临床 DDI 研究?
tdm_bayes.py根据患者测得的药物浓度,其个体参数是多少?

所有脚本都支持 --format table|tsv|json。数据输出到 stdout,来源信息和发现输出到 stderr,因此使用 > out.tsv 可以将两者分开。没有发现时退出代码为 0,发现问题时为 1, 输入错误时为 2,因此任何脚本都可以用于工作流门控。

两个私有模块提供共享功能:_models.py(线性乳腺模型的解析解,以及积分形式的 Michaelis-Menten、TMDD 和间接反应结构)和 _common.py(I/O 和报告)。请导入这些模块,而不要重新推导 Bateman 函数。

工作流

1. 非房室分析
python3 nca.py -i profile.csv --dose 100 --route extravascular --partial-auc 0-24

有四个选项会决定结果,但通常不会明确说明。本脚本将这四项全部明确列出: --auc-method(默认值为 linup-logdown)、--blq-rule、--lambda-z-points 或显式指定的 --lambda-z-window,以及报告 auc_inf_obs 还是 auc_inf_pred。

Lambda_z 的选择使用标准规则:从最后三个可定量点开始向前扩展,仅当调整后 r 平方值提升超过 0.0001 时,才保留更长的时间窗。 普通 r 平方值只会随着点数增加而上升,因此总会选中最长的时间窗。 Tmax 及之前的点永远不符合条件——纳入 Tmax 会拟合吸收末期,导致半衰期、Vz 和 AUCinf 偏低。

在 CL/F = 5、V/F = 20、ka = 1.2 的无噪声模拟单室口服药代曲线上:

id  cmax     tmax  auc_last  lambda_z  t_half   r2_adj  auc_inf_obs  pct_auc_extrap  cl_f     vz_f
1   3.29678  1.5   19.8737   0.25      2.77259  1       19.8739      0.000781037     5.03173  20.1269

CL/F 高估 0.6% 是稀疏采样吸收阶段的梯形积分法所致,并非错误——这是该采样方案下 NCA 无法避免的偏差,也是 NCA 与房室模型清除率估计值始终无法完全一致的原因。

重点在于这些发现。截断于 tau 的稳态曲线会得出:

finding: subject A: 25.2% of AUCinf is extrapolated (above 20%); AUCinf is driven by the
         lambda_z fit, not by data
finding: subject A: lambda_z window spans 0.58 half-lives (below 2.0); the terminal phase may
         not have been reached

两种结果都正确,但在实际中往往都被忽略。稳态时应报告的暴露指标是 AUC(0-tau),而不是 AUCinf;本脚本仍会计算 AUCinf,但也会提醒你不要相信它。

2. 房室拟合与模型选择
python3 fit_compartmental.py -i profile.csv --dose 500 --route iv-bolus --compare 1cmt,2cmt,3cmt

参数在对数尺度上估计,因此不会变成负值,置信区间也会呈非对称分布。权重默认采用 1/y2(恒定 CV),这是 PK 的正确默认值,却不适用于同方差的 PD 终点。

拟合模拟的双室数据(CL 4、V1 12、Q 6、V2 40、比例误差 8%):

model  parameters  wssr       aic       bic       f_vs_simpler  f_p_value    compared_with
1cmt   2           3.13201    -19.4956  -18.0795  n/a           n/a          n/a
2cmt   4           0.0309579  -84.7477  -81.9155  550.936       9.38016e-12  1cmt
3cmt   6           0.0232859  -85.0193  -80.771   1.4826        0.27762      2cmt

AIC 选择了三室模型。BIC 和 F 检验都否定了它。 每个参数固定惩罚 2 的 AIC 在此样本量下惩罚较弱,选择过度参数化模型的频率高于从业者的预期。参数表给出了最终判断:

finding: fit: Q3 has 98% RSE - not estimable from these data at this model size
finding: fit: V3 has 71% RSE - not estimable from these data at this model size

与此同时,单室模型拟合得到:

finding: fit: residual signs are not random (runs test p = 0.0036) - a structural
         misspecification, which no amount of reweighting will fix

需要正确区分的是结构设定错误与误差模型错误。残差随时间变化的图中若出现连续同号的残差,说明模型形状有误。残差呈异方差但符号随机,则说明权重有误。对第一种情况重新加权,只会掩盖问题,并不能解决问题。

3. 群体 PK

运行任何分析前,先检查数据集。这才是真正耗时的部分。

python3 check_popk_dataset.py -i nmdata.csv --covariates WT,CRCL --time-varying WT

真正重要的是那些不会显现出来的问题。NM-TRAN 不会拒绝非数值型 DV——它会将 BLQ 读作零,并将其作为真实的零浓度纳入拟合。空白协变量会变成 0,因此缺失体重会变成体重为 0 kg 的患者。没有 II 的 ADDL 不会安排额外剂量。共享时间戳的记录按文件顺序处理,因此浓度是在给药前还是给药后,取决于哪一行先出现。这些问题都不会中止运行。

severity  check                            detail
error     non-numeric DV                   DV contains text... NM-TRAN reads them as 0
error     subject with no dose             1 subject(s) have observations but no dose: 2
error     TIME not sorted                  1 subject(s) have out-of-order TIME: 1
error     covariate WT missing             1 record(s) have no value...
warning   duplicate TIME within a subject  NONMEM applies them in file order...

至于估计本身,此技能不会重新实现 NLME——估计方法、BLQ M1-M7 方法、协变量模型构建以及用于判断模型是否可接受的诊断方法,请参阅 references/population-pk.md;关于应选择哪种工具,请参阅 references/software-ecosystem.md。

4. 模拟和给药方案选择
python3 simulate_regimen.py --cl 5 --v 40 --dose 500 --interval 12 --n-doses 10 --steady-state
python3 simulate_regimen.py --cl 5 --v 40 --dose 500 --interval 12 --n-doses 10 \
    --simulate 2000 --omega-cl 0.35 --omega-v 0.25 --target-trough 4.0

确定性模拟回答的是“典型患者是什么样的”,但这几乎从来不是我们想问的问题:

metric             p5        p25      median   p75      p95      geo_mean
peak               11.861    14.6018  16.6702  19.1476  22.9339  16.6453
trough             0.863226  2.15191  3.64412  5.49655  9.21053  3.27035

target       fraction_attaining
trough >= 4  0.444

典型谷浓度为 3.6,目标为 4,因此44% 的人群可达到目标。根据典型患者调整的给药方案,会让约一半人群处于目标的错误一侧。这里报告的达标率仍然偏乐观:这只考虑了受试者间变异,没有考虑残差变异或访视间变异。

线性模型通过解析法求解并叠加,结果精确。--nonlinear 会切换为积分计算的 Michaelis-Menten 消除模型;此时叠加不再成立,而且完全无法根据单次给药推断多次给药的行为。

5. 暴露-反应关系
python3 exposure_response.py --emax -i er.csv --sigmoid
python3 exposure_response.py --cqtc -i qt.csv --cmax 250

Emax 拟合会报告 fraction_of_emax_reached,并标记平台值位于数据范围之外的拟合。如果最高观察暴露量只达到估计 Emax 的三分之一,那么 Emax 和 EC50 都是外推值,且两者高度相关;将它们作为相互独立的估计值进行报告缺乏依据,而所谓的“线性”暴露-反应关系,只是同一曲线在低浓度一侧的表现。

--cqtc 会评估预测的安慰剂校正基线变化 QTc 的双侧 90% 置信区间上限是否低于 10 ms 阈值,这才是 ICH E14 实际提出的问题。点估计或 95% 置信区间回答的是另一个问题。捆绑模型采用普通线性回归,仅用于筛查;达到申报标准的 C-QTc 分析需要混合模型,并为每位受试者设置随机截距和随机斜率。

每种模式都会附带同一条注意事项,因为这正是最容易被忽略的一点:患者是按剂量而非暴露量进行随机分组的。即使在随机试验中,按分位数分析的暴露-反应关系仍是观察性的,也可能反映影响清除率的协变量。

6. 生物等效性
python3 bioequivalence.py -i be.csv --design 2x2 --metric AUC
python3 bioequivalence.py -i be.csv --design replicate --metric Cmax --scaling both
python3 bioequivalence.py --power --cv 0.30 --gmr 0.95 --target-power 0.80

三种标准都包含“生物等效性”一词,但彼此不能互换:平均 BE(90% 置信区间在 80.00-125.00% 内)、EMA 的 ABEL(根据 CVwR 放宽界限,最高放宽至 69.84-143.19%,点估计仍须在 80-125% 内),以及 FDA 的 RSABE(通过 Hyslop 方法计算的缩放线性化界限,根本不是置信区间)。--scaling 遇到 2x2 设计时会拒绝运行:

error: reference-scaling requires --design replicate. High observed variability in a 2x2 study
does not license widening: without replicated reference administrations there is no estimate of
within-subject reference variability to scale to.

样本量计算可精确复现已发表的表格(CV 为 30%、GMR 为 0.95、把握度为 80% 时,2x2 设计的 N = 40)。把握度的计算会对估计标准差的抽样分布进行积分,而不是将标准误视为已知值——在现实样本量下,正态近似会高估把握度。请注意,N 受假设 GMR 的影响远大于 CV;假设 GMR 为 1.00 而非 0.95,会使计算出的 N 大约减半,这通常是 BE 研究把握度不足的原因。

7. 缩放、儿科和首次人体试验
python3 allometry_and_fih.py --scale --cl 5 --weight-from 70 --weight-to 6 --pma-weeks 44
python3 allometry_and_fih.py --fih --noael rat=50,dog=10 --safety-factor 10

在约 2 岁以下仅按体型进行缩放会高估清除率;对新生儿而言,可能高估数倍。这是因为清除率受酶和肾脏成熟度限制,而非仅由体型决定。提供 --pma-weeks 会加入 Anderson-Holford S 形成熟项;体重低于 20 kg 时若省略该参数,会触发一条发现。

parameter  reference  exponent  size_scaled  maturation_factor  final
CL         5          0.75      0.792063     0.30634            0.242641
V          40         1         3.42857      1                  3.42857

仅按体型计算的清除率为 0.79 L/h;在胎龄后月经年龄为 44 周时,考虑成熟度后为 0.24 L/h,相差 3.3 倍。体积不会随成熟度变化——成熟度描述的是消除能力,而非分布空间。

--fih 使用 FDA 2005 年最大安全起始剂量指南中的体表面积换算,并且始终会提示:对于激动剂免疫调节剂,仅依据 NOAEL 推导 MRSD 并不充分;应使用 --mabel 计算 MABEL,并选择较低值。

8. 药物相互作用
python3 ddi_static.py --basic --ki 0.5 --imax 2.0 --fu 0.05 --dose 0.4
python3 ddi_static.py --msm --ki 0.5 --imax 2.0 --fu 0.05 --dose 0.4 --fm 0.9 --fg 0.7

ICH M12 基础模型及其界值(肝脏 R1 ≥ 1.02,肠道 R1 ≥ 11;TDI 的 R2 ≥ 1.25; 诱导作用的 R3 ≤ 0.8;转运体界值因作用部位而异),以及机制静态模型。基础模型刻意 采取保守设定:阴性结果有参考意义;阳性结果意味着需要进一步研究,而非预测临床影响的大小。

机制静态模型会在预测结果旁报告上限:

note: With fm = 0.9, no inhibitor of this pathway can raise the victim AUC above 10.00-fold. If
the prediction approaches that ceiling, fm is doing more work than the inhibition constants.

fm 和 Fg 对结果的影响远大于抑制常数,而且通常是计算中最不确定的数值。

9. 治疗药物监测
python3 tdm_bayes.py --model vancomycin-adult --weight 80 --crcl 75 \
    --dose 1500 --interval 12 --level [email protected] --level 42@2 --target-auc24 500

当数据的信息量不足时,MAP 贝叶斯估计会向人群参数收缩;当数据的信息量充足时,则会遵循数据,因此它优于按人群参数解读谷浓度,也优于基于两个点进行对数线性回归。单个浓度值只能提示一个发现:它无法区分清除率和分布容积;对样本信息不足的参数,则会直接沿用其先验值。

随附的万古霉素参数化明确标注为示例。只有换用经过你所在人群验证的模型,输出结果才有意义。

软件生态系统

已于 2026-07-27 根据实时来源核实;完整概览参见 references/software-ecosystem.md,来源记录参见 references/source-ledger.md。

  • Pharmpy 2.1.1(2026-05-19)是实用的 Python 入门选择——与模型无关,可驱动 NONMEM/nlmixr2/rxode2,并附带 19 个 run_* 工具,包括 run_amd、run_modelsearch、 run_covsearch、run_structsearch、run_pdsearch、run_modelrank、run_vpc 和 run_qa。 最近有两项重大变更需要留意:2.0.0(2026-02-12)将数据集行索引的起始值改为 1, 2.1.0(2026-05-08)将 add_placebo_model 重命名为 set_placebo_model,且现在要求 numpy ≥ 2。
  • NONMEM 7.6(用户指南日期为 2025 年 11 月)仍是监管默认标准。相较 7.5 的新增功能: ADVAN16(用于刚性时滞微分方程的 RADAR5 隐式 Runge-Kutta)、ADVAN17(刚性 时滞微分-代数方程)、NUTS 贝叶斯抽样,以及 SAEM 个体样本存储。
  • nlmixr2(要求 rxode2 ≥ 5.0.0)是可靠的开源 NLME 替代方案; babelmixr2 和 monolix2rx 可在它、NONMEM 和 Monolix 之间转换模型。
  • PKPy(PeerJ,2025)是 Python popPK 框架,但仅在 GitHub 上提供,不在 PyPI 上, 因此 uv pip install pkpy 会失败。chi-drm(1.0.3)在 PyPI 上提供,用于贝叶斯 PKPD。
  • Open Systems Pharmacology Suite v12(PK-Sim/MoBi)是开源 PBPK 平台;Simcyp 和 GastroPlus 则是商业平台。ospsuite 仅支持 R,且需要 .NET 8。

Python 没有成熟且具备监管认可度的 NCA 或 NLME 软件包。这正是此技能提供自有的、经过验证的 NCA 和拟合实现,而非仅对其他工具进行封装的原因。

此技能旨在避免的问题

  1. 仅凭普通 r-squared 选择 Lambda_z,或在 Tmax 处进行拟合。
  2. 在 25% 的 AUCinf 来自外推的情况下报告 AUCinf。
  3. 允许 AIC 选中室间清除率 RSE 达 98% 的房室模型。
  4. 用重新加权来处理非随机残差;这属于结构性问题。
  5. 将 BLQ 留在 DV 列中,导致 NM-TRAN 将其读取为真实的零值。
  6. 根据典型患者选择给药方案,却不估算人群中的达标情况。
  7. 在从未观察到平台期时,将 Emax 和 EC50 作为相互独立的估计值报告。
  8. 将参考制剂标度的生物等效性界限用于 2x2 研究。
  9. 在没有成熟度项的情况下,对新生儿进行异速生长缩放。
  10. 将基于 NOAEL 得出的 MRSD 用作激动剂免疫调节剂的起始剂量。

参考资料

  • references/nca-conventions.md — 参数定义、lambda_z 规则、BLQ 处理、稳态
  • references/structural-models.md — 闭式解、参数化、NONMEM ADVAN/TRANS 映射
  • references/population-pk.md — NLME 估计、协变量构建、BLQ M1-M7、诊断、VPC
  • references/pd-and-exposure-response.md — Emax、间接反应、效应室、ER 分析
  • references/tmdd-and-biologics.md — TMDD 近似、单克隆抗体 PK、免疫原性
  • references/pbpk.md — PBPK 何时值得投入、平台,以及验证所需条件
  • references/bioequivalence.md — 设计、ABE/ABEL/RSABE、ICH M13 系列、高变异药物
  • references/special-populations.md — 儿科、肾功能和肝功能损害、肥胖、妊娠
  • references/dataset-standards.md — CDISC PC/PP 和 ADPC/ADPP、NONMEM 数据项、常见缺陷
  • references/ddi-and-qt.md — ICH M12 分步评估、静态模型、ICH E14/S7B C-QTc
  • references/antimicrobial-and-tdm.md — PK/PD 指标、PTA/CFR、万古霉素 AUC 指导给药、MIPD
  • references/software-ecosystem.md — 所有工具、用途、许可和已验证版本
  • references/regulatory-guidance.md — 指南清单,包含日期、状态及各项要求
  • references/source-ledger.md — 本技能中每项声明的来源及研究日期

资源

  • assets/popk-analysis-plan.md — 群体分析计划结构,预先列明各项决策
  • assets/nca-reporting-checklist.md — NCA 报告必须说明的内容,以便解读数值

Agent 操作流程

  1. 检查环境。 确认工具包版本和输入格式(SMILES、SDF、PDB、CIF),并在计算前清理分子。
  2. 明确输入。 根据数据或用户提供的信息确认格式、标识符和参数。任何会改变结果的数值都应询问,不要猜测。
  3. 先运行小规模任务。 先处理少量分子或一个靶点,并检查输出。
  4. 使用上述说明和参考资料执行完整任务。
  5. 验证结果。 检查无效结构、单位一致性和预测模型的适用域。
  6. 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及仍有哪些不确定之处。
如果发生这种情况请这样做
分子解析或清理失败说明原因并跳过;绝不要悄悄丢弃或更改结构。
已安装版本中缺少这些说明提及的函数、标志或端点查阅已安装版本自带的文档(help()、--help、官方文档),进行调整并告知用户。绝不要编造 API。
必需的输入、标识符或参数含糊不清询问用户,或在运行前明确说明假设。

诚信准则

  • 绝不要编造结果、参数、标识符、引文或统计数据。若某项内容无法运行或验证,请如实说明。
  • 计算预测是待验证的假设,不是实验结果;应明确标注。
  • 此处与特定版本相关的细节可能已经过时:请对照已安装版本的官方文档进行确认。
  • 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,请先征求同意。

评论

支持 Markdown