---
title: "Risankizumab (Suleiman 2018)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Risankizumab (Suleiman 2018)}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment  = "#>"
)
```

```{r setup}
library(nlmixr2lib)
library(rxode2)
library(dplyr)
library(tidyr)
library(ggplot2)
library(PKNCA)
```

# Risankizumab population PK in psoriasis and Crohn's disease (phase I-II)

Simulate risankizumab concentration-time profiles using the final
population PK model of Suleiman et al. (2018) from the pooled analysis
of one phase I study in psoriasis (Study 1, n=31), one phase II study
in psoriasis (Study 2, n=126), and one phase II study in Crohn's
disease (Study 3, n=115). The source paper pooled 2831 plasma
concentrations from 272 individuals across the three studies.

The model is a two-compartment structure with first-order subcutaneous
absorption and linear elimination (NONMEM `ADVAN4`). Typical parameters
for a 70 kg reference subject with baseline albumin 40 g/L (the overall
cohort median) are CL = 0.30 L/day, Vc = 5.66 L, Vp = 3.43 L,
Q = 0.33 L/day, ka = 0.18 /day, and F = 0.72. The final covariate set is
body weight on CL, Q, Vc, and Vp (two shared exponents: 0.93 for CL/Q
and 0.99 for Vc/Vp) and baseline serum albumin on CL (exponent -1.54).

* Citation: `r rxode2::rxode(readModelDb("Suleiman_2018_risankizumab"))$reference`
* Article: <https://doi.org/10.1007/s40262-018-0704-z>

## Source trace

Per-parameter origins are recorded as in-file comments in the model
file; the table below collects them in one place.

| Equation / parameter | Value | Source location |
| --- | --- | --- |
| Two-compartment ODE structure (ka -> central <-> peripheral1, linear CL) | n/a | Sect. 2.3.2 and 3.2 (NONMEM ADVAN4) |
| CL (typical, 70 kg, 40 g/L ALB) | 0.30 L/day | Table 3 |
| Vc (typical, 70 kg) | 5.66 L | Table 3 |
| Q (typical, 70 kg) | 0.33 L/day | Table 3 |
| Vp (typical, 70 kg) | 3.43 L | Table 3 |
| ka (typical) | 0.18 /day | Table 3 |
| F (SC absolute bioavailability) | 0.72 | Table 3 |
| WT on CL and Q (shared exponent) | (WT/70)^0.93 | Table 3; Eq. 3 |
| WT on Vc and Vp (shared exponent) | (WT/70)^0.99 | Table 3 |
| ALB on CL | (ALB/40)^-1.54 | Table 3; Eq. 4; ALB reference = overall Table 2 median 40 g/L |
| IIV CL | 37% CV -> omega^2 = log(1 + 0.37^2) = 0.12832 | Table 3 (footnote b conversion) |
| IIV Vc | 55% CV -> omega^2 = log(1 + 0.55^2) = 0.26432 | Table 3 |
| IIV Vp | 35% CV -> omega^2 = log(1 + 0.35^2) = 0.11556 | Table 3 |
| IIV ka | 80% CV -> omega^2 = log(1 + 0.80^2) = 0.49470 | Table 3 |
| IIV CL-Vc covariance | 0.07182 (correlation 39%) | Sibling Suleiman 2019 Table 3 (non-paper provenance; see Assumptions) |
| Residual error | proportional, propSd = 0.19 (19% CV) | Sibling Suleiman 2019 Table 3 (non-paper provenance; see Assumptions) |
| Dosing regimen (psoriasis phase III) | 150 mg SC weeks 0 and 4, then q12w | Sect. 2.3.4 |
| Dosing regimen (Crohn's phase II maintenance) | IV 600 mg weeks 0, 4, 8 induction, then SC 180 mg q8w | Sect. 2.3.4 |

## Covariate column naming

| Source column | Canonical column used here |
| --- | --- |
| `WT` (kg) | `WT` (kg; per `covariate-columns.md`) |
| `ALB` (g/L) | `ALB` (g/L; canonical general-scope) |

## Virtual population

Approximate the pooled Suleiman 2018 cohort (Table 2): median body
weight 79 kg (range 36-138), overall albumin median 40 g/L
(range 24-51). The paper simulates 100,000 virtual subjects per
indication; the vignette uses 500 for a fast render.

```{r virtual-pop}
set.seed(2018)
n_subj <- 500

pop <- tibble(
  ID  = seq_len(n_subj),
  WT  = pmin(pmax(rlnorm(n_subj, log(79), 0.26), 36), 138),  # kg
  ALB = pmin(pmax(rnorm(n_subj, 40, 4.5), 24), 51)           # g/L
)
```

## Dosing dataset

Psoriasis phase III regimen (Sect. 2.3.4): 150 mg SC at weeks 0 and 4,
then every 12 weeks (q12w) thereafter. Simulate through week 52.

```{r dosing}
dose_weeks <- c(0, 4, 16, 28, 40)
dose_times <- dose_weeks * 7

obs_times <- sort(unique(c(
  seq(0,  28,       by = 0.5),
  seq(28, 52 * 7,   by = 2)
)))

d_dose <- pop %>%
  crossing(TIME = dose_times) %>%
  mutate(AMT = 150, EVID = 1, CMT = 1, DV = NA_real_)

d_obs <- pop %>%
  crossing(TIME = obs_times) %>%
  mutate(AMT = NA_real_, EVID = 0, CMT = 2, DV = NA_real_)

d_sim <- bind_rows(d_dose, d_obs) %>%
  arrange(ID, TIME, desc(EVID)) %>%
  as.data.frame()
```

## Simulate

```{r simulate}
mod <- readModelDb("Suleiman_2018_risankizumab")
sim <- rxSolve(mod, d_sim, returnType = "data.frame")
```

## Concentration-time profile (replicates Fig. 2, Suleiman 2018)

```{r pk-plot, fig.width = 7, fig.height = 5}
sim_summary <- sim %>%
  filter(time > 0) %>%
  group_by(time) %>%
  summarise(
    median = median(Cc, na.rm = TRUE),
    lo     = quantile(Cc, 0.05, na.rm = TRUE),
    hi     = quantile(Cc, 0.95, na.rm = TRUE),
    .groups = "drop"
  )

ggplot(sim_summary, aes(x = time / 7)) +
  geom_ribbon(aes(ymin = lo, ymax = hi), alpha = 0.2, fill = "steelblue") +
  geom_line(aes(y = median), colour = "steelblue", linewidth = 1) +
  scale_y_log10() +
  labs(
    x        = "Time (weeks)",
    y        = "Risankizumab concentration (ug/mL)",
    title    = "Simulated risankizumab PK (150 mg SC weeks 0, 4, q12w)",
    subtitle = "Median and 90% prediction interval (N = 500 virtual pooled subjects)",
    caption  = "Replicates Fig. 2 of Suleiman 2018 (phase II psoriasis VPC layout)."
  ) +
  theme_bw()
```

## Typical-subject comparison against the published abstract

The Abstract gives typical values for two reference subjects (with
random effects zeroed): (a) 90 kg psoriasis patient, ALB 42 g/L ->
CL = 0.35 L/day, Vc = 7.26 L, Vp = 4.39 L, Vss = 11.7 L, terminal
half-life ~27 days; (b) 65 kg Crohn's patient, ALB 37 g/L ->
CL = 0.31 L/day, Vc = 5.26 L, Vp = 3.19 L, Vss = 8.45 L, terminal
half-life ~22 days. Reproduce these using the packaged model:

```{r typical-subject}
mod_typ <- rxode2::zeroRe(mod)

typ_scenarios <- tribble(
  ~scenario,           ~WT, ~ALB, ~paper_CL, ~paper_Vc, ~paper_Vp, ~paper_Vss, ~paper_thalf,
  "90 kg psoriasis",    90,   42,      0.35,      7.26,      4.39,       11.7,           27,
  "65 kg Crohn's",      65,   37,      0.31,      5.26,      3.19,       8.45,           22
)

# Closed-form typical values from the model equations.
lam_terminal <- function(kel, q, vc, vp) {
  k12 <- q / vc
  k21 <- q / vp
  s   <- kel + k12 + k21
  (s - sqrt(s^2 - 4 * kel * k21)) / 2
}

typ_calc <- typ_scenarios %>%
  rowwise() %>%
  mutate(
    calc_CL = 0.30 * (WT / 70)^0.93 * (ALB / 40)^(-1.54),
    calc_Vc = 5.66 * (WT / 70)^0.99,
    calc_Vp = 3.43 * (WT / 70)^0.99,
    calc_Q  = 0.33 * (WT / 70)^0.93,
    calc_Vss = calc_Vc + calc_Vp,
    calc_kel = calc_CL / calc_Vc,
    calc_thalf = log(2) / lam_terminal(calc_kel, calc_Q, calc_Vc, calc_Vp)
  ) %>%
  ungroup()

knitr::kable(
  typ_calc %>%
    transmute(
      scenario,
      `CL (paper / calc)`   = sprintf("%.2f / %.3f", paper_CL,   calc_CL),
      `Vc (paper / calc)`   = sprintf("%.2f / %.2f", paper_Vc,   calc_Vc),
      `Vp (paper / calc)`   = sprintf("%.2f / %.2f", paper_Vp,   calc_Vp),
      `Vss (paper / calc)`  = sprintf("%.2f / %.2f", paper_Vss,  calc_Vss),
      `t1/2 (paper / calc, days)` = sprintf("%.1f / %.1f", paper_thalf, calc_thalf)
    ),
  caption = "Suleiman 2018 typical-subject reference cases (Abstract vs closed-form derivation from the packaged model)."
)
```

## PKNCA validation

Run PKNCA on a steady-state 12-week maintenance interval of the
psoriasis phase III regimen (weeks 16-28). The paper's Abstract
reports steady-state AUC(weeks 40-52) = 344 +/- 151 ug*day/mL for the
psoriasis regimen; PKNCA on the 500-subject virtual cohort should be
in a comparable range.

```{r nca}
nca_conc <- sim %>%
  filter(time >= 16 * 7, time <= 28 * 7) %>%
  mutate(
    time_rel  = time - 16 * 7,
    treatment = "risankizumab_150mg_q12w"
  ) %>%
  rename(ID = id) %>%
  select(ID, time_rel, Cc, treatment)

nca_dose <- pop %>%
  mutate(
    time_rel  = 0,
    AMT       = 150,
    treatment = "risankizumab_150mg_q12w"
  ) %>%
  select(ID, time_rel, AMT, treatment)

conc_obj <- PKNCAconc(nca_conc, Cc ~ time_rel | treatment + ID)
dose_obj <- PKNCAdose(nca_dose, AMT ~ time_rel | treatment + ID)
data_obj <- PKNCAdata(
  conc_obj,
  dose_obj,
  intervals = data.frame(
    start     = 0,
    end       = 12 * 7,
    cmax      = TRUE,
    tmax      = TRUE,
    auclast   = TRUE,
    half.life = TRUE
  )
)
nca_results <- pk.nca(data_obj)
nca_summary <- summary(nca_results)
knitr::kable(
  nca_summary,
  digits  = 2,
  caption = "PKNCA summary for the steady-state maintenance interval (weeks 16-28) of the psoriasis phase III 150 mg SC q12w regimen."
)
```

## Weight-effect sensitivity (replicates Fig. 4, Suleiman 2018)

Suleiman 2018 Fig. 4 shows the exposure ratio vs a reference subject
across body weight and albumin strata. Reproduce the body-weight arm
by simulating typical subjects at 60, 79 (cohort median), and 100 kg
with ALB fixed at the cohort median.

```{r wt-sensitivity, fig.width = 7, fig.height = 4}
wt_grid <- c(60, 79, 100)

wt_scenarios <- tibble(WT = wt_grid, ALB = 40)

wt_typ <- wt_scenarios %>%
  rowwise() %>%
  do({
    row <- .
    typ_pop <- tibble(ID = 1L, WT = row$WT, ALB = row$ALB)
    events <- bind_rows(
      typ_pop %>% crossing(TIME = dose_times) %>%
        mutate(AMT = 150, EVID = 1, CMT = 1, DV = NA_real_),
      typ_pop %>% crossing(TIME = obs_times) %>%
        mutate(AMT = NA_real_, EVID = 0, CMT = 2, DV = NA_real_)
    ) %>%
      arrange(TIME, desc(EVID)) %>%
      as.data.frame()
    df <- rxSolve(mod_typ, events, returnType = "data.frame") %>%
      filter(time >= 16 * 7, time <= 28 * 7, Cc > 0) %>%
      arrange(time)
    auctau <- sum(diff(df$time) * (head(df$Cc, -1) + tail(df$Cc, -1)) / 2)
    tibble(WT = row$WT, ALB = row$ALB, AUCtau = auctau)
  }) %>%
  bind_rows()

ref_auc <- wt_typ$AUCtau[wt_typ$WT == 79]

wt_typ <- wt_typ %>%
  mutate(ratio = AUCtau / ref_auc)

knitr::kable(
  wt_typ,
  digits  = 2,
  caption = "Typical-subject AUCtau (weeks 16-28) vs body weight; ratios relative to the cohort-median 79 kg subject. Consistent with Fig. 4 of Suleiman 2018 which shows heavier subjects (>100 kg) exposed to ~25% lower AUC."
)
```

## Assumptions and deviations

- **Reference albumin 40 g/L (non-paper-explicit).** Suleiman 2018
  Eq. 4 (`(cov / median)^theta`) is defined in terms of the covariate's
  median, but Table 3 does not print the reference value used. The
  overall Table 2 median (40 g/L) was verified by back-calculating the
  paper's typical-subject CL: 0.30 * (90/70)^0.93 * (42/40)^-1.54 =
  0.351 L/day matches the Abstract's 0.35 L/day for a typical 90 kg
  psoriasis subject with ALB 42 g/L, and 0.30 * (65/70)^0.93 *
  (37/40)^-1.54 = 0.314 L/day matches 0.31 L/day for a 65 kg Crohn's
  subject with ALB 37 g/L.

- **Proportional residual error (propSd = 0.19) is non-paper
  provenance.** Suleiman 2018 Sect. 3.2 states "Residual variability
  was best described by a proportional error model" but Table 3 does
  not report the magnitude; the value is expected to be in the paper's
  Electronic Supplementary Material, which was not on disk during
  extraction. The packaged value 0.19 is carried from the sibling
  `Suleiman_2019_risankizumab` model in the same registry: same first
  author (Suleiman AA) and same authorship group (Khatri, Minocha,
  Othman), same drug, and the 2018 phase I-II cohort is a strict
  subset of the 2019 integrated phase I-III cohort used to fit the
  2019 model. This substitution was authorised via sidecar
  requests 001/002 (option C).

- **CL-Vc covariance (0.07182, correlation 39%) is non-paper
  provenance.** Suleiman 2018 Sect. 3.2 states "introducing a
  correlation between CL and Vc reduced the OFV by 135 points" but
  Table 3 reports only IIV variances, not the off-diagonal. The
  correlation is expected to be in the unavailable ESM. The packaged
  correlation (39%) is carried from `Suleiman_2019_risankizumab`
  Table 3 under the same sibling-substitution reasoning above;
  covariance = 0.39 * sqrt(0.12832 * 0.26432) = 0.07182 given the
  2018 IIV variances.

- **Virtual population approximates the pooled Table 2 demographics.**
  Suleiman 2018 does not publish individual-level data. Body weight
  is sampled log-normal around the pooled 79 kg median with SD 0.26
  on the log scale (clipped to the observed 36-138 kg range).
  Albumin is sampled normally around the pooled 40 g/L median with
  SD 4.5 (clipped to the observed 24-51 g/L range). No correlation
  between WT and ALB is imposed; the paper does not report the joint
  distribution.

- **Disease population (psoriasis vs Crohn's) is not a model
  covariate.** The paper explicitly finds no residual pharmacokinetic
  difference between psoriasis and Crohn's disease after accounting
  for body weight and albumin (Abstract, Conclusions), so the
  packaged model does not carry an indication indicator.

- **Sex, age, race, C-reactive protein, ALT, AST, serum creatinine,
  creatinine clearance, and ADA / NAb status** were evaluated in the
  paper (Sect. 2.3.2) but were not retained in the final model and
  are not part of the packaged model.

- **Time-varying ADA covariate.** Suleiman 2018 tested ADA status as
  binary, ADA titer as continuous, and time-varying LOCF-imputed
  binary; none were retained. The later Suleiman 2019 paper
  (`Suleiman_2019_risankizumab`) does carry an ADA titer threshold
  effect (>= 128 -> +43% CL) which was estimated from a much larger
  ADA-positive subgroup in phase III. Users wanting an ADA-sensitive
  risankizumab model should use the 2019 sibling.

## Reference

* `r rxode2::rxode(readModelDb("Suleiman_2018_risankizumab"))$reference`
