17 药物动力学
药物动力学(Pharmacokinetics)是研究药物和其他物质是如何在动物体内移动、反应和消除的一门学科。在这一章,我们要实现被最广泛应用的药物动力学模型之一:关于血流中的葡萄糖和胰岛素的最小模型(minimal model)。
我在这一章的陈述遵循Bergman (2005) “Minimal Model” (获取摘要 http://modsimpy.com/bergman,获取PDF http://modsimpy.com/minmod)
17.1 葡萄糖-胰岛素系统
葡萄糖是一种在动物血液中循环的糖类,它是肌肉,大脑和其他器官的能量来源。血液中糖的浓度是由内分泌系统调控的,特别是由胰腺产生的胰岛素(insulin),具有降低血糖的作用。
对于胰腺功能正常的人群来说,内分泌系统保持稳态(homeostasis);也就是说,它使血糖浓度保持在一个不高也不低的范围内。
但是,如果胰腺不能产生足够的胰岛素,或者是细胞对胰岛素的反应变得不那么敏感,那么血糖就会上升,这种情况被称作高血糖(hyperglycemia)。长期来看,严重的高血糖是糖尿病(diabetes mellitus)的一种典型症状。而糖尿病是一种严重的疾病,几乎影响了美国10%的人口 (详情请看 http://modsimpy.com/cdc)。
高血糖和糖尿病最常用的测试之一是静脉葡萄糖耐受试验(frequently sampled intravenous glucose tolerance test ,FSIGT)。试验为禁食受试者(最近一段时间没有吃东西的人)注射葡萄糖,然后每隔2-10分钟采集一次血样,持续采集3小时。之后对样品进行分析,测量样本的葡萄糖和胰岛素的浓度。
通过分析这些测量结果,我们可以评估出几个有关受试者反应的几个参数;其中一个最重要的参数是, 它量化了胰岛素对血糖降低率的影响。
17.2 葡萄糖最小模型
“最小模型”是由Bergman、Ider、Bowden和Cobelli1提出的。它由两部分组成:葡萄糖模型和胰岛素模型。我将会介绍葡萄糖模型的实现;作为案例学习,您可以相应地去实现胰岛素模型。
最初的模型是在二十世纪七十年代发展起来的,从那以后,许多变种和扩展已经被相继提出。Bergman对该模型发展的评论提供了对该过程的洞察:
我们应用了奥卡姆剃刀的原理(the principle of Occam’s Razor),即通过询问基于已知生理学的最简单的模型是什么,可以解释数据中显示的胰岛素-葡萄糖关系。这样一个模型必须足够简单来完整地描述测量到的所有葡萄糖浓度(考虑到胰岛素输入),但是它必须可以通过使用数学技术,从一个单一的数据集中估计出模型中的所有参数(从而避免无法检验的假设)。
最有用的模型是能够实现这一平衡的模型:需要包括足够的现实性来捕获系统的基本特性,但不会太复杂以至于不切实际。在这个例子中,实际的限制在于使用数据来估计模型的参数的能力以及有意义地解释这些参数的能力。
伯格曼讨论了他和他的同事认为必不可少的特征:
(1)葡萄糖在注射后一旦升高,会由于两种作用而恢复到基础水平:葡萄糖本身使自身浓度恢复正常化的作用[...]以及胰岛素对葡萄糖自我正常化的催化作用。(2)同时,我们发现胰岛素对葡萄糖消失的影响是缓慢的——也就是说,胰岛素作用缓慢是因为胰岛素需要通过血浆运输到远端作用部位[...]然后在葡萄糖上发挥作用。
转述第二点,胰岛素降低血糖的作用,正如数据所示,如果它主要依赖于血液中的胰岛素浓度,它就会发生得比我们预期的要慢。伯格曼的研究小组的假设就是,胰岛素必须从血液中相对缓慢地转移到它发挥作用的“远室”。
在当时,远程分隔是一个可能表示也可能不表示某些物理内容的建模抽象。后来,根据伯格曼的说法,它“被证明是组织间液”,也就是在组织细胞的周围液体。在数学建模的历史上,它通常作为假设的实体,被添加到模型中以达到特定的效果,然后后来才发现相对应的物理实体。
葡萄糖模型由两个微分方程组成:
其中:
- 是血糖浓度随时间变化的函数,是血糖浓度随时间的变化率。
- 是组织液中胰岛素浓度随时间变化的函数,是组织液中胰岛素浓度随时间的变化率。
- 是血液中胰岛素浓度随时间变化的函数,它可以被测量,作为模型的输入。
- 是血糖的基础浓度,是血液中胰岛素的基础浓度,即处于平衡状态的浓度。二者都是在测试开始或者结束时通过测量估计出的常数。
- ,,都是控制葡萄糖和胰岛素出现和消失的速率的正值参数。
我们可以逐一解释方程中的项:
- 是葡萄糖自身作用导致的葡萄糖消失速率。当高于基础水平时,这一项为负值;当低于基础水平时,这一项为正值;所以在没有胰岛素的情况下,这一项倾向于将血糖恢复到基础水平。
- 模拟组织液中葡萄糖和胰岛素的相互作用,所以速率随或的增加而增加。这一项不需要速率参数,因为这的单位还没有被指定,我们可以假设的单位使这一项的参数为1。
- 是胰岛素在血液和组织液之间扩散的速率。当高于基础水平时,胰岛素从血液扩散到组织液中。当I(t)低于基础水平时,胰岛素从组织扩散入血液中。
- 是胰岛素在组织液中被消耗和或分解的的速率。
模型的初始状态为, ,其中G0为常数,表示注射后即刻的血糖浓度。理论上,我们可以通过测量来估计,但在实际中,注射的葡萄糖在血液中扩散需要时间,导致不可测量。因此我们将其视为模型的一个自由参数(free parameters),这意味着我们可以自由地选择它来拟合数据。
17.3 数据
为了开发和测试模型,我们我使用了Pacini和Bergman2的数据。这个数据集可以在这本书的存储库中的一个文件中找到,我们可以将其读取到一个数据框(DataFrame)中:
data = pd.read_csv('data/glucose_insulin.csv',
index_col='time')
数据由两列组成:glucose是血糖浓度,单位为mg/dL;insulin是血液中胰岛素浓度,单位为μU/mL(一个医学单位,其中U,是上下文约定的量)。其中索引index为时间,单位是时间。
图17.1:用FSIGT测量到的葡萄糖和胰岛素浓度
图17.1显示一个具有正常的胰岛素产生和敏感性的受试者其葡萄糖和胰岛素浓度在182分钟内的变化。
17.4 插值
在我们准备实施这个模型之前,我们还需要解决一个问题。在微分方程中,是可以在任意时间上求值的函数,但是在DataFrame数据框中,我们只拥有离散时间上的测量值,这就需要进行插值工作!
ModSim库提供了一个名为interpolate的函数,它是SciPy函数interp1d的包装器,它将任何类型的序列(Series)作为参数,包括时间序列(TimeSeries)和扫描序列(SweepSeries),并返回一个函数。没错,我说它会返回一个函数。
所以我们可以这样调用interpolate插值函数:
I = interpolate(data.insulin)
然后我们可以调用这个新的函数,I ,像这样:
I(18)
所得结果为31.66,这是在t=16和t=19所得的真实测量值之间进行线性插值所得到的结果,我们还可以将一个数组作为参数传递给I:
ts = linrange(t_0, t_end, endpoint=True)
I(ts)
结果是一组等间隔的t的插值值,如图17.2所示。
图17.2:用FSIGT和插值函数显示的测量的胰岛素浓度
interpolate插值函数还可以接受一些额外的参数,它将其传递给interp1d。您可以在http://modsimpy.com/interp上了解这些选项。
在下一章中,我们将使用插值后的数据来模拟葡萄糖-胰岛素系统。
在你继续之前,你可能需要阅读这一章的notebook文件chap17.ipynb,然后进行练习。有关下载和运行代码的说明,请参阅第0.4节。
参考文献:
1Bergman RN, Ider YZ, Bowden CR, Cobelli C., “Quantitative estimation of insulin sensitivity”, Am J Physiol. 1979 Jun;236(6):E667-77. Abstract at http://modsimpy.com/insulin.
2“MINMOD: A computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test”, Computer Methods and Programs in Biomedicine 23: 113-122, 1986.
本书的中文翻译由南开大学医学院智能医学工程专业2018级、2019级的师生完成,方便后续学生学习《Python仿真建模》课程。翻译人员(排名不分前后):薛淏源、金钰、张雯、张莹睿、赵子雨、李翀、慕振墺、许靖云、李文硕、尹瀛寰、沈纪辰、迪力木拉、樊旭波、商嘉文、赵旭、连煦、杨永新、樊一诺、刘志鑫、彭子豪、马碧婷、吴晓玲、常智星、陈俊帆、高胜寒、韩志恒、刘天翔、张艺潇、刘畅。
整理校订由刘畅完成,如果您发现有翻译不当或者错误,请邮件联系changliu@nankai.edu.cn。
本书中文版不用于商业用途,供大家自由使用。
未经允许,请勿转载。