source("global.R")
set.seed(1010)

Short answer

There are two commonly-used ways to set initial conditions: in $MAIN and in the initial condition list.

Set initials in $MAIN

For a compartment called CMT, there is a variable available to you called CMT_0 that you can use to set the initial condition of that compartment in $MAIN. For example:

code <- '
$PARAM KIN = 200, KOUT = 50

$CMT RESP

$MAIN
RESP_0 = KIN/KOUT;
'

This is the most commonly-used way to set initial conditions: the initial condition for the RESP compartment is set equal to KIN divided by KOUT. If you had a parameter called BASE, you could also write RESP_0 = BASE;. In these examples, we're using data items from $PARAM. But the initial condition could be set to any numeric value in the model, including individual parameters derived from parameters, covariates, and random effects. Note that you should never declare RESP_0 (e.g. double RESP_0): it just appears for you to use.

Set initials in the init list

You can also set initial conditions in the initials list. Most commonly, this means declaring compartments with $INIT rather than $CMT. For example

code <- '
$INIT RESP = 4
'

This method gets us the same result as the previous example, however the initial condition now is not a derived value, but it is coded as a number. Alternatively, you could declare a compartment via $CMT and update later (see next).

We can update this value later like this

library(mrgsolve) 

mod <- mcode("init_up", code)

init(mod)

init(mod, RESP=8) %>% init

This method is commonly used to set initial conditions in large QSP models where the compartment starts out as some known or assumed steady state value.

Don't use initial conditions as a dosing mechanism

Using an initial condition to put a starting dose in a compartment is not recommended. Always use a dosing event for that.

Long answer

The following is from a wiki post I did on the topic. It's pedantic. But hopefully helpful to learn what mrgsolve is doing for those who want to know.

Make a model only to examine init behavior

Note: IFLAG is my invention only for this demo. The demo is always responsible for setting and interpreting the value (it is not reserved in any way and mrgsolve does not control the value).

For this demo

code <- '
$PARAM BASE=200, IFLAG = 0

$CMT A

$MAIN
if(IFLAG > 0) A_0 = BASE;

$ODE dxdt_A = 0;
'
mod <- mcode("init_long",code)
dplot <- function(x) plot(x,ylim=c(0,400))

Check the initial condition

init(mod)

Note:

mod %>% mrgsim %>% dplot

Next, we update the base initial condition for A to 100

Note:

mod %>% init(A = 100) %>% mrgsim %>% dplot

Now, turn on IFLAG

Note:

mod %>% param(IFLAG=1) %>% mrgsim %>% dplot

mod %>% param(IFLAG=1, BASE=300) %>% mrgsim %>% dplot

Example PK/PD model with initial condition

Just to be clear, there is no need to set any sort of flag to set the initial condition.

code <- '
$PARAM AUC=0, AUC50 = 75, KIN=200, KOUT=5

$CMT RESP

$MAIN 
RESP_0 = KIN/KOUT;

$ODE
dxdt_RESP = KIN*(1-AUC/(AUC50+AUC)) - KOUT*RESP;
'
mod <- mcode("init_long2", code)

The initial condition is set to 40 per the values of KIN and KOUT

mod %>% mrgsim %>% plot

Even when we change RESP_0 in R, the calculation in $MAIN gets the final say

mod %>% init(RESP=1E9) %>% mrgsim

Calling init will let you check to see what is going on

init(mod)

mod %>% param(KIN=100) %>% init

Set initial conditions via idata

Go back to house model

mod <- mrgsolve:::house()
init(mod)

Notes

idata <- expand.idata(CENT_0 = seq(0,25,1))

idata %>% head

out <- 
  mod %>% 
  idata_set(idata) %>% 
  mrgsim(end=40)
plot(out, CENT~.)


metrumresearchgroup/mrgsolve documentation built on Feb. 13, 2024, 10:27 p.m.