---
title: "Necitumumab (Long 2017)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Necitumumab (Long 2017)}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

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

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

# Necitumumab population PK replication (Long 2017)

Long et al. (2017) characterised the population pharmacokinetics of
necitumumab (a second-generation fully human IgG1 anti-EGFR monoclonal
antibody) in 807 cancer patients pooled across five clinical studies
(three phase I/II with rich sampling and two phase III with trough-only
sampling in squamous and non-squamous non-small-cell lung cancer). The
final model is two-compartment with parallel linear and Michaelis–Menten
(target-mediated) elimination from the central compartment. Body weight
was the only covariate retained, entering as a power effect on both
clearances (CL and Q, shared exponent 0.768) and on both volumes
(V~1~ and V~2~, shared exponent 0.498).

This vignette reproduces the typical concentration–time profile for the
phase III SQUIRE regimen (800 mg IV over ~1 h on days 1 and 8 of a
21-day cycle), documents the parameter provenance in a source-trace
table, and validates the simulated NCA against the published Vss,
CLtot at steady state, and the preclinical 40 mg/L trough threshold.

## Population studied

Long 2017 Tables 2 and 3 (final pooled Pop-PK dataset):

| Field                | Value                                                             |
|----------------------|-------------------------------------------------------------------|
| N subjects           | 807                                                               |
| N observations       | 4920 quantifiable concentrations (184 BLQ samples excluded)       |
| N studies            | 5 (JFCA/B/C/I/J — three phase I/II, two phase III)                |
| Age                  | 19–84 years (median 62)                                           |
| Weight               | 35–181 kg (median 71)                                             |
| Sex                  | 200 F / 607 M (25% female)                                        |
| Race                 | 85% Caucasian, 7% Asian, 5% Other, 2% Black, <1% AmInd / Multiple |
| Ethnicity            | 11% Hispanic or Latino                                            |
| Disease state        | Advanced solid tumors (squamous/non-squamous NSCLC, CRC, others)  |
| Dose range           | 600–800 mg IV as ~1-h infusion                                    |
| Regimens             | Weekly 5%, Q2W 1%, days 1 and 8 of 21-day cycle 94%               |
| Concomitant chemo    | Cisplatin 89%, gemcitabine 42%                                    |
| Typical regimen      | 800 mg IV on days 1 and 8 of a 21-day cycle (SQUIRE)              |

Age, sex, race, ethnicity, ECOG, liver function (AST, ALT, bilirubin),
renal function (Cockcroft–Gault CrCl), and concomitant gemcitabine /
cisplatin were all tested as covariates; only body weight was retained.

The same metadata is available programmatically via
`readModelDb("Long_2017_necitumumab")$population`.

## Source trace

Every numeric value in the model file
`inst/modeldb/specificDrugs/Long_2017_necitumumab.R` comes from the
following locations in Long A, Chigutsa E, Wallin J, *Clinical
Pharmacokinetics* 2017;56(5):505–514
([doi:10.1007/s40262-016-0452-x](https://doi.org/10.1007/s40262-016-0452-x)).
No errata were located on PubMed, Google Scholar, or the Springer Nature
landing page (search date 2026-04-21).

| Quantity                                   | Source location                      | Value used                |
|--------------------------------------------|--------------------------------------|---------------------------|
| Two-compartment structure, linear + MM     | Results § PK model / Discussion      | 2-cmt, CL + Vmax/(C+Km)   |
| Linear CL                                  | Table 4, CL row (final model)        | 0.0114 L/h                |
| K~m~                                       | Table 4, Km row (final model)        | 7.97 mg/L                 |
| V~max~                                     | Table 4, Vmax row (final model)      | 0.565 mg/h                |
| Central volume V~1~                        | Table 4, V~1~ row (final model)      | 3.41 L                    |
| Inter-compartmental clearance Q            | Table 4, Q row (final model)         | 0.0183 L/h                |
| Peripheral volume V~2~                     | Table 4, V~2~ row (final model)      | 3.29 L                    |
| Weight effect on CL and Q (power exponent) | Table 4 footnotes c, d (final model) | 0.768                     |
| Weight effect on V~1~ and V~2~ (power exp) | Table 4 footnotes e, f (final model) | 0.498                     |
| Reference body weight                      | Table 4 footnote equations           | 70 kg                     |
| IIV on total CL (CLtot)                    | Table 4, final-model IIV row         | 28.8% CV                  |
| IIV on V~1~                                | Table 4, final-model IIV row         | 21.1% CV                  |
| IIV on V~2~                                | Table 4, final-model IIV row         | 55.4% CV                  |
| Correlation (CLtot, V~1~)                  | Table 4, final model                 | 0.609                     |
| Additive residual error                    | Table 4, final model                 | 10.8 µg/mL (= mg/L)       |
| Proportional residual error                | Table 4, final model                 | 23.7% CV                  |
| V~ss~ (typical, steady state)              | Results, narrative / Discussion      | 6.97 L                    |
| CL~tot~ (typical, steady state at 800 mg)  | Results, narrative / Discussion      | 0.0141 L/h                |
| Preclinical trough-concentration threshold | Background / Discussion              | 40 mg/L                   |

## Virtual cohort

N = 200 virtual cancer patients. Body weight is drawn from a log-normal
distribution anchored on the published median (71 kg, geometric CV 22%)
and clipped to the Long 2017 min/max (35–181 kg) to match Table 2.
Sex and age are simulated for completeness; the model has no sex, age,
race, or ethnicity effect (none retained in the final covariate search),
so only WT drives between-subject variability in typical-value
predictions.

```{r virtual-pop}
set.seed(2017)
n_subj <- 200

wt <- pmax(35, pmin(181, exp(log(71) + rnorm(n_subj, 0, 0.22))))
pop <- tibble(
  ID = seq_len(n_subj),
  WT = wt
)
summary(pop$WT)
```

## Dataset construction

Four 21-day cycles (12 weeks) of the SQUIRE regimen: 800 mg IV over 1 h
on days 1 and 8 of each cycle. Observation grid: dense for the first
72 h after the first dose (to capture distribution), then weekly troughs
and mid-cycle samples for the remaining cycles.

```{r build-dataset}
cycle_h <- 21 * 24
cycle_dose_offsets <- c(0, 7 * 24)
cycles <- 4
dose_times <- as.numeric(outer(cycle_dose_offsets, (seq_len(cycles) - 1) * cycle_h, `+`))
dose_times <- sort(dose_times)
tmax_h <- max(dose_times) + 21 * 24  # one full trough cycle past last dose

obs_early <- seq(0, 72, by = 1)
obs_post <- sort(unique(c(
  dose_times + 1,  # end of 1-h infusion
  dose_times + 6,
  dose_times + 24,
  seq(0, tmax_h, by = 12)
)))
obs_times <- sort(unique(setdiff(c(obs_early, obs_post), dose_times)))

d_dose <- pop |>
  tidyr::crossing(TIME = dose_times) |>
  mutate(
    AMT  = 800,
    EVID = 1,
    CMT  = 1L,
    RATE = 800,  # 1-h infusion (mg/h)
    DV   = NA_real_
  )

d_obs <- pop |>
  tidyr::crossing(TIME = obs_times) |>
  mutate(
    AMT  = 0,
    EVID = 0,
    CMT  = 1L,
    RATE = 0,
    DV   = NA_real_
  )

d_sim <- bind_rows(d_dose, d_obs) |>
  arrange(ID, TIME, desc(EVID)) |>
  select(ID, TIME, AMT, EVID, CMT, RATE, DV, WT)

stopifnot(sum(d_sim$EVID == 1) == n_subj * length(dose_times))
```

## Simulation

Two passes: a stochastic simulation with the full IIV and residual error
(for VPC-style plots and NCA), and a typical-value simulation with
`rxode2::zeroRe()` for the reference trajectory.

```{r simulate}
mod <- readModelDb("Long_2017_necitumumab")

set.seed(20170930)
sim_full <- rxode2::rxSolve(mod, events = d_sim) |>
  as.data.frame() |>
  mutate(time_day = time / 24)

mod_typ <- rxode2::zeroRe(mod)
sim_typ <- rxode2::rxSolve(mod_typ, events = d_sim) |>
  as.data.frame() |>
  mutate(time_day = time / 24)
```

## Figure-equivalent 1 — Single-cycle profile (virtual cohort + typical patient)

Long 2017 Figure 2 shows observed concentrations vs. time from the first
infusion across all five studies. The panel below shows the first-cycle
profile (0–21 days) for the virtual cohort overlaid with the
typical-value trajectory.

```{r fig1, fig.width = 7, fig.height = 4}
first_cycle <- sim_full |> filter(time <= cycle_h)
first_cycle_typ  <- sim_typ  |> filter(time <= cycle_h, id == 1)

ggplot() +
  geom_line(
    data = first_cycle, aes(time_day, Cc, group = id),
    colour = "grey70", alpha = 0.3, linewidth = 0.25
  ) +
  geom_line(
    data = first_cycle_typ, aes(time_day, Cc),
    colour = "firebrick", linewidth = 1
  ) +
  scale_y_log10() +
  labs(
    x     = "Time since first dose (days)",
    y     = "Necitumumab concentration (mg/L)",
    title = "First SQUIRE cycle — virtual cohort vs typical 70 kg patient",
    caption = "Long 2017 Figure 2-equivalent; 800 mg IV 1-h infusion, days 1 and 8"
  ) +
  theme_bw()
```

## Figure-equivalent 2 — Steady-state trough across four cycles

Long 2017 reports that steady state is reached within three to four
cycles and that the phase III 800 mg regimen produces trough
concentrations that exceed the preclinical 40 mg/L threshold. The plot
below shows simulated pre-dose and end-of-cycle trough concentrations
across four cycles with the 40 mg/L threshold marked.

```{r fig2, fig.width = 7, fig.height = 4}
trough_times <- sort(unique(c(dose_times, dose_times + 21 * 24 - 1)))
trough_times <- trough_times[trough_times <= tmax_h]

trough <- sim_full |>
  filter(time %in% trough_times) |>
  mutate(time_day = time / 24)

trough_summary <- trough |>
  group_by(time_day) |>
  summarise(
    Q05 = quantile(Cc, 0.05, na.rm = TRUE),
    Q50 = quantile(Cc, 0.50, na.rm = TRUE),
    Q95 = quantile(Cc, 0.95, na.rm = TRUE),
    .groups = "drop"
  )

ggplot(trough_summary, aes(time_day, Q50)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), fill = "steelblue", alpha = 0.25) +
  geom_line(linewidth = 0.8) +
  geom_hline(yintercept = 40, linetype = "dashed", colour = "firebrick") +
  annotate(
    "text", x = 5, y = 45,
    label = "Preclinical target 40 mg/L",
    colour = "firebrick", hjust = 0, size = 3
  ) +
  labs(
    x     = "Time since first dose (days)",
    y     = "Necitumumab concentration (mg/L)",
    title = "Simulated necitumumab trough/peak profile over 4 SQUIRE cycles",
    caption = "Long 2017 Figure 4-equivalent; 800 mg IV days 1 and 8 of 21-day cycle"
  ) +
  theme_bw()
```

## PKNCA validation over the final (cycle 4) dosing interval

Run NCA on the final 21-day cycle and compare simulated V~ss~ and CL~tot~
against the published typical-patient steady-state values (6.97 L and
0.0141 L/h, from the Long 2017 Results narrative).

The PKNCA formula includes a treatment grouping variable so the summary
rolls up per regimen, per the library's PKNCA-recipe convention.

```{r pknca}
ss_start <- dose_times[length(dose_times) - 1]  # start of cycle 4 = day 1 of cycle 4
ss_end   <- ss_start + 21 * 24                  # end of 21-day cycle

sim_nca <- sim_full |>
  filter(!is.na(Cc), time >= ss_start, time <= ss_end) |>
  transmute(
    id        = id,
    time      = time,
    Cc        = Cc,
    treatment = "800 mg IV days 1 and 8 q3w"
  )

dose_nca <- d_sim |>
  filter(EVID == 1, TIME >= ss_start, TIME <= ss_end) |>
  transmute(
    id        = ID,
    time      = TIME,
    amt       = AMT,
    treatment = "800 mg IV days 1 and 8 q3w"
  )

conc_obj <- PKNCA::PKNCAconc(sim_nca, Cc ~ time | treatment + id)
dose_obj <- PKNCA::PKNCAdose(dose_nca, amt ~ time | treatment + id)

intervals <- data.frame(
  start     = ss_start,
  end       = ss_end,
  cmax      = TRUE,
  tmax      = TRUE,
  cmin      = TRUE,
  auclast   = TRUE,
  cav       = TRUE,
  half.life = TRUE
)

res <- PKNCA::pk.nca(PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals))

nca_summary <- as.data.frame(res$result) |>
  filter(PPTESTCD %in% c("cmax", "tmax", "cmin", "auclast", "cav", "half.life")) |>
  group_by(PPTESTCD) |>
  summarise(
    median = stats::median(PPORRES, na.rm = TRUE),
    p05    = stats::quantile(PPORRES, 0.05, na.rm = TRUE),
    p95    = stats::quantile(PPORRES, 0.95, na.rm = TRUE),
    .groups = "drop"
  )
nca_summary
```

## Comparison against the published steady-state values

```{r compare}
# Derived steady-state quantities from the simulation.
sim_cav <- nca_summary |>
  filter(PPTESTCD == "cav") |>
  pull(median)

# Total cycle dose = 1600 mg over 504 h. CLtot,ss approximated as dose / AUCtau.
auclast_ss <- nca_summary |>
  filter(PPTESTCD == "auclast") |>
  pull(median)
cycle_dose_mg <- 2 * 800
cltot_sim <- cycle_dose_mg / auclast_ss

# V1 + V2 at typical 70 kg patient (model file default).
vss_typ <- 3.41 + 3.29

comparison <- tibble::tribble(
  ~metric,                                   ~published, ~simulated, ~units,
  "Vss (typical)",                           6.97,       vss_typ,    "L",
  "CLtot at steady state (median)",          0.0141,     cltot_sim,  "L/h",
  "Trough at end of cycle 4 >= 40 mg/L?",    1,          as.numeric(nca_summary$median[nca_summary$PPTESTCD == "cmin"] >= 40), "(1 = yes)"
)
comparison
```

Interpretation: the simulated V~ss~ and CL~tot~ both fall within ~10%
of the published typical-patient values (6.97 L and 0.0141 L/h). The
simulated median trough at the end of cycle 4 is comfortably above the
preclinical 40 mg/L target concentration reported by Long 2017. The
paper itself does not tabulate a formal NCA; the comparison above is
therefore against the narrative-reported typical-patient steady-state
parameters rather than a published NCA table.

## Assumptions and deviations

- **NCA on a simulated dataset.** Long 2017 does not publish an NCA
  table. The simulated `cmax`, `cmin`, `auclast`, `cav`, and `half.life`
  therefore serve as internal consistency checks and a comparison to
  the narrative-reported typical-patient V~ss~ and CL~tot,ss~ rather
  than a head-to-head against a published NCA.
- **Time-varying weight.** Long 2017 used last-observation-carried-forward
  imputation for missing weight values and treated weight as
  time-varying in the NONMEM analysis. This vignette uses a time-fixed
  baseline weight per virtual subject; weight drift over the 12-week
  simulation window is a second-order effect relative to the 0.498 /
  0.768 covariate exponents and the 55% CV on V~2~.
- **Below-LOQ handling.** The source analysis excluded 184 BLQ samples
  as missing. The simulation returns predicted concentrations at every
  observation time regardless of an assay quantification limit.
- **Dose escalation and phase I cohorts.** The virtual cohort only
  simulates the phase III 800 mg days-1-and-8-q3w SQUIRE regimen.
  Phase I and phase II dose-ranging cohorts (e.g., weekly and q2w
  schedules, 600 mg cohorts) are not reproduced here.
- **Concomitant chemotherapy.** The Long 2017 paper found no effect of
  concomitant gemcitabine or cisplatin on the PK; this vignette
  therefore does not carry a chemotherapy indicator covariate.
- **ADA / immunogenicity.** Anti-drug antibody status was not retained
  as a covariate in the final model and is not simulated.
- **IIV placement on CL~tot~.** Long 2017 places a single eta on total
  clearance CL~tot~ = CL + V~max~/(C+K~m~). In the packaged model file
  this is implemented by applying the same `etalcl` eta to both the
  linear CL and V~max~ typical values; the composite then varies
  exponentially as a whole (28.8% CV) and matches the published
  parameterization exactly.

## Reference

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