Pre-dose Observation Handling and Clarification on SS

Dear Pumas Support Team,

I am new to PopPK modeling and Pumas, and would appreciate some clarification regarding the proper data structure for pre-dose observations and SS dosing

My project involves two cohorts receiving either once-daily regimen or once-weekly regimen. Intensive sampling was performed, including a pre-dose trough and multiple post-dose concentrations.

Pre-dose observations

For the pre-dose (trough) sample, I have seen an example in Pumas documentation that it is acceptable to use a small negative time value (e.g., -0.01).
My question is:

  1. Is it considered best practice in Pumas to use negative time to represent pre-dose ?
  2. Can I use time = 0 for both the observation and the dose and then relying on row ordering (evid=0 before evid=1) ?
  3. Is there another valid way to represent the pre-dose state, such as adding an explicit dosing event (dummy dose) to prime the system ?

SS, II and ADDL in dosing event

Since these subjects are at steady state, I have set ss=1 and ii=24 for daily or ii=168 for weekly and because there are no further doses after the intensive period, I set addl=0. However, Pumas tutorial states that “:ii must be > 0 if :addl > 0, and vice versa.”
My question is:

  1. Is ii > 0 with addl = 0 valid when ss = 1, or does the system require a dummy value for addl to satisfy the validation logic ?

Thank you in advance for your time and help !

If you want your dose to be at time point 0 then yes. You can also have the trough values at time point 0 and then dose at t = 0.01 for example.

In general, it is always best practice, in any modeling system, to match the data to what really happened as closely as possible. Since it is rarely the case that you literally take a trough value the exact same second you dose, the data should ideally reflect this to correctly recover the parameters. If you take a trough sample of 5 units and you dose 20 minutes later, then you may incorrectly interpret a post dose value at time 0.01 of 5.1 as an increase of 0.1 in the 0.01 time interval if really the observation should have been 4.9 at literal time of does and if you did the “ordering of rows at the same time point”-method.

No, doses are not applied like this in Pumas. Time is not relative to row order, interpretation of time is quite literal in Pumas.

Can you elaborate? Do you want to start a dynamical system at some value? If you want to, you can add a bolus dose into that compartment, yes, but we do have the `@init` block for this purpose. Defining NLME models in Pumas · Pumas You would then carry the initial value as a covariate and use that to specific the value of the system at time point 0.

Hm, I’m not sure this applies to bolus doses. Can you point me to the exact tutorial?

```

using Pumas
using AlgebraOfGraphics, CairoMakie

# 1. One-compartment PK model
model = @model begin
    @param begin
        tvcl ∈ RealDomain(lower=0)
        tvvc ∈ RealDomain(lower=0)
        Ω   ∈ PDiagDomain(2)
        σ   ∈ RealDomain(lower=0)
    end
    @random begin
        η ~ MvNormal(Ω)
    end
    @pre begin
        CL = tvcl * exp(η[1])
        Vc = tvvc * exp(η[2])
    end
    @dynamics Central1
    @derived begin
        cp = @. Central / Vc
        dv ~ @. Normal(cp, σ)
    end
end

# 2. Parameters
params = (tvcl=1.0, tvvc=10.0, Ω=Diagonal([0.04, 0.04]), σ=0.1)

# 3. Steady-state bolus, single interval
ev = DosageRegimen(100; ii=12, ss=1)
sub = Subject(; id="1", events=ev)

# 4. Simulate over one dosing interval
sim = simobs(model, sub, params; obstimes=0:0.1:12)

# 5. Plot
df = DataFrame(sim)

plt = data(df) *
    mapping(:time, :cp) *
    visual(Lines)

draw(plt; axis=(; xlabel="Time (h)", ylabel="Concentration", title="Steady-State Bolus"))

this works for me

I thought I needed an explicit dosing event to explain where the pre-dose trough conc. came from.

Here is what my dummy dosing event means:

As you can see, the dataset have an early dose at time= -24 with ss= 1 to prime the system for the pre-dose trough conc. at time=-0.18.

… or maybe this dummy dosing event is not needed at all ? …

If I understand correctly, setting ss=1 at time=0 already tells Pumas to solve for SS conc. (based on amt and ii) and initialize the system in that state before the study dose is administered, in other words, Pumas already knows where that pre-dose trough conc. come from ?

Thank you for the suggestion regarding the @init block ! If I understand correctly, would the setup look like this ?

  1. Dataset

I would include a column which is the pre-dose trough conc. as a subject-level covariate (C_TROUGH) and set SS=0 ii=0 and addl=0 since we are manually initializing the system:

ID, TIME,  AMT,  EVID, CMT,    RATE, SS, II,  ADDL, DV_parent, WT,  C_TROUGH
1,  -0.18, 0,    0,    .,      .,    .,  .,   .,    7.564,     81,  7.564
1,  0.0,   600,  1,    Depot,  0,    0,  0,   0,    .,         81,  7.564
1,  1.0,   0,    0,    .,      .,    .,  .,   .,    12.301,    81,  7.564
1,  2.0,   0,    0,    .,      .,    .,  .,   .,    19.062,    81,  7.564
  1. Model code
@covariates begin
    WT
    C_TROUGH    # pre-dose trough conc.
end

@pre begin
    CL = θCL * exp(η[1])
    V  = θV  * exp(η[2])
    Ka = θKa * exp(η[3])
end

@init begin
    Central = C_TROUGH * V    # amount = conc. × volume
    Depot   = 0
end

Is this what you meant by carrying the initial value as a covariate ?

I found that specific wording in Data Representation in Pumas Section 9.1 (The read_pumas function signature).

I also tested my population construction with ss=1, ii=24, and addl=0 using read_pumas function. It works perfectly without any errors.

Then is it correct to say that the logic “:ii must be > 0 if :addl > 0, and vice versa” is primarily applies to non-steady-state dosing ?