Skip to contents
library(nlmixr2lib)
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)

Model and source

  • Citation: Grimm HP, Schumacher V, Schafer M, Imhof-Jung S, Freskgard PO, Brady K, Hofmann C, Ruger P, Schlothauer T, Gopfert U, Hartl M, Rottach S, Zwick A, Seger S, Neff R, Niewoehner J, Janssen N. Delivery of the Brainshuttle amyloid-beta antibody fusion trontinemab to non-human primate brain and projected efficacious dose regimens in humans. MAbs. 2023;15(1):2261509. doi:10.1080/19420862.2023.2261509.
  • Description (trontinemab): Trontinemab PK model in non-human primates (Grimm 2023): two-compartment plasma PK with Michaelis-Menten elimination and brain-region effect-compartment distribution (brain_cerebellum, brain_hippocampus, brain_striatum, brain_cortex, choroid plexus, CSF).
  • Description (gantenerumab): Gantenerumab PK model in cynomolgus monkeys (Grimm 2023): two-compartment plasma PK with brain extracellular distribution across six brain regions (brain_cerebellum, brain_hippocampus, brain_striatum, brain_cortex, choroid plexus, CSF).
  • Article: https://doi.org/10.1080/19420862.2023.2261509

Trontinemab replication

Simulate trontinemab PK in plasma and brain

Replicate figures 2 and 3 in the publication with a single 10 mg/kg dose to a cynomolgus monkey.

dSimDose <-
  data.frame(
    ID = 1,
    AMT = 10, # dose in mg/kg # nolint: commented_code_linter.
    WT = 5, # cynomologus monkey body weight according to the paper
    TIME = 0,
    EVID = 1,
    CMT = "central"
  )
dSimObs <-
  data.frame(
    ID = 1,
    AMT = 0,
    WT = 5,
    TIME = c(5 / 60, 1, 2, 4, 8, 12, seq(24, 336, by = 24)),
    EVID = 0,
    CMT = "central"
  )
dSimPrep <- dplyr::bind_rows(dSimDose, dSimObs)
Grimm2023Tront <- readModelDb("Grimm_2023_trontinemab")
conc_unit <- rxode2::rxode(Grimm2023Tront)$units[["concentration"]]
#> ℹ parameter labels from comments will be replaced by 'label()'
# Set BSV to zero for simulation to get a reproducible result
dSimTront <- rxode2::rxSolve(Grimm2023Tront |> rxode2::zeroRe(), events = dSimPrep)
#> ℹ parameter labels from comments will be replaced by 'label()'
#> ℹ omega/sigma items treated as zero: 'etalfpla_cerebellum', 'etalfpla_hippocampus', 'etalfpla_striatum', 'etalfpla_cortex', 'etalfpla_choroid_plexus'
dSimTront$Analyte <- "Trontinemab"

Simulate gantenerumab PK in plasma and brain

Replicate figures 2 and 3 in the publication with a single 20 mg/kg dose to a cynomolgus monkey.

dSimDose <-
  data.frame(
    ID = 1,
    AMT = 20, # dose in mg/kg # nolint: commented_code_linter.
    WT = 5, # cynomologus monkey body weight according to the paper
    TIME = 0,
    EVID = 1,
    CMT = "central"
  )
dSimObs <-
  data.frame(
    ID = 1,
    AMT = 0,
    WT = 5,
    TIME = c(5 / 60, 1, 2, 4, 8, 12, seq(24, 336, by = 24)),
    EVID = 0,
    CMT = "central"
  )
dSimPrep <- dplyr::bind_rows(dSimDose, dSimObs)
Grimm2023Gant <- readModelDb("Grimm_2023_gantenerumab")
# Set BSV to zero for simulation to get a reproducible result
dSimGant <- rxode2::rxSolve(Grimm2023Gant |> rxode2::zeroRe(), events = dSimPrep)
#> ℹ omega/sigma items treated as zero: 'etalfpla_cerebellum', 'etalfpla_hippocampus', 'etalfpla_striatum', 'etalfpla_cortex', 'etalfpla_choroid_plexus'
dSimGant$Analyte <- "Gantenerumab"

Plot plasma PK

Replicate figure 2 from the paper.

dSim <- bind_rows(dSimTront, dSimGant)
dSim$Analyte <- factor(dSim$Analyte, levels = c("Trontinemab", "Gantenerumab"))

ggplot(dSim, aes(x = time, y = sim)) +
  geom_line() +
  labs(
    x = "Time (h)",
    y = paste0("Concentration (", conc_unit, ")")
  ) +
  scale_y_log10() +
  scale_x_continuous(breaks = seq(0, 336, by = 48)) +
  coord_cartesian(ylim = c(1e3, NA)) +
  facet_grid(~Analyte)

Plot brain PK

Replicate figure 3 from the paper.

d_plot_brain <-
  dSim |>
  select(
    time, Analyte,
    any_of(c("cerebellum", "hippocampus", "striatum", "cortex",
             "choroid_plexus", "csf"))
  ) |>
  tidyr::pivot_longer(cols = -c("time", "Analyte"), names_to = "ASPEC", values_to = "AVAL") |>
  mutate(
    ASPEC =
      factor(
        ASPEC,
        levels = c("hippocampus", "cerebellum", "choroid_plexus", "cortex", "striatum", "csf"),
        labels = c("Hippocampus", "Cerebellum", "Choroid Plexus", "Cortex", "Striatum", "Cerebrospinal Fluid")
      )
  )

ggplot(d_plot_brain, aes(x = time, y = AVAL, colour = Analyte)) +
  geom_line() +
  labs(
    x = "Time (h)",
    y = "Concentration (ng/g)"
  ) +
  scale_x_continuous(breaks = c(0, 72, 168, 240, 336)) +
  facet_wrap(~ASPEC)