7. 协变量筛选#

7.1. mas.model.scm#

class mas.model.scm#

7.1.1. spec()#

spec(direction='both', p_forward=0.05, p_backward=0.01, global_init=0.001, maxiter=None, accept_rule=None) MarkedScmSpecDefFunctionType#

标记一个函数作为 scm 配置函数

参数:

  • direction ("forward" | "backward" | "both", optional): 搜索方向。默认值为"both"

  • p_forward (float, optional): 前向搜索过程中假设检验的显著性水平。即若 p 值小于此值,则纳入此协变量关系。默认值为 0.05

  • p_backward (float, optional): 逆向搜索过程中假设检验的显著性水平。即若 p 值大于此值,则剔除此协变量关系。默认值为 0.01

  • global_init (float, optional): 所有因纳入协变量关系而新增的固定效应参数(theta)初值。默认值为 1e-3

  • maxiter (int, optional): 最大搜索次数。默认值为 None

  • accept_rule (AcceptRuleCallable, optional): 用户自定义的接受规则。

    例如设置自定义接受规则为:仅当纳入协变量后清除率的个体间变异参数方差估计值 omega["eta_cl", "eta_cl"] 减小 30% 或以上时才接受新的协变量模型。

    def custom_rule(context: AcceptRuleContext) -> bool:
        if context.direction == "forward":
            if context.test_params.omega["eta_cl", "eta_cl"] / context.base_params.omega["eta_cl", "eta_cl"] < 0.7:
                return True
        return False
    

示例:

@scm.spec(direction="forward", maxiter=20)
def my_scm_spec(m: Warfarin):
    ...

7.1.2. test_cont()#

test_cont(covariates, on, states, init=None, bounds=None, init_state=None) None#

指定需要被测试的连续协变量-参数关系。

参数:

  • covariates (AnyContinuousColVar | list[AnyContinuousColVar] | NumericContinuousColVarCollection | str | list[str]):需要被测试的连续协变量。一般接受自 column()multicolumn() 定义的变量。

  • on (Theta | list[Theta] | str | list[str]):需要被引入协变量的固定效应参数。

  • states (AnyCategoricalValidStates | AnyContinuousValidStates):需要被测试的协变量-参数关系状态。对应的协变量效应参数化形式请参考 协变量效应参数化公式。对于连续型协变量,支持的状态为 "exclude""linear""piecewise""exp""power"。设置 states="*" 代表筛选时尝试所有的可选状态。

  • init (ValueType | list[ValueType | PiecewiseValueType | None], optional):因纳入协变量关系而新增的协变量效应参数初值。若为 None,将自动计算初值。默认值为 None

  • bounds (BoundsType | list[BoundsType | PiecewiseBoundsType | None], optional):协变量效应参数估计的上下边界值。若为 None,将自动计算边界值。默认值为 None

  • init_state (CategoricalValidStateType, optional):在搜索开始时即被引入至模型的协变量关系及其状态。默认值为 None

7.1.3. test_cat()#

test_cat(covariates, on, states, init=None, bounds=None, init_state=None) None#

指定需要被测试的分类协变量-参数关系。

参数:

  • covariates (AnyCategoricalColVar | list[AnyCategoricalColVar] | StrCategoricalColVarCollection | str | list[str]):需要被测试的分类协变量。一般接受自 column()multicolumn() 定义的变量。

  • on (Theta | list[Theta] | str | list[str]):需要被引入协变量的固定效应参数。

  • states (AnyCategoricalValidStates | AnyContinuousValidStates):需要被测试的协变量-参数关系状态。对应的协变量效应参数化形式请参考 协变量效应参数化公式。对于分类型协变量,支持的状态为 "exclude""linear"。设置 states="*" 代表筛选时尝试所有的可选状态。

  • init (ValueType | list[ValueType | PiecewiseValueType | None], optional):因纳入协变量关系而新增的协变量效应参数初值。若为 None,将自动计算初值。默认值为 None

  • bounds (BoundsType | list[BoundsType | PiecewiseBoundsType | None], optional):协变量效应参数估计的上下边界值。若为 None,将自动计算边界值。默认值为 None

  • init_state (CategoricalValidStateType, optional):在搜索开始时即被引入至模型的协变量关系及其状态。默认值为 None

7.1.4. 协变量效应参数化公式#

总则

以乘法的形式结合各协变量效应与原模型固定效应参数,公式如下:

\[ p_{ki} = \theta_{k} \times g_{k}({z}_i) + \eta_{ki} \]
\[ g({z}_i) = \prod_{r = 1}^{q} c_{ir} \]

假设原模型中共有 k 个固定效应参数与 i 个个体。其中,\(p_{ki}\) 为第 i 个个体的第 k 个固定效应参数的估计值;\(\theta_{k}\) 为此固定效应参数的群体典型值;\(\eta_{ki}\) 为此固定效应参数的个体间变异;\({z}_i\) 为第 i 个个体的协变量值向量;\(g_{k}\) 为有关于 \({z}_i\) 的函数,用于描述协变量与固定效应参数间的关系,具体由纳入协变量的个数 r 以及不同的协变量-参数关系状态(\(c_{ir}\))决定。

各状态的参数化公式

  • "exclude":不引入任何协变量。

  • "linear":以线性关系引入协变量,公式如下:

若为连续型协变量:

\[ c_{ir} = 1 + \theta_{r} \times (z_{ir} - median(z_r)) \]

若为分类协变量(以二分类变量为例):

\[\begin{split} c_{ir} = \begin{cases} 1 & 若 \quad z_{ir} = a \\ 1 + \theta_{r} & 若 \quad z_{ir} = b \end{cases} \end{split}\]
  • "piecewise":以分段线性关系引入协变量,公式如下:

\[\begin{split} c_{ir} = \begin{cases} 1 + \theta_{r} \times (z_{ir} - median(z_r)) & 若 \quad z_{ir} ≤ median(z_r) \\ 1 + \theta_{r+1} \times (z_{ir} - median(z_r)) & 若 \quad z_{ir} > median(z_r) \end{cases} \end{split}\]
  • "exp":以指数形式引入协变量,公式如下:

\[ c_{ir} = exp(\theta_{r} \times (z_{ir} - median(z_r))) \]
  • "power":以幂的形式引入协变量,公式如下:

\[ c_{ir} = \theta_{r}^{z_{ir} - median(z_r)} \]

上述公式中,\(\theta_{r}\) 为协变量效应参数,表明了协变量值的变动对固定效应参数的影响大小。

参考文献

Jonsson, E. N., & Karlsson, M. O. (1998). Automated covariate model building within NONMEM. Pharmaceutical research, 15(9), 1463–1468.

示例:

例如,假设在模型固定效应参数清除率(self.pop_cl)上以线性关系引入了协变量体重(self.wt)与年龄(self.age),模型将变为如下形式:

class WarfarinPk(EvOneCmtLinear.Physio):
    """
    pop_cl ~ WT @ linear
    pop_cl ~ AGE @ linear
    """

    def __init__(self):
        super().__init__()
        self.pop_cl = theta(0.15, bounds=(0.01, 10.0), fixed=False)
        self.pop_v = theta(8.0, bounds=(0.01, 20.0), fixed=False)
        self.pop_ka = theta(0.5, bounds=(0.01, 5.0), fixed=False)
        self.pop_alag = theta(0.8, bounds=(0.01, 24.0), fixed=False)
        self.WT__pop_cl_1 = theta(-0.003125, bounds=(-0.03125, 0.03333), fixed=False)
        self.AGE__pop_cl_1 = theta(-0.002985, bounds=(-0.02985, 0.1176), fixed=False)
        self.eta_cl = omega(0.05, fixed=False)
        self.eta_v = omega(0.08, fixed=False)
        self.eta_ka = omega(0.05, fixed=False)
        self.eta_alag = omega(0.15, fixed=False)
        self.eps_prop = sigma(0.01, fixed=False)
        self.eps_add = sigma(0.55, fixed=False)
        self.WT = column('WT', dtype='numeric', is_categorical=False)
        self.AGE = column('AGE', dtype='numeric', is_categorical=False)

    def pred(self):
        AGE__pop_cl = 1 + self.AGE__pop_cl_1 * (self.AGE - 29.5)
        pop_cl__with_cov = self.pop_cl * AGE__pop_cl
        WT__pop_cl = 1 + self.WT__pop_cl_1 * (self.WT - 70.0)
        pop_cl__with_cov = pop_cl__with_cov * WT__pop_cl
        cl = pop_cl__with_cov * exp(self.eta_cl)
        v = self.pop_v * exp(self.eta_v)
        ka = self.pop_ka * exp(self.eta_ka)
        alag = self.pop_alag * exp(self.eta_alag)
        F = self.solve(cl=cl, v=v, ka=ka, alag1=alag, s2=v)
        ipred = F
        y = ipred * (1 + self.eps_prop) + self.eps_add
        return y
from mas.model import *
from mas.datasets import warfarin_pk


class WarfarinPk(EvOneCmtLinear.Physio):
    def __init__(self) -> None:
        self.pop_cl = theta(0.15, bounds=(0.01, 10))
        self.pop_v = theta(8, bounds=(0.01, 20))
        self.pop_ka = theta(0.5, bounds=(0.01, 5))
        self.pop_alag = theta(0.8, bounds=(0.01, 24))

        self.eta_cl = omega(0.05)
        self.eta_v = omega(0.08)
        self.eta_ka = omega(0.05)
        self.eta_alag = omega(0.15)

        self.eps_prop = sigma(0.01)
        self.eps_add = sigma(0.55)

    def pred(self):
        cl = self.pop_cl * exp(self.eta_cl)  # 指数型个体间变异
        v = self.pop_v * exp(self.eta_v)
        ka = self.pop_ka * exp(self.eta_ka)
        alag = self.pop_alag * exp(self.eta_alag)

        F = self.solve(cl=cl, v=v, ka=ka, alag1=alag, s2=v)  # 使用生理药动学参数预测
        ipred = F  # 血药浓度预测值

        y = ipred * (1 + self.eps_prop) + self.eps_add  # 比例型与加和型个体内变异

        return y


model = PopModel(WarfarinPk, warfarin_pk)
fit_res = model.fit()
[MTran] Start interpreting module: WarfarinPk
[MTran] Interpretation finished in 0.575977 seconds
[MTran] Vaporization started for WarfarinPk(EvOneCmtLinear.Physio)
[MTran] Vaporization finished in 0.169499 seconds
🔧 CXX compiler C:\ProgramData\mingw64\bin\g++.EXE
📦 Compiling build target...
🔗 Linking dynamic library...
✅ Compilation Finished
✈️ First Order Conditional Estimation
Using BFGS...
* maxiter = 9999
* xtol = 1e-06
* ftol = 1e-06
* lower_bounds = 
* upper_bounds = 
* log_level = 0
* print = 1
* print_type = 0
* verbose = 1
* p_small = 0.1
* rel_step_size = 0.001

# 0    ofv: 364.3540523
Params:       1.0000e-01  1.0000e-01  1.0000e-01  1.0000e-01  1.0000e-01  1.0000e-01  1.0000e-01  1.0000e-01  1.0000e-01  1.0000e-01
NParams:      1.5000e-01  8.0000e+00  5.0000e-01  8.0000e-01  2.2361e-01  2.8284e-01  2.2361e-01  3.8730e-01  1.0000e-01  7.4162e-01
Gradients:    1.0109e+02  7.4483e+00 -1.0453e+02  3.0997e+01 -3.7062e+01  1.6551e+01 -4.5978e+01 -1.3859e+01  3.2815e+01  1.1441e+02
Funcalls:   8
# 1    ofv: 299.5539461
Params:      -1.6505e-01  8.0470e-02  3.7407e-01  1.8725e-02  1.9718e-01  5.6603e-02  2.2056e-01  1.3634e-01  1.3957e-02 -2.0000e-01
NParams:      1.1775e-01  7.9065e+00  6.3515e-01  7.4021e-01  2.4643e-01  2.7083e-01  2.5226e-01  4.0163e-01  9.1755e-02  5.4941e-01
Gradients:   -1.1408e+02 -2.6476e+00 -7.2145e+01  1.0928e+01 -3.4008e+01  1.5793e+01 -3.6542e+01 -1.2031e+01  3.8902e+01  8.5342e+01
Funcalls:   17
# 2    ofv: 265.0144085
Params:       8.0508e-02  8.6169e-02  5.2938e-01 -4.7986e-03  2.7039e-01  2.2606e-02  2.9922e-01  1.6224e-01 -6.9785e-02 -3.8371e-01
NParams:      1.4733e-01  7.9338e+00  7.2513e-01  7.2374e-01  2.6514e-01  2.6178e-01  2.7290e-01  4.1217e-01  8.4385e-02  4.5720e-01
Gradients:    7.8372e+01 -6.9285e-01 -5.0120e+01  2.1018e+00 -1.8873e+01  1.4570e+01 -3.3889e+01 -1.1711e+01  2.6262e+01  5.7212e+01
Funcalls:   26
# 3    ofv: 237.8232702
Params:      -4.4996e-02  9.3925e-02  8.7340e-01 -3.3590e-02  4.1236e-01 -6.7988e-02  5.0958e-01  2.3385e-01 -2.5205e-01 -7.8184e-01
NParams:      1.3133e-01  7.9709e+00  9.6270e-01  7.0407e-01  3.0559e-01  2.3911e-01  3.3679e-01  4.4277e-01  7.0325e-02  3.0704e-01
Gradients:   -3.8265e+00  1.9052e+00 -7.4667e+00  2.9178e-01  5.1942e+00  6.6084e+00 -3.2573e+01 -2.3613e+00 -6.1540e+01 -1.1129e+01
Funcalls:   35
# 4    ofv: 226.8520803
Params:      -8.7464e-02  8.5075e-02  1.1354e+00 -5.3358e-02  4.6160e-01 -1.6997e-01  8.6937e-01  2.9401e-01  7.6682e-02 -9.4398e-01
NParams:      1.2635e-01  7.9285e+00  1.1811e+00  6.9087e-01  3.2101e-01  2.1592e-01  4.8263e-01  4.7022e-01  9.7695e-02  2.6109e-01
Gradients:   -2.4146e+01 -5.2178e+00  4.3135e+00 -4.0057e+00  1.0957e+01 -1.4615e+00 -1.5678e+01  2.0751e-01  4.4022e+01  9.8397e+00
Funcalls:   44
# 5    ofv: 221.942983
Params:      -7.4977e-02  1.4710e-01  1.1112e+00  2.6679e-02  2.0417e-01 -2.1551e-01  1.4630e+00  3.1768e-01  3.0043e-03 -9.5099e-01
NParams:      1.2779e-01  8.2269e+00  1.1595e+00  7.4586e-01  2.4816e-01  2.0631e-01  8.7381e-01  4.8149e-01  9.0756e-02  2.5926e-01
Gradients:   -3.0250e+01  2.4856e+01 -2.0250e+00 -9.9372e-01 -2.1573e+01 -8.1454e+00  2.3013e+00  1.4438e+00  1.6175e+01  6.1248e+00
Funcalls:   53
# 6    ofv: 221.0960183
Params:      -7.2891e-02  8.3836e-02  1.0966e+00  4.6522e-02  2.1288e-01 -1.9917e-01  1.5544e+00  3.1610e-01 -1.5021e-02 -9.3995e-01
NParams:      1.2803e-01  7.9226e+00  1.1467e+00  7.6015e-01  2.5033e-01  2.0971e-01  9.5747e-01  4.8072e-01  8.9135e-02  2.6214e-01
Gradients:   -2.7840e+01 -4.5294e+00 -2.5595e+00  1.2686e-01 -2.0115e+01 -4.8061e+00  4.3218e+00  1.6257e+00  1.1704e+01  5.6767e+00
Funcalls:   62
# 7    ofv: 220.3849934
Params:      -7.2355e-02  1.0763e-01  1.0591e+00  8.2535e-02  3.2093e-01 -1.5401e-01  1.6748e+00  3.0074e-01 -3.7553e-02 -9.0280e-01
NParams:      1.2810e-01  8.0366e+00  1.1141e+00  7.8677e-01  2.7889e-01  2.1940e-01  1.0799e+00  4.7340e-01  8.7149e-02  2.7206e-01
Gradients:   -2.2467e+01  5.4331e+00 -3.0688e+00  1.1684e+00 -5.0257e+00 -3.1199e-01  6.6269e+00  1.8955e+00  7.8407e+00  7.4332e+00
Funcalls:   71
# 8    ofv: 220.311444
Params:      -7.1093e-02  1.0466e-01  9.9391e-01  1.3292e-01  3.4360e-01 -1.9409e-01  1.6673e+00  1.3333e-01 -1.6102e-02 -9.8698e-01
NParams:      1.2824e-01  8.0223e+00  1.0591e+00  8.2554e-01  2.8529e-01  2.1078e-01  1.0719e+00  4.0042e-01  8.9038e-02  2.5010e-01
Gradients:   -2.0760e+01  3.6749e+00 -5.1036e+00  3.0013e+00 -1.6051e+00 -4.5947e+00  6.0495e+00 -3.6913e-01  7.2525e+00  6.4340e-01
Funcalls:   80
# 9    ofv: 220.0818023
Params:      -7.0826e-02  1.0673e-01  1.0282e+00  1.2825e-01  3.3255e-01 -1.5467e-01  1.6507e+00  4.5455e-02 -1.5810e-02 -9.8821e-01
NParams:      1.2828e-01  8.0323e+00  1.0877e+00  8.2187e-01  2.8215e-01  2.1925e-01  1.0542e+00  3.6674e-01  8.9064e-02  2.4979e-01
Gradients:   -2.1027e+01  4.1000e+00 -4.1097e+00  7.6561e-01 -3.1425e+00 -4.7769e-01  5.8487e+00 -2.1025e+00  7.7286e+00  4.8929e-01
Funcalls:   89
# 10   ofv: 219.5604367
Params:      -6.4508e-02  1.0342e-01  1.1140e+00  1.6954e-01  3.3088e-01 -1.8315e-01  1.6015e+00 -3.5791e-02 -3.5774e-02 -9.2937e-01
NParams:      1.2902e-01  8.0164e+00  1.1620e+00  8.5489e-01  2.8168e-01  2.1309e-01  1.0037e+00  3.3812e-01  8.7304e-02  2.6493e-01
Gradients:   -1.7189e+01  3.2486e+00 -3.1673e+00  3.0862e+00 -3.4694e+00 -3.4451e+00  4.9129e+00 -2.7425e+00  5.7191e+00  3.5063e+00
Funcalls:   98
# 11   ofv: 218.3357278
Params:      -4.3254e-02  9.8811e-02  1.1537e+00  1.2984e-01  3.2023e-01 -1.5320e-01  1.4055e+00  1.1531e-01 -4.2353e-02 -9.2249e-01
NParams:      1.3154e-01  7.9943e+00  1.1976e+00  8.2312e-01  2.7870e-01  2.1957e-01  8.2504e-01  3.9327e-01  8.6731e-02  2.6676e-01
Gradients:   -3.0319e+00  1.5517e+00 -1.9474e+00  2.4727e+00 -4.5263e+00 -3.6625e-01  6.8792e-01 -2.7207e-01  4.1398e+00  3.5527e+00
Funcalls:   108
# 12   ofv: 218.3302056
Params:      -4.2963e-02  9.7610e-02  1.1528e+00  1.1036e-01  3.2317e-01 -1.6124e-01  1.4020e+00  1.1630e-01 -4.5333e-02 -9.1787e-01
NParams:      1.3158e-01  7.9885e+00  1.1967e+00  8.0796e-01  2.7952e-01  2.1782e-01  8.2214e-01  3.9366e-01  8.6473e-02  2.6800e-01
Gradients:   -2.7106e+00  1.2875e+00 -1.8420e+00  7.5753e-01 -4.1660e+00 -1.2105e+00  7.1898e-01 -5.7527e-01  3.4644e+00  3.7492e+00
Funcalls:   118
# 13   ofv: 218.1737151
Params:      -4.0106e-02  9.5279e-02  1.1725e+00  9.8696e-02  3.3913e-01 -1.5153e-01  1.3654e+00  1.4177e-01 -4.7600e-02 -9.3140e-01
NParams:      1.3192e-01  7.9774e+00  1.2147e+00  7.9900e-01  2.8401e-01  2.1994e-01  7.9260e-01  4.0382e-01  8.6278e-02  2.6439e-01
Gradients:   -4.9027e-01  3.4996e-01 -1.2483e+00  3.7142e-01 -2.1377e+00 -2.5010e-01 -4.0248e-01 -2.5812e-01  1.5562e+00  2.1062e+00
Funcalls:   129
# 14   ofv: 218.094335
Params:      -3.9124e-02  9.3641e-02  1.2037e+00  9.1424e-02  3.5662e-01 -1.4586e-01  1.3752e+00  1.6346e-01 -4.8658e-02 -9.4827e-01
NParams:      1.3204e-01  7.9695e+00  1.2434e+00  7.9347e-01  2.8902e-01  2.2119e-01  8.0041e-01  4.1267e-01  8.6186e-02  2.5997e-01
Gradients:    4.8933e-01 -2.9785e-01 -7.1478e-01  1.4392e-01  4.3816e-02  3.2834e-01 -3.0676e-01  3.2091e-02 -3.4989e-01  3.8368e-01
Funcalls:   138
# 15   ofv: 218.0465777
Params:      -3.9802e-02  9.3712e-02  1.2673e+00  9.2500e-02  3.6203e-01 -1.4977e-01  1.3922e+00  1.6071e-01 -4.5431e-02 -9.5937e-01
NParams:      1.3196e-01  7.9699e+00  1.3034e+00  7.9429e-01  2.9059e-01  2.2033e-01  8.1407e-01  4.1154e-01  8.6465e-02  2.5710e-01
Gradients:    3.8986e-01 -1.8931e-01  1.4723e-01 -1.3280e-01  7.4126e-01 -5.2928e-03 -3.2058e-01  7.1312e-02 -1.5306e-01 -3.2252e-01
Funcalls:   147
# 16   ofv: 218.0402149
Params:      -4.0068e-02  9.4113e-02  1.2621e+00  9.5160e-02  3.5770e-01 -1.4946e-01  1.4013e+00  1.5612e-01 -4.5825e-02 -9.5688e-01
NParams:      1.3193e-01  7.9718e+00  1.2984e+00  7.9631e-01  2.8934e-01  2.2040e-01  8.2152e-01  4.0966e-01  8.6431e-02  2.5774e-01
Gradients:    1.7511e-01 -4.6729e-02 -4.6086e-02 -5.5538e-02  2.1427e-01  3.6066e-02  6.3098e-02  6.9857e-03 -1.6323e-01 -1.0293e-01
Funcalls:   156
# 17   ofv: 218.0343663
Params:      -4.0530e-02  9.4373e-02  1.2665e+00  9.8265e-02  3.5379e-01 -1.5026e-01  1.3977e+00  1.5135e-01 -4.5480e-02 -9.5422e-01
NParams:      1.3187e-01  7.9730e+00  1.3027e+00  7.9868e-01  2.8821e-01  2.2022e-01  8.1864e-01  4.0771e-01  8.6461e-02  2.5843e-01
Gradients:   -1.4731e-01  6.4567e-02  2.9137e-02  5.6683e-02 -2.6607e-01 -3.4840e-02 -1.0639e-01 -5.8363e-03  2.4350e-01  1.7767e-01
Funcalls:   165
# 18   ofv: 218.0025783
Params:      -3.9148e-02  9.5296e-02  1.3023e+00  1.1950e-01  3.5338e-01 -1.5000e-01  1.4106e+00  1.2959e-01 -4.6051e-02 -9.5291e-01
NParams:      1.3204e-01  7.9774e+00  1.3372e+00  8.1503e-01  2.8809e-01  2.2028e-01  8.2918e-01  3.9893e-01  8.6411e-02  2.5877e-01
Gradients:   -5.9295e-01  1.2627e-02 -9.4821e-02 -5.5213e-01 -3.2541e-01  3.3782e-02 -5.9279e-02  3.6629e-03  1.2037e-01  1.0783e-01
Funcalls:   198
# 19   ofv: 217.9974735
Params:      -3.8214e-02  9.5439e-02  1.3199e+00  1.3189e-01  3.5583e-01 -1.5042e-01  1.4182e+00  1.1707e-01 -4.6246e-02 -9.5329e-01
NParams:      1.3215e-01  7.9781e+00  1.3544e+00  8.2473e-01  2.8880e-01  2.2019e-01  8.3553e-01  3.9397e-01  8.6395e-02  2.5867e-01
Gradients:   -1.0315e-02  1.0879e-02 -8.3145e-04  2.6769e-02 -2.9585e-02  7.4315e-03 -5.2385e-04 -7.4571e-03  3.3031e-03  2.3766e-03
Funcalls:   213
# 20   ofv: 217.9974593
Params:      -3.8206e-02  9.5404e-02  1.3195e+00  1.3128e-01  3.5607e-01 -1.5048e-01  1.4181e+00  1.1805e-01 -4.6250e-02 -9.5334e-01
NParams:      1.3215e-01  7.9780e+00  1.3540e+00  8.2425e-01  2.8887e-01  2.2017e-01  8.3543e-01  3.9435e-01  8.6394e-02  2.5866e-01
Gradients:   -2.4457e-03  4.5897e-04 -1.1560e-04  6.7830e-05 -3.9774e-04  7.5784e-04 -1.3453e-04  5.5157e-04 -1.3115e-03 -2.1940e-04
Funcalls:   228
converged = True
n_iter = 21
x_opt =  -3.8206e-02  9.5404e-02  1.3195e+00  1.3128e-01  3.5607e-01 -1.5048e-01  1.4181e+00  1.1805e-01 -4.6250e-02 -9.5334e-01
f_opt = 217.9974593
fun_calls = 241

Estimation Summary                                                              

────────────────────────────────────────────────────────────────────────────────
    Step         OFV     
────────────────────────────────────────────────────────────────────────────────
✅ Converged 217.997     
────────────────────────────────────────────────────────────────────────────────


Parameter Estimation                                                            

────────────────────────────────────────────────────────────────────────────────
 Parameter     Estimate   Shrinkage(%)
────────────────────────────────────────────────────────────────────────────────
Theta                                 
  pop_cl       0.132                  
  pop_v        7.978                  
  pop_ka       1.354                  
  pop_alag     0.824                  
Omega(SD)                             
  eta_cl       0.289        0.000     
  eta_v        0.220        3.995     
  eta_ka       0.835        50.450    
  eta_alag     0.394        59.243    
Sigma(SD)                             
  eps_prop     0.086        14.952    
  eps_add      0.259        15.636    
────────────────────────────────────────────────────────────────────────────────


Information                                                                     

────────────────────────────────────────────────────────────────────────────────
 Number of       Time    
 Iterations              
────────────────────────────────────────────────────────────────────────────────
21           0:00:01.53  
────────────────────────────────────────────────────────────────────────────────

Estimation finished, now start covariance calculation.
Computing Covariance...
Covariance computation succeed

如果基于 SCM 方法自动搜索连续协变量体重 ("WT") 和分类协变量性别 ("SEX") 与参数 CL ("pop_cl") 和 V ("pop_v") 的潜在关系,可以通过指定相应的搜索规则 (spec) 来实现:

@scm.spec
def warfarin_scm_rules(m: WarfarinPk):
    scm.test_cont("WT", on=[m.pop_cl, m.pop_v], states="*")
    scm.test_cat("SEX", on=[m.pop_cl, m.pop_v], states="*")

scm_res = fit_res.scm(warfarin_scm_rules)
scm_res

SCM Summary

StepTestOFVdOFV DDFP ValueAcceptedSelectedModel
0Base Model217.997WarfarinPk
1pop_cl ~ WT @ linear213.308-4.69010.030 < 0.05 (forward)YesWarfarinPk__1_1
pop_v ~ WT @ linear191.380-26.61810.000 < 0.05 (forward)YesWarfarinPk__1_2
pop_cl ~ SEX @ linear217.600-0.39810.528 > 0.05 (forward)NoWarfarinPk__1_3
pop_v ~ SEX @ linear203.424-14.57310.000 < 0.05 (forward)YesWarfarinPk__1_4
2pop_cl ~ WT @ linear186.560-4.82010.028 < 0.05 (forward)YesWarfarinPk__2_1
pop_v ~ WT @ piecewise191.011-0.36910.543 > 0.05 (forward)NoWarfarinPk__2_2
pop_cl ~ SEX @ linear190.971-0.40910.523 > 0.05 (forward)NoWarfarinPk__2_3
pop_v ~ SEX @ linear190.508-0.87210.351 > 0.05 (forward)NoWarfarinPk__2_4
3pop_cl ~ WT @ piecewise186.033-0.52710.468 > 0.05 (forward)NoWarfarinPk__3_1
pop_v ~ WT @ piecewise186.202-0.35810.550 > 0.05 (forward)NoWarfarinPk__3_2
pop_cl ~ SEX @ linear184.664-1.89710.168 > 0.05 (forward)NoWarfarinPk__3_3
pop_v ~ SEX @ linear185.696-0.86410.352 > 0.05 (forward)NoWarfarinPk__3_4
4pop_cl ~ WT @ exclude191.3804.820-10.028 > 0.01 (backward)YesWarfarinPk__4_1
pop_v ~ WT @ exclude213.30826.748-10.000 < 0.01 (backward)NoWarfarinPk__4_2
5pop_v ~ WT @ exclude217.99726.618-10.000 < 0.01 (backward)NoWarfarinPk__5_2

7.2. ScmResult#

class ScmResult#

SCM 搜索结果,包含最终模型、运行日志以及各个步骤中的模型结果。

7.2.1. final_model#

property final_model#

SCM 法搜索得到的最终模型。

类型:

PopModel

scm_res.final_model
class WarfarinPk__4_1(EvOneCmtLinear.Physio):
    def __init__(self):
        super().__init__()
        
        # Define thetas
        self.pop_cl = theta(0.1323, bounds=(0.01, 10.0))
        self.pop_v = theta(8.076, bounds=(0.01, 20.0))
        self.pop_ka = theta(1.337, bounds=(0.01, 5.0))
        self.pop_alag = theta(0.8228, bounds=(0.01, 24.0))
        self.WT__pop_v_1 = theta(0.01304, bounds=(-0.03125, 0.03333333333333333))
        
        # Define etas
        self.eta_cl = omega(0.0829)
        self.eta_v = omega(0.01767)
        self.eta_ka = omega(0.7037)
        self.eta_alag = omega(0.1555)
        
        # Define epsilons
        self.eps_prop = sigma(0.007529)
        self.eps_add = sigma(0.06592)
        
        # Define covariates (data columns)
        self.WT = column("WT")
        self.SEX = column("SEX", is_categorical=True)
    def pred(self):
        WT__pop_cl = 1
        # Linear WT on pop_v
        WT__pop_v = 1 + self.WT__pop_v_1 * (self.WT - 70.0)
        SEX__pop_cl = 1
        SEX__pop_v = 1
        # pop_cl with covariates
        pop_cl__with_cov = self.pop_cl * WT__pop_cl * SEX__pop_cl
        # pop_v with covariates
        pop_v__with_cov = self.pop_v * WT__pop_v * SEX__pop_v
        cl = pop_cl__with_cov * exp(self.eta_cl)  # 指数型个体间变异
        v = pop_v__with_cov * exp(self.eta_v)
        ka = self.pop_ka * exp(self.eta_ka)
        alag = self.pop_alag * exp(self.eta_alag)

        F = self.solve(cl=cl, v=v, ka=ka, alag1=alag, s2=v)  # 使用生理药动学参数预测
        ipred = F  # 血药浓度预测值

        y = ipred * (1 + self.eps_prop) + self.eps_add  # 比例型与加和型个体内变异

        return y

7.2.2. final_fit_result#

property final_fit_result#

SCM 法搜索得到的最终模型的拟合结果。

类型:

FitResult

scm_res.final_fit_result

Estimation Summary

EstimationCovarianceOFV
✅ Converged✅ Succeed191.380
Number of Observations: 250
Number of Parameters: 11

Parameter Estimation

ParameterEstimateRSE(%)Shrinkage(%)
Theta
pop_cl0.1325.185
pop_v8.0762.976
pop_ka1.33728.620
pop_alag0.82318.598
WT__pop_v_10.01311.656
Omega(SD)
eta_cl0.28814.1980.000
eta_v0.13314.71811.534
eta_ka0.83920.53150.847
eta_alag0.39428.30759.033
Sigma(SD)
eps_prop0.08714.36013.910
eps_add0.25723.38814.602

Information

Number of IterationsTime
CompilationEstimationCovariance
190:00:00.250:00:02.250:00:06.5

7.2.3. steps#

property steps#

各搜索步骤的模型测试结果。

类型:

list[ScmStepwiseResult]

7.2.4. as_dataframe()#

as_dataframe()#

将搜索步骤与结果转为 dataframe 类型

类型:

DataFrame

scm_res.as_dataframe()
shape: (16, 14)
stepparametercovariatestatebase_ofvtest_ofvofv_changedelta_dfp_valuealphadirectionacceptedselectedmodel
i64strstrstrf64f64f64i64f64f64strboolboolstr
0nullnullnull217.997459nullnullnullnullnullnullnullnull"WarfarinPk"
1"pop_cl""WT""linear"217.997459213.3079574.68950210.0303470.05"forward"truefalse"WarfarinPk__1_1"
1"pop_v""WT""linear"217.997459191.37986126.61759812.4797e-70.05"forward"truetrue"WarfarinPk__1_2"
1"pop_cl""SEX""linear"217.997459217.5996660.39779310.5282310.05"forward"falsefalse"WarfarinPk__1_3"
1"pop_v""SEX""linear"217.997459203.42399314.57346710.0001350.05"forward"truefalse"WarfarinPk__1_4"
3"pop_cl""SEX""linear"186.560095184.6635311.89656310.1684630.05"forward"falsefalse"WarfarinPk__3_3"
3"pop_v""SEX""linear"186.560095185.6956470.86444810.3524970.05"forward"falsefalse"WarfarinPk__3_4"
4"pop_cl""WT""exclude"186.560095191.379861-4.819767-10.0281350.01"backward"truetrue"WarfarinPk__4_1"
4"pop_v""WT""exclude"186.560095213.307957-26.747863-12.3181e-70.01"backward"falsefalse"WarfarinPk__4_2"
5"pop_v""WT""exclude"191.379861217.99746-26.617598-12.4797e-70.01"backward"falsefalse"WarfarinPk__5_2"