I would like to have the initial mass in the central compartment as a parameter to be estimated. Maybe @billg, @yizhang, or @charlesm93 could help.
Thanks a lot.
Torsten is from Metrum, not from the Stan project. You’ve pinged the right people who work on both projects. I couldn’t find a mailing list or forum for Torsten itself, in which case, it feels like fair game to open an issue:
Hi linas,
It doesn’t look like there is a straightforward way of specifying the initial mass in the central compartment, as in you can’t pass the initial condition to a Torsten function.
One way would be to specify a “dosing” event at time t=0, which sets an initial drug mass in the central compartment. However, I’m not sure if we support passing a dosing event as a parameter (I think it has to be data but not 100% certain). This is definitely a feature we can change. I agree with @Bob_Carpenter creating the issue is the right move.
It might also be possible to change the ODE itself, with a condition at time t=0 or close to 0.
@billg and @yizhang may know another approach. If not, we need to add a feature to Torsten.
Hi Linas,
Non-zero initial conditions are readily handled by changing the variables in the ODEs from the original scale to difference from initial value. For example if dx/dt = f(x) where x(0) = x0, rewrite the ODE in terms of z = x - x0. Then the new ODE system becomes dz/dt = f(z + x0) where z(0) = 0. This approach allows you to make x0 a parameter in your Stan model.
Feel free to contact me at Metrum Research Group if you would like a worked example of this method.
Cheers,
Bill Gillespie
Also as a follow up to @charlesm93 's reply, the amt
argument may be passed as a parameter, so you can specify an initial mass in any compartment by setting amt
at time
= 0 for the desired compartment (the cmt
argument) to that initial mass. That is probably the best way to handle it with Torsten functions that use analytic solutions, e.g., pmx_solve_onecpt
and pmx_solve_twocpt
. I prefer the approach I mentioned above with Torsten functions that numerically solve the ODEs and require the user to specify the system of ODEs as a function.
I like to use analytic solutions because they are faster. Can you please give me an example of this approach? I don’t understand how amt[1] can be a parameter while remaining amt elements are data.
See: 3.2 Partially known parameters | Stan User’s Guide
The section about partially missing data is 3.2.
Hi Linas,
Here’s a worked example. I constructed it by modifying the pk2cpt
example provided in the example_models
folder of the Torsten distribution. It’s just a simple 2 compartment model with first order absorption fit to data from a single individual. The same approach works for a population data set, but requires a bit more data bookkeeping. I modify the data set by adding a record prior to the first record in the original data set. It is a dosing record for dosing into compartment 2 (the central compartment). The model is then modified by copying the data array called amt
into a parameter array called amt_par
and then making the assignment amt_par[1] = amt[1] + x2_init
. This is consistent with Stan User’s Guide section that @Bob_Carpenter cited.
pk2cpt.stan (1.9 KB)
run.R (6.4 KB)
Fantastic!!! Thanks a lot.