Three-Compartment IV Bolus¶
Three-compartment mammillary model with central, shallow peripheral, and deep peripheral compartments, exhibiting tri-exponential concentration decline.
Model Overview¶
graph TB
D((Dose)) -->|Bolus| C[Central<br/>V1]
C <-->|Q2| P1[Shallow Peripheral<br/>V2]
C <-->|Q3| P2[Deep Peripheral<br/>V3]
C -->|CL| E((Elimination))
Clinical Applications¶
- Highly lipophilic drugs
- Drugs with deep tissue binding
- Long half-life compounds
- Anesthetics (propofol, fentanyl)
- Monoclonal antibodies
- Drugs with bone/fat distribution
When to Use¶
| Use When | Don't Use When |
|---|---|
| Tri-exponential decline | Bi-exponential adequate |
| Very long terminal t½ | Simple tissue distribution |
| Deep tissue binding | Two compartments sufficient |
| Three distinct phases | Overfitting concerns |
Mathematical Formulation¶
Parameters¶
| Parameter | Symbol | Units | Description | Constraints |
|---|---|---|---|---|
| Clearance | CL | L/h | Systemic clearance | CL > 0 |
| Central volume | V1 | L | Central compartment | V1 > 0 |
| Shallow Q | Q2 | L/h | Clearance to shallow peripheral | Q2 > 0 |
| Shallow volume | V2 | L | Shallow peripheral volume | V2 > 0 |
| Deep Q | Q3 | L/h | Clearance to deep peripheral | Q3 > 0 |
| Deep volume | V3 | L | Deep peripheral volume | V3 > 0 |
Micro-Rate Constants¶
$\(k_{10} = \frac{CL}{V_1}\)$ (elimination)
$\(k_{12} = \frac{Q_2}{V_1}\)$, $\(k_{21} = \frac{Q_2}{V_2}\)$ (shallow transfer)
$\(k_{13} = \frac{Q_3}{V_1}\)$, $\(k_{31} = \frac{Q_3}{V_3}\)$ (deep transfer)
State Variables¶
| State | Symbol | Description |
|---|---|---|
| A1 | Central | Amount in central compartment |
| A2 | Shallow | Amount in shallow peripheral |
| A3 | Deep | Amount in deep peripheral |
Differential Equations¶
\[\frac{dA_1}{dt} = -(k_{10} + k_{12} + k_{13}) \cdot A_1 + k_{21} \cdot A_2 + k_{31} \cdot A_3\]
\[\frac{dA_2}{dt} = k_{12} \cdot A_1 - k_{21} \cdot A_2\]
\[\frac{dA_3}{dt} = k_{13} \cdot A_1 - k_{31} \cdot A_3\]
Tri-Exponential Solution¶
\[C(t) = A \cdot e^{-\alpha t} + B \cdot e^{-\beta t} + C \cdot e^{-\gamma t}\]
Where: - α = fast (initial distribution) rate - β = intermediate rate - γ = slow (terminal) rate - α > β > γ
Observation¶
\[C = \frac{A_1}{V_1}\]
Derived Parameters¶
Volume at Steady State¶
\[V_{ss} = V_1 + V_2 + V_3\]
Half-Lives¶
$\(t_{1/2,\alpha} = \frac{0.693}{\alpha}\)$ (rapid distribution)
$\(t_{1/2,\beta} = \frac{0.693}{\beta}\)$ (slow distribution)
$\(t_{1/2,\gamma} = \frac{0.693}{\gamma}\)$ (terminal elimination)
Mean Residence Time¶
\[MRT = \frac{V_{ss}}{CL}\]
Julia API¶
Type Definitions¶
# Model kind
struct ThreeCompIVBolus <: ModelKind end
# Parameters
struct ThreeCompIVBolusParams <: AbstractParams
CL::Float64 # Clearance (L/h)
V1::Float64 # Central volume (L)
Q2::Float64 # Shallow peripheral clearance (L/h)
V2::Float64 # Shallow peripheral volume (L)
Q3::Float64 # Deep peripheral clearance (L/h)
V3::Float64 # Deep peripheral volume (L)
end
Basic Simulation¶
using NeoPKPD
# Define parameters
# CL = 5 L/h, V1 = 10 L
# Q2 = 20 L/h, V2 = 30 L (rapid equilibration)
# Q3 = 5 L/h, V3 = 100 L (slow equilibration)
params = ThreeCompIVBolusParams(5.0, 10.0, 20.0, 30.0, 5.0, 100.0)
# Single 1000 mg IV bolus
doses = [DoseEvent(0.0, 1000.0)]
# Create specification
spec = ModelSpec(
ThreeCompIVBolus(),
"threecomp_example",
params,
doses
)
# Long simulation to capture terminal phase (7 days)
grid = SimGrid(0.0, 168.0, collect(0.0:0.5:168.0))
# Solver
solver = SolverSpec(:Tsit5, 1e-10, 1e-12, 10_000_000)
# Run simulation
result = simulate(spec, grid, solver)
# Observe three phases
conc = result.observations[:conc]
t = result.t
println("C at t=0: ", round(conc[1], digits=2), " mg/L (initial)")
println("C at t=1h: ", round(conc[3], digits=2), " mg/L (α phase)")
println("C at t=12h: ", round(conc[25], digits=2), " mg/L (β phase)")
println("C at t=168h: ", round(conc[end], digits=4), " mg/L (γ phase)")
Calculate Rate Constants¶
# Micro-rate constants
k10 = params.CL / params.V1
k12 = params.Q2 / params.V1
k21 = params.Q2 / params.V2
k13 = params.Q3 / params.V1
k31 = params.Q3 / params.V3
println("k10 (elimination): ", round(k10, digits=3), " 1/h")
println("k12 (to shallow): ", round(k12, digits=3), " 1/h")
println("k21 (from shallow): ", round(k21, digits=3), " 1/h")
println("k13 (to deep): ", round(k13, digits=3), " 1/h")
println("k31 (from deep): ", round(k31, digits=3), " 1/h")
# Vss and MRT
Vss = params.V1 + params.V2 + params.V3
MRT = Vss / params.CL
println("\nVss: ", Vss, " L")
println("MRT: ", MRT, " h")
Clinical Example: Propofol¶
# Propofol typical parameters (anesthesia)
# Rapid redistribution from brain to muscle, then slow to fat
params = ThreeCompIVBolusParams(
1.6, # CL (L/min)
4.3, # V1 (L) - central
2.3, # Q2 (L/min) - rapid
22.0, # V2 (L) - muscle
0.8, # Q3 (L/min) - slow
200.0 # V3 (L) - fat
)
# Convert to hourly rates for simulation
params_hourly = ThreeCompIVBolusParams(
1.6 * 60, 4.3, 2.3 * 60, 22.0, 0.8 * 60, 200.0
)
# 200 mg bolus
doses = [DoseEvent(0.0, 200.0)]
spec = ModelSpec(ThreeCompIVBolus(), "propofol", params_hourly, doses)
grid = SimGrid(0.0, 6.0, collect(0.0:0.02:6.0)) # 6 hours, 72 sec resolution
result = simulate(spec, grid, solver)
# Context-sensitive half-time depends on infusion duration
# For short infusions, distribution dominates recovery
Compartment Amounts Over Time¶
# Track drug distribution
result = simulate(spec, grid, solver)
A1 = result.states[:A_central]
A2 = result.states[:A_periph1]
A3 = result.states[:A_periph2]
t = result.t
# At different times
for time in [0.0, 1.0, 12.0, 48.0, 168.0]
idx = findfirst(x -> x >= time, t)
total = A1[idx] + A2[idx] + A3[idx]
println("t = $(time)h:")
println(" Central: $(round(100*A1[idx]/total, digits=1))%")
println(" Shallow: $(round(100*A2[idx]/total, digits=1))%")
println(" Deep: $(round(100*A3[idx]/total, digits=1))%")
end
Population Simulation¶
# Typical parameters
typical_params = ThreeCompIVBolusParams(5.0, 10.0, 20.0, 30.0, 5.0, 100.0)
# IIV on key parameters
omega = OmegaMatrix([
0.09 0.0 0.0 0.0 0.0 0.0; # CL (30% CV)
0.0 0.04 0.0 0.0 0.0 0.0; # V1 (20% CV)
0.0 0.0 0.09 0.0 0.0 0.0; # Q2 (30% CV)
0.0 0.0 0.0 0.04 0.0 0.0; # V2 (20% CV)
0.0 0.0 0.0 0.0 0.16 0.0; # Q3 (40% CV)
0.0 0.0 0.0 0.0 0.0 0.09 # V3 (30% CV)
])
doses = [DoseEvent(0.0, 1000.0)]
base_spec = ModelSpec(ThreeCompIVBolus(), "pop", typical_params, doses)
pop_spec = PopulationSpec(base_spec, 50, omega, 12345)
grid = SimGrid(0.0, 168.0, collect(0.0:2.0:168.0))
result = simulate_population(pop_spec, grid, solver)
# Terminal half-life variability
# (Dominated by V3 and CL variability)
Model Selection: 2-Comp vs 3-Comp¶
# Generate data from 3-comp model
true_params = ThreeCompIVBolusParams(5.0, 10.0, 20.0, 30.0, 5.0, 100.0)
doses = [DoseEvent(0.0, 1000.0)]
spec_3comp = ModelSpec(ThreeCompIVBolus(), "true", true_params, doses)
grid = SimGrid(0.0, 168.0, [0.0, 0.25, 0.5, 1, 2, 4, 8, 12, 24, 48, 72, 120, 168])
result = simulate(spec_3comp, grid, solver)
# Log-linear plot reveals phases
log_conc = log.(result.observations[:conc])
t = result.t
# If three distinct slopes are visible, 3-comp is justified
# Otherwise, 2-comp may be sufficient
Equations Summary¶
| Quantity | Formula |
|---|---|
| k10 | \(CL/V_1\) |
| k12, k21 | \(Q_2/V_1\), \(Q_2/V_2\) |
| k13, k31 | \(Q_3/V_1\), \(Q_3/V_3\) |
| C(t) | \(Ae^{-\alpha t} + Be^{-\beta t} + Ce^{-\gamma t}\) |
| Vss | \(V_1 + V_2 + V_3\) |
| MRT | \(V_{ss}/CL\) |
| Terminal t½ | \(0.693/\gamma\) |
See Also¶
- Two-Compartment IV - Simpler model
- One-Compartment IV - Simplest model
- Population Modeling - Adding variability
- Parameter Estimation - Fitting to data