Structural model - Multi compartment model with saturable absorption kinetics
Route of administration - Oral Route
Dosage Regimen - 10 mg, 30 mg, 90 mg oral dose given at different occasions
Number of Subjects - 1
This model gives an understanding of non linear absorption due to saturation of drug transporters at higher doses of drug administered orally.
In this tutorial, you will learn to build a multi compartment model for a drug following saturable absorption kinetics and simulate the data.
call the "necessary" libraries to get started.
using Pumas using Plots using CSV using StatsPlots using Random
In this multi compartment model,a single subject recieves oral doses of a compound X at three different occasions which follows non linear absorption and linear disposition kinetics.
pk_42 = @model begin @param begin tvvmax ∈ RealDomain(lower=0) tvkm ∈ RealDomain(lower=0) tvvc ∈ RealDomain(lower=0) tvvp ∈ RealDomain(lower=0) tvq ∈ RealDomain(lower=0) tvcl ∈ RealDomain(lower=0) Ω ∈ PDiagDomain(6) σ_add ∈ RealDomain(lower=0) end @random begin η ~ MvNormal(Ω) end @pre begin Vmax = tvvmax*exp(η[1]) Km = tvkm*exp(η[2]) Vc = tvvc*exp(η[3]) Vp = tvvp*exp(η[4]) Q = tvq*exp(η[5]) CL = tvcl*exp(η[6]) end @vars begin VMKM := Vmax/(Km+Depot) end @dynamics begin Depot' = -VMKM*Depot Central' = VMKM*Depot -CL*(Central/Vc) - (Q/Vc)*Central + (Q/Vp)*Peripheral Peripheral' = (Q/Vc)*Central - (Q/Vp)*Peripheral end @derived begin cp = @. Central/Vc dv ~ @. Normal(cp,σ_add) end end
PumasModel Parameters: tvvmax, tvkm, tvvc, tvvp, tvq, tvcl, Ω, σ_add Random effects: η Covariates: Dynamical variables: Depot, Central, Peripheral Derived: cp, dv Observed: cp, dv
Parameters provided for simulation as below. tv
represents the typical value for parameters.
Vmax - Maximum Metabolic Capacity (ug/min)
Km - Michaelis-Menten Constant (ug/ml)
Vc - Volume of Distribution of Central Compartment (L)
Vp - Volume of Distribution of Peripheral compartment (L)
Q - Inter Compartmental Clearance (L/min)
CL - Clearance (L/min)
Ω - Between Subject Variability
σ - Residual Error
param = (tvvmax = 982.453, tvkm = 9570.63, tvvc = 4.66257, tvvp = 35, tvq = 0.985, tvcl = 2.00525, Ω = Diagonal([0.0, 0.0, 0.0,0.0,0.0,0.0]), σ_add = 0.123)
(tvvmax = 982.453, tvkm = 9570.63, tvvc = 4.66257, tvvp = 35, tvq = 0.985, tvcl = 2.00525, Ω = [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0. 0 0.0; 0.0 0.0 … 0.0 0.0], σ_add = 0.123)
A single subject received oral dosing of 10,30,90 mg on three different ocassions
ev1 = DosageRegimen(90000, time=0, cmt=1) sub1 = Subject(id=1, events=ev1, covariates=(Dose="10 mg",)) ev2 = DosageRegimen(30000, time=0, cmt=1) sub2 = Subject(id=1, events=ev2, covariates=(Dose="30 mg",)) ev3 = DosageRegimen(10000, time=0, cmt=1) sub3 = Subject(id=1, events=ev3, covariates=(Dose="90 mg",)) pop3_sub = [sub1,sub2,sub3]
Population Subjects: 3 Covariates: Dose
Simulate the plasma concentration for single subject after an oral dose given at three different occasions.
Random.seed!(123) sim_pop3_sub = simobs(pk_42, pop3_sub, param, obstimes=0.1:0.1:360) df1 = DataFrame(sim_pop3_sub)
Use the dataframe for plotting
df1_10 = filter(x -> x.Dose == "10 mg", df1) filter!(x -> x.time in [0,5,10,15,20,25,30,35,40,45,50,55,60,70,75,80,85,90,95,105,110,115,120,150,180,210,240,300,360], df1_10) df1_30 = filter(x -> x.Dose == "30 mg", df1) filter!(x -> x.time in [0,5,10,15,20,25,30,35,40,45,50,55,60,70,75,80,85,90,95,105,110,115,120,150,180,210,240,300,360], df1_30) df1_90 = filter(x -> x.Dose == "90 mg", df1) filter!(x -> x.time in [0,5,10,15,20,25,30,35,40,45,50,55,60,70,75,80,85,90,95,105,110,115,120,150,180,210,240,300], df1_90) @df df1_10 plot(:time, :cp, yaxis=:log, title="Concentration vs Time", label="Pred - Conc 10 mg", xlabel="Time (mins)", ylabel="Concentration (ug/L)", linewidth=3, xticks = [0,50,100,150,200,250,300,350,400], yticks = [0.1,1,10,100,1000], xlims=(0,450), ylims=(0.1,1000)) @df df1_30 plot!(:time, :cp, label="Pred - Conc 30mg", linewidth=3) @df df1_90 plot!(:time, :cp, label="Pred - Conc 90mg", linewidth=3) @df df1_10 scatter!(:time, :dv, label="Obs - Conc 10mg", markershape=[:star4]) @df df1_30 scatter!(:time, :dv, label="Obs - Conc 30mg", markershape=:diamond) @df df1_90 scatter!(:time, :dv, label="Obs - Conc 90 mg")