「肝臓で薬が消えにくくなったら、血中濃度は上がる」。ここまでは分かりやすい話です。
では、静注と経口で、上がり方も同じでしょうか。 経口の薬は、全身へ届く前にも肝臓を通ります。この初回通過を忘れると、クリアランスの変化だけから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 |
左は肝血流、右は固有クリアランスを変えた図です。青の実線は静注、橙の破線は経口。横軸の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の違いは、投与経路、変化した要因、モデルの仮定を分けると整理できます。
- 静注か経口か。 経口なら、消失と初回通過の両方を見る。
- 何が変化したか。 血流、代謝能力、蛋白結合を一つの「CL低下」でまとめない。
- どの仮定で計算したか。 腸管代謝や腎排泄を含むか、血液と血漿の単位が揃っているかを確認する。
実際には、腎排泄、腸管代謝、吸収、代謝の飽和、血流の迂回、蛋白結合なども変わり得ます。文献[1]の全身PBPKは複数の生理学的変化を扱いますが、この記事はその一部を切り出した計算です。肝硬変や特定の併用薬の効果、患者の用量変更は予測していません。
経口AUCの変化を読むときは、CLだけでなく「どれだけ全身へ届くか」も見る。 これが今回の計算で確かめたかった点です。
参考文献
- 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
- Wilkinson GR, Shand DG. Commentary: a physiological approach to hepatic drug clearance. Clinical Pharmacology & Therapeutics. 1975;18:377–390. doi:10.1002/cpt1975184377
