---
title: "Anrukinzumab (Hua 2015)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Anrukinzumab (Hua 2015)}
  %\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)
```

# Model and source

* Citation: Hua F, Ribbing J, Reinisch W, Cataldi F, Martin S. A
  pharmacokinetic comparison of anrukinzumab, an anti-IL-13 monoclonal
  antibody, among healthy volunteers, asthma and ulcerative colitis
  patients. Br J Clin Pharmacol. 2015;80(1):101-109.
* Article: [doi:10.1111/bcp.12589](https://doi.org/10.1111/bcp.12589)
* Publicly available full text:
  <https://bpspubs.onlinelibrary.wiley.com/doi/10.1111/bcp.12589>

Anrukinzumab (IMA-638) is a humanized IgG1 anti-IL-13 monoclonal
antibody. Hua et al. pooled PK data from five clinical studies (N = 255)
across four populations — healthy volunteers, mild-to-moderate asthma,
moderate-to-severe asthma, and ulcerative colitis (UC) — to identify
disease and demographic covariates on mAb PK parameters. The final model
is a two-compartment structure with first-order SC absorption and linear
elimination, with body weight and baseline albumin as demographic
covariates and UC disease status (on CL) and moderate-to-severe asthma
status (on SC bioavailability F) as disease-state covariates.

# Population

Hua 2015 Table 2 summarises the pooled cohort of 255 subjects across all
5 studies:

* **Sex:** 65% male, 35% female.
* **Race:** 73% White, 12% Black, 12% Asian, 3% Other.
* **Age:** median 37 years (mean 38, SD 13).
* **Body weight:** median 81.3 kg (mean 82.6, SD 18.7).
* **Disease state:** healthy volunteers 17%, mild-to-moderate asthma
  20%, moderate-to-severe asthma 38%, ulcerative colitis 25%.
* **Dosing route:** SC 72%, IV 28%.

Per-study design (Hua 2015 Table 1):

| # | Population | n | Dosing |
| - | ---------- | - | ------ |
| 1 | Mild-to-moderate asthma          | 37 | 3 mg/kg IV + 0.3-4 mg/kg SC single dose |
| 2 | Healthy Japanese and non-Asian   | 44 | 0.3-4 mg/kg SC single dose |
| 3 | Allergen challenge, mild asthma  | 14 | 2 mg/kg SC x 2 doses, 1 week apart |
| 4 | Moderate-to-severe asthma        | 97 | 0.2, 0.6, 2 mg/kg SC or 200 mg SC Q2-4W |
| 5 | Ulcerative colitis               | 63 | 200, 400, 600 mg IV Q2-4W x 5 doses |

The same information is available programmatically via
`readModelDb("Hua_2015_anrukinzumab")$population`.

# Source trace

The per-parameter origin is recorded next to each `ini()` entry in
`inst/modeldb/specificDrugs/Hua_2015_anrukinzumab.R`. The table below
collects them in one place for review.

| Element | Source | Value / form |
| ------- | ------ | ------------ |
| CL      | Hua 2015 Table 3 (Final model) | 0.00732 L/h (75-kg non-UC, ALB 4.3 g/dL) |
| Vc      | Table 3 | 3.81 L |
| Vp      | Table 3 | 2.17 L |
| Q       | Table 3 | 0.0224 L/h |
| Ka      | Table 3 | 0.0119 /h |
| F       | Table 3 | 0.973 (non-moderate-to-severe-asthma) |
| WT on CL  | Table 3 | Allometric power, exponent fixed at 0.75: `(WT/75)^0.75` |
| WT on Vc, Vp | Table 3 | Allometric power, estimated shared exponent 0.688: `(WT/75)^0.688` |
| ALB on CL | Table 3 | Power form, `(ALB/4.3)^(-1.07)` |
| UC on CL  | Table 3 | Multiplicative fractional, `(1 + 0.728 * DIS_UC)` |
| Moderate-to-severe asthma on F | Table 3 | Multiplicative fractional, `(1 + (-0.309) * DIS_SASTHMA)` |
| IIV CL      | Table 3 | CV 31.6% (omega^2 = log(1 + 0.316^2) = 0.0952) |
| IIV Vc, Vp (shared eta) | Table 3 | CV 26.5% (omega^2 = 0.0679) |
| IIV Ka      | Table 3 | CV 54.0% (omega^2 = 0.2560) |
| Corr(CL, V) | Table 3 | 0.727 |
| Residual    | Table 3 | 23.5% proportional (additive on log-transformed data) |

# Covariate column naming

| Source column | Canonical column used here |
| ------------- | --------------------------- |
| `WT` | `WT` |
| `ALB` (g/dL, per Figure 1 axis) | `ALB` |
| `UC` (binary UC indicator) | `DIS_UC` |
| `sAsthma` (binary moderate-to-severe asthma indicator) | `DIS_SASTHMA` |

`DIS_UC` and `DIS_SASTHMA` were newly ratified in
`inst/references/covariate-columns.md` (2026-04-21) as scope-specific
binary indicators decomposed from the paper's four-level disease-state
categorical (healthy volunteer, mild-to-moderate asthma,
moderate-to-severe asthma, UC).

# Virtual population

Original per-subject data are not publicly available. The virtual
population below approximates the pooled Table 2 demographics and the
Table 1 disease-state mixture.

```{r virtual-pop}
set.seed(2015)
n_subj <- 400

pop <- tibble(
  ID  = seq_len(n_subj),
  WT  = rlnorm(n_subj, log(81.3), 0.22),               # median 81.3, SD ~20
  ALB = pmax(28, pmin(rnorm(n_subj, 43, 4), 55))  # mean 43, SD 4 g/dL
)

# Disease-state assignment matching Hua 2015 Table 2 proportions.
pop$disease <- sample(
  c("HV", "mild_moderate_asthma", "moderate_severe_asthma", "UC"),
  size    = n_subj,
  replace = TRUE,
  prob    = c(0.17, 0.20, 0.38, 0.25)
)
pop$DIS_UC      <- as.integer(pop$disease == "UC")
pop$DIS_SASTHMA <- as.integer(pop$disease == "moderate_severe_asthma")
```

# Simulation setup: single SC dose (healthy + asthma cohort)

Replicates the profile shape of Hua 2015 Figure 4E-F (single-dose SC in
healthy volunteers and mild-to-moderate asthma) and Figure 4D (single
0.6 mg/kg SC in moderate-to-severe asthma).

```{r single-sc}
pop_sc <- pop %>% filter(disease != "UC")

dose_sc <- pop_sc %>%
  mutate(
    TIME = 0,
    AMT  = round(2 * WT, 1),   # 2 mg/kg SC, consistent with study 1 and 3
    EVID = 1,
    CMT  = "depot",
    DV   = NA_real_
  ) %>%
  select(ID, TIME, AMT, EVID, CMT, DV, WT, ALB, DIS_UC, DIS_SASTHMA, disease)

obs_times_sc <- sort(unique(c(
  seq(0, 24, by = 3),
  seq(24, 24 * 7, by = 12),
  seq(24 * 7, 24 * 56, by = 24)
)))

obs_sc <- pop_sc %>%
  crossing(TIME = obs_times_sc) %>%
  mutate(
    AMT  = NA_real_,
    EVID = 0,
    CMT  = "central",
    DV   = NA_real_
  ) %>%
  select(ID, TIME, AMT, EVID, CMT, DV, WT, ALB, DIS_UC, DIS_SASTHMA, disease)

d_sc <- bind_rows(dose_sc, obs_sc) %>%
  arrange(ID, TIME, desc(EVID))
```

```{r simulate-sc}
mod <- readModelDb("Hua_2015_anrukinzumab")
sim_sc <- rxSolve(mod, d_sc, keep = "disease", returnType = "data.frame")
```

## Replicates Figure 4 (SC single-dose shape)

```{r fig-4-sc, fig.width = 7, fig.height = 5}
sim_sc %>%
  filter(time > 0) %>%
  mutate(week = time / (24 * 7)) %>%
  group_by(week, disease) %>%
  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(aes(x = week, color = disease, fill = disease)) +
  geom_ribbon(aes(ymin = lo, ymax = hi), alpha = 0.15, linetype = 0) +
  geom_line(aes(y = median), linewidth = 0.9) +
  scale_y_log10() +
  labs(
    x = "Time since dose (weeks)",
    y = "Anrukinzumab concentration (ng/mL)",
    title = "Simulated 2 mg/kg SC single dose, stratified by disease state",
    subtitle = "Median and 90% prediction interval; replicates the profile shape of Hua 2015 Fig. 4E,F,D",
    caption = "Reduced F in moderate-to-severe asthma depresses exposure at matched dose."
  ) +
  theme_bw()
```

# Simulation setup: 200 mg IV repeat dosing (UC vs matched non-UC)

Replicates Figure 5 of Hua 2015: five 200 mg IV doses on day 0, weeks 2,
4, 8, and 12, comparing UC patients to covariate-matched non-UC
subjects. The paper holds WT and ALB distributions matched so that the
only difference is UC disease status; we do the same here.

```{r iv-events}
n_iv <- 100

pop_uc <- tibble(
  ID  = seq_len(n_iv),
  WT  = rlnorm(n_iv, log(75), 0.18),
  ALB = pmax(28, pmin(rnorm(n_iv, 43, 3), 55))
) %>%
  crossing(group = c("non-UC", "UC")) %>%
  mutate(
    ID          = (as.integer(factor(group)) - 1L) * n_iv + ID,
    DIS_UC      = as.integer(group == "UC"),
    DIS_SASTHMA = 0L
  )

dose_weeks_iv <- c(0, 2, 4, 8, 12)
dose_times_iv <- dose_weeks_iv * 7 * 24  # hours

dose_iv <- pop_uc %>%
  crossing(TIME = dose_times_iv) %>%
  mutate(
    AMT  = 200,        # 200 mg IV
    EVID = 1,
    CMT  = "central",
    DV   = NA_real_
  ) %>%
  select(ID, TIME, AMT, EVID, CMT, DV, WT, ALB, DIS_UC, DIS_SASTHMA, group)

obs_times_iv <- sort(unique(c(
  seq(0, 24, by = 4),
  seq(24, 24 * 7 * 16, by = 24)
)))

obs_iv <- pop_uc %>%
  crossing(TIME = obs_times_iv) %>%
  mutate(
    AMT  = NA_real_,
    EVID = 0,
    CMT  = "central",
    DV   = NA_real_
  ) %>%
  select(ID, TIME, AMT, EVID, CMT, DV, WT, ALB, DIS_UC, DIS_SASTHMA, group)

d_iv <- bind_rows(dose_iv, obs_iv) %>%
  arrange(ID, TIME, desc(EVID))
```

```{r simulate-iv}
sim_iv <- rxSolve(mod, d_iv, keep = "group", returnType = "data.frame")
```

## Replicates Figure 5 (200 mg IV, UC vs non-UC)

```{r fig-5, fig.width = 7, fig.height = 5}
sim_iv %>%
  filter(time > 0) %>%
  mutate(week = time / (24 * 7)) %>%
  group_by(week, group) %>%
  summarise(
    median = median(Cc, na.rm = TRUE),
    lo     = quantile(Cc, 0.025, na.rm = TRUE),
    hi     = quantile(Cc, 0.975, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  ggplot(aes(x = week, color = group, fill = group)) +
  geom_ribbon(aes(ymin = lo, ymax = hi), alpha = 0.15, linetype = 0) +
  geom_line(aes(y = median), linewidth = 0.9) +
  scale_y_log10() +
  scale_color_manual(values = c("non-UC" = "#2f7f4f", "UC" = "#c25252")) +
  scale_fill_manual(values  = c("non-UC" = "#2f7f4f", "UC" = "#c25252")) +
  labs(
    x = "Time since first dose (weeks)",
    y = "Anrukinzumab concentration (ng/mL)",
    title = "Simulated 200 mg IV (day 0, wk 2, 4, 8, 12): UC vs non-UC",
    subtitle = "Median and 95% prediction interval; replicates Hua 2015 Fig. 5.",
    caption = "UC patients show +72.8% CL and lower exposure at matched WT/ALB."
  ) +
  theme_bw()
```

# PKNCA validation

Run PKNCA on the first 28-day single-dose interval of the 200 mg IV
cohort, stratified by group (UC vs non-UC). The PKNCA formula includes
the `group` treatment variable so Cmax, AUClast, and half-life are
computed per-group.

```{r pknca}
single_dose_obs <- sim_iv %>%
  filter(time <= 28 * 24) %>%
  transmute(
    ID  = id,
    time,
    Cc,
    treatment = group
  )

single_dose_df <- pop_uc %>%
  mutate(TIME = 0, AMT = 200) %>%
  transmute(ID, time = TIME, amt = AMT, treatment = group)

conc_obj <- PKNCAconc(single_dose_obs, Cc ~ time | treatment + ID)
dose_obj <- PKNCAdose(single_dose_df,  amt ~ time | treatment + ID)

data_obj <- PKNCAdata(
  conc_obj,
  dose_obj,
  intervals = data.frame(
    start     = 0,
    end       = 28 * 24,          # 28 days in hours
    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  = 3,
  caption = "PKNCA summary after a single 200 mg IV dose (first 28 days), stratified by UC vs non-UC."
)
```

## Comparison against published values

Hua 2015 reports a median half-life for non-UC subjects of 567 h (95%
CI 548-586) and for UC subjects of 328 h (95% CI 301-352) (page 105 /
Figure 5 caption). These are computed from the model's terminal-phase
parameters `CL` and `Vss = Vc + Vp`, so at matched WT and ALB:

```{r half-life-compare}
vss_nonuc <- 3.81 + 2.17
t_half_nonuc <- log(2) * vss_nonuc / 0.00732
t_half_uc    <- log(2) * vss_nonuc / (0.00732 * (1 + 0.728))

tibble(
  group     = c("non-UC", "UC"),
  t_half_h  = c(t_half_nonuc, t_half_uc),
  paper_h   = c(567, 328)
) %>%
  knitr::kable(
    digits  = 0,
    caption = "Analytic terminal-phase half-life from the model's typical-value parameters vs Hua 2015 reported medians."
  )
```

The analytic values differ from the sparse-sampling NCA output above
because NCA estimates the half-life from whatever time window the
simulated concentrations span; the paper's 567 h / 328 h values come
from the population model itself and are what the model-file parameters
are supposed to reproduce.

# Assumptions and deviations

- **Subject-level covariates:** Hua 2015 does not publish per-subject
  WT, ALB, or disease-state values. WT is sampled log-normal around the
  reported Table 2 mean 82.6 kg / SD 18.7 kg; ALB sampled normal around
  mean 4.3 g/dL (the Table 3 reference value), clipped to a clinical
  range [2.8, 5.5] g/dL.
- **Albumin units:** the paper does not state units explicitly in
  Table 3; the value 4.3 and the Figure 1 x-axis range (3.0-5.0) are
  consistent with g/dL (US convention). This is recorded in
  `covariateData[[ALB]]$units` and the per-parameter comment.
- **Full-dose regimen for UC:** we simulate the 200 mg arm
  (day 0, weeks 2, 4, 8, 12) that Hua 2015 Figure 5 plots. The paper's
  study-5 protocol also tested 400 mg and 600 mg doses; the
  concentration-time shape is dose-proportional for this linear model,
  so a single dose level demonstrates the UC-vs-non-UC contrast.
- **Time-varying covariates:** WT and ALB are treated as time-invariant
  baseline values, consistent with typical IgG1 PK modelling and
  Hua 2015's "baseline" covariate terminology.
- **NCA half-life vs typical-value half-life:** the PKNCA sparse-sampling
  output differs from the analytic CL/V-based half-life; the
  "Comparison against published values" table above reports the analytic
  value, which is what the model-file parameters are meant to reproduce.

# Reference

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