Facilities for Simulating from ODE-Based Models (2024)

The model equations can be specified through a text string, a model file or an R expression. Both differential and algebraic equations are permitted. Differential equations are specified by d/dt(var_name) =. Each equation can be separated by a semicolon.

Specify ODE parameters and initial conditions

Model parameters can be defined as named vectors. Names of parameters in the vector must be a superset of parameters in the ODE model, and the order of parameters within the vector is not important.

theta <- c(KA=2.94E-01, CL=1.86E+01, V2=4.02E+01, # central  Q=1.05E+01, V3=2.97E+02, # peripheral Kin=1, Kout=1, EC50=200) # effects

Initial conditions (ICs) can be defined through a vector as well. If the elements are not specified, the initial condition for the compartment is assumed to be zero.

inits <- c(eff=1);

If you want to specify the initial conditions in the model you can add:

eff(0) = 1

Specify Dosing and sampling in RxODE

RxODE provides a simple and very flexible way to specify dosing and sampling through functions that generate an event table. First, an empty event table is generated through the “eventTable()” function:

ev <- eventTable(amount.units='mg', time.units='hours')

Next, use the add.dosing() and add.sampling() functions of the EventTable object to specify the dosing (amounts, frequency and/or times, etc.) and observation times at which to sample the state of the system. These functions can be called multiple times to specify more complex dosing or sampling regiments. Here, these functions are used to specify 10mg BID dosing for 5 days, followed by 20mg QD dosing for 5 days:

ev$add.dosing(dose=10000, nbr.doses=10, dosing.interval=12)ev$add.dosing(dose=20000, nbr.doses=5, start.time=120, dosing.interval=24)ev$add.sampling(0:240)

If you wish you can also do this with the mattigr pipe operator %>%

ev <- eventTable(amount.units="mg", time.units="hours") %>% add.dosing(dose=10000, nbr.doses=10, dosing.interval=12) %>% add.dosing(dose=20000, nbr.doses=5, start.time=120, dosing.interval=24) %>% add.sampling(0:240)

The functions get.dosing() and get.sampling() can be used to retrieve information from the event table.

head(ev$get.dosing())#> id low time high cmt amt rate ii addl evid ss dur#> 1 1 NA 0 NA (default) 10000 0 12 9 1 0 0#> 2 1 NA 120 NA (default) 20000 0 24 4 1 0 0
head(ev$get.sampling())#> id low time high cmt amt rate ii addl evid ss dur#> 1 1 NA 0 NA (obs) NA NA NA NA 0 NA NA#> 2 1 NA 1 NA (obs) NA NA NA NA 0 NA NA#> 3 1 NA 2 NA (obs) NA NA NA NA 0 NA NA#> 4 1 NA 3 NA (obs) NA NA NA NA 0 NA NA#> 5 1 NA 4 NA (obs) NA NA NA NA 0 NA NA#> 6 1 NA 5 NA (obs) NA NA NA NA 0 NA NA

You may notice that these are similar to NONMEM event tables; If you are more familiar with NONMEM data and events you could use them directly with the event table function et

ev <- et(amountUnits="mg", timeUnits="hours") %>% et(amt=10000, addl=9,ii=12,cmt="depot") %>% et(time=120, amt=2000, addl=4, ii=14, cmt="depot") %>% et(0:240) # Add sampling 

You can see from the above code, you can dose to the compartment named in the RxODE model. This slight deviation from NONMEM can reduce the need for compartment renumbering.

These events can also be combined and expanded (to multi-subject events and complex regimens) with rbind, c, seq, and rep. For more information about creating complex dosing regimens using RxODE see the RxODE events vignette.

Solving ODEs

The ODE can now be solved by calling the model object’s run or solve function. Simulation results for all variables in the model are stored in the output matrix x.

x <- mod1$solve(theta, ev, inits);knitr::kable(head(x))
timeC2C3depotcentrperieff
00.000000.000000010000.0000.0000.00001.000000
144.375550.91982987452.7651783.897273.18951.084664
254.882962.67298255554.3702206.295793.87581.180825
351.903434.45649274139.5422086.5181323.57831.228914
444.497385.98070763085.1031788.7951776.27021.234610
536.484347.17749812299.2551466.6702131.71691.214742

You can also solve this and create a RxODE data frame:

x <- mod1 %>% rxSolve(theta, ev, inits);x#> ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂ Solved RxODE object ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂#> ── Parameters (x$params): ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────#> V2 V3 KA CL Q Kin Kout EC50 #> 40.200 297.000 0.294 18.600 10.500 1.000 1.000 200.000 #> ── Initial Conditions (x$inits): ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────#> depot centr peri eff #> 0 0 0 1 #> ── First part of data (object): ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────#> # A tibble: 241 x 7#> time C2 C3 depot centr peri eff#> [h] <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>#> 1 0 0 0 10000 0 0 1 #> 2 1 44.4 0.920 7453. 1784. 273. 1.08#> 3 2 54.9 2.67 5554. 2206. 794. 1.18#> 4 3 51.9 4.46 4140. 2087. 1324. 1.23#> 5 4 44.5 5.98 3085. 1789. 1776. 1.23#> 6 5 36.5 7.18 2299. 1467. 2132. 1.21#> # … with 235 more rows#> ▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂

This returns a modified data frame. You can see the compartment values in the plot below:

library(ggplot2)plot(x,C2) + ylab("Central Concentration")

Facilities for Simulating from ODE-Based Models (1)

Or,

plot(x,eff) + ylab("Effect")

Facilities for Simulating from ODE-Based Models (2)

Note that the labels are automatically labeled with the units from the initial event table. RxODE extracts units to label the plot (if they are present).

Facilities for Simulating from ODE-Based Models (2024)

References

Top Articles
Latest Posts
Article information

Author: Saturnina Altenwerth DVM

Last Updated:

Views: 5807

Rating: 4.3 / 5 (64 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Saturnina Altenwerth DVM

Birthday: 1992-08-21

Address: Apt. 237 662 Haag Mills, East Verenaport, MO 57071-5493

Phone: +331850833384

Job: District Real-Estate Architect

Hobby: Skateboarding, Taxidermy, Air sports, Painting, Knife making, Letterboxing, Inline skating

Introduction: My name is Saturnina Altenwerth DVM, I am a witty, perfect, combative, beautiful, determined, fancy, determined person who loves writing and wants to share my knowledge and understanding with you.