Handling dv at time 0

When I convert with read_pumas and check the dataframe, the dv row comes always above the evid. I tried to convert back to df and sort the time and rerun the read_pumas but still having the same output.

A couple of work arounds:

  1. Remove observation at time 0
  2. Change time to 1e-5

Any suggestions for adding DV at time 0?

julia> dataset
162×8 DataFrame
 Row │ id      amt    time     dv            mdv    cmt    DOSE   evid
     │ String  Int64  Float64  Float64?      Int64  Int64  Int64  Int64
─────┼──────────────────────────────────────────────────────────────────
   1 │ 1          81      0.0  missing           1      1     81      1
   2 │ 1           0      0.0        0.0         0      2     81      0
   3 │ 1           0      0.5        0.4368      0      2     81      0
   4 │ 1           0      1.0        0.8433      0      2     81      0

DataFrame(population)

162×13 DataFrame
 Row │ id      time     evid   dv            amt       cmt      rate      duration  ss    ii        route       tad      dosenum
     │ String  Float64  Int64  Float64?      Float64?  Int64?   Float64?  Float64?  Int8  Float64?  NCA.Route?  Float64  Int64
─────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 │ 1           0.0      0        0.0          0.0  missing       0.0       0.0     0       0.0  NullRoute       0.0        1
   2 │ 1           0.0      1  missing           81.0        1       0.0       0.0     0       0.0  NullRoute       0.0        1
   3 │ 1           0.5      0        0.4368       0.0  missing       0.0       0.0     0       0.0  NullRoute       0.5        1

The question is not clear. Why is the order of rows important if they are at the same time point? If the order is important, using different time values by adding a small offset to one of the rows is the recommended way of handling this.

1 Like

Thanks for the input.
I always see EVID = 1 row is behind the EVID = 0 at the same time point when using read_pumas function (see figure #2) and it is causing an error when using fit. I was wondering how others are handling in this case, or I should bring up as a potential bug.

Can you please show the fit error stack traces then? Because it should not matter if the evid==1 or observation (evid==0) comes first.

Confirming that evid = 1 row is later than evid = 0, I face error I run fit.
I had no problem with nonmem when using the same dataset.

Interestingly, I got the same parameter values both in pumas and nonmem when I removed time = 0 row.

Full error message:

[ Info: Checking the initial parameter values.
ERROR: DomainError with Inf:
The initial parameter values cause a negative log likelihood of Inf. This can be due to model mis-specification or bad initial parameter values.
Stacktrace:
 [1] _optim_check_initial_values(costf::Pumas.var"#628#632"{PumasModel{(ka = 1, TVV = 1, TVCL = 1, Ω = 2, σ_prop = 1), 2, (:Depot, :TRANS1, :TRANS2, :Central), ParamSet{NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, PDiagDomain{PDMats.PDiagMat{Float64, Vector{Float64}}}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}}}}, var"#27#32", var"#28#33", Nothing, var"#29#34", Pumas.LinearODE, var"#30#35", var"#31#36", ModelingToolkit.ODESystem}, Vector{Subject{NamedTuple{(:DV,), Tuple{Vector{Union{Missing, Float64}}}}, Pumas.ConstantCovar{NamedTuple{(), Tuple{}}}, Vector{Pumas.Event{Float64, Float64, Float64, Float64, Float64, Float64, Int64}}, Vector{Float64}}}, FOCE, EnsembleThreads, NamedTuple{(), Tuple{}}, TransformVariables.TransformTuple{NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{TransformVariables.ShiftedExp{true, Float64}, TransformVariables.ShiftedExp{true, Float64}, TransformVariables.ShiftedExp{true, Float64}, Pumas.PDiagTransform, TransformVariables.ShiftedExp{true, Float64}}}}, Vector{Vector{Float64}}, Vector{Vector{Float64}}, Vector{Float64}}, vparam::Vector{Float64}, verbose::Bool)
   @ Pumas /Users/runner/work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Pumas/VyE8h/src/estimation/likelihoods.jl:4026
 [2] _fit(m::PumasModel{(ka = 1, TVV = 1, TVCL = 1, Ω = 2, σ_prop = 1), 2, (:Depot, :TRANS1, :TRANS2, :Central), ParamSet{NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, PDiagDomain{PDMats.PDiagMat{Float64, Vector{Float64}}}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}}}}, var"#27#32", var"#28#33", Nothing, var"#29#34", Pumas.LinearODE, var"#30#35", var"#31#36", ModelingToolkit.ODESystem}, population::Vector{Subject{NamedTuple{(:DV,), Tuple{Vector{Union{Missing, Float64}}}}, Pumas.ConstantCovar{NamedTuple{(), Tuple{}}}, Vector{Pumas.Event{Float64, Float64, Float64, Float64, Float64, Float64, Int64}}, Vector{Float64}}}, param::NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{Float64, Float64, Float64, Diagonal{Float64, Vector{Float64}}, Float64}}, approx::FOCE, ensemblealg::EnsembleThreads, optimize_fn::Pumas.DefaultOptimizeFN{Optim.BFGS{LineSearches.InitialStatic{Float64}, LineSearches.BackTracking{Float64, Int64}, Nothing, Float64, Optim.Flat}, NamedTuple{(:show_trace, :store_trace, :extended_trace, :g_tol, :allow_f_increases), Tuple{Bool, Bool, Bool, Float64, Bool}}}, fixedparamset::ParamSet{NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, PDiagDomain{PDMats.PDiagMat{Float64, Vector{Float64}}}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}}}}, fixedparam::NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{Float64, Float64, Float64, Diagonal{Float64, Vector{Float64}}, Float64}}, checkidentification::Bool, diffeq_options::NamedTuple{(), Tuple{}}, init_vrandeffsorth::Vector{Vector{Float64}}, verbose::Bool, optim_state::Nothing)
   @ Pumas /Users/runner/work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Pumas/VyE8h/src/estimation/likelihoods.jl:4189
 [3] __fit
   @ /Users/runner/work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Pumas/VyE8h/src/estimation/likelihoods.jl:3943 [inlined]
 [4] __fit
   @ /Users/runner/work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Pumas/VyE8h/src/estimation/likelihoods.jl:3930 [inlined]
 [5] fit(m::PumasModel{(ka = 1, TVV = 1, TVCL = 1, Ω = 2, σ_prop = 1), 2, (:Depot, :TRANS1, :TRANS2, :Central), ParamSet{NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, PDiagDomain{PDMats.PDiagMat{Float64, Vector{Float64}}}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}}}}, var"#27#32", var"#28#33", Nothing, var"#29#34", Pumas.LinearODE, var"#30#35", var"#31#36", ModelingToolkit.ODESystem}, _population::Vector{Subject{NamedTuple{(:DV,), Tuple{Vector{Union{Missing, Float64}}}}, Pumas.ConstantCovar{NamedTuple{(), Tuple{}}}, Vector{Pumas.Event{Float64, Float64, Float64, Float64, Float64, Float64, Int64}}, Vector{Float64}}}, param::NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{Float64, Float64, Float64, Diagonal{Float64, Vector{Float64}}, Float64}}, approx::FOCE; optim_alg::Nothing, optim_options::Nothing, optimize_fn::Nothing, constantcoef::NamedTuple{(), Tuple{}}, omegas::Tuple{}, ensemblealg::EnsembleThreads, checkidentification::Bool, diffeq_options::NamedTuple{(), Tuple{}}, init_randeffs::Nothing, init_vrandeffsorth::Nothing, verbose::Bool)
   @ Pumas /Users/runner/work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Pumas/VyE8h/src/estimation/likelihoods.jl:3899
 [6] fit(m::PumasModel{(ka = 1, TVV = 1, TVCL = 1, Ω = 2, σ_prop = 1), 2, (:Depot, :TRANS1, :TRANS2, :Central), ParamSet{NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}, PDiagDomain{PDMats.PDiagMat{Float64, Vector{Float64}}}, RealDomain{Int64, TransformVariables.Infinity{true}, Int64}}}}, var"#27#32", var"#28#33", Nothing, var"#29#34", Pumas.LinearODE, var"#30#35", var"#31#36", ModelingToolkit.ODESystem}, _population::Vector{Subject{NamedTuple{(:DV,), Tuple{Vector{Union{Missing, Float64}}}}, Pumas.ConstantCovar{NamedTuple{(), Tuple{}}}, Vector{Pumas.Event{Float64, Float64, Float64, Float64, Float64, Float64, Int64}}, Vector{Float64}}}, param::NamedTuple{(:ka, :TVV, :TVCL, :Ω, :σ_prop), Tuple{Float64, Float64, Float64, Diagonal{Float64, Vector{Float64}}, Float64}}, approx::FOCE)
   @ Pumas /Users/runner/work/PumasSystemImages/PumasSystemImages/julia_depot/packages/Pumas/VyE8h/src/estimation/likelihoods.jl:3842
 [7] top-level scope
   @ ~/Library/CloudStorage/OneDrive-TheOhioStateUniversity/Desktop/PMx_workspace/Aspirin/design_optimization/transit_iiv_V_CL/aspirin_model_param_eta_v_cl.jl:127

NONMEM is ignoring your observation that violates the statistical assumption. The problem here is not that you have evid=0 and evid=1 at the same time, the problem is that you have a DV of 0 at time 0 and a dose at time 0 as well as a Proportional error model. If your sample is correct, your dosing time is incorrect in my opinion.

1 Like

Thank you for pointing it out. I will try to go back and review with my colleagues