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. 协变量效应参数化公式#
总则
以乘法的形式结合各协变量效应与原模型固定效应参数,公式如下:
假设原模型中共有 k 个固定效应参数与 i 个个体。其中,\(p_{ki}\) 为第 i 个个体的第 k 个固定效应参数的估计值;\(\theta_{k}\) 为此固定效应参数的群体典型值;\(\eta_{ki}\) 为此固定效应参数的个体间变异;\({z}_i\) 为第 i 个个体的协变量值向量;\(g_{k}\) 为有关于 \({z}_i\) 的函数,用于描述协变量与固定效应参数间的关系,具体由纳入协变量的个数 r 以及不同的协变量-参数关系状态(\(c_{ir}\))决定。
各状态的参数化公式
"exclude"
:不引入任何协变量。"linear"
:以线性关系引入协变量,公式如下:
若为连续型协变量:
若为分类协变量(以二分类变量为例):
"piecewise"
:以分段线性关系引入协变量,公式如下:
"exp"
:以指数形式引入协变量,公式如下:
"power"
:以幂的形式引入协变量,公式如下:
上述公式中,\(\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
Step | Test | OFV | dOFV | DDF | P Value | Accepted | Selected | Model |
---|---|---|---|---|---|---|---|---|
0 | Base Model | 217.997 | WarfarinPk | |||||
1 | pop_cl ~ WT @ linear | 213.308 | -4.690 | 1 | 0.030 < 0.05 (forward) | Yes | WarfarinPk__1_1 | |
pop_v ~ WT @ linear | 191.380 | -26.618 | 1 | 0.000 < 0.05 (forward) | Yes | ✅ | WarfarinPk__1_2 | |
pop_cl ~ SEX @ linear | 217.600 | -0.398 | 1 | 0.528 > 0.05 (forward) | No | WarfarinPk__1_3 | ||
pop_v ~ SEX @ linear | 203.424 | -14.573 | 1 | 0.000 < 0.05 (forward) | Yes | WarfarinPk__1_4 | ||
2 | pop_cl ~ WT @ linear | 186.560 | -4.820 | 1 | 0.028 < 0.05 (forward) | Yes | ✅ | WarfarinPk__2_1 |
pop_v ~ WT @ piecewise | 191.011 | -0.369 | 1 | 0.543 > 0.05 (forward) | No | WarfarinPk__2_2 | ||
pop_cl ~ SEX @ linear | 190.971 | -0.409 | 1 | 0.523 > 0.05 (forward) | No | WarfarinPk__2_3 | ||
pop_v ~ SEX @ linear | 190.508 | -0.872 | 1 | 0.351 > 0.05 (forward) | No | WarfarinPk__2_4 | ||
3 | pop_cl ~ WT @ piecewise | 186.033 | -0.527 | 1 | 0.468 > 0.05 (forward) | No | WarfarinPk__3_1 | |
pop_v ~ WT @ piecewise | 186.202 | -0.358 | 1 | 0.550 > 0.05 (forward) | No | WarfarinPk__3_2 | ||
pop_cl ~ SEX @ linear | 184.664 | -1.897 | 1 | 0.168 > 0.05 (forward) | No | WarfarinPk__3_3 | ||
pop_v ~ SEX @ linear | 185.696 | -0.864 | 1 | 0.352 > 0.05 (forward) | No | WarfarinPk__3_4 | ||
4 | pop_cl ~ WT @ exclude | 191.380 | 4.820 | -1 | 0.028 > 0.01 (backward) | Yes | ✅ | WarfarinPk__4_1 |
pop_v ~ WT @ exclude | 213.308 | 26.748 | -1 | 0.000 < 0.01 (backward) | No | WarfarinPk__4_2 | ||
5 | pop_v ~ WT @ exclude | 217.997 | 26.618 | -1 | 0.000 < 0.01 (backward) | No | WarfarinPk__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
Estimation | Covariance | OFV |
---|---|---|
✅ Converged | ✅ Succeed | 191.380 |
Number of Observations: | 250 | |
Number of Parameters: | 11 |
Parameter Estimation
Parameter | Estimate | RSE(%) | Shrinkage(%) |
---|---|---|---|
Theta | |||
pop_cl | 0.132 | 5.185 | |
pop_v | 8.076 | 2.976 | |
pop_ka | 1.337 | 28.620 | |
pop_alag | 0.823 | 18.598 | |
WT__pop_v_1 | 0.013 | 11.656 | |
Omega(SD) | |||
eta_cl | 0.288 | 14.198 | 0.000 |
eta_v | 0.133 | 14.718 | 11.534 |
eta_ka | 0.839 | 20.531 | 50.847 |
eta_alag | 0.394 | 28.307 | 59.033 |
Sigma(SD) | |||
eps_prop | 0.087 | 14.360 | 13.910 |
eps_add | 0.257 | 23.388 | 14.602 |
Information
Number of Iterations | Time | ||
---|---|---|---|
Compilation | Estimation | Covariance | |
19 | 0:00:00.25 | 0:00:02.25 | 0:00:06.5 |
7.2.3. steps#
- property steps#
各搜索步骤的模型测试结果。
类型:
list[ScmStepwiseResult]
7.2.4. as_dataframe()#
- as_dataframe()#
将搜索步骤与结果转为 dataframe 类型
类型:
DataFrame
scm_res.as_dataframe()
step | parameter | covariate | state | base_ofv | test_ofv | ofv_change | delta_df | p_value | alpha | direction | accepted | selected | model |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
i64 | str | str | str | f64 | f64 | f64 | i64 | f64 | f64 | str | bool | bool | str |
0 | null | null | null | 217.997459 | null | null | null | null | null | null | null | null | "WarfarinPk" |
1 | "pop_cl" | "WT" | "linear" | 217.997459 | 213.307957 | 4.689502 | 1 | 0.030347 | 0.05 | "forward" | true | false | "WarfarinPk__1_1" |
1 | "pop_v" | "WT" | "linear" | 217.997459 | 191.379861 | 26.617598 | 1 | 2.4797e-7 | 0.05 | "forward" | true | true | "WarfarinPk__1_2" |
1 | "pop_cl" | "SEX" | "linear" | 217.997459 | 217.599666 | 0.397793 | 1 | 0.528231 | 0.05 | "forward" | false | false | "WarfarinPk__1_3" |
1 | "pop_v" | "SEX" | "linear" | 217.997459 | 203.423993 | 14.573467 | 1 | 0.000135 | 0.05 | "forward" | true | false | "WarfarinPk__1_4" |
… | … | … | … | … | … | … | … | … | … | … | … | … | … |
3 | "pop_cl" | "SEX" | "linear" | 186.560095 | 184.663531 | 1.896563 | 1 | 0.168463 | 0.05 | "forward" | false | false | "WarfarinPk__3_3" |
3 | "pop_v" | "SEX" | "linear" | 186.560095 | 185.695647 | 0.864448 | 1 | 0.352497 | 0.05 | "forward" | false | false | "WarfarinPk__3_4" |
4 | "pop_cl" | "WT" | "exclude" | 186.560095 | 191.379861 | -4.819767 | -1 | 0.028135 | 0.01 | "backward" | true | true | "WarfarinPk__4_1" |
4 | "pop_v" | "WT" | "exclude" | 186.560095 | 213.307957 | -26.747863 | -1 | 2.3181e-7 | 0.01 | "backward" | false | false | "WarfarinPk__4_2" |
5 | "pop_v" | "WT" | "exclude" | 191.379861 | 217.99746 | -26.617598 | -1 | 2.4797e-7 | 0.01 | "backward" | false | false | "WarfarinPk__5_2" |