0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PBPKの肝臓モデルをPythonで計算する:静注と経口でAUCの変化は同じ?

0
Last updated at Posted at 2026-10-10

「肝臓で薬が消えにくくなったら、血中濃度は上がる」。ここまでは分かりやすい話です。

では、静注と経口で、上がり方も同じでしょうか。 経口の薬は、全身へ届く前にも肝臓を通ります。この初回通過を忘れると、クリアランスの変化だけからAUCを計算してしまいます。

PBPK(生理学的薬物動態モデル)は、血流や臓器、薬の性質を組み合わせて体内動態を扱います。今回はその中で使う肝臓のwell-stirredモデルに絞ります。プロプラノロールの公開PBPK論文[1]の値を一部使いますが、全身PBPKモデルや患者データの再現ではありません。

まず結果を見る

以下は、血流と代謝能力を一つずつ変えた条件付きの計算結果です。AUCは濃度曲線の面積で、薬にさらされる量の指標です。静注・経口それぞれの基準条件を1とし、同じ経路内では投与量を変えていません。

変更した条件 静注AUCの比 経口AUCの比 肝臓を通り抜ける割合(FH)
基準 1.00 1.00 0.426
肝血流だけを半分にする 1.57 1.00 0.270
固有クリアランスだけを半分にする 1.43 2.00 0.597

肝血流と固有クリアランスを変えたときの静注・経口AUC比

左は肝血流、右は固有クリアランスを変えた図です。青の実線は静注、橙の破線は経口。横軸の1が基準です。

代謝能力を半分にすると、経口では「全身に入った後に消えにくい」と「初回通過で失われにくい」が重なります。 この例では、静注AUCは1.43倍、経口AUCは2倍になりました。

一方、肝血流だけが減った場合、静注では消失が遅くなりますが、経口では初回通過で全身へ届く割合も減ります。このモデル条件では、二つが相殺して経口AUCは変わりません。実際の経口薬で、血流はいつでも無関係という意味ではありません。

何を固定したか

入力・仮定 設定
肝血漿クリアランス 46 L/h:文献[1]のTable 3
血液/血漿濃度比(B/P) 0.89:同表
血漿非結合形分率 0.10:同表
基準の肝血流 90 L/h:この記事で置いた例示条件
吸収と腸管代謝 完全吸収、腸管での損失なし(Fa×Fg=1)
消失 肝臓のみ。線形で、時間によらず一定

基準の固有クリアランスは、上記の肝血流と血漿クリアランスから逆算しました。これは新しい患者データからの推定ではありません。変化させる「固有クリアランス」は肝臓全体の代謝能力であり、特定のCYP一つを半分にした解析でもありません。

血漿のCLを、そのまま血流の式へ入れないこともポイントです。今回の血流は全血基準なので、CLと非結合形分率も血液基準へ揃えます。

式を追いたい人向け

肝臓モデルとAUCの計算式

well-stirredモデル[2]では、肝血流をQ、血液中の非結合形分率をfu,b、固有クリアランスをCLintとして、血液基準の肝クリアランスは

$$
CL_{H,b}=\frac{Q,f_{u,b}CL_{int}}{Q+f_{u,b}CL_{int}}
$$

肝臓を通り抜ける割合は

$$
F_H=\frac{Q}{Q+f_{u,b}CL_{int}}
$$

です。r=B/Pとして、CLH,b=CLH,p/r、fu,b=fu,p/rへ変換します。血漿AUCは

$$
\frac{AUC_{IV,p}}{Dose_{IV}}=\frac{1}{r,CL_{H,b}},\qquad
\frac{AUC_{oral,p}}{Dose_{oral}}=\frac{F_aF_gF_H}{r,CL_{H,b}}
$$

となります。Fa×Fg=1、肝消失のみなら、経口の式は

$$
\frac{AUC_{oral,p}}{Dose_{oral}}=\frac{1}{r,f_{u,b}CL_{int}}
$$

へ整理され、Qが消えます。これはwell-stirredモデルの仮定から導かれる性質であり、実データから新たに発見した関係ではありません。

Pythonで再計算

Python 3.12、NumPy 1.26.4、Matplotlib 3.9.1で実行しました。以下をcalculate.pyとして保存し、python calculate.pyで図と数値を作れます。

コードを表示
"""Isolated well-stirred liver module; illustrative, not a whole-body PBPK fit."""
from pathlib import Path
import json
import numpy as np
import matplotlib.pyplot as plt

ROOT = Path(__file__).resolve().parent
Q0 = 90.0  # L/h; explicitly chosen teaching scenario, not fitted physiology
BP = 0.89  # blood/plasma concentration ratio; propranolol PBPK paper Table 3
FU_PLASMA = 0.10
CL_PLASMA = 46.0  # hepatic plasma clearance, L/h; same Table 3
CL_BLOOD = CL_PLASMA / BP
FU_BLOOD = FU_PLASMA / BP
X0 = Q0 * CL_BLOOD / (Q0 - CL_BLOOD)  # fu,b * CLint, L/h


def metrics(flow_fraction=1.0, capacity_fraction=1.0):
    q = Q0 * np.asarray(flow_fraction)
    x = X0 * np.asarray(capacity_fraction)
    if np.any(q <= 0) or np.any(x <= 0):
        raise ValueError('Fractions must be positive')
    cl = q * x / (q + x)
    fh = q / (q + x)
    # Dose-normalized plasma AUC, h/L; hepatic elimination only, Fa*Fg=1.
    iv = 1 / (cl * BP)
    oral = fh / (cl * BP)
    return cl, fh, iv, oral


def main():
    for directory in ['figures', 'results']:
        (ROOT / directory).mkdir(exist_ok=True)
    baseline = metrics()
    rows = []
    for label, flow, capacity in [('Baseline', 1, 1), ('Half hepatic blood flow', .5, 1),
                                  ('Half intrinsic clearance', 1, .5)]:
        cl, fh, iv, oral = metrics(flow, capacity)
        rows.append(dict(condition=label, hepatic_blood_CL_L_h=float(cl),
                         hepatic_availability=float(fh), IV_AUC_ratio=float(iv/baseline[2]),
                         oral_AUC_ratio=float(oral/baseline[3])))
    report = dict(inputs=dict(Q0_L_h=Q0, BP=BP, fu_plasma=FU_PLASMA,
                             CL_plasma_L_h=CL_PLASMA, inferred_CLint_L_h=X0/FU_BLOOD), rows=rows)
    (ROOT / 'results' / 'summary.json').write_text(json.dumps(report, indent=2), encoding='utf-8')
    fractions = np.linspace(.25, 1.5, 201)
    fig, axes = plt.subplots(1, 2, figsize=(8, 4.3), sharey=True, layout='constrained')
    for ax, flow, capacity, label in zip(axes, [fractions, 1], [1, fractions],
                                       ['Hepatic blood flow / baseline', 'Intrinsic clearance / baseline']):
        result = metrics(flow, capacity)
        ax.plot(fractions, result[2]/baseline[2], color='#0072B2', lw=2, label='IV')
        ax.plot(fractions, result[3]/baseline[3], color='#D55E00', lw=2, ls='--', label='Oral')
        ax.axhline(1, color='#777777', lw=.6)
        ax.set(xlabel=label, xlim=(.25, 1.5), ylim=(0, 4.5))
        ax.spines[['top', 'right']].set_visible(False)
        ax.grid(axis='y', color='#dddddd', lw=.6)
    axes[0].set_ylabel('Plasma AUC / baseline AUC (same route)')
    axes[0].legend(frameon=False, loc='upper right')
    fig.suptitle('First pass changes the answer: IV versus oral', fontsize=13)
    fig.text(.5, .88, 'Isolated liver; linear elimination; unchanged binding and absorption',
             ha='center', fontsize=9)
    fig.get_layout_engine().set(rect=(0, 0, 1, .84))
    fig.savefig(ROOT/'figures'/'first-pass.png', dpi=180)
    print(json.dumps(report, indent=2))


if __name__ == '__main__':
    main()

検算では、肝臓と循環血液の二つの区画を別に組み立て、静注は血液側、経口に相当する入力は肝臓側へ入れました。物質収支から得たAUCが上の式と一致することを確認しています。これは実装の検算であり、臨床予測の妥当性確認ではありません。

解析を読むときの確認点

薬物相互作用や肝機能変化によるAUCの違いは、投与経路、変化した要因、モデルの仮定を分けると整理できます。

  1. 静注か経口か。 経口なら、消失と初回通過の両方を見る。
  2. 何が変化したか。 血流、代謝能力、蛋白結合を一つの「CL低下」でまとめない。
  3. どの仮定で計算したか。 腸管代謝や腎排泄を含むか、血液と血漿の単位が揃っているかを確認する。

実際には、腎排泄、腸管代謝、吸収、代謝の飽和、血流の迂回、蛋白結合なども変わり得ます。文献[1]の全身PBPKは複数の生理学的変化を扱いますが、この記事はその一部を切り出した計算です。肝硬変や特定の併用薬の効果、患者の用量変更は予測していません。

経口AUCの変化を読むときは、CLだけでなく「どれだけ全身へ届くか」も見る。 これが今回の計算で確かめたかった点です。

参考文献

  1. Kalam MN, et al. Development and Evaluation of a Physiologically Based Pharmacokinetic Drug-Disease Model of Propranolol for Suggesting Model Informed Dosing in Liver Cirrhosis Patients. Drug Design, Development and Therapy. 2021;15:1195–1211. doi:10.2147/DDDT.S297981
  2. Wilkinson GR, Shand DG. Commentary: a physiological approach to hepatic drug clearance. Clinical Pharmacology & Therapeutics. 1975;18:377–390. doi:10.1002/cpt1975184377
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?