Multiple Dose NCA¶
Comprehensive documentation for non-compartmental analysis of multiple dose and steady-state pharmacokinetic data.
Overview¶
Multiple dose NCA extends single-dose analysis to repeated dosing scenarios, providing additional metrics relevant to chronic therapy and steady-state characterization.
Quick Start¶
using NeoPKPD
# Steady-state data (after multiple doses)
times = [0.0, 0.5, 1.0, 2.0, 4.0, 8.0, 12.0] # Within dosing interval
conc = [2.1, 5.8, 5.2, 4.1, 2.8, 1.9, 1.3] # Steady-state concentrations
dose = 100.0
tau = 12.0 # Dosing interval (hours)
# Run steady-state NCA
result = run_nca(times, conc, dose; dosing_type=:steady_state, tau=tau)
println("Cmax,ss: $(result.cmax)")
println("Cmin,ss: $(result.cmin)")
println("Cavg,ss: $(result.cavg)")
println("AUC0-tau: $(result.auc_0_tau)")
println("Fluctuation: $(result.fluctuation)%")
Dosing Types¶
Single Dose¶
Multiple Dose (Non-Steady-State)¶
# Analysis during accumulation phase
result = run_nca(times, conc, dose; dosing_type=:multiple, tau=12.0)
Steady State¶
Steady-State Metrics¶
Cmax,ss and Cmin,ss¶
Peak and trough concentrations at steady state:
result = run_nca(times, conc, dose; dosing_type=:steady_state, tau=12.0)
# Maximum concentration at steady state
println("Cmax,ss: $(result.cmax)")
# Minimum concentration (trough) at steady state
println("Cmin,ss: $(result.cmin)")
println("Cmin at time: $(result.tmin)")
Cavg (Average Concentration)¶
\[C_{avg} = \frac{AUC_{0-\tau}}{\tau}\]
# Average concentration over dosing interval
println("Cavg: $(result.cavg)")
# Direct calculation
cavg = result.auc_0_tau / tau
AUC0-tau¶
Area under the curve over one dosing interval:
# AUC over dosing interval
println("AUC0-tau: $(result.auc_0_tau)")
# Relates to total exposure per dose at steady state
Fluctuation Metrics¶
Peak-Trough Fluctuation (PTF)¶
\[PTF = \frac{C_{max} - C_{min}}{C_{avg}} \times 100\%\]
result = run_nca(times, conc, dose; dosing_type=:steady_state, tau=12.0)
println("PTF: $(result.fluctuation)%")
# Manual calculation
ptf = (result.cmax - result.cmin) / result.cavg * 100
Swing¶
\[Swing = \frac{C_{max} - C_{min}}{C_{min}} \times 100\%\]
println("Swing: $(result.swing)%")
# Manual calculation
swing = (result.cmax - result.cmin) / result.cmin * 100
Interpretation¶
| PTF | Interpretation |
|---|---|
| < 100% | Low fluctuation (extended release) |
| 100-200% | Moderate fluctuation (typical IR) |
| > 200% | High fluctuation (may need dosing adjustment) |
Accumulation Metrics¶
Accumulation Index (Racc)¶
Ratio of steady-state to first-dose exposure:
\[R_{acc} = \frac{AUC_{0-\tau,ss}}{AUC_{0-\tau,sd}}\]
# From steady-state result
println("Accumulation Index: $(result.accumulation_index)")
# Theoretical accumulation (from t1/2)
theoretical_racc = 1 / (1 - exp(-log(2) * tau / result.t_half))
Observed vs Theoretical Accumulation¶
# Compare observed accumulation to theoretical
observed_racc = result.accumulation_index
theoretical_racc = nca_theoretical_accumulation(result.t_half, tau)
ratio = observed_racc / theoretical_racc
if abs(ratio - 1.0) < 0.2
println("Accumulation consistent with linear kinetics")
else
println("Possible time-dependent kinetics (ratio: $(ratio))")
end
Time to Steady State¶
Approximate time to reach steady state (~5 half-lives):
t_ss = 5 * result.t_half
println("Time to steady state: ~$t_ss hours")
# More precise: time to 90% steady state
t_90_ss = log(10) / log(2) * result.t_half # ~3.3 × t1/2
println("Time to 90% SS: ~$t_90_ss hours")
Multiple Dose Analysis¶
Non-Steady-State Multiple Dose¶
When steady state has not yet been achieved:
# Day 3 data (before steady state)
times_d3 = [0.0, 0.5, 1.0, 2.0, 4.0, 8.0, 12.0]
conc_d3 = [1.5, 4.2, 4.0, 3.2, 2.1, 1.4, 0.9]
result = run_nca(
times_d3, conc_d3, dose;
dosing_type = :multiple,
tau = 12.0,
dose_number = 5 # 5th dose
)
# Compare to single dose
sd_result = run_nca(times_sd, conc_sd, dose)
accumulation_ratio = result.auc_0_tau / sd_result.auc_0_tau
println("Accumulation after 5 doses: $(accumulation_ratio)")
Predicting Steady State from Single Dose¶
# Single dose analysis
sd_result = run_nca(times, conc, dose)
# Predict steady-state metrics
predicted_ss = predict_steady_state(sd_result, tau=12.0)
println("Predicted Cmax,ss: $(predicted_ss.cmax_ss)")
println("Predicted Cmin,ss: $(predicted_ss.cmin_ss)")
println("Predicted Cavg,ss: $(predicted_ss.cavg_ss)")
println("Predicted Racc: $(predicted_ss.accumulation_index)")
Superposition Principle¶
For linear PK, predict multiple dose profiles from single dose:
# Single dose data
sd_times = [0.0, 0.5, 1.0, 2.0, 4.0, 8.0, 12.0, 24.0]
sd_conc = [0.0, 2.1, 2.5, 2.0, 1.2, 0.5, 0.2, 0.02]
# Predict steady-state profile using superposition
ss_times, ss_conc = superposition_predict(
sd_times, sd_conc;
tau = 12.0,
n_doses = 10 # Number of doses to reach SS
)
# Run NCA on predicted SS profile
ss_result = run_nca(ss_times, ss_conc, dose; dosing_type=:steady_state, tau=12.0)
Trough Concentration Analysis¶
Ctrough Timing¶
# Ensure trough is at end of interval
result = run_nca(times, conc, dose; dosing_type=:steady_state, tau=12.0)
# Verify trough timing
if result.tmin ≈ tau
println("Trough at expected time (end of interval)")
else
println("Trough at $(result.tmin)h, expected at $(tau)h")
end
Ctrough Target¶
For drugs with therapeutic targets:
# Check if trough meets target
target_ctrough = 1.0 # mg/L (e.g., MIC for antibiotics)
if result.cmin >= target_ctrough
println("Trough concentration meets target")
else
# Calculate dose adjustment needed
dose_factor = target_ctrough / result.cmin
new_dose = dose * dose_factor
println("Consider dose increase to $(new_dose) mg")
end
Time Above Threshold¶
Time Above MIC (Antibiotics)¶
# Calculate %T>MIC over dosing interval
mic = 0.5 # mg/L
t_above_mic = time_above_concentration(times, conc, mic)
pct_above_mic = t_above_mic / tau * 100
println("Time above MIC: $t_above_mic h ($(pct_above_mic)% of interval)")
# Target interpretation (depends on antibiotic class)
# Time-dependent: Need >40-50% of interval
# Concentration-dependent: Cmax/MIC > 8-10
AUC/MIC Ratio¶
auc_mic_ratio = result.auc_0_tau / mic
println("AUC0-tau/MIC: $auc_mic_ratio")
# Target varies by drug class
# Fluoroquinolones: typically >100-125
Effective Half-Life¶
At steady state, the effective half-life describes drug elimination:
# From accumulation index
t_half_eff = nca_effective_half_life(result.accumulation_index, tau)
println("Effective t1/2: $t_half_eff h")
# Compare to terminal half-life
println("Terminal t1/2: $(result.t_half) h")
# Difference indicates multi-compartment kinetics
if t_half_eff < result.t_half * 0.8
println("Effective t1/2 shorter than terminal - multi-compartment behavior")
end
Example: Complete Multiple Dose Analysis¶
using NeoPKPD
# Drug administered Q12H at steady state
times = [0.0, 0.5, 1.0, 2.0, 4.0, 6.0, 8.0, 10.0, 12.0]
conc = [2.8, 8.5, 9.2, 7.5, 5.1, 3.8, 3.0, 2.5, 2.2]
dose = 250.0 # mg
tau = 12.0 # hours
# Configure NCA
config = NCAConfig(
method = LinLogMixedMethod(),
lambda_z_min_points = 3
)
# Run steady-state NCA
result = run_nca(
times, conc, dose;
config = config,
dosing_type = :steady_state,
tau = tau,
route = :extravascular
)
# Report steady-state metrics
println("=== Steady-State PK Parameters ===")
println("Dose: $dose mg Q$(Int(tau))H")
println("")
println("Exposure Metrics:")
println(" Cmax,ss: $(round(result.cmax, digits=2)) mg/L at $(result.tmax)h")
println(" Cmin,ss: $(round(result.cmin, digits=2)) mg/L")
println(" Cavg,ss: $(round(result.cavg, digits=2)) mg/L")
println(" AUC0-tau: $(round(result.auc_0_tau, digits=2)) mg·h/L")
println("")
println("Variability Metrics:")
println(" PTF: $(round(result.fluctuation, digits=1))%")
println(" Swing: $(round(result.swing, digits=1))%")
println("")
println("Accumulation:")
println(" Racc: $(round(result.accumulation_index, digits=2))")
println(" Effective t1/2: $(round(nca_effective_half_life(result.accumulation_index, tau), digits=2)) h")
println(" Terminal t1/2: $(round(result.t_half, digits=2)) h")
println("")
println("Clearance:")
println(" CLss/F: $(round(result.cl_f, digits=2)) L/h")
# Target assessment (e.g., for antibiotics)
mic = 0.5 # mg/L
println("\n=== Target Assessment (MIC = $mic mg/L) ===")
println(" Cmax/MIC: $(round(result.cmax / mic, digits=1))")
println(" Cmin/MIC: $(round(result.cmin / mic, digits=1))")
println(" AUC/MIC: $(round(result.auc_0_tau / mic, digits=1))")
t_above = time_above_concentration(times, conc, mic)
println(" %T>MIC: $(round(t_above / tau * 100, digits=1))%")
# Dosing recommendation
if result.cmin < mic
println("\n⚠ Trough below MIC - consider dose adjustment")
suggested_dose = dose * (mic / result.cmin) * 1.1 # 10% margin
println(" Suggested dose: $(round(suggested_dose, digits=0)) mg Q$(Int(tau))H")
else
println("\n✓ Trough concentration adequate")
end
Formulas Summary¶
| Parameter | Formula |
|---|---|
| Cavg | \(AUC_{0-\tau} / \tau\) |
| PTF | \((C_{max} - C_{min}) / C_{avg} \times 100\%\) |
| Swing | \((C_{max} - C_{min}) / C_{min} \times 100\%\) |
| Racc | \(AUC_{0-\tau,ss} / AUC_{0-\tau,sd}\) |
| Racc (theoretical) | \(1 / (1 - e^{-\lambda_z \cdot \tau})\) |
| t1/2,eff | \(\ln(2) \cdot \tau / \ln(R_{acc} / (R_{acc} - 1))\) |
See Also¶
- Exposure Metrics - Single dose metrics
- Terminal Phase - Lambda_z and t1/2
- Population NCA - Multi-subject analysis
- Bioequivalence - Steady-state BE studies