Skip to contents

Model and source

  • Citation: Xu XS, Moreau P, Usmani SZ, et al. Split First Dose Administration of Intravenous Daratumumab for the Treatment of Multiple Myeloma (MM): Clinical and Population Pharmacokinetic Analyses. Adv Ther. 2020;37(4):1464-1478. doi:10.1007/s12325-020-01247-8
  • Description: Two-compartment population PK model for intravenous daratumumab (anti-CD38 IgG1k) in adults with multiple myeloma, with parallel linear and Michaelis-Menten eliminations from the central compartment. The maximum velocity of the saturable (target-mediated) elimination decays mono-exponentially from its baseline value at first-order rate KDES, mimicking depletion of the CD38 target over weekly 16 mg/kg therapy (Xu 2020 MMY1001 D-Kd / D-KRd cohorts).
  • Article: https://doi.org/10.1007/s12325-020-01247-8
  • Supplement (Online Resources 1-6, including the final-model parameter table): https://doi.org/10.1007/s12325-020-01247-8 (electronic supplementary material).

The model is a two-compartment IV population PK structure with parallel linear and Michaelis-Menten eliminations from the central compartment. The maximum velocity of the saturable (target-mediated) elimination decays mono-exponentially from its baseline value at first-order rate KDES, mimicking depletion of the CD38 target over weekly 16 mg/kg therapy. The structural form follows the established daratumumab population-PK parameterisation; Xu 2020 re-fit the parameters using the MMY1001 D-Kd (n=85) and D-KRd (n=22) cohorts.

Population

The PK-evaluable population comprised 107 patients with multiple myeloma from the phase 1b MMY1001 study (ClinicalTrials.gov NCT01998971): the D-Kd cohort (daratumumab + carfilzomib + dexamethasone, n=85, relapsed/refractory MM with 1-3 prior lines of therapy) and the D-KRd cohort (daratumumab + carfilzomib + lenalidomide + dexamethasone, n=22, newly diagnosed MM). The D-Kd cohort was older (median 66 years, range 38-85) than the D-KRd cohort (median 60 years, range 34-74); sex was balanced (~54% male in both cohorts); the population was 80-86% White; median body weight was 70.0 kg (D-Kd) and 79.9 kg (D-KRd); ECOG performance status was 0 or 1 in approximately 92% of D-Kd and 95% of D-KRd patients (Xu 2020 Table 1).

All patients received 16 mg/kg IV daratumumab weekly for Cycles 1-2 (28-day cycles), every 2 weeks for Cycles 3-6, and every 4 weeks thereafter. The first dose was administered either as a single 16-mg/kg infusion on Cycle 1 Day 1 (D-Kd, n=10) or as two 8-mg/kg infusions on Cycle 1 Days 1 and 2 (D-Kd n=75, D-KRd n=22). The median durations of the first, second, and subsequent intravenous infusions of daratumumab in MMY1001 were 7.0, 4.3, and 3.4 h, respectively.

The same metadata is available programmatically via readModelDb("Xu_2020_daratumumab")$population.

Source trace

The per-parameter origin is recorded as an in-file comment next to each ini() entry in inst/modeldb/specificDrugs/Xu_2020_daratumumab.R. The table below collects the equation and parameter origins in one place.

Equation / parameter Value Source location
lcl (CL) 0.00485 L/hour Online Resource 6: CL, RSE 10%
lvc (V1) 4.09 L Online Resource 6: V1, RSE 3.5%
lq (Q) 0.0642 L/hour Online Resource 6: Q, RSE 8.0%
lvp (V2) 3.06 L Online Resource 6: V2, RSE 9.7%
lvmax (Vmax baseline) 2.08 mg/hour Online Resource 6: Vmax, RSE 16.7%
lkdes (1st-order Vmax decay) 0.0013 1/hour Online Resource 6: KDES, RSE 17.8%
lkm (Km, fixed) 0.93 ug/mL Online Resource 6: KM, fixed
e_wt_cl 0.451 Online Resource 6: WT on CL, RSE 50.1%
e_alb_cl -1.149 Online Resource 6: serum albumin on CL, RSE 27.2%
e_igg_cl 0.806 Online Resource 6: Type of MM (IgG vs non-IgG) on CL, RSE 29.8%
e_wt_vc 0.375 Online Resource 6: WT on V1, RSE 38.1%
e_sexf_vc -0.205 Online Resource 6: Sex on V1, RSE 22.2%
omega(CL) 40.7% CV Online Resource 6, RSE 10.4%
omega(V1) 21.8% CV Online Resource 6, RSE 10.3%
omega(Vmax) 71.3% CV Online Resource 6, RSE 23.8%
omega(KDES) 43.4% CV Online Resource 6, RSE 45.6%
Residual error (proportional) 13.8% CV Online Resource 6: additive on log-scale
d/dt(central), d/dt(peripheral1) n/a Main text Methods (Population PK Analysis) + Online Resource 6 footnote equations
TVCL = 0.00485 * (WT/78.6)^0.451 * (ALB/37.0)^-1.149 * TPMMCL n/a Online Resource 6 footnote
TVV1 = 4.09 * (WT/78.6)^0.375 * SEXV1 n/a Online Resource 6 footnote
Reference WT, ALB 78.6 kg, 37.0 g/L Online Resource 6 footnote

Virtual cohort

Individual MMY1001 patient covariate values are not publicly available. The virtual cohort below approximates the published Cohort demographics in Xu 2020 Table 1: ~46% female, ~80% White, median body weight 78.6 kg (consistent with the model’s reference weight), median baseline albumin 37 g/L (model reference). Approximately 60% of patients with multiple myeloma have IgG-secreting disease in published RRMM cohorts (Fau 2020 Table S2 reports 55% IgG MM); we use 55% IgG MM here so the simulation reflects a clinically typical mix.

set.seed(20260514L)

n_per_arm <- 100L

make_cohort <- function(n, regimen, dose_schedule, id_offset = 0L) {
  ids <- id_offset + seq_len(n)

  cov_df <- tibble(
    id      = ids,
    # Median 72 kg approximates the pooled D-Kd / D-KRd median across cohorts
    # (D-Kd 70.0 kg; D-KRd 79.9 kg), with a clipped SD of 15 kg spanning the
    # full Xu 2020 Table 1 range of 45-160.8 kg.
    WT      = pmax(45, pmin(160, rnorm(n, mean = 72, sd = 15))),
    ALB     = pmax(25, pmin(50,  rnorm(n, mean = 37, sd = 4))),
    SEXF    = as.integer(runif(n) < 0.458),
    # 55% IgG MM => MM_NIGG = 0; 45% non-IgG MM => MM_NIGG = 1.
    MM_NIGG = as.integer(runif(n) > 0.55),
    regimen = regimen
  )

  dose_df <- dose_schedule(ids) |>
    left_join(cov_df, by = "id") |>
    mutate(amt = 16 * WT * dose_fraction)

  obs_grid <- tidyr::expand_grid(
    id   = ids,
    # 6-hourly through the weekly dosing phase, 12-hourly to end of follow-up.
    time = sort(unique(c(seq(0, 8 * 7 * 24, by = 6),
                         seq(8 * 7 * 24, 28 * 7 * 24, by = 12))))
  ) |>
    left_join(cov_df, by = "id") |>
    mutate(evid = 0L, amt = 0, cmt = "central", dur = 0)

  dose_rows <- dose_df |>
    transmute(id, time, amt, evid = 1L, cmt = "central", dur,
              WT, ALB, SEXF, MM_NIGG, regimen)

  bind_rows(dose_rows, obs_grid |> select(names(dose_rows))) |>
    arrange(id, time, desc(evid))
}

# MMY1001 calendar: 28-day cycles. Weekly dosing during Cycles 1-2 (days 0,
# 7, 14, 21, 28, 35, 42, 49); every 2 weeks during Cycles 3-6 (days 56, 70,
# 84, 98, 112, 126, 140, 154); every 4 weeks thereafter.

# Single first dose regimen: 16 mg/kg infusion on C1D1 (7h),
# then weekly for Cycles 1-2 (4.3h second infusion, 3.4h thereafter),
# Q2W for Cycles 3-6, Q4W after.
single_schedule <- function(ids) {
  qw_times  <- (0:7) * 7 * 24                  # days 0, 7, ..., 49 (Cycles 1-2)
  q2w_times <- 56 * 24 + 14 * 24 * (0:7)       # days 56, 70, ..., 154 (Cycles 3-6)
  q4w_times <- max(q2w_times) + 28 * 24 * (1:6)
  all_times <- c(qw_times, q2w_times, q4w_times)
  durations <- c(7.0,                          # first infusion
                 4.3,                          # second infusion
                 rep(3.4, length(all_times) - 2L))
  tidyr::expand_grid(id = ids, time_idx = seq_along(all_times)) |>
    mutate(time = all_times[time_idx],
           dur  = durations[time_idx],
           dose_fraction = 1) |>
    select(-time_idx)
}

# Split first dose regimen: 8 mg/kg on C1D1 (7h) and C1D2 (4.3h),
# then 16 mg/kg weekly through C2D last dose, then Q2W, then Q4W.
split_schedule <- function(ids) {
  qw_times  <- c(0, 24, (1:7) * 7 * 24)        # split first + days 7-49
  q2w_times <- 56 * 24 + 14 * 24 * (0:7)
  q4w_times <- max(q2w_times) + 28 * 24 * (1:6)
  all_times <- c(qw_times, q2w_times, q4w_times)
  doses     <- c(0.5, 0.5, rep(1, length(all_times) - 2L))
  durations <- c(7.0, 4.3, rep(3.4, length(all_times) - 2L))
  tidyr::expand_grid(id = ids, time_idx = seq_along(all_times)) |>
    mutate(time = all_times[time_idx],
           dur  = durations[time_idx],
           dose_fraction = doses[time_idx]) |>
    select(-time_idx)
}

events <- bind_rows(
  make_cohort(n_per_arm, "Single first dose", single_schedule, id_offset = 0L),
  make_cohort(n_per_arm, "Split first dose",  split_schedule,  id_offset = n_per_arm)
)
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))

Simulation

mod <- readModelDb("Xu_2020_daratumumab")

sim <- rxode2::rxSolve(
  mod,
  events = events,
  keep   = c("regimen", "WT", "ALB", "SEXF", "MM_NIGG"),
  addDosing = FALSE
) |> as.data.frame()
#>  parameter labels from comments will be replaced by 'label()'

For deterministic typical-value replications (no between-subject variability), zero out the random effects:

mod_typ <- mod |> rxode2::zeroRe()
#>  parameter labels from comments will be replaced by 'label()'
typ_events <- events |> filter(id %in% c(1L, n_per_arm + 1L))
sim_typ <- rxode2::rxSolve(mod_typ, events = typ_events,
                           keep = c("regimen", "WT", "ALB", "SEXF", "MM_NIGG")) |>
  as.data.frame()
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalvmax', 'etalkdes'
#> Warning: multi-subject simulation without without 'omega'

Replicate published figures

Figure 1 – mean daratumumab serum concentrations

The published Figure 1 compares mean (+/- SD) daratumumab serum concentrations between the single first dose and split first dose cohorts of MMY1001 during the first 4 cycles of therapy. Below is the simulated analogue using the virtual cohort.

fig1_window_hr <- 16 * 7 * 24      # 16 weeks (~ Cycles 1-4 of 28-day cycles)

sim_fig1 <- sim |>
  filter(time <= fig1_window_hr, !is.na(Cc))

sim_fig1 |>
  group_by(regimen, time) |>
  summarise(
    Cc_mean = mean(Cc),
    Cc_sd   = sd(Cc),
    .groups = "drop"
  ) |>
  ggplot(aes(time / 24, Cc_mean, colour = regimen, fill = regimen)) +
  geom_ribbon(aes(ymin = pmax(0, Cc_mean - Cc_sd), ymax = Cc_mean + Cc_sd),
              alpha = 0.15, colour = NA) +
  geom_line(linewidth = 0.8) +
  labs(x = "Time (days)", y = "Daratumumab serum concentration (ug/mL)",
       colour = NULL, fill = NULL,
       title = "Simulated mean (+/- SD) serum concentrations through Cycle 3",
       caption = "Replicates Figure 1 of Xu 2020.")

Figure 2b – difference between regimens during the first 2 weeks

Xu 2020 Figure 2b zooms into the first 2 weeks where the split- and single-first dose regimens differ. After the second split-dose infusion on Cycle 1 Day 2, the two regimens converge.

sim |>
  filter(time <= 14 * 24, !is.na(Cc)) |>
  group_by(regimen, time) |>
  summarise(
    Cc_p50 = median(Cc),
    Cc_p025 = quantile(Cc, 0.025),
    Cc_p975 = quantile(Cc, 0.975),
    .groups = "drop"
  ) |>
  ggplot(aes(time / 24, Cc_p50, colour = regimen, fill = regimen)) +
  geom_ribbon(aes(ymin = Cc_p025, ymax = Cc_p975), alpha = 0.15, colour = NA) +
  geom_line(linewidth = 0.8) +
  labs(x = "Time (days)", y = "Daratumumab serum concentration (ug/mL)",
       colour = NULL, fill = NULL,
       title = "First 2 weeks: split vs single first dose regimen",
       caption = "Replicates Figure 2b of Xu 2020.")

Figure 3 – percent difference in concentration converges to <1%

Xu 2020 Figure 3 reports that the percent difference between the simulated single- and split-dose concentrations falls below 1% for most patients by Week 4. The simulated percent difference is computed below using the regimen-mean trajectories.

pct_diff <- sim |>
  filter(!is.na(Cc), time <= 28 * 24) |>
  group_by(regimen, time) |>
  summarise(Cc_mean = mean(Cc), .groups = "drop") |>
  pivot_wider(names_from = regimen, values_from = Cc_mean) |>
  mutate(pct = 100 * (`Single first dose` - `Split first dose`) /
                pmax(`Single first dose`, 1e-3))

ggplot(pct_diff, aes(time / 24, pct)) +
  geom_hline(yintercept = 0, linetype = 2) +
  geom_line() +
  labs(x = "Time (days)", y = "% difference in Cc (single - split) / single",
       title = "Mean percent difference between single- and split-dose regimens",
       caption = "Replicates the qualitative pattern of Figure 3 of Xu 2020 (mean curves rather than per-subject boxplots).")

PKNCA validation

Daratumumab is administered as multiple-hour IV infusions; PKNCA AUC and Cmax are reported here for the first dose interval (single 16 mg/kg infusion on Cycle 1 Day 1) of the single-first-dose regimen, where the parallel-elimination behaviour and target-mediated saturation are most informative.

sim_first_cycle <- sim |>
  filter(regimen == "Single first dose", !is.na(Cc),
         time >= 0, time <= 7 * 24) |>
  select(id, time, Cc, regimen)

dose_first_cycle <- events |>
  filter(regimen == "Single first dose", evid == 1, time == 0) |>
  select(id, time, amt, regimen)

conc_obj <- PKNCA::PKNCAconc(
  sim_first_cycle,
  Cc ~ time | regimen + id,
  concu = "ug/mL", timeu = "hour"
)

dose_obj <- PKNCA::PKNCAdose(
  dose_first_cycle,
  amt ~ time | regimen + id,
  doseu = "mg"
)

intervals <- data.frame(
  start    = 0,
  end      = 7 * 24,
  cmax     = TRUE,
  tmax     = TRUE,
  auclast  = TRUE,
  cmin     = TRUE
)

nca_res <- PKNCA::pk.nca(PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals))
nca_tbl <- as.data.frame(nca_res$result)

knitr::kable(
  nca_tbl |>
    group_by(PPTESTCD) |>
    summarise(
      median = median(PPORRES, na.rm = TRUE),
      Q05    = quantile(PPORRES, 0.05, na.rm = TRUE),
      Q95    = quantile(PPORRES, 0.95, na.rm = TRUE),
      .groups = "drop"
    ),
  digits = 3,
  caption = "Simulated NCA parameters on the first 7-day dose interval (Single first dose regimen, 16 mg/kg)."
)
Simulated NCA parameters on the first 7-day dose interval (Single first dose regimen, 16 mg/kg).
PPTESTCD median Q05 Q95
auclast 23714.020 11627.764 36208.748
cmax 269.158 175.069 400.973
cmin 0.000 0.000 0.000
tmax 12.000 6.000 12.000

Comparison against published concentrations

Xu 2020 Table 2 reports observed median (range) postinfusion concentrations in MMY1001. The simulated medians from the virtual cohort are tabulated below for the same sampling time points.

# MMY1001 calendar (28-day cycles): C1D1 = day 0; C1D2 = day 1; C2D1 = day 28;
# C3D1 = day 56; C4D1 = day 84.
pub <- tibble::tribble(
  ~timepoint,            ~time_hr,         ~regimen,             ~pub_median, ~pub_low, ~pub_high,
  "C1D1 postinfusion",     7.0,            "Single first dose",  319.2,       237.5,    394.7,
  "C1D1 postinfusion",     7.0,            "Split first dose",   156.7,        82.5,    345.0,
  "C1D2 postinfusion",    24 + 4.3,        "Split first dose",   256.8,       125.8,    435.5,
  "C2D1 postinfusion",    28 * 24 + 3.4,   "Single first dose",  726.6,       523.1,    911.6,
  "C2D1 postinfusion",    28 * 24 + 3.4,   "Split first dose",   688.9,         0.0,   1202.4,
  "C3D1 preinfusion",     56 * 24 - 0.1,   "Single first dose",  463.2,       355.9,    792.9,
  "C3D1 preinfusion",     56 * 24 - 0.1,   "Split first dose",   639.2,        57.7,   1110.7,
  "C4D1 preinfusion",     84 * 24 - 0.1,   "Single first dose",  509.1,       291.2,    743.5,
  "C4D1 preinfusion",     84 * 24 - 0.1,   "Split first dose",   523.0,        92.3,   1019.3
)

approx_id <- function(df, target_hr) {
  df |>
    group_by(id, regimen) |>
    arrange(time) |>
    summarise(Cc = approx(time, Cc, xout = target_hr, rule = 2)$y, .groups = "drop")
}

sim_summary <- pub |>
  rowwise() |>
  mutate(sim_df = list(approx_id(sim |> filter(regimen == .env$regimen), time_hr))) |>
  ungroup() |>
  mutate(
    sim_median = vapply(sim_df, function(d) median(d$Cc, na.rm = TRUE), numeric(1)),
    sim_low    = vapply(sim_df, function(d) quantile(d$Cc, 0.05, na.rm = TRUE), numeric(1)),
    sim_high   = vapply(sim_df, function(d) quantile(d$Cc, 0.95, na.rm = TRUE), numeric(1))
  ) |>
  select(-sim_df) |>
  mutate(pct_diff = 100 * (sim_median - pub_median) / pub_median)

knitr::kable(
  sim_summary,
  digits = 1,
  caption = "Published (Xu 2020 Table 2) vs simulated median daratumumab concentrations at key MMY1001 sampling time points. The simulation uses a virtual cohort (n = 100 per arm) and is not expected to match patient-by-patient; the published medians are over small per-arm cohorts (D-Kd single dose n = 8-10; split-dose cohorts n = 14-75). Differences within +/- 30 percent indicate the structural model is reproducing the published exposure pattern; the C2D1 postinfusion peak is the most volatile point because it is most sensitive to body weight and to the timing of the second infusion."
)
Published (Xu 2020 Table 2) vs simulated median daratumumab concentrations at key MMY1001 sampling time points. The simulation uses a virtual cohort (n = 100 per arm) and is not expected to match patient-by-patient; the published medians are over small per-arm cohorts (D-Kd single dose n = 8-10; split-dose cohorts n = 14-75). Differences within +/- 30 percent indicate the structural model is reproducing the published exposure pattern; the C2D1 postinfusion peak is the most volatile point because it is most sensitive to body weight and to the timing of the second infusion.
timepoint time_hr regimen pub_median pub_low pub_high sim_median sim_low sim_high pct_diff
C1D1 postinfusion 7.0 Single first dose 319.2 237.5 394.7 259.7 170.5 398.3 -18.6
C1D1 postinfusion 7.0 Split first dose 156.7 82.5 345.0 128.1 78.2 197.9 -18.3
C1D2 postinfusion 28.3 Split first dose 256.8 125.8 435.5 199.1 131.2 298.1 -22.5
C2D1 postinfusion 675.4 Single first dose 726.6 523.1 911.6 472.9 233.2 817.6 -34.9
C2D1 postinfusion 675.4 Split first dose 688.9 0.0 1202.4 474.2 225.4 753.2 -31.2
C3D1 preinfusion 1343.9 Single first dose 463.2 355.9 792.9 536.5 229.9 977.0 15.8
C3D1 preinfusion 1343.9 Split first dose 639.2 57.7 1110.7 531.4 229.5 990.1 -16.9
C4D1 preinfusion 2015.9 Single first dose 509.1 291.2 743.5 438.8 135.5 1004.6 -13.8
C4D1 preinfusion 2015.9 Split first dose 523.0 92.3 1019.3 439.1 142.1 996.3 -16.0

Assumptions and deviations

  • Virtual cohort. Individual patient covariates from the MMY1001 PK-evaluable population are not publicly available. The cohort above draws WT N(72, 15) kg and ALB N(37, 4) g/L, ~46% female, and 55% IgG MM / 45% non-IgG MM. These distributions are consistent with Xu 2020 Table 1 (D-Kd median 70.0 kg; D-KRd median 79.9 kg) and Fau 2020 Table S2 but are not the actual MMY1001 patients.
  • Infusion duration. Xu 2020 reports median durations of 7.0 h (first infusion), 4.3 h (second), and 3.4 h (subsequent). The vignette uses those three values; in practice the durations varied between patients and across cycles.
  • Time-varying Vmax equation. The supplement defines KDES as the “first-order rate for decrease of Vmax”. This is the only mathematically natural reading of “first-order rate of decrease,” and we encode it as Vmax(t) = Vmax(0) * exp(-KDES * t). The paper credits the structural form to a referenced prior publication (Xu 2020 Methods, reference 25) which is not on disk; the parameter values used here are exclusively from Xu 2020 Online Resource 6.
  • Residual error. Xu 2020 reports “Additive error term on the log-scale 13.8% CV”. An additive error on the log-transformed observation in NONMEM is equivalent to a proportional error in linear space; we encode it as propSd = 0.138.
  • Albumin units. The Online Resource 6 footnote uses ALB reference 37.0 without an explicit unit. A value of 37 is consistent with g/L (typical adult median 35-50 g/L); g/dL would yield a reference of ~3.7. The model records ALB in g/L.
  • MM_NIGG reference orientation. The canonical MM_NIGG covariate (inst/references/covariate-columns.md) takes 1 = non-IgG MM and 0 = IgG MM, with a recommended reference category of 0 (IgG MM). Xu 2020 parameterises the linear-CL effect with non-IgG MM as the reference and IgG MM as the 80.6% additive shift. The model preserves the canonical column semantics and applies the shift as (1 + e_igg_cl * (1 - MM_NIGG)), faithful to the paper’s Online Resource 6 footnote equation TPMMCL = 1 (non-IgG) or 1+0.806 (IgG).
  • Errata. No erratum or correction notice was located on disk; the source files comprise the main PMC XML plus the docx supplement. If a later correction adjusts an Online Resource 6 value, the affected ini() entry should be updated and the citation extended.