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

Model and source

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.

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(2.8, pmin(rnorm(n_subj, 4.3, 0.4), 5.5))  # mean 4.3, SD 0.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).

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))
mod <- readModelDb("Hua_2015_anrukinzumab")
sim_sc <- rxSolve(mod, d_sc, keep = "disease", returnType = "data.frame")
#>  parameter labels from comments will be replaced by 'label()'

Replicates Figure 4 (SC single-dose shape)

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.

n_iv <- 100

pop_uc <- tibble(
  ID  = seq_len(n_iv),
  WT  = rlnorm(n_iv, log(75), 0.18),
  ALB = pmax(2.8, pmin(rnorm(n_iv, 4.3, 0.3), 5.5))
) %>%
  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))
sim_iv <- rxSolve(mod, d_iv, keep = "group", returnType = "data.frame")
#>  parameter labels from comments will be replaced by 'label()'

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

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.

single_dose_obs <- sim_iv %>%
  filter(time >= 0, time <= 28 * 24, Cc > 0) %>%
  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)
#> Warning: Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
#> Too few points for half-life calculation (min.hl.points=3 with only 0 points)
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."
)
PKNCA summary after a single 200 mg IV dose (first 28 days), stratified by UC vs non-UC.
start end treatment N auclast cmax tmax half.life
0 672 non-UC 100 2.69e7 [28.1] 88900 [29.6] 672 [672, 672] NC
0 672 UC 100 2.12e7 [31.5] 74000 [32.6] 672 [672, 672] NC

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:

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."
  )
Analytic terminal-phase half-life from the model’s typical-value parameters vs Hua 2015 reported medians.
group t_half_h paper_h
non-UC 566 567
UC 328 328

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

  • 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. doi:10.1111/bcp.12589