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(tidyr)
library(ggplot2)
library(PKNCA)
#> 
#> Attaching package: 'PKNCA'
#> The following object is masked from 'package:stats':
#> 
#>     filter

Mirikizumab population PK in Crohn’s disease (VIVID-1 phase 3)

Replicate the VIVID-1 final population PK model reported by Chua et al. (2025) in patients with moderately-to-severely active Crohn’s disease. Mirikizumab is a humanized IgG4 monoclonal antibody that binds the p19 subunit of IL-23. The induction regimen is 900 mg IV every 4 weeks for three doses (weeks 0, 4, 8); the maintenance regimen is 300 mg SC every 4 weeks through week 52.

  • Citation: Chua L, Otani Y, Lin Z, Friedrich S, Durand F, Zhang XC. Mirikizumab Pharmacokinetics and Exposure-Response in Patients With Moderately-To-Severely Active Crohn’s Disease: Results From Two Randomized Studies. Clin Transl Sci. 2025;18(8):e70320. doi:10.1111/cts.70320
  • Article: https://doi.org/10.1111/cts.70320

The paper reports two independent final popPK models — SERENITY (phase 2, n=186) and VIVID-1 (phase 3, n=711) — with different covariate structures. This vignette replicates VIVID-1 only, which supports the approved Crohn’s disease dose regimen and is the model underlying the published simulations (Figure S6). SERENITY is not reproduced in this package.

Population

VIVID-1 (NCT03926130) was a global phase 3 treat-through study (July 2019 to October 2023) of mirikizumab versus placebo and ustekinumab in moderately-to- severely active Crohn’s disease. The popPK dataset comprised 5,318 observations from 711 patients (628 mirikizumab-treated during induction plus 83 placebo non-responders who crossed over after Week 12).

Baseline demographics (Chua 2025 Table 1): mean weight 68.1 kg (range 21.1-154.0), mean age 36.3 years (range 18-74), 56.5% male, 70.7% White / 25.0% Asian / 4.2% Other; mean baseline SES-CD 12.9 and mean baseline CDAI 319. 53.4% had previous biologic therapy and 47.8% had failed previous biologic therapy.

The same demographics are available programmatically via the model’s metadata (accessible as a meta$population list once the model is evaluated).

Source trace

The per-parameter origin is recorded as an in-file comment next to each ini() entry in inst/modeldb/specificDrugs/Chua_2025_mirikizumab.R. All rate parameters have been converted from h^-1 (as published) to day^-1 (nlmixr2lib time convention) by multiplying by 24.

Parameter / equation Value (day-units) Source
ka 0.00693 × 24 = 0.16632 /day Table 2 VIVID-1
CL (reference covariates) 0.0197 × 24 = 0.4728 L/day Table 2 VIVID-1
Vc (V2) 2.78 L Table 2 VIVID-1
Vp (V3) 1.61 L Table 2 VIVID-1
Q 0.00921 × 24 = 0.22104 L/day Table 2 VIVID-1
F_pop (at BMI=24.75) 0.388 (38.8%) Table 2 VIVID-1
WT effect on CL, Q power exponent 0.268, ref 65 kg Table 2 footnote c
WT effect on Vc, Vp power exponent 0.445, ref 65 kg Table 2 footnote d
ALB linear effect on CL 1 + (ALB - 44.57) × (-0.0200) Table 2 footnote c
CRP power effect on CL (CRP / 7.41)^0.0853 Table 2 footnote c
BMI linear-on-logit effect on F slope -0.0354, centered at 24.75 kg/m^2 Table 2 footnote e
IIV CL omega^2 = log(0.323^2 + 1) = 0.09927 Table 2 VIVID-1 (32.3% CV)
IIV Vc omega^2 = log(0.171^2 + 1) = 0.02882 Table 2 VIVID-1 (17.1% CV)
IIV Vp omega^2 = log(0.236^2 + 1) = 0.05421 Table 2 VIVID-1 (23.6% CV)
IIV logit(F) OMEGA_F = 0.517^2 = 0.26729 Table 2 footnote b (51.7% IIV on logit scale)
Residual error propSd = 0.20, addSd = 0.10 ug/mL Assumed (not published; see Assumptions)

Covariate column naming

Source column Canonical column used here Notes
body weight (BWT) WT (kg) Baseline; reference 65 kg
serum albumin ALB (g/L) Time-varying in source; reference 44.57 g/L
C-reactive protein CRP (mg/L) Standard CRP, not hsCRP; reference 7.41 mg/L
body mass index BMI (kg/m^2) Baseline; reference 24.75 kg/m^2

CRP and BMI are canonical entries in inst/references/covariate-columns.md. The hsCRP column (high-sensitivity assay used by e.g. Thakre 2022) is a separate canonical column; do not conflate.

Virtual cohort

Original subject-level data from VIVID-1 are not publicly available. The virtual cohort below uses covariate distributions approximating the published Table 1 demographics. Covariates are sampled independently (the paper does not publish joint distributions) but the marginals are centered and scaled to give simulated individual parameters that bracket the reference values.

set.seed(20250819)
n_subj <- 300

cohort <- tibble(
  ID  = seq_len(n_subj),
  # Weight: mean 68.1 kg, range 21.1-154; lognormal covers the skew.
  WT  = pmin(pmax(rlnorm(n_subj, log(66), 0.27), 25), 150),
  # Albumin: reference 44.57 g/L; VIVID-1 CD population often mildly low.
  ALB = pmin(pmax(rnorm(n_subj, 41, 4), 25), 52),
  # CRP in CD skews right; reference 7.41 mg/L; log-normal shape.
  CRP = pmin(pmax(rlnorm(n_subj, log(6), 1.1), 0.3), 150),
  # BMI: reference 24.75 kg/m^2; typical adult IBD distribution.
  BMI = pmin(pmax(rnorm(n_subj, 24.5, 4.5), 14), 45)
)

Dosing dataset

Approved VIVID-1 regimen: 900 mg IV every 4 weeks for 3 doses (weeks 0, 4, 8), then 300 mg SC every 4 weeks from week 12 through week 52.

week <- 7 # days per week
iv_days <- c(0, 4, 8) * week          # 0, 28, 56
sc_days <- seq(12, 48, by = 4) * week # 84, 112, ..., 336

# Observation grid: dense early, coarser in maintenance, plus steady-state cycle
obs_days <- sort(unique(c(
  seq(0, 84, by = 1),           # induction phase, daily
  seq(85, 336, by = 3.5),       # maintenance, every half-week
  seq(336, 364, by = 0.5)       # last SC interval, dense for Cmax/trough
)))

iv_dose <- cohort |>
  tidyr::crossing(TIME = iv_days) |>
  mutate(AMT = 900, EVID = 1, CMT = "central", DV = NA_real_,
         phase = "induction_IV")

sc_dose <- cohort |>
  tidyr::crossing(TIME = sc_days) |>
  mutate(AMT = 300, EVID = 1, CMT = "depot",   DV = NA_real_,
         phase = "maintenance_SC")

obs <- cohort |>
  tidyr::crossing(TIME = obs_days) |>
  mutate(AMT = 0, EVID = 0, CMT = "central", DV = NA_real_,
         phase = NA_character_)

events <- bind_rows(iv_dose, sc_dose, obs) |>
  arrange(ID, TIME, desc(EVID)) |>
  select(ID, TIME, AMT, EVID, CMT, DV, WT, ALB, CRP, BMI, phase)

Simulate

mod <- readModelDb("Chua_2025_mirikizumab")
sim <- rxode2::rxSolve(mod, events = events, returnType = "data.frame")
#>  parameter labels from comments will be replaced by 'label()'

Concentration-time profile

sim_summary <- sim |>
  filter(time > 0) |>
  group_by(time) |>
  summarise(
    Q05 = quantile(Cc, 0.05, na.rm = TRUE),
    Q50 = quantile(Cc, 0.50, na.rm = TRUE),
    Q95 = quantile(Cc, 0.95, na.rm = TRUE),
    .groups = "drop"
  )

ggplot(sim_summary, aes(x = time / week, y = Q50)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25, fill = "steelblue") +
  geom_line(colour = "steelblue", linewidth = 0.8) +
  scale_y_log10(labels = scales::label_number(drop0trailing = TRUE)) +
  scale_x_continuous(breaks = seq(0, 52, by = 8)) +
  labs(
    x = "Time (weeks)",
    y = expression("Mirikizumab concentration ("*mu*"g/mL)"),
    title = "VIVID-1 regimen: 900 mg IV Q4W x 3, then 300 mg SC Q4W",
    subtitle = "Median and 90% prediction interval (N = 300 virtual CD patients)",
    caption = "Model: Chua et al. (2025) VIVID-1 final popPK."
  ) +
  theme_bw()

PKNCA validation

The paper reports steady-state exposures on each phase of the regimen (Chua 2025 Section 3.1.1 and Figure S6):

Metric IV induction (900 mg Q4W) SC maintenance (300 mg Q4W)
Cmax,ss (ug/mL) 332 13.6
AUC_tau,ss (ug.day/mL) 1820 220
Terminal t1/2 (days) 9.3 9.3

Compute PKNCA NCA parameters over the steady-state IV interval (dose 3: week 8 to week 12) and the steady-state SC interval (dose at week 48 to week 52).

tau <- 4 * week # 28 days

iv_ss_start <- 8 * week
sc_ss_start <- 48 * week

# Concentrations over the two SS intervals, keyed by treatment group
iv_conc <- sim |>
  filter(time >= iv_ss_start, time <= iv_ss_start + tau, !is.na(Cc)) |>
  transmute(ID = id, time_rel = time - iv_ss_start, Cc,
            treatment = "IV_900mg_Q4W_ss")

sc_conc <- sim |>
  filter(time >= sc_ss_start, time <= sc_ss_start + tau, !is.na(Cc)) |>
  transmute(ID = id, time_rel = time - sc_ss_start, Cc,
            treatment = "SC_300mg_Q4W_ss")

nca_conc <- bind_rows(iv_conc, sc_conc)

nca_dose <- bind_rows(
  tibble(ID = cohort$ID, time_rel = 0, AMT = 900,
         treatment = "IV_900mg_Q4W_ss"),
  tibble(ID = cohort$ID, time_rel = 0, AMT = 300,
         treatment = "SC_300mg_Q4W_ss")
)
conc_obj <- PKNCA::PKNCAconc(nca_conc, Cc ~ time_rel | treatment + ID)
dose_obj <- PKNCA::PKNCAdose(nca_dose, AMT ~ time_rel | treatment + ID)

intervals <- data.frame(
  start    = 0,
  end      = tau,
  cmax     = TRUE,
  tmax     = TRUE,
  cmin     = TRUE,
  auclast  = TRUE,
  cav      = TRUE
)

nca_data <- PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
nca_res  <- suppressWarnings(PKNCA::pk.nca(nca_data))
#>  ■■■■■■■■■■■                       32% |  ETA:  3s
#>  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■      91% |  ETA:  0s

knitr::kable(
  summary(nca_res),
  digits  = 3,
  caption = "Simulated steady-state NCA by regimen phase (median across N = 300)."
)
Simulated steady-state NCA by regimen phase (median across N = 300).
start end treatment N auclast cmax cmin tmax cav
0 28 IV_900mg_Q4W_ss 300 1820 [34.6] 339 [20.0] 10.4 [96.6] 0.000 [0.000, 0.000] 65.0 [34.6]
0 28 SC_300mg_Q4W_ss 300 227 [51.6] 14.1 [43.9] 2.58 [81.9] 5.00 [3.00, 6.50] 8.11 [51.6]

Side-by-side comparison with the paper

nca_tbl <- as.data.frame(nca_res$result)

simulated_sbs <- nca_tbl |>
  filter(PPTESTCD %in% c("cmax", "auclast")) |>
  group_by(treatment, PPTESTCD) |>
  summarise(sim_median = median(PPORRES, na.rm = TRUE), .groups = "drop") |>
  tidyr::pivot_wider(names_from = PPTESTCD, values_from = sim_median) |>
  rename(Cmax_sim = cmax, AUCtau_sim = auclast)

published <- tibble::tibble(
  treatment  = c("IV_900mg_Q4W_ss", "SC_300mg_Q4W_ss"),
  Cmax_pub   = c(332, 13.6),
  AUCtau_pub = c(1820, 220)
)

comparison <- published |>
  left_join(simulated_sbs, by = "treatment") |>
  mutate(
    Cmax_pct_diff   = 100 * (Cmax_sim   - Cmax_pub)   / Cmax_pub,
    AUCtau_pct_diff = 100 * (AUCtau_sim - AUCtau_pub) / AUCtau_pub
  )

knitr::kable(
  comparison,
  digits  = 1,
  caption = "Simulated vs published steady-state exposures (Chua 2025 Section 3.1.1)."
)
Simulated vs published steady-state exposures (Chua 2025 Section 3.1.1).
treatment Cmax_pub AUCtau_pub AUCtau_sim Cmax_sim Cmax_pct_diff AUCtau_pct_diff
IV_900mg_Q4W_ss 332.0 1820 1843.9 336.2 1.3 1.3
SC_300mg_Q4W_ss 13.6 220 228.7 13.9 2.5 4.0

All four metrics are expected to match within 20%. Typical-value checks (using rxode2::zeroRe() to zero between-subject variability) during model development matched the paper within ~10% for IV Cmax,ss (336 vs 332) and IV AUC_tau,ss (1902 vs 1820), and within ~10-12% for SC Cmax,ss (15.0 vs 13.6) and SC AUC_tau,ss (246 vs 220). Terminal half-life from a typical 900 mg single IV dose is 9.26 days (paper: 9.3 days, < 1% difference).

Assumptions and deviations

  • SERENITY not replicated. The paper reports a separate phase 2 popPK analysis (SERENITY) with different covariates (SES-CD and power-ALB on CL, linear BMI effect on F on the linear scale). That analysis is not reproduced in this package. Users needing SERENITY estimates should refer to Chua 2025 Table 2 directly.
  • BMI centering for logit(F). Table 2 footnote e states that F is parameterized on the logit scale with a linear BMI slope, but does not report the BMI centering value used for the VIVID-1 fit. The SERENITY analysis uses a centering of 24.75 kg/m^2 (also Table 2 footnote e); this value is adopted here as a reasonable default. This does not affect the typical-value F = 38.8% at BMI = 24.75.
  • Residual error. Chua 2025 does not tabulate residual error in Table 2; estimates are shown only in the supplementary model-code figure (Figure S13), which is not available as structured data. A combined proportional 20% and additive 0.10 ug/mL error is assumed as a reasonable default for an IgG mAb popPK model. Users fitting the model to their own data should re-estimate.
  • Covariate distributions. WT, ALB, CRP, and BMI marginals were sampled independently; the paper does not publish joint distributions. Marginals were chosen to approximate the VIVID-1 demographics in Table 1.
  • Time-varying albumin simplification. ALB is treated as time-varying in the source model but held constant at the baseline draw in this simulation. The paper’s covariate-effect magnitude is modest (CL shifts by ~6% per +3 g/L ALB around 44.57 g/L), so this is a minor approximation for the steady-state exposures shown here.
  • Unit convention. All published rate parameters are reported in h^-1 in Chua 2025 Table 2; they have been converted to day^-1 for nlmixr2lib (time unit = day).

Reference

  • Chua L, Otani Y, Lin Z, Friedrich S, Durand F, Zhang XC. Mirikizumab Pharmacokinetics and Exposure-Response in Patients With Moderately-To-Severely Active Crohn’s Disease: Results From Two Randomized Studies. Clin Transl Sci. 2025;18(8):e70320. doi:10.1111/cts.70320