摘要
这篇文章是 NONMEM 入门章节,核心不是讲某个具体模型结果,而是讲清楚一个新手最容易卡住的地方:NM-TRAN control stream 到底是什么,以及一份简单 PK 模型控制流应该怎么组织。
我读下来觉得它最值得记住的主线是:NONMEM 不是点选式软件,而是一套 batch-mode 的建模系统;控制流就是你给 NM-TRAN、PREDPP 和 NONMEM 写的“任务说明书”。这份说明书要告诉系统:数据在哪里、每一列叫什么、用哪个 ADVAN/TRANS、结构参数怎么写、随机效应怎么放、残差怎么定义、初值和方差怎么给、最后要估计什么和输出什么。
引言
对刚开始学 NONMEM 的人来说,最难的往往不是理解 clearance、volume 或 ETA,而是不知道一份控制流为什么要长成那个样子。如果只把别人写好的 `.ctl` 文件当模板改,很容易变成“能跑但不知道为什么能跑”。
这篇文章的价值就在于把 NONMEM 系统拆成三个层次:NM-TRAN 负责翻译控制流,PREDPP 提供常用 PK 模型子程序,NONMEM 负责非线性混合效应模型估计。一份 control stream 就是把这三者串起来的入口。
NONMEM 系统怎么分工
文章把 NONMEM 系统分成三个主要组件。第一是 NM-TRAN,也就是 NonMem TRANslator,它读取用户写的 control stream,检查语法和格式,并把指令转换成 NONMEM 可以处理的形式。
第二是 PREDPP,也就是 Prediction of Population Pharmacokinetic models and parameters 的子程序库。对常见 PK 模型来说,PREDPP 很重要,因为它已经内置了很多经典结构模型,例如一室、二室、三室、一级吸收、一级消除等。模型员不必每次都从微分方程开始手写完整模型,而是通过 ADVAN 和 TRANS 组合调用合适的结构。
第三才是 NONMEM 本体,也就是估计 nonlinear mixed effects models 的引擎。简单说,NM-TRAN 像翻译和调度,PREDPP 像模型库,NONMEM 像真正执行估计的发动机。
控制流的一般规则
NM-TRAN control stream 是纯文本文件。文章强调它应保存为 ASCII/plain text,而不是 Word 文档这类带格式的文件。每个 record 或 block 通常以 `$` 开头,例如 `$PROBLEM`、`$DATA`、`$INPUT`、`$PK`、`$ERROR`。
一个很实用的细节是:record 名可以缩写到至少前三个字符,比如 `$PROBLEM` 可以写成 `$PROB` 或 `$PRO`。不过对于新手,我反而建议先用完整写法,因为完整写法更像自解释文档,后面复盘时不容易迷路。
注释用分号 `;` 开始。分号后到行尾的内容不会被 NM-TRAN 读取。这个习惯非常值得从第一天开始养成:每个关键初值、每个特殊数据筛选、每个模型变更,都应该用注释说明意图。以后回头看模型历史时,这些注释比文件名还救命。
必需控制流组件
`$PROBLEM` 是整份控制流的标题和身份标签。文章建议每次从旧模型复制控制流开始改新模型时,先改 `$PROBLEM`。这点很朴素,但很重要,因为模型开发会很快堆出几十上百个文件,标题和文件名体系不清楚,后面就会变成考古。
`$DATA` 告诉 NM-TRAN 数据文件在哪里。这个 record 还能通过 `IGNORE` 和 `ACCEPT` 做数据子集选择。文章特别强调,条件式 `IGNORE` 可以让你在不改原始数据文件的情况下测试不同子集,例如按 study、体重、疾病严重程度或异常观测做排除。
`$INPUT` 告诉 NM-TRAN 数据每一列按什么变量名读取。这里会出现 NONMEM/PREDPP 的保留变量名,比如 `ID`、`TIME`、`AMT`、`DV`、`CMT`、`EVID`、`MDV`。如果数据列很多,可以用 `DROP` 丢弃当前模型不用的列;但要注意,`$DATA` 的条件筛选在 `$INPUT DROP` 前发生,所以被 DROP 的变量仍可用于筛选。
模型结构:ADVAN 与 TRANS
对常规 PK 模型,文章重点讲了 `$SUBROUTINES`。这里的关键是 ADVAN 决定结构模型,TRANS 决定参数化方式。
例如,`ADVAN1` 常对应一室一级消除;`ADVAN2` 对应一室一级吸收和消除;`ADVAN3/4` 进入二室模型;`ADVAN11/12` 则对应三室相关结构。TRANS 则决定你用 rate constants 还是 clearance/volume 这类参数来表达模型。对药代建模来说,`CL/V/KA/Q` 这些参数化通常更符合解释习惯。
这里的新手陷阱是:ADVAN/TRANS 一旦选定,哪些参数必须在 `$PK` 里定义也随之确定。例如 `ADVAN2 TRANS2` 需要定义 `CL`、`V`、`KA`;如果是更复杂的二室或三室组合,就会多出 `Q`、`V2/V3` 等参数。
`$PK`:把 THETA 和 ETA 变成个体参数
`$PK` block 是结构参数和个体差异的核心区域。文章示例里使用了常见写法:先定义 typical value,例如 `TVCL`、`TVV`、`TVKA`,再通过 ETA 引入个体间变异。
这种写法的好处不只是好看。第一,`TVCL` 这类中间变量可以输出到表格,方便后处理和画图;第二,当以后加入协变量时,只需要修改 typical value 方程,而不用重写整个参数表达式。比如体重影响 clearance 时,可以把 `TVCL` 改成含体重项的表达式。
对 PK 参数,文章推荐理解指数型 IIV 写法的优势:`EXP(ETA)` 可以让个体参数保持正值。这对 CL、V、KA 这类本来就应该为正的参数很重要。相反,加性误差或简单比例误差在某些 ETA 取值下可能导致负的个体参数。
附加参数与单位缩放
文章还讲了几个常见附加参数:`ALAG` 用于吸收滞后时间,`F` 用于相对生物利用度,`R` 和 `D` 用于零级输入速率或持续时间,`S` 用于 scale。
其中我觉得新手最容易忽略的是 `S` scale parameter。如果剂量单位和浓度单位不在同一量纲,例如剂量是 mg、DV 是 ng/mL,就需要明确地用 scale 把模型预测和观测值单位对齐。文章举的一室模型逻辑可以概括为:结构模型算的是 amount/volume,最终要让 F 的数值单位和 DV 对上。
快速对照表
| Record / Block | 作用 | 读控制流时先问什么 |
|---|---|---|
$PROBLEM |
模型标题和目的说明 | 这次 run 到底想回答什么? |
$DATA |
指定数据文件和筛选规则 | 用的是哪个数据集?排除了哪些记录? |
$INPUT |
定义数据列名和读取顺序 | 数据列是否和控制流变量一一对应? |
$SUBROUTINES |
选择 PREDPP 模型结构和参数化 | ADVAN/TRANS 对应哪些必需参数? |
$PK |
定义结构参数、协变量和 IIV | THETA、ETA 分别落在哪些参数上? |
$ERROR |
定义残差模型和观测预测值 | Y 如何由 F 和 EPS 得到? |
$THETA/$OMEGA/$SIGMA |
固定效应、IIV 方差、残差方差初值 | 初值是否有药理和数值上的合理性? |
$EST/$COV/$TABLE |
估计方法、协方差、输出表 | 跑什么估计?输出什么用于诊断? |
讨论
这篇文章虽然是入门内容,但它背后的训练目标很重要:先把一室模型的控制流读透,再逐步加复杂度。NONMEM 学习最怕一开始就拿复杂模型复制粘贴,因为每一行都像咒语,一旦报错或结果异常,就不知道从哪里查。
我自己的读法是,控制流可以按三条线检查。第一条是数据线:`$DATA` 和 `$INPUT` 是否真正读到了你以为的数据。第二条是模型线:`$SUBROUTINES` 和 `$PK` 是否匹配,必需参数有没有定义,单位 scale 有没有对。第三条是误差和估计线:`$ERROR`、`$THETA/$OMEGA/$SIGMA`、`$EST` 和 `$TABLE` 是否支持你当前模型阶段的诊断。
此外,文章对 `IGNORE/ACCEPT` 的介绍很实用。对建模来说,临时排除某些 study、某些体重范围或某些异常观测,最好尽量通过控制流声明,而不是反复手改数据文件。这样模型历史更可追溯,也更容易复现。
结论
如果把这篇文章压缩成一句话,我会写成:NM-TRAN control stream 是 NONMEM 建模的最小可复现单元,它把数据读取、模型结构、参数初值、随机效应、残差模型、估计方法和输出诊断全部组织在一起。
对新手来说,不要急着背所有 ADVAN/TRANS,也不要一开始就追求复杂协变量模型。更好的起点是:能逐行解释一份一室模型 control stream,并知道每个 record 对后续估计和输出有什么影响。
我的几点启发
1. 控制流首先是文档,其次才是可运行代码。 `$PROBLEM`、注释、文件命名和输出表设计,都会影响后续模型追踪。
2. 数据筛选尽量写进 `$DATA`。 `IGNORE/ACCEPT` 比手动改数据更利于复现,尤其是模型开发阶段反复测试子集时。
3. ADVAN/TRANS 不是形式选择,而是参数义务。 选了某个组合,就必须知道哪些参数要在 `$PK` 里定义。
4. Scale 参数要早早养成检查习惯。 很多奇怪的预测和残差问题,本质上可能只是单位没有对齐。