Skip to contents
library(nlmixr2lib)
library(rxode2)
#> rxode2 5.0.2 using 2 threads (see ?getRxThreads)
#>   no cache: create with `rxCreateCache()`
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(ggplot2)
library(tidyr)

Overview

Bender et al. (2014) developed two preclinical PK models for trastuzumab emtansine (T-DM1), an antibody-drug conjugate (ADC) of trastuzumab and the maytansine derivative DM1 linked via SMCC. The dataset combined rat (n = 34) and cynomolgus monkey (n = 18) PK, plus in vitro plasma stability.

This vignette exercises the reduced model (Bender 2014 Table III), which collapses the conjugated species into a single lumped “T-DM1” compartment and tracks naked trastuzumab (DAR0) separately. T-DM1 deconjugates to DAR0 via a single first-order deconjugation clearance CL_DEC. Both forms share the same central / two peripheral volumes and distributional clearances.

See the companion Bender_2014_trastuzumabEmtansine_mechanistic model / vignette for the full DAR0–DAR7 catenary chain (Bender 2014 Table II).

Scope and species

Both rat and cynomolgus monkey parameter sets are documented in the model’s population$species_parameters metadata. The ini() block is populated with the cynomolgus estimates (Table III, cyno column). The rat alternates are noted in the in-file comments and can be applied by updating the fixed effects (converting published mL/day values to L/day via /1000).

mod <- rxode2::rxode(readModelDb("Bender_2014_trastuzumabEmtansine_reduced"))
#>  parameter labels from comments will be replaced by 'label()'
str(mod$meta$population$species_parameters, max.level = 2)
#> List of 2
#>  $ cynomolgus:List of 9
#>   ..$ source : chr "Bender 2014 Table III, cynomolgus columns"
#>   ..$ CL_TT  : chr "19.9 mL/day (IIV CV 19.8%)"
#>   ..$ V1     : chr "154 mL (IIV CV 7.65%)"
#>   ..$ CLd2   : chr "56.8 mL/day (no IIV)"
#>   ..$ V2     : chr "50.0 mL (no IIV)"
#>   ..$ CLd3   : chr "60.4 mL/day (no IIV)"
#>   ..$ V3     : chr "84.7 mL (IIV CV 27.3%)"
#>   ..$ CL_DEC : chr "22.0 mL/day (IIV CV 11.9%)"
#>   ..$ res_err: chr "9.64% proportional"
#>  $ rat       :List of 10
#>   ..$ source : chr "Bender 2014 Table III, rat columns"
#>   ..$ CL_TT  : chr "2.37 mL/day (IIV CV 24.6%)"
#>   ..$ V1     : chr "10.7 mL (IIV CV 19.8%)"
#>   ..$ CLd2   : chr "59.7 mL/day (no IIV)"
#>   ..$ V2     : chr "2.52 mL (IIV CV 68.0%)"
#>   ..$ CLd3   : chr "13.9 mL/day (no IIV)"
#>   ..$ V3     : chr "15.5 mL (IIV CV 16.5%)"
#>   ..$ CL_DEC : chr "2.24 mL/day (IIV CV 15.3%)"
#>   ..$ res_err: chr "10.9% proportional"
#>   ..$ notes  : chr "Rat fit adds IIV on V2; to switch from the cynomolgus default to the rat parameter set, call ini() on the resul"| __truncated__

Source trace

Every ini() value in inst/modeldb/specificDrugs/Bender_2014_trastuzumabEmtansine_reduced.R comes from Bender 2014 (doi:10.1208/s12248-014-9618-3):

Parameter Cynomolgus value Rat value Source
CL_TT 19.9 mL/day (CV 19.8%) 2.37 mL/day (CV 24.6%) Table III
V1 154 mL (CV 7.65%) 10.7 mL (CV 19.8%) Table III
CLd2 56.8 mL/day 59.7 mL/day Table III
V2 50.0 mL 2.52 mL (CV 68.0%) Table III
CLd3 60.4 mL/day 13.9 mL/day Table III
V3 84.7 mL (CV 27.3%) 15.5 mL (CV 16.5%) Table III
CL_DEC 22.0 mL/day (CV 11.9%) 2.24 mL/day (CV 15.3%) Table III
Residual 9.64% proportional 10.9% proportional Table III

Values in the ini() block are expressed in L and L/day (mL and mL/day divided by 1000) so that dose in mg and volume in L give concentrations in mg/L = ug/mL directly.

Cynomolgus 30 mg/kg IV single-dose replication

Bender 2014 Figure 3 (bottom panel) displays total trastuzumab (TT) and T-DM1 concentration–time profiles after a single 30 mg/kg IV T-DM1 DAR 3.1 dose in four cynomolgus monkeys. Reference body weight for cynomolgus monkeys is ~4 kg, giving a nominal 120 mg absolute dose.

dose_mg <- 120  # 30 mg/kg * 4 kg body weight
events  <- rxode2::et(amt = dose_mg, cmt = "central", time = 0) |>
  rxode2::et(seq(0.1, 42, length.out = 120), cmt = "Cc")

sim <- rxode2::rxSolve(mod |> rxode2::zeroRe(), events = events)
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalvp2', 'etalcldec'
sim_long <- as.data.frame(sim) |>
  pivot_longer(c(Cc, Ctt), names_to = "analyte", values_to = "conc") |>
  mutate(analyte = recode(analyte,
                          Cc  = "T-DM1",
                          Ctt = "Total trastuzumab"))

ggplot(sim_long, aes(time, conc, colour = analyte)) +
  geom_line(size = 0.9) +
  scale_y_log10(limits = c(0.5, NA)) +
  labs(x = "Time (day)", y = "Concentration (ug/mL)",
       colour = NULL,
       title  = "Cynomolgus monkey 30 mg/kg IV T-DM1 (Bender 2014 reduced)",
       caption = "Typical-value replication of Bender 2014 Figure 3 (cynomolgus panel).")
#> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
#>  Please use `linewidth` instead.
#> This warning is displayed once per session.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.

Rat 10 mg/kg IV single-dose replication

Switching the ini() fixed effects to the Table III rat estimates is a two-step update: convert published mL and mL/day to L and L/day (divide by 1000), then pass to ini() on the model object. IIV on V2 is reported in rat but the cyno default ini has no etalvp term, so we illustrate the typical-value simulation only.

mod_rat <- mod |>
  ini(
    lcl    = log(0.00237),
    lvc    = log(0.0107),
    lqd2   = log(0.0597),
    lvp    = log(0.00252),
    lqd3   = log(0.0139),
    lvp2   = log(0.0155),
    lcldec = log(0.00224),
    CcpropSd  = 0.109,
    CttpropSd = 0.109
  )
#>  change initial estimate of `lcl` to `-6.0448653238351`
#>  change initial estimate of `lvc` to `-4.53751153751428`
#>  change initial estimate of `lqd2` to `-2.81842325858358`
#>  change initial estimate of `lvp` to `-5.98349637745881`
#>  change initial estimate of `lqd3` to `-4.27586643884549`
#>  change initial estimate of `lvp2` to `-4.16691525505694`
#>  change initial estimate of `lcldec` to `-6.10127941311519`
#>  change initial estimate of `CcpropSd` to `0.109`
#>  change initial estimate of `CttpropSd` to `0.109`

rat_dose <- 3  # 10 mg/kg * 0.3 kg typical rat BW
events_rat <- rxode2::et(amt = rat_dose, cmt = "central", time = 0) |>
  rxode2::et(seq(0.05, 28, length.out = 120), cmt = "Cc")

sim_rat <- rxode2::rxSolve(mod_rat |> rxode2::zeroRe(), events = events_rat)
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalvp2', 'etalcldec'
sim_rat_long <- as.data.frame(sim_rat) |>
  pivot_longer(c(Cc, Ctt), names_to = "analyte", values_to = "conc") |>
  mutate(analyte = recode(analyte,
                          Cc  = "T-DM1",
                          Ctt = "Total trastuzumab"))

ggplot(sim_rat_long, aes(time, conc, colour = analyte)) +
  geom_line(size = 0.9) +
  scale_y_log10(limits = c(0.5, NA)) +
  labs(x = "Time (day)", y = "Concentration (ug/mL)",
       colour = NULL,
       title  = "Rat 10 mg/kg IV T-DM1 (Bender 2014 reduced, rat parameter set)",
       caption = "Typical-value replication of Bender 2014 Figure 2 (rat panel).")

Derived terminal half-lives

Bender 2014 Table III reports derived terminal half-lives for total trastuzumab and T-DM1 in each species. Computing them from the simulated log-linear terminal phase provides an end-to-end sanity check against the published values.

late <- as.data.frame(sim) |>
  filter(time >= 25)

t12 <- function(t, c) log(2) / -coef(lm(log(c) ~ t))[2]
data.frame(
  analyte = c("T-DM1", "Total trastuzumab"),
  simulated_t12_days = c(t12(late$time, late$Cc),
                         t12(late$time, late$Ctt)),
  paper_t12_days = c(5.21, 10.5)
)
#>             analyte simulated_t12_days paper_t12_days
#> 1             T-DM1           5.207294           5.21
#> 2 Total trastuzumab          10.465739          10.50

Assumptions and deviations

  • Cynomolgus body weight fixed at 4 kg and rat body weight fixed at 0.3 kg to convert paper mg/kg doses to absolute mg inputs; the model itself does not scale by body weight, matching the paper’s absolute-volume parameterization.
  • Residual error treated as pure proportional in linear space; Bender 2014 reports residual error as additive on log-scale, which is equivalent to proportional in nlmixr2’s linear space.
  • BSV zeroed out with rxode2::zeroRe() for typical-value replication; Table III IIV estimates remain available in ini() for stochastic simulation.