Infliximab (Fasanmade 2009)
Source:vignettes/articles/Fasanmade_2009_infliximab.Rmd
Fasanmade_2009_infliximab.Rmd
library(nlmixr2lib)
library(rxode2)
#> rxode2 5.1.8 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':
#>
#> filterInfliximab population PK simulation
Simulate infliximab concentration-time profiles using the final population PK model from Fasanmade et al. (2009) in patients with ulcerative colitis from the ACT 1 and ACT 2 phase III trials (N = 482).
The model is a 2-compartment IV infusion model with linear elimination. Covariates in the final model are serum albumin, anti-drug antibody (ATI / ADA) status, and sex on clearance, and body weight and sex on central volume. Concomitant immunomodulators (azathioprine, 6-mercaptopurine) were evaluated but did not have a statistically significant effect on CL.
Source trace
| Element | Source location | Value / form |
|---|---|---|
| CL, Vc, Vp, Q | Fasanmade 2009 Table 3 | 0.407 L/day, 3.29 L, 4.13 L, 7.14 L/day |
| ALB on CL | Fasanmade 2009 Table 3 | Power: (ALB/4.1)^-1.54 |
| ADA on CL | Fasanmade 2009 Table 3 | Multiplicative: 1 + 0.471 * ADA_POS |
| SEX on CL | Fasanmade 2009 Table 3 | Multiplicative: 1 + (-0.236) * SEXF |
| WT on Vc | Fasanmade 2009 Table 3 | Power: (WT/77)^0.538 |
| SEX on Vc | Fasanmade 2009 Table 3 | Multiplicative: 1 + (-0.137) * SEXF |
| IIV CL, Vc | Fasanmade 2009 Table 3 | omega^2 = 0.131 (37.7% CV), 0.048 (22.1% CV) |
| Residual error | Fasanmade 2009 Table 3 | Proportional 0.403, additive 0.0413 ug/mL |
| Dosing regimen | Fasanmade 2009 Methods | 5 mg/kg IV at weeks 0, 2, 6, then q8w |
Covariate column naming
| Source column | Canonical column used here |
|---|---|
ATI (antibodies to infliximab) |
ADA_POS (per
inst/references/covariate-columns.md) |
SEX (1 = female, 0 = male) |
SEXF (same 0/1 encoding, canonical name) |
Virtual population
set.seed(2009)
n_subj <- 500
pop <- data.frame(
ID = seq_len(n_subj),
WT = rlnorm(n_subj, log(77), 0.22), # Median 77 kg, range ~40-177
ALB = rnorm(n_subj, 41, 4), # Mean 41, SD 4 g/L (4.1, 0.4 g/dL)
SEXF = rbinom(n_subj, 1, 0.392), # 39.2% female
ADA_POS = rbinom(n_subj, 1, 0.068) # 6.8% ADA-positive
)
pop$ALB <- pmax(20, pmin(pop$ALB, 55))Dosing dataset
Standard UC induction: 5 mg/kg IV at weeks 0, 2, and 6, then maintenance every 8 weeks through week 46 (8 doses total). Infusion over 2 hours.
dose_weeks <- c(0, 2, 6, 14, 22, 30, 38, 46)
dose_times <- dose_weeks * 7 # convert to days
obs_times <- sort(unique(c(
seq(0, 7, by = 0.5), # Dense first week
seq(7, 364, by = 3.5) # Twice weekly thereafter
)))
d_dose <- pop %>%
crossing(TIME = dose_times) %>%
mutate(
AMT = round(5 * WT, 1), # 5 mg/kg
EVID = 1,
CMT = 1,
DUR = 2 / 24, # 2-hour infusion in days
DV = NA_real_
)
d_obs <- pop %>%
crossing(TIME = obs_times) %>%
mutate(AMT = NA_real_, EVID = 0, CMT = 1, DUR = NA_real_, DV = NA_real_)
d_sim <- bind_rows(d_dose, d_obs) %>%
arrange(ID, TIME, desc(EVID)) %>%
as.data.frame()Simulate
mod <- readModelDb("Fasanmade_2009_infliximab")
conc_unit <- rxode2::rxode(mod)$units[["concentration"]]
#> ℹ parameter labels from comments will be replaced by 'label()'
sim <- rxSolve(mod, d_sim, returnType = "data.frame")
#> ℹ parameter labels from comments will be replaced by 'label()'Concentration-time profiles
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 = "darkred") +
geom_line(aes(y = median), color = "darkred", linewidth = 1) +
scale_y_log10() +
labs(
x = "Time (weeks)",
y = paste0("Infliximab concentration (", conc_unit, ")"),
title = "Simulated infliximab PK (5 mg/kg IV, induction + q8w maintenance)",
subtitle = "Median and 90% prediction interval (N = 500 virtual UC patients)",
caption = "Model: Fasanmade et al. (2009) Eur J Clin Pharmacol"
) +
theme_bw()
Effect of anti-drug antibodies on PK
sim_ada <- sim %>%
filter(time > 0) %>%
mutate(ADA_label = ifelse(ADA_POS == 1, "ADA-positive", "ADA-negative")) %>%
group_by(time, ADA_label) %>%
summarise(
median = median(Cc, na.rm = TRUE),
.groups = "drop"
)
ggplot(sim_ada, aes(x = time / 7, y = median, color = ADA_label)) +
geom_line(linewidth = 1) +
scale_y_log10() +
scale_color_manual(values = c("ADA-negative" = "steelblue", "ADA-positive" = "tomato")) +
labs(
x = "Time (weeks)",
y = paste0("Infliximab concentration (", conc_unit, ")"),
title = "Infliximab median concentrations by ADA status",
subtitle = "ADA-positive patients have 47% higher clearance",
color = "Immunogenicity",
caption = "Model: Fasanmade et al. (2009)"
) +
theme_bw()
NCA validation
Run PKNCA on the maintenance dosing interval (after the 5th dose, weeks 22–30). Stratify by ADA status so each treatment group has its own NCA summary.
nca_conc <- sim %>%
filter(time >= 154, time <= 210) %>%
mutate(
time_rel = time - 154,
treatment = ifelse(ADA_POS == 1, "ADA-positive", "ADA-negative")
) %>%
rename(ID = id) %>%
select(ID, time_rel, Cc, treatment)
nca_dose <- pop %>%
mutate(
time_rel = 0,
AMT = 5 * WT,
treatment = ifelse(ADA_POS == 1, "ADA-positive", "ADA-negative")
) %>%
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 = 56,
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 = "NCA summary (maintenance interval, weeks 22-30), stratified by ADA status"
)| start | end | treatment | N | auclast | cmax | tmax | half.life |
|---|---|---|---|---|---|---|---|
| 0 | 56 | ADA-negative | 465 | 891 [58.0] | 45.3 [28.8] | 3.50 [3.50, 3.50] | 14.9 [6.67] |
| 0 | 56 | ADA-positive | 35 | 545 [60.3] | 38.4 [27.5] | 3.50 [3.50, 3.50] | 9.69 [4.83] |
Assumptions and deviations
Fasanmade 2009 does not publish individual PK or per-subject covariate values, so the virtual population above approximates the reported distributions rather than reproducing them:
- Weight: sampled log-normal around a 77 kg median with SD 0.22 on the log scale (≈ 40–177 kg), matching the reported range.
- Albumin: sampled normal around mean 41 g/L (4.1 g/dL), SD 4 g/L (0.4 g/dL), clipped to [20, 55] g/L ([2.0, 5.5] g/dL).
- Sex and ADA status: sampled independently at 39.2% female and 6.8% ADA-positive, respectively. In the pooled ACT 1 / ACT 2 data these are not fully independent, but the joint distribution is not reported.
- No correlation between WT and ALB is imposed; the paper does not report one.
- Dosing regimen uses the 5 mg/kg induction + q8w maintenance schedule. Fasanmade 2009 pooled this with a 10 mg/kg arm; the 5 mg/kg schedule is the approved label dose and the most relevant typical use.
- Race is not included because it was not retained as a covariate in the final model.
Notes
- Model: 2-compartment IV with linear elimination. No TMDD.
- Key covariates: Albumin (strongest, power -1.54 on CL), ADA status (+47.1% CL), and sex (-23.6% CL and -13.7% Vc for females).
- Body weight was only significant on Vc (exponent 0.538), NOT on CL (unlike most mAb models).
- Concomitant immunomodulators (AZA, 6-MP) did NOT affect PK in the final model.
Reference
- Fasanmade AA, Adedokun OJ, Ford J, Hernandez D, Johanns J, Hu C, Davis HM, Zhou H. Population pharmacokinetic analysis of infliximab in patients with ulcerative colitis. Eur J Clin Pharmacol. 2009;65(12):1211-1228. doi:10.1007/s00228-009-0718-4.