Skip to content

Disease Progression Model

PD model for tumor growth dynamics with drug-induced cell kill, supporting multiple growth models.


Usage

using NeoPKPD

# PK setup
pk_model = OneCompIVBolus()
pk_params = OneCompIVBolusParams(5.0, 50.0)
doses = [DoseEvent(0.0, 500.0)]
pk_spec = ModelSpec(pk_model, "pk", pk_params, doses)

# Disease Progression PD
pd_model = DiseaseProgressionPD(GompertzGrowth)
pd_params = DiseaseProgressionPDParams(
    100.0,    # s0: initial tumor size
    0.02,     # kgrow: growth rate
    1000.0,   # smax: carrying capacity
    0.0,      # alpha: linear rate (not used)
    0.01      # kdrug: drug kill rate
)

pd_spec = PDSpec(pd_model, "tumor", pd_params, :conc, :tumor_size)

grid = SimGrid(0.0, 336.0, 0:2:336)
solver = SolverSpec(:Tsit5, 1e-10, 1e-12, 10^7)

result = simulate_pkpd_coupled(pk_spec, pd_spec, grid, solver)

Parameters

Parameter Type Description
s0 Float64 Initial tumor size
kgrow Float64 Growth rate constant
smax Float64 Maximum size (carrying capacity)
alpha Float64 Linear growth rate
kdrug Float64 Drug-induced cell kill rate

Growth Models

Model Constructor Equation
Exponential ExponentialGrowth \(dS/dt = k_{grow} \cdot S\)
Linear LinearGrowth \(dS/dt = \alpha\)
Logistic LogisticGrowth \(dS/dt = k_{grow} \cdot S \cdot (1 - S/S_{max})\)
Gompertz GompertzGrowth \(dS/dt = k_{grow} \cdot S \cdot \ln(S_{max}/S)\)
Asymptotic AsymptoticGrowth \(dS/dt = k_{grow} \cdot (S_{max} - S)\)

Drug effect: \(-k_{drug} \cdot C \cdot S\)


Basic Example

using NeoPKPD

# PK setup
pk_model = OneCompIVBolus()
pk_params = OneCompIVBolusParams(5.0, 50.0)
doses = [DoseEvent(i * 168.0, 200.0) for i in 0:3]  # Weekly
pk_spec = ModelSpec(pk_model, "pk", pk_params, doses)

# Gompertz tumor growth
pd_model = DiseaseProgressionPD(GompertzGrowth)
pd_params = DiseaseProgressionPDParams(100.0, 0.02, 1000.0, 0.0, 0.01)
pd_spec = PDSpec(pd_model, "tumor", pd_params, :conc, :tumor_size)

grid = SimGrid(0.0, 672.0, 0:4:672)
solver = SolverSpec(:Tsit5, 1e-10, 1e-12, 10^7)

result = simulate_pkpd_coupled(pk_spec, pd_spec, grid, solver)

tumor = result.observations[:tumor_size]
t = result.t

println("Initial: $(tumor[1])")
println("Day 28: $(tumor[end])")

Comparing Growth Models

using NeoPKPD

models = [
    ("Exponential", ExponentialGrowth),
    ("Logistic", LogisticGrowth),
    ("Gompertz", GompertzGrowth),
    ("Asymptotic", AsymptoticGrowth)
]

pk_model = OneCompIVBolus()
pk_params = OneCompIVBolusParams(5.0, 50.0)
pk_spec = ModelSpec(pk_model, "pk", pk_params, DoseEvent[])

println("Model | Day 14 | Day 28")
println("-" ^ 35)

for (name, growth_type) in models
    pd_model = DiseaseProgressionPD(growth_type)
    pd_params = DiseaseProgressionPDParams(100.0, 0.02, 1000.0, 1.0, 0.0)
    pd_spec = PDSpec(pd_model, "tumor", pd_params, :conc, :tumor_size)

    grid = SimGrid(0.0, 672.0, 0:4:672)
    solver = SolverSpec(:Tsit5, 1e-10, 1e-12, 10^7)

    result = simulate_pkpd_coupled(pk_spec, pd_spec, grid, solver)
    tumor = result.observations[:tumor_size]

    println("$name | $(tumor[85]) | $(tumor[end])")
end

Tumor Growth Inhibition

using NeoPKPD

# Reference (no treatment)
pk_model = OneCompIVBolus()
pk_params = OneCompIVBolusParams(5.0, 50.0)
pk_spec_ref = ModelSpec(pk_model, "pk", pk_params, DoseEvent[])

pd_model = DiseaseProgressionPD(LogisticGrowth)
pd_params = DiseaseProgressionPDParams(100.0, 0.02, 1000.0, 0.0, 0.0)
pd_spec = PDSpec(pd_model, "tumor", pd_params, :conc, :tumor_size)

grid = SimGrid(0.0, 336.0, 0:4:336)
solver = SolverSpec(:Tsit5, 1e-10, 1e-12, 10^7)

result_ref = simulate_pkpd_coupled(pk_spec_ref, pd_spec, grid, solver)
ref_final = result_ref.observations[:tumor_size][end]

# With treatment
doses = [DoseEvent(i * 168.0, 200.0) for i in 0:1]
pk_spec_tx = ModelSpec(pk_model, "pk", pk_params, doses)

pd_params_tx = DiseaseProgressionPDParams(100.0, 0.02, 1000.0, 0.0, 0.01)
pd_spec_tx = PDSpec(pd_model, "tumor", pd_params_tx, :conc, :tumor_size)

result_tx = simulate_pkpd_coupled(pk_spec_tx, pd_spec_tx, grid, solver)
tx_final = result_tx.observations[:tumor_size][end]

tgi = (1 - tx_final / ref_final) * 100
println("Control final: $ref_final")
println("Treatment final: $tx_final")
println("TGI: $tgi%")

Clinical Applications

  • Oncology dose-response modeling
  • Tumor growth inhibition studies
  • Combination therapy evaluation
  • Survival surrogate endpoints

Equations Summary

Model dS/dt (without drug) Steady State
Exponential \(k_{grow} \cdot S\)
Linear \(\alpha\)
Logistic \(k_{grow} \cdot S \cdot (1 - S/S_{max})\) \(S_{max}\)
Gompertz \(k_{grow} \cdot S \cdot \ln(S_{max}/S)\) \(S_{max}\)
Asymptotic \(k_{grow} \cdot (S_{max} - S)\) \(S_{max}\)

See Also