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

Guselkumab population PK in moderate-to-severe plaque psoriasis

Simulate guselkumab serum concentration-time profiles using the original population PK model of Yao et al. (2018), built from pooled phase 2 (X-PLORE) and phase 3 (VOYAGE 1, VOYAGE 2) data in adults with moderate to severe plaque psoriasis. Guselkumab is a fully human IgG1-lambda monoclonal antibody targeting the p19 subunit of interleukin-23.

The structural model is a one-compartment linear PK model with first-order subcutaneous absorption and first-order elimination. The final reduced covariate set is body weight on apparent clearance (CL/F) and apparent volume of distribution (V/F), and diabetes-mellitus and race (non-White vs White) indicators on CL/F. Typical parameters for an 87.1 kg non-diabetic White reference subject are CL/F = 0.516 L/day, V/F = 13.5 L, and Ka = 1.11 1/day, which give a typical terminal half-life of approximately 18.1 days.

  • Citation: Yao Z, Hu C, Zhu Y, Xu Z, Randazzo B, Wasfi Y, Chen Y, Sharma A, Zhou H. Population Pharmacokinetic Modeling of Guselkumab, a Human IgG1-lambda Monoclonal Antibody Targeting IL-23, in Patients with Moderate to Severe Plaque Psoriasis. J Clin Pharmacol. 2018;58(5):613-627. doi:10.1002/jcph.1063
  • Article: https://doi.org/10.1002/jcph.1063

The package also includes Chen_2022_guselkumab, which fits guselkumab population PK in psoriatic arthritis (DISCOVER-1 / DISCOVER-2 phase 3 trials). Both models share the same one-compartment first-order SC absorption / first-order elimination structural form and the same combined additive + proportional residual error structure. They differ in the analysis dataset, the reference covariates, and the retained covariate set:

Aspect Yao 2018 (this model) Chen 2022
Indication Plaque psoriasis Psoriatic arthritis
Studies X-PLORE, VOYAGE 1, VOYAGE 2 (1454 patients) DISCOVER-1, DISCOVER-2
Reference body weight 87.1 kg (analysis-dataset median) 84 kg (analysis-dataset median)
Typical CL/F 0.516 L/day 0.596 L/day
Typical V/F 13.5 L 15.5 L
Typical Ka 1.11 1/day 0.572 1/day
BWT exponent on CL/F 0.998 0.926
BWT exponent on V/F 0.829 0.861
Diabetes on CL/F 1.12 1.15
Race on CL/F 1.11 (non-White vs White) not retained
Typical terminal half-life ~18.1 days ~18.1 days
IIV CL/F (% in source notation) 35.6 (sqrt(variance)) 38.9 (CV)

Despite different patient populations and reference covariates, both models converge on essentially the same typical terminal half-life, which is consistent with guselkumab’s IgG1 PK dictated by FcRn-mediated recycling and a comparable demographic mix.

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
One-compartment ODE structure (depot -> central, first-order absorption and elimination) n/a Methods, Base model section (page 616)
CL/F (typical, 87.1 kg, no diabetes, White) 0.516 L/day Table 4, Final Reduced Model
V/F (typical, 87.1 kg) 13.5 L Table 4, Final Reduced Model
Ka (typical) 1.11 1/day Table 4, Final Reduced Model
BWT on CL/F (BWT/87.1)^0.998 Table 4 footnote b
BWT on V/F (BWT/87.1)^0.829 Table 4 footnote c
Diabetes on CL/F 1.12^DIAB Table 4 footnote b
Race on CL/F 1.11^RACE (RACE = 1 for non-White) Table 4 footnote b
IIV CL/F 35.6% (sqrt(variance)*100) -> omega^2 = 0.356^2 = 0.126736 Table 4, footnote on IIV definition
IIV V/F 28.0% -> omega^2 = 0.280^2 = 0.078400 Table 4
IIV Ka 129% -> omega^2 = 1.290^2 = 1.6641 (shrinkage 74.7%) Table 4
IIV correlation CL/F:V/F r = 0.834 -> covariance = 0.083133 Table 4
Proportional residual error 20.0% CV -> propSd = 0.200 Table 4
Additive residual error 0.00289 ug/mL (fixed; uniform-distribution probability characteristic for LLOQ = 0.01 ug/mL) Table 4; Methods, Base model section (page 620)
Reference body weight 87.1 kg (analysis-dataset median) Table 2 (median IQR 74.8-100); Results page 619
Estimated typical terminal half-life ~18.1 days Results, page 619
Phase 3 dosing regimen (q8w) 100 mg SC at weeks 0 and 4, then every 8 weeks Methods, Study Designs (VOYAGE 1, VOYAGE 2)

The footnote on IIV in Yao 2018 Table 4 reads “interindividual variability calculated as (variance)^(1/2) x 100%”, i.e., the reported percentages are the standard deviation in log-space (omega) times 100 rather than a linear-scale CV. Conversion is therefore omega^2 = (IIV/100)^2 directly, not the omega^2 = log(1 + CV^2) form used for papers that report a linear-scale CV (compare with Chen_2022_guselkumab.R).

Covariate column naming

Source column Canonical column used here
BWT (kg) WT (kg; canonical general)
DIAB (binary 0/1) DIAB (binary; canonical general)
RACE (binary 0/1; 1 = non-White, 0 = White; “Race (nonwhite)” row in Table 4) RACE_WHITE (canonical; 1 = White, 0 = non-White) — values inverted: RACE_WHITE = 1 - source RACE. The race covariate effect is encoded as 1.11^(1 - RACE_WHITE) so the multiplier is applied to non-White subjects, matching Yao 2018 Table 4 footnote b.

Population

Per Yao 2018 Tables 2 and 3 and the Patient Disposition and Baseline Characteristics section: the analysis pooled data from X-PLORE (NCT01483599; phase 2 dose-ranging study, 238 patients), VOYAGE 1 (NCT02207231; phase 3, 492 patients), and VOYAGE 2 (NCT02207244; phase 3, 724 patients), all in adults with moderate-to-severe plaque psoriasis (1454 patients total, 13,014 PK records). Patient ages ranged from 18 to 82 years (median 44 years, IQR 34-53), and body weight ranged from 45 to 198 kg (median 87.1 kg, IQR 74.8-100). The population was 70.8% male and 29.2% female, with race distribution of 83.8% White, 12.2% Asian, 1.8% Black, and 2.3% Other. Diabetes prevalence was 8.9% and ADA-positive prevalence was 5.4%. The phase 3 trials used a uniform dosing regimen of 100 mg SC at weeks 0 and 4 followed by every 8 weeks; X-PLORE used a wider dose-ranging regimen (5-200 mg) at varying schedules through week 40.

The same metadata is available programmatically:

readModelDb("Yao_2018_guselkumab")$meta$population

Virtual population

The virtual cohort below approximates the demographics from Yao 2018 Tables 2 and 3. Body weight is sampled log-normal centered on the population median (87.1 kg). Diabetes is sampled as Bernoulli at the reported 8.9% prevalence. Race is sampled as Bernoulli (16.2% non-White) to match the pooled Asian + Black + Other percentage. The cohort is sized at 500 subjects per regimen / dose group to make per-time-point quantiles smooth.

set.seed(2018)
n_subj <- 500L

pop <- tibble(
  ID         = seq_len(n_subj),
  WT         = pmin(pmax(rlnorm(n_subj, log(87.1), 0.20), 45), 198),  # kg, clipped to Yao 2018 reported range
  DIAB       = as.integer(rbinom(n_subj, 1, 0.089)),                   # ~8.9% diabetic per Table 3
  RACE_WHITE = as.integer(rbinom(n_subj, 1, 0.838))                    # 83.8% White per Table 3
)

Dosing dataset

The phase 3 approved clinical regimen is simulated:

  • q8w (approved): 100 mg SC at weeks 0 and 4, then every 8 weeks (weeks 12, 20, 28, …), out to week 52 to reach approximate steady state.

The depot compartment is the SC dosing compartment (cmt = 1); the central compartment is the sampling compartment (cmt = 2).

weeks_q8w     <- c(0, 4, seq(12, 52, by = 8))    # 0, 4, 12, 20, 28, 36, 44, 52
dose_times_q8w <- weeks_q8w * 7

obs_times <- sort(unique(c(
  seq(0,   28,    by = 1),     # daily through week 4
  seq(28, 52 * 7, by = 7)      # weekly through week 52
)))

make_events <- function(pop_df, dose_times, regimen, id_offset = 0L) {
  pop_df <- pop_df %>% mutate(ID = ID + id_offset, regimen = regimen)
  d_dose <- pop_df %>%
    crossing(TIME = dose_times) %>%
    mutate(AMT = 100, EVID = 1, CMT = 1, DV = NA_real_)
  d_obs <- pop_df %>%
    crossing(TIME = obs_times) %>%
    mutate(AMT = NA_real_, EVID = 0, CMT = 2, DV = NA_real_)
  bind_rows(d_dose, d_obs) %>%
    arrange(ID, TIME, desc(EVID)) %>%
    as.data.frame()
}

events_q8w <- make_events(pop, dose_times_q8w, "q8w", id_offset = 0L)

events <- events_q8w
stopifnot(!anyDuplicated(unique(events[, c("ID", "TIME", "EVID")])))

Simulate

mod <- readModelDb("Yao_2018_guselkumab")
sim <- rxSolve(mod, events, returnType = "data.frame",
               keep = c("regimen", "WT", "DIAB", "RACE_WHITE"))
#>  parameter labels from comments will be replaced by 'label()'

Concentration-time profile (q8w, full population)

Median and 90% prediction interval of the simulated serum guselkumab concentration time course for the q8w regimen (replicates the shape of the population PK simulation in Figure 3 of Yao 2018, top panels).

sim_summary <- sim %>%
  filter(time > 0) %>%
  group_by(regimen, 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, colour = regimen, fill = regimen)) +
  geom_ribbon(aes(ymin = lo, ymax = hi), alpha = 0.2, colour = NA) +
  geom_line(aes(y = median), linewidth = 1) +
  scale_y_log10() +
  labs(
    x        = "Time (weeks)",
    y        = "Guselkumab concentration (ug/mL)",
    title    = "Simulated guselkumab PK in plaque psoriasis (Yao 2018 model)",
    subtitle = "Median and 90% prediction interval (N = 500 virtual patients, q8w)",
    caption  = "Replicates the shape of Figure 3 (VPC) of Yao 2018."
  ) +
  theme_bw()

Typical-subject reproduction of published values

The Results section reports typical-subject CL/F = 0.516 L/day, V/F = 13.5 L, Ka = 1.11 1/day, and a typical terminal half-life of approximately 18.1 days at the median 87.1 kg with no diabetes, White (Yao 2018 Results, page 619 and Table 4). Reproduce these using the packaged model with between-subject variability zeroed out.

mod_typ <- rxode2::zeroRe(mod)
#>  parameter labels from comments will be replaced by 'label()'

typ_pop <- tibble(
  ID         = 1L,
  WT         = 87.1,
  DIAB       = 0L,
  RACE_WHITE = 1L
)

typ_dose <- typ_pop %>%
  crossing(TIME = dose_times_q8w) %>%
  mutate(AMT = 100, EVID = 1, CMT = 1, DV = NA_real_)

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

typ_events <- bind_rows(typ_dose, typ_obs) %>%
  arrange(TIME, desc(EVID)) %>%
  as.data.frame()

sim_typ <- rxSolve(mod_typ, typ_events, returnType = "data.frame")
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalka'

cl_typ <- 0.516
v_typ  <- 13.5
ka_typ <- 1.11
t_half <- log(2) * v_typ / cl_typ

cat(sprintf(
  paste0(
    "Typical 87.1 kg non-diabetic White subject (vs paper Table 4 / Results page 619):\n",
    "  CL/F = %.3f L/day  (paper: 0.516)\n",
    "  V/F  = %.2f L      (paper: 13.5)\n",
    "  Ka   = %.3f 1/day  (paper: 1.11)\n",
    "  t1/2 (typical, ln(2) * V/CL) = %.1f days  (paper: ~18.1)\n"
  ),
  cl_typ, v_typ, ka_typ, t_half
))
#> Typical 87.1 kg non-diabetic White subject (vs paper Table 4 / Results page 619):
#>   CL/F = 0.516 L/day  (paper: 0.516)
#>   V/F  = 13.50 L      (paper: 13.5)
#>   Ka   = 1.110 1/day  (paper: 1.11)
#>   t1/2 (typical, ln(2) * V/CL) = 18.1 days  (paper: ~18.1)

ggplot(sim_typ %>% filter(time > 0), aes(time / 7, Cc)) +
  geom_line(colour = "darkred", linewidth = 1) +
  scale_y_log10() +
  labs(
    x        = "Time (weeks)",
    y        = "Guselkumab concentration (ug/mL)",
    title    = "Typical 87.1 kg non-diabetic White subject, q8w (zeroed random effects)",
    caption  = "100 mg SC at weeks 0 and 4, then every 8 weeks."
  ) +
  theme_bw()

PKNCA validation

Run PKNCA on the steady-state q8w maintenance interval (weeks 44-52). The expected typical terminal half-life is ~18.1 days for a typical 87.1 kg White non-diabetic subject (Yao 2018 Results, page 619).

nca_conc <- sim %>%
  filter(regimen == "q8w", time >= 44 * 7, time <= 52 * 7, Cc > 0) %>%
  mutate(time_rel = time - 44 * 7) %>%
  rename(ID = id) %>%
  select(ID, time_rel, Cc, regimen)

nca_dose <- pop %>%
  mutate(
    time_rel = 0,
    AMT      = 100,
    regimen  = "q8w"
  ) %>%
  select(ID, time_rel, AMT, regimen)

conc_obj <- PKNCAconc(
  nca_conc,
  Cc ~ time_rel | regimen + ID,
  concu = "ug/mL",
  timeu = "day"
)
dose_obj <- PKNCAdose(
  nca_dose,
  AMT ~ time_rel | regimen + ID,
  doseu = "mg"
)
data_obj <- PKNCAdata(
  conc_obj,
  dose_obj,
  intervals = data.frame(
    start     = 0,
    end       = 8 * 7,
    cmax      = TRUE,
    tmax      = TRUE,
    cmin      = TRUE,
    auclast   = TRUE,
    half.life = TRUE
  )
)
nca_results <- pk.nca(data_obj)
#>  ■■■■                              11% |  ETA:  8s
#>  ■■■■■■■■■■■■■■■■                  51% |  ETA:  4s
#>  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■      91% |  ETA:  1s
nca_summary <- summary(nca_results)
knitr::kable(
  nca_summary,
  caption = "PKNCA summary for the q8w steady-state maintenance interval (weeks 44-52). Expected typical terminal half-life ~18.1 days (Yao 2018 Results, page 619)."
)
PKNCA summary for the q8w steady-state maintenance interval (weeks 44-52). Expected typical terminal half-life ~18.1 days (Yao 2018 Results, page 619).
Interval Start Interval End regimen N AUClast (day*ug/mL) Cmax (ug/mL) Cmin (ug/mL) Tmax (day) Half-life (day)
0 56 q8w 500 169 [46.8] 6.26 [40.4] 0.958 [75.2] 7.00 [7.00, 21.0] 18.3 [4.36]

Comparison against published Table 5 (steady-state q8w simulations)

Yao 2018 Table 5 reports model-predicted median Ctrough,ss and AUC over weeks 0-8 at steady state (AUC week0-8,ss) for subgroups defined by body weight, diabetes, and race, simulated from 5000 patients sampled from the original analysis dataset. Reproduce the per-subgroup medians from the present 500-subject virtual cohort and compare. Differences are expected to be within sampling error of the smaller cohort here.

# Per-subject steady-state summary on the q8w maintenance interval (weeks 44-52)
ss <- sim %>%
  filter(regimen == "q8w", time >= 44 * 7, time <= 52 * 7, Cc > 0) %>%
  arrange(id, time)

per_id <- ss %>%
  group_by(id, WT, DIAB, RACE_WHITE) %>%
  summarise(
    Ctrough = Cc[which.max(time)],
    AUCtau  = sum(diff(time) * (head(Cc, -1) + tail(Cc, -1)) / 2),
    .groups = "drop"
  )

subgroup_medians <- bind_rows(
  per_id %>% filter(WT < 90)      %>% summarise(group = "Weight < 90 kg",    n = n(),
                                                Median_AUC     = median(AUCtau),
                                                Median_Ctrough = median(Ctrough)),
  per_id %>% filter(WT >= 90)     %>% summarise(group = "Weight >= 90 kg",   n = n(),
                                                Median_AUC     = median(AUCtau),
                                                Median_Ctrough = median(Ctrough)),
  per_id %>% filter(DIAB == 0)    %>% summarise(group = "No diabetes",       n = n(),
                                                Median_AUC     = median(AUCtau),
                                                Median_Ctrough = median(Ctrough)),
  per_id %>% filter(DIAB == 1)    %>% summarise(group = "Diabetes",          n = n(),
                                                Median_AUC     = median(AUCtau),
                                                Median_Ctrough = median(Ctrough)),
  per_id %>% filter(RACE_WHITE == 1) %>% summarise(group = "White",          n = n(),
                                                   Median_AUC     = median(AUCtau),
                                                   Median_Ctrough = median(Ctrough)),
  per_id %>% filter(RACE_WHITE == 0) %>% summarise(group = "Non-White",      n = n(),
                                                   Median_AUC     = median(AUCtau),
                                                   Median_Ctrough = median(Ctrough))
)

# Yao 2018 Table 5 published medians for AUC_week0-8,ss (ug*day/mL) and Ctrough,ss (ug/mL)
published <- tibble(
  group              = c("Weight < 90 kg", "Weight >= 90 kg",
                         "No diabetes",    "Diabetes",
                         "White",          "Non-White"),
  Published_AUC      = c(225, 159, 196, 158, 192, 192),
  Published_Ctrough  = c(1.21, 0.80, 1.04, 0.72, 1.02, 0.93)
)

comparison <- subgroup_medians %>%
  left_join(published, by = "group") %>%
  mutate(
    Pct_diff_AUC     = 100 * (Median_AUC     - Published_AUC)     / Published_AUC,
    Pct_diff_Ctrough = 100 * (Median_Ctrough - Published_Ctrough) / Published_Ctrough
  )

knitr::kable(
  comparison,
  digits  = 2,
  caption = "Comparison of simulated steady-state q8w medians (this cohort, N=500) against Yao 2018 Table 5 (published medians from the paper's 5000-subject simulation). AUC is over weeks 0-8 at steady state in ug*day/mL; Ctrough is in ug/mL."
)
Comparison of simulated steady-state q8w medians (this cohort, N=500) against Yao 2018 Table 5 (published medians from the paper’s 5000-subject simulation). AUC is over weeks 0-8 at steady state in ug*day/mL; Ctrough is in ug/mL.
group n Median_AUC Median_Ctrough Published_AUC Published_Ctrough Pct_diff_AUC Pct_diff_Ctrough
Weight < 90 kg 282 191.48 1.10 225 1.21 -14.90 -8.81
Weight >= 90 kg 218 141.45 0.79 159 0.80 -11.04 -1.09
No diabetes 450 168.29 1.01 196 1.04 -14.14 -3.08
Diabetes 50 160.75 0.78 158 0.72 1.74 7.89
White 424 169.72 1.01 192 1.02 -11.60 -1.37
Non-White 76 145.27 0.70 192 0.93 -24.34 -24.88

The simulated subgroup medians here use a 500-subject virtual cohort sampled with parametric covariate distributions, while Yao 2018 Table 5 samples 5000 subjects from the original analysis dataset (so the covariate joint distribution differs slightly, especially for weight-correlated covariates like diabetes). Within-cohort median-of-median differences <~ 20% indicate the structural and covariate model is faithfully reproduced.

Covariate-effect simulation: heavier (>= 90 kg), diabetic, and non-White subgroups

Yao 2018 reports (Results, Simulation; Table 5) that with the q8w regimen the model predicts:

  • patients with body weight >= 90 kg vs. < 90 kg have AUC lower by roughly 29% and Ctrough lower by roughly 34%;
  • patients with vs. without diabetes have AUC lower by roughly 19% and Ctrough lower by roughly 31%;
  • non-White vs White subjects show comparable AUC, with a small Ctrough difference.

Reproduce these contrasts using zeroed random effects (typical-subject predictions) on q8w steady state (weeks 44-52). The body-weight contrast uses 95 kg vs. 80 kg as round-number representatives that straddle the 90 kg cutoff used in the paper’s subgroup definitions.

typ_eval <- function(WT_val, DIAB_val, RW_val) {
  pop1   <- tibble(ID = 1L, WT = WT_val, DIAB = as.integer(DIAB_val),
                   RACE_WHITE = as.integer(RW_val))
  d_dose <- pop1 %>% crossing(TIME = dose_times_q8w) %>%
    mutate(AMT = 100, EVID = 1, CMT = 1, DV = NA_real_)
  d_obs  <- pop1 %>% crossing(TIME = obs_times) %>%
    mutate(AMT = NA_real_, EVID = 0, CMT = 2, DV = NA_real_)
  ev <- bind_rows(d_dose, d_obs) %>% arrange(TIME, desc(EVID)) %>% as.data.frame()
  s  <- rxSolve(mod_typ, ev, returnType = "data.frame") %>%
    filter(time >= 44 * 7, time <= 52 * 7, Cc > 0) %>% arrange(time)
  list(
    Ctrough = tail(s$Cc, 1),
    AUCtau  = sum(diff(s$time) * (head(s$Cc, -1) + tail(s$Cc, -1)) / 2)
  )
}

ref_white <- typ_eval(80,  0, 1)
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalka'
heavy95   <- typ_eval(95,  0, 1)
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalka'
diab80    <- typ_eval(80,  1, 1)
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalka'
nonwhite  <- typ_eval(80,  0, 0)
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalka'

pct <- function(new, ref) 100 * (new - ref) / ref

cov_table <- tibble(
  contrast        = c("WT 95 vs 80 kg, no diabetes, White",
                      "Diabetes vs no diabetes, 80 kg, White",
                      "Non-White vs White, 80 kg, no diabetes"),
  Ctrough_ref     = rep(ref_white$Ctrough, 3),
  Ctrough_new     = c(heavy95$Ctrough, diab80$Ctrough, nonwhite$Ctrough),
  Ctrough_pct_chg = c(pct(heavy95$Ctrough, ref_white$Ctrough),
                      pct(diab80$Ctrough,  ref_white$Ctrough),
                      pct(nonwhite$Ctrough, ref_white$Ctrough)),
  AUCtau_ref      = rep(ref_white$AUCtau, 3),
  AUCtau_new      = c(heavy95$AUCtau, diab80$AUCtau, nonwhite$AUCtau),
  AUCtau_pct_chg  = c(pct(heavy95$AUCtau, ref_white$AUCtau),
                      pct(diab80$AUCtau,  ref_white$AUCtau),
                      pct(nonwhite$AUCtau, ref_white$AUCtau))
)

knitr::kable(
  cov_table,
  digits  = 2,
  caption = "Steady-state q8w typical-subject covariate-effect contrasts (Ctrough in ug/mL; AUCtau in ug*day/mL). Compare to Yao 2018 Table 5 / Results: heavier patients have ~34% lower Ctrough and ~29% lower AUC; diabetic patients have ~31% lower Ctrough and ~19% lower AUC."
)
Steady-state q8w typical-subject covariate-effect contrasts (Ctrough in ug/mL; AUCtau in ug*day/mL). Compare to Yao 2018 Table 5 / Results: heavier patients have ~34% lower Ctrough and ~29% lower AUC; diabetic patients have ~31% lower Ctrough and ~19% lower AUC.
contrast Ctrough_ref Ctrough_new Ctrough_pct_chg AUCtau_ref AUCtau_new AUCtau_pct_chg
WT 95 vs 80 kg, no diabetes, White 1.14 0.92 -19.09 190.82 160.26 -16.02
Diabetes vs no diabetes, 80 kg, White 1.14 0.86 -24.37 190.82 168.28 -11.81
Non-White vs White, 80 kg, no diabetes 1.14 0.88 -22.62 190.82 169.97 -10.92

The body-weight contrast above is simulated at 95 vs. 80 kg (typical-subject anchors straddling the 90 kg cutoff) rather than the median-of-each-subgroup the paper used to report Table 5’s subgroup medians, so a within-a-few-percent difference is expected. The diabetes and race contrasts at fixed 80 kg should reproduce the paper’s multipliers (1.12 for DIAB, 1.11 for non-White on CL/F) closely because those operate independently of body weight.

Errata

The team performed a search of PubMed and the journal landing page (https://accp1.onlinelibrary.wiley.com/doi/10.1002/jcph.1063) for errata, corrigenda, or author corrections covering Yao 2018 and found no published corrections at the time of model extraction. Several typesetting artifacts in the published PDF affect readability but not the model values; they are recorded here so future readers do not mistake them for genuine notation:

  • Greek omega is rendered as “/Omega1” / “/omega1” in some sentences describing the IIV variance-covariance matrix (e.g., “the vector of random effects has a covariance matrix /Omega1”). The intended symbol is upper-case omega.
  • Inequality and Greek epsilon glyphs are mangled in places (e.g., “/22656” appears for “>=”, and “/223c” appears for “approximately equal” or “epsilon”). The text reading is unambiguous in context.
  • Words occasionally lack inter-word spaces (e.g., “T-helper(Th)cells”, “1-compartmentlinearPKmodel”). This is a PDF text-extraction artifact, not the published article.

None of these affect the parameter values, the equations in Tables 4 or 5, or the residual-error structure as extracted into this model file.

Assumptions and deviations

Yao 2018 does not publish individual-level PK or per-subject covariate values, so the virtual population above approximates the main-text demographics rather than reproducing them:

  • Weight: sampled log-normal around an 87.1 kg median (Table 2) with SD 0.20 on the log scale, clipped to 45-198 kg (the reported range in Patient Disposition). This approximately matches the reported 25th-75th percentile range (74.8-100 kg).
  • Diabetes: sampled as Bernoulli(0.089) (~8.9% prevalence per Table 3).
  • Race: sampled as Bernoulli(0.838) for RACE_WHITE = 1 to match the 83.8% White proportion in Table 3. The non-White complement pools Asian (12.2%), Black (1.8%), and Other (2.3%) per the paper’s binary “Race (nonwhite)” covariate definition.
  • Sex, age, ethnicity, ADA status, baseline laboratory values, prior biologics, smoking, alcohol, hypertension, hyperlipidemia, concomitant medications: evaluated in the paper’s full covariate model but each had a <10% effect on CL/F or V/F and was dropped from the final reduced model (Yao 2018 Results, Full Covariate Model and Final Reduced Covariate Model sections; Figure 1). They are not part of the packaged PK model.
  • Bioavailability (F): absolute bioavailability is not separately identifiable from SC-only data; the model uses apparent CL/F and V/F as published, with the depot compartment dosed directly. No f(depot) term is included.
  • Residual error: the combined add(addSd) + prop(propSd) form is the standard nlmixr2 implementation of the paper’s “combined additive and proportional residual error model” (Methods, Base Model section), with addSd in ug/mL matching the concentration units. The additive component was fixed in Yao 2018 at 0.00289 ug/mL based on a uniform-distribution probability characteristic associated with the LLOQ of 0.01 ug/mL; the same fixed value is used here.
  • IIV interpretation: Yao 2018 reports “interindividual variability calculated as (variance)^(1/2) x 100%” (Table 4 footnote). This treats the percentage as the SD on the log scale (omega) times 100, not a linear-scale CV. The omega^2 used in the model is therefore (IIV/100)^2 directly, not the log(1 + CV^2) form used by some other monoclonal-antibody papers. For ka with IIV = 129%, the interpretation makes a large numerical difference; the paper’s footnote was followed verbatim.
  • No time-varying covariates. Body weight, diabetes status, and race are time-fixed at baseline values; the paper does not describe time-varying covariate effects.
  • Bigger published simulation cohort. Yao 2018 Table 5 simulations resampled 5000 subjects from the original analysis dataset; the validation block above uses 500 simulated subjects with parametric covariate distributions, which is sufficient to reproduce the subgroup median patterns but will exhibit some sampling noise.

Reference

  • Yao Z, Hu C, Zhu Y, Xu Z, Randazzo B, Wasfi Y, Chen Y, Sharma A, Zhou H. Population Pharmacokinetic Modeling of Guselkumab, a Human IgG1-lambda Monoclonal Antibody Targeting IL-23, in Patients with Moderate to Severe Plaque Psoriasis. J Clin Pharmacol. 2018;58(5):613-627. doi:10.1002/jcph.1063