using PumasUtilities
using Random
using Pumas
using CairoMakie
using AlgebraOfGraphics
using DataFramesMeta
using CSV
using Dates
PK44 (Part 2) - Estimation of inhibitory constant Ki
1 Background
- Structural model - Estimation of inhibitory rate constant in a non-competitive enzyme inhibition model
- Number of subjects - 1
- Number of compounds - 1
2 Learning Outcome
This exercise demonstrates how to build non-competitive inhibitory models and understand the relationship between rate of metabolite formation and concentration
3 Objectives
To build a non-competitive inhibitory model and simulate the model for a single subject.
4 Libraries
Load the necessary libraries.
5 Model definition
Note the expression of the model parameters with helpful comments. The model is expressed with differential equations. Residual variability is an additive error model.
pk_44_nim = @model begin
@metadata begin
desc = "Non-Competitive Inhibitory Model"
timeu = u"minute"
end
@param begin
"""
Maximum metabolic rate (μM*gm/min)
"""
tvvmax ∈ RealDomain(lower = 0)
"""
Michaelis-Mentons constant (μmol/L)
"""
tvkm ∈ RealDomain(lower = 0)
"""
Inhibitory constant (μmol/L)
"""
tvki ∈ RealDomain(lower = 0)
Ω ∈ PDiagDomain(2)
"""
Additive RUV
"""
σ_add ∈ RealDomain(lower = 0)
end
@random begin
η ~ MvNormal(Ω)
end
@covariates conc I
@pre begin
Vmax = tvvmax * exp(η[1])
Km = tvkm * exp(η[2])
Ki = tvki
_conc = conc
_I = I
end
@derived begin
## Noncompetitive Inhibition Model
rate_nim = @. ((Vmax * _conc / (Km + _conc)) * (Ki / (Ki + _I)))
"""
Metabolic rate (nmol/min/mg)
"""
dv_rate_nim ~ @. Normal(rate_nim, σ_add)
end
endPumasModel
Parameters: tvvmax, tvkm, tvki, Ω, σ_add
Random effects: η
Covariates: conc, I
Dynamical system variables:
Dynamical system type: No dynamical model
Derived: rate_nim, dv_rate_nim
Observed: rate_nim, dv_rate_nim
6 Initial Estimates of Model Parameters
The model parameters for simulation are the following. Note that tv represents the typical value for parameters.
Vmax- Maximum metabolic rate (μM*gm_protein/min)Km- Michaelis-Mentons constant (μmol/L)Ki- Inhibitory constant (μmol/L)I- Inhibitor concentration/Exposure
param = (
tvvmax = 122.827,
tvkm = 42.7053,
tvki = 98.8058,
Ω = Diagonal([0.01, 0.01]),
σ_add = 2.256,
)7 Creating a Dataset
The time, concentration data and exposure (I) will be used to estimate the rate of metabolite concentration
df_sub1 = map(
i -> DataFrame(id = i, time = 1:1:1000, dv_rate_nim = missing, conc = 1:1:1000, I = 0),
1:6,
)
df = vcat(DataFrame.(df_sub1)...)
df[!, :I] = ifelse.(df.id .== 2, 10, df.I)
df[!, :I] = ifelse.(df.id .== 3, 25, df.I)
df[!, :I] = ifelse.(df.id .== 4, 50, df.I)
df[!, :I] = ifelse.(df.id .== 5, 75, df.I)
df[!, :I] = ifelse.(df.id .== 6, 100, df.I)
df_sub1 = df
sub1 = read_pumas(
df_sub1,
observations = [:dv_rate_nim],
covariates = [:conc, :I],
event_data = false,
)Population
Subjects: 6
Covariates: conc, I
Observations: dv_rate_nim
8 Single-Subject Simulation
Simulate the rate of metabolite formation
Initialize the random number generator with a seed for reproducibility of the simulation.
Random.seed!(123)sim_sub1 = simobs(pk_44_nim, sub1, param)Simulated population (Vector{<:Subject})
Simulated subjects: 6
Simulated variables: rate_nim, dv_rate_nim
pkdata_44_2 = DataFrame(sim_sub1)
first(pkdata_44_2, 5)| Row | id | time | rate_nim | dv_rate_nim | evid | conc | I | η_1 | η_2 | Vmax | Km | Ki | _conc | _I |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| String? | Float64 | Float64? | Float64? | Int64? | Int64? | Int64? | Float64? | Float64? | Float64? | Float64? | Float64? | Int64? | Int64? | |
| 1 | 1 | 1.0 | 2.92322 | 7.47604 | 0 | 1 | 0 | -0.100618 | -0.143521 | 111.07 | 36.9957 | 98.8058 | 1 | 0 |
| 2 | 1 | 2.0 | 5.69651 | 5.5901 | 0 | 2 | 0 | -0.100618 | -0.143521 | 111.07 | 36.9957 | 98.8058 | 2 | 0 |
| 3 | 1 | 3.0 | 8.33113 | 8.61607 | 0 | 3 | 0 | -0.100618 | -0.143521 | 111.07 | 36.9957 | 98.8058 | 3 | 0 |
| 4 | 1 | 4.0 | 10.8372 | 11.1128 | 0 | 4 | 0 | -0.100618 | -0.143521 | 111.07 | 36.9957 | 98.8058 | 4 | 0 |
| 5 | 1 | 5.0 | 13.2239 | 10.0148 | 0 | 5 | 0 | -0.100618 | -0.143521 | 111.07 | 36.9957 | 98.8058 | 5 | 0 |
9 Visualize Results
@chain pkdata_44_2 begin
@rsubset :conc ∈ [1, 5, 10, 15, 26, 104, 251, 502, 1000]
data(_) *
mapping(
:conc => "Concentration (μM)",
:rate_nim => "Metabolic rate (nmol/min/mg protein)",
color = :I => nonnumeric => "Exposure",
) *
visual(ScatterLines, linewidth = 4, markersize = 12)
draw(; figure = (; fontsize = 22), axis = (; xticks = 0:100:1000, yticks = 0:10:140))
end@chain pkdata_44_2 begin
@rsubset :conc ∈ [1, 5, 10, 15, 26, 104, 251, 502, 1000]
data(_) *
mapping(
:conc => "log Concentration (μM)",
:rate_nim => "Metabolic rate (nmol/min/mg protein)",
color = :I => nonnumeric => "Exposure",
) *
visual(ScatterLines, linewidth = 4, markersize = 12)
draw(;
figure = (; fontsize = 22),
axis = (;
xscale = log10,
xtickformat = i -> (@. string(round(i; digits = 1))),
yticks = 0:10:140,
),
)
end10 Conclusion
This tutorial showed how to build a non-competitive inhibitory model and perform a rate of metabolite formation versus concentration simulation.