Oral Reference Design

The Getting started example uses an IV bolus as the reference formulation for UIR fitting. This guide shows how to use an immediate-release (IR) oral formulation instead, using strip_ka=true to mathematically separate first-order absorption from the underlying disposition — useful when IV data is unavailable.

Simulated data

The data is identical to the Getting started example except that the reference formulation is an IR oral product with first-order absorption (rate constant $K_a$) and a lag time, rather than an IV bolus. Twenty subjects in a crossover design receive the IR reference and three oral test formulations.

first(pk_df, 8)
8×4 DataFrame
Rowidformulationtimeconc
Int64StringFloat64Float64
11FormA0.00.0
21FormA0.4790170.252104
31FormA0.9406820.766301
41FormA1.51661.48553
51FormA2.06182.15264
61FormA2.501082.64725
71FormA3.053583.17229
81FormA3.459243.49077
first(diss_df, 8)
8×3 DataFrame
Rowformulationtimediss
StringFloat64Float64
1FormA0.00.0
2FormA0.5211240.0463696
3FormA1.074570.130579
4FormA1.410230.189439
5FormA1.98150.294384
6FormA2.467010.383808
7FormA3.073830.489692
8FormA3.951870.625072

Running the pipeline with strip_ka

The key difference from the Getting started example: strip_ka=true tells the pipeline that the reference formulation ("IR") is an oral formulation whose first-order absorption must be mathematically stripped to recover the underlying disposition. time_lag=true adds a lag-time parameter, and n_exp=1 sets the number of disposition exponentials.

result = run_ivivc(
    pk_df,
    diss_df;
    fast_formulation = "IR",
    strip_ka = true,
    time_lag = true,
    n_exp = 1,
    validation_formulation = "FormB",
    times = collect(range(0.0, 48.0, length = 101)),
);

UIR fits

first(result.uir_df, 8)
8×3 DataFrame
Rowidformulationuir
AnyStringPolyExpo…
13IRPolyExponential{Float64, Float64}([8.65163], [0.209544], 1.0, 1.0)
22IRPolyExponential{Float64, Float64}([9.56063], [0.167306], 1.0, 1.0)
34IRPolyExponential{Float64, Float64}([8.75111], [0.189256], 1.0, 1.0)
45IRPolyExponential{Float64, Float64}([9.86454], [0.187739], 1.0, 1.0)
56IRPolyExponential{Float64, Float64}([9.30618], [0.250098], 1.0, 1.0)
613IRPolyExponential{Float64, Float64}([11.343], [0.209333], 1.0, 1.0)
78IRPolyExponential{Float64, Float64}([10.778], [0.180712], 1.0, 1.0)
87IRPolyExponential{Float64, Float64}([11.0441], [0.172853], 1.0, 1.0)

Model parameters

coeftable(result.model)
4×3 DataFrame
Rowparameterconstantestimate
SymbolBoolFloat64
1abs_scalefalse0.993381
2abs_interceptfalse0.0017848
3time_scalefalse0.84159
4time_shiftfalse-0.0822501

Plots

concentration_profiles(result)
Example block output
dissolution_profiles(result)
Example block output
absorption_profiles(result)
Example block output
levy_plot(result)
Example block output
ivivc_correlation(result)
Example block output