NONMEM 语法对照#

本节中提供了一些在 NONMEM 中常用的模型与 Masmod 的对照:

基础自定义模型#

class Warfarin(Module):
    def __init__(self) -> None:
        super().__init__()
        self.theta_v = theta(7.81, bounds=(0, None))
        self.theta_cl = theta(0.134, bounds=(0, None))
        self.theta_ka = theta(0.571, bounds=(0, None))
        self.theta_alag = theta(0.823, bounds=(0, None))

        self.eta_v = omega(0.049)
        self.eta_cl = omega(0.0802)
        self.eta_ka = omega(0.47)
        self.eta_alag = omega(0.156)

        self.eps_prop = sigma(0.0104)
        self.eps_add = sigma(0.554)

        self.dose, self.wt, self.t = column(["DOSE", "WT", "TIME"])

    def pred(self) -> Expression:
        v = self.theta_v * exp(self.eta_v)
        cl = self.theta_cl * exp(self.eta_cl)
        ka = self.theta_ka * exp(self.eta_ka)
        alag = self.theta_alag * exp(self.eta_alag)
        k = cl / v

        ipred = 0
        if self.t > alag:
            ipred = self.dose / v * ka / (ka - k) * (exp(-k * (self.t - alag)) - exp(-ka * (self.t - alag)))

        y = ipred * (1 + self.eps_prop) + self.eps_add

        return y

model = PopModel(mod=Warfarin, data=warfarin)
fit_res = model.fit(FOCEi(maxiter=9999, print=10), cov=True)
fit_res.summary()
$PROBLEM Warfarin PK Model
$DATA warfarin.csv IGNORE=#
$INPUT ID TIME AMT DV DVID MDV DOSE WT AGE SEX

$PRED
V = THETA(1) * EXP(ETA(1))
CL = THETA(2) * EXP(ETA(2))
KA = THETA(3) * EXP(ETA(3))
ALAG = THETA(4) * EXP(ETA(4))
K = CL / V

IPRED = 0
IF (TIME>ALAG) THEN
IPRED = DOSE / V * KA / (KA - K) * (EXP(-K * (TIME - ALAG)) - EXP(-KA * (TIME - ALAG)))
ENDIF

Y = IPRED * (1 + EPS(1)) + EPS(2)

$THETA
(0.0, 7.81, 1000000.0); theta_v
(0.0, 0.134, 1000000.0); theta_cl
(0.0, 0.571, 1000000.0); theta_ka
(0.0, 0.823, 1000000.0); theta_alag

$OMEGA 0.049
$OMEGA 0.0802
$OMEGA 0.47
$OMEGA 0.156

$SIGMA 0.0104
$SIGMA 0.554

$ESTIMATION METHOD=COND INTER MAXEVAL=9999 PRINT=10
$COVARIANCE

内置药动学房室模型#

class Warfarin(EvOneCmtLinear):
    def __init__(self) -> None:
        super().__init__()
        self.theta_cl = theta(0.134, bounds=(0, None))
        self.theta_v = theta(7.81, bounds=(0, None))
        self.theta_ka = theta(0.571, bounds=(0, None))
        self.theta_alag = theta(0.823, bounds=(0, None))

        self.eta_cl = omega(0.049)
        self.eta_v = omega(0.0802)
        self.eta_ka = omega(0.047)
        self.eta_alag = omega(0.156)

        self.eps_prop = sigma(0.0104)
        self.eps_add = sigma(0.554)

    def pred(self) -> Expression:
        cl = self.theta_cl * exp(self.eta_cl)
        v = self.theta_v * exp(self.eta_v)
        ka = self.theta_ka * exp(self.eta_ka)
        alag = self.theta_alag * exp(self.eta_alag)

        pred_res = self.pred_physio(cl=cl, v=v, ka=ka, alag1=alag, s2=v)
        ipred = pred_res.F

        y = ipred * (1 + self.eps_prop) + self.eps_add

        return y


model = PopModel(mod=Warfarin, data=warfarin)
fit_res = model.fit(FOCEi(maxiter=9999, print=10), cov=True)
fit_res.summary()
$PROBLEM Warfarin PK Model
$DATA warfarin.csv IGNORE=#
$INPUT ID TIME AMT DV DVID MDV WT AGE SEX
$SUBROUTINES ADVAN2 TRANS2

$PK
CL = THETA(1) * EXP(ETA(1))
V = THETA(2) * EXP(ETA(2))
KA = THETA(3) * EXP(ETA(3))
ALAG1 = THETA(4) * EXP(ETA(4))
S2 = V

$ERROR
IPRED = F
T = IPRED * (1 + EPS(1)) + EPS(2)

$THETA
(0.0, 7.81, 1000000.0); theta_v
(0.0, 0.134, 1000000.0); theta_cl
(0.0, 0.571, 1000000.0); theta_ka
(0.0, 0.823, 1000000.0); theta_alag

$OMEGA 0.049
$OMEGA 0.0802
$OMEGA 0.47
$OMEGA 0.156

$SIGMA 0.0104
$SIGMA 0.554

$ESTIMATION METHOD=COND INTER MAXEVAL=9999 PRINT=10
$COVARIANCE

ADVAN 与 TRANS 对照表#

ADVAN 与 TRANS 编号

Masmod 模型类名与方法

ADVAN1 TRANS1

IvOneCmtLinear.pred_micro

ADVAN1 TRANS2

IvOneCmtLinear.pred_physio

ADVAN2 TRANS1

EvOneCmtLinear.pred_micro

ADVAN2 TRANS2

EvOneCmtLinear.pred_physio

ADVAN3 TRANS1

IvTwoCmtLinear.pred_micro

ADVAN3 TRANS3

IvTwoCmtLinear.pred_physio_vss

ADVAN3 TRANS4

IvTwoCmtLinear.pred_physio

ADVAN3 TRANS5

IvTwoCmtLinear.pred_macro_aob

ADVAN3 TRANS6

IvTwoCmtLinear.pred_macro_micro

ADVAN4 TRANS1

EvTwoCmtLinear.pred_micro

ADVAN4 TRANS3

EvTwoCmtLinear.pred_physio_vss

ADVAN4 TRANS4

EvTwoCmtLinear.pred_physio

ADVAN4 TRANS5

EvTwoCmtLinear.pred_macro_aob

ADVAN4 TRANS6

EvTwoCmtLinear.pred_macro_micro

微分方程模型#

class Warfarin(OdeModule):
    def __init__(self) -> None:
        super().__init__(solver=odeint.DVERK(tol=1e-3))
        self.dose_cmt = compartment(default_dose=True)
        self.central_cmt = compartment(default_obs=True)

        self.theta_v = theta(7.81, bounds=(0, None))
        self.theta_cl = theta(0.134, bounds=(0, None))
        self.theta_ka = theta(0.571, bounds=(0, None))
        self.theta_alag = theta(0.823, bounds=(0, None))

        self.eta_v = omega(0.049)
        self.eta_cl = omega(0.0802)
        self.eta_ka = omega(0.47)
        self.eta_alag = omega(0.156)

        self.eps_prop = sigma(0.0104)
        self.eps_add = sigma(0.554)

    def pred(self) -> Expression:
        cl = self.theta_cl * exp(self.eta_cl)
        v = self.theta_v * exp(self.eta_v)
        ka = self.theta_ka * exp(self.eta_ka)

        k = cl / v

        self.dose_cmt.dAdt = -ka * self.dose_cmt.A
        self.central_cmt.dAdt = ka * self.dose_cmt.A - k * self.central_cmt.A
        alag1 = self.theta_alag * exp(self.eta_alag)
        self.dose_cmt.alag = alag1

        ipred = self.central_cmt.A / v
        y = ipred * (1 + self.eps_prop) + self.eps_add

        return y

model = PopModel(mod=Warfarin, data=warfarin)
fit_res = model.fit(FOCEi(maxiter=9999, print=10), cov=True)
fit_res.summary()
$PROBLEM Warfarin PK Model
$DATA warfarin.csv IGNORE=#
$INPUT ID TIME AMT DV DVID MDV WT AGE SEX
$SUBROUTINES ADVAN6 TRANS1 TOL=3
$MODEL COMP(dose_cmt, DEFDOSE) COMP(central_cmt, DEFOBS)

$PK
V = THETA(1) * EXP(ETA(1))
CL = THETA(2) * EXP(ETA(2))
KA = THETA(3) * EXP(ETA(3))
ALAG1 = THETA(4) * EXP(ETA(4))
K = CL / V

$DES
DADT(1) = -KA * A(1)
DADT(2) = KA * A(1) - K * A(2)

$ERROR
IPRED = A(2) / V
Y = IPRED * (1 + EPS(1)) + EPS(2)

$THETA
(0.0, 7.81, 1000000.0); theta_v
(0.0, 0.134, 1000000.0); theta_cl
(0.0, 0.571, 1000000.0); theta_ka
(0.0, 0.823, 1000000.0); theta_alag

$OMEGA 0.049
$OMEGA 0.0802
$OMEGA 0.47
$OMEGA 0.156

$SIGMA 0.0104
$SIGMA 0.554

$ESTIMATION METHOD=COND INTER MAXEVAL=9999 PRINT=10
$COVARIANCE