薬剤師のプログラミング学習日記

プログラミングやコンピュータに関する記事を書いていきます

経口投与1-コンパートメントモデルのグラフを描く

1次速度の吸収過程のある1-コンパートメントモデル

経口投与時の血中濃度推移はこのモデルで表すことができます。

f:id:enokisaute:20200307152500p:plain

※ka: 吸収速度定数, ke: 消失速度定数

\frac{dX_a}{dt} =  - k_a \cdot X_a
\frac{dX}{dt} = k_a \cdot X_a - k_e \cdot X

この連立微分方程式を解くと、血中濃度Cを表す式は以下のようになります。

C = \frac{F \cdot D \cdot k_a}{Vd (k_a - k_e)} (e ^ {-k_e \cdot t} - e ^ {-k_a \cdot t})\ \ \ \ \ \ (1)

Fは消化管からの吸収率(0≤F≤1)、Dは経口投与量です。
ここで、最高血中濃度に達する時間である t_{\rm max}は、(1)式を微分して0(接線の傾きが0)とおくと得られます。

 t_{\rm max} = \frac{\rm ln\frac{k_a}{k_e}}{k_a - k_e}

そして最高血中濃度の C_{\rm max}はこの t_{\rm max}を(1)式に代入すればOKです。

C_{\rm max} = \frac{F \cdot D}{Vd}(\frac{k_a}{k_e}) ^ \frac{k_e}{k_e - k_a}

また、AUC_{0-∞}は(1)式を0-∞で定積分して

AUC_{0-∞} = \frac{F \cdot D}{k_e \cdot Vd}

となります。

吸収過程と消失過程

(1)式の\frac{F \cdot D \cdot k_a}{Vd(k_a - k_e)}部分をAと置き換えると、経口投与後の血中濃度Cは指数関数で表される2つの濃度式に分けることができます。

C_1 = A e ^ {-k_e \cdot t}

C_2 = A e ^ {-k_a \cdot t}

 C = C_1 - C_2

この3つの式をグラフに描いてみます。
f:id:enokisaute:20200307152607p:plain

F = 1.0         # 消化管からの吸収率
D = 100         # 経口投与量(mg)
vd = 12         # 分布容積(L)
ka = 0.4        # 吸収速度定数(hr^-1)
ke = 0.08       # 消失速度定数(hr^-1)
lag_time = 0    # 溶解時間(hr)


各パラメータは適当にしましたが、消化管からの吸収が速やかな普通の(徐放錠などでない)薬を想定してka > keとしています。この条件下では、ある程度時間が経ったときの血中濃度推移のβ相(消失相)はc1(消失過程)で近似できることがわかります。
また、lag_timeは薬の溶解時間を表し、これがある場合の血中濃度推移のプロットは濃度式のtをt - lag_timeで置き換えます。 t_{\rm max}は+lag_timeとするだけです。
これらのパラメータを使って計算した値は次のようになります。

A(縦軸との交点):  10.416666666666668
Tmax:  5.0294934763565635
Cmax 5.572835874803517
t_half:  8.664339756999317
AUC:  104.16666666666667

Aはグラフの縦軸との交点というだけで、薬物動態的に意味のある数字ではありません。後で使おうと思ってます。

今回はあらかじめka, keなどがわかっているものとしてグラフを描いてみましたが、次回は濃度データからこれらのパラメータを求める方法をやってみたいと思います。
www.yakupro.info

参考

最後に今回のコードです。

import numpy as np
import matplotlib.pyplot as plt
 
# 1次吸収過程のある1コンパートメント経口投与モデル
 
class PoOneComp:
    def __init__(self, F, D, vd, ka, ke, lag_time):
        self.F = F
        self.D = D
        self.vd = vd
        self.ka = ka
        self.ke = ke
        self.lag_time = lag_time
        self.A = (F * D * ka) / vd / (ka - ke)
 
    # 吸収過程
    def absorption_process(self, t):
        return self.A * np.exp(-self.ka * (t - self.lag_time))
 
    # 消失過程
    def elimination_process(self, t):
        return self.A * np.exp(-self.ke * (t - self.lag_time))
 
    # Cmax到達時間
    def t_max(self):
        return np.log(self.ka / self.ke) / (self.ka - self.ke) + self.lag_time
 
    # 最高血中濃度
    def c_max(self):
        return self.F * self.D / self.vd * (self.ka / self.ke) ** (self.ke / (self.ke - self.ka))
 
 
F = 1.0     # 消化管からの吸収率
D = 100     # 経口投与量(mg)
vd = 12     # 分布容積(L)
ka = 0.4    # 吸収速度定数(hr^-1)
ke = 0.08   # 消失速度定数(hr^-1)
lag_time = 0    # 溶解時間(hr)
 
t = np.arange(0, 60, 0.1)
po = PoOneComp(F, D, vd, ka, ke, lag_time)
 
c_ab = po.absorption_process(t)
c_eli = po.elimination_process(t)
 
tmax = po.t_max()
cmax = po.c_max()
 
print('A(縦軸との交点): ', po.A)
print('Tmax: ', tmax)
print('Cmax', cmax)
print('t_half: ', np.log(2) / ke)
print('AUC: ', F * D / vd / ke)
 
# 濃度式をプロット
plt.plot(t, c_eli, color='blue', alpha=0.8, label='c1:消失過程')
plt.plot(t, c_ab, color='red', alpha=0.8, label='c2:吸収過程')
plt.plot(t, c_eli-c_ab, color='green', alpha=0.8, label='c1-c2')
# tmaxに補助線を入れる
plt.vlines(x=tmax, ymin=0, ymax=cmax, color='crimson', linestyles='dotted')
# 軸ラベルを表示
plt.ylabel('conc[ug/mL]')
plt.xlabel('time[hr]')
plt.xlim(0, 60)
plt.ylim(0, )
plt.grid(linestyle='dashed')
plt.legend()
plt.show()