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:
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.
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.
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
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_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 can be a parameter while remaining amt elements are data.
The section about partially missing data is 3.2.
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 = amt + x2_init. This is consistent with Stan User’s Guide section that @Bob_Carpenter cited.
Thanks, @billg! Always nice to get a real expert involved.
Fantastic!!! Thanks a lot.