---
title: "Capecitabine population PK (Blesch 2003)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Capecitabine population PK (Blesch 2003)}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4.5)
library(nlmixr2lib)
library(PKNCA)
library(rxode2)
library(dplyr)
library(tidyr)
library(ggplot2)
```

# Model and source

* Citation: Blesch KS, Gieschke R, Tsukamoto Y, Reigner BG, Burger HU, Steimer
  JL. Clinical pharmacokinetic/pharmacodynamic and physiologically based
  pharmacokinetic modeling in new drug development: the capecitabine
  experience. *Invest New Drugs.* 2003;21(2):195-223.
* Article: <https://doi.org/10.1023/A:1023525513696>
* PMID: 12889740.

This vignette validates the population PK model named "CAP7440" in the
Blesch 2003 review. Capecitabine is converted in sequential steps through
5'-DFCR -> 5'-DFUR -> 5-FU -> FUH2 -> FUPA -> FBAL; the published model
fits three of these plasma analytes simultaneously: 5'-DFUR
(5'-deoxy-5-fluorouridine), 5-FU (5-fluorouracil), and FBAL
(alpha-fluoro-beta-alanine). Parent capecitabine and the first metabolite
5'-DFCR are not carried as compartments. Mass enters the 5'-DFUR pool
directly through an absorption rate constant KA with lag TLAG; from there,
sequential first-order kinetics on three apparent oral clearances (CL1/F,
CL2/F, CL3/F) and apparent volumes (V1/F, V2/F, V3/F) carry the drug
through 5-FU and into FBAL.

The Blesch 2003 review also reports a physiologically based PK (PBPK)
model for the same cascade, but the PBPK parameter values are referenced
from a separate publication (Tsukamoto et al. 2001, reference [30] in
Blesch 2003) and are not tabulated in the Blesch review itself; the PBPK
model is therefore out of scope for this nlmixr2lib extraction. Only the
fittable popPK model CAP7440 is reproduced here.

# Population

The model was developed on plasma concentration data from 481 patients
with advanced or metastatic colorectal cancer (two identical Phase III
studies; Hoff 2001 and Van Cutsem 2001 -- references [10] and [11] in
Blesch 2003) plus 24 patients with extensive sampling from a Phase I
bioequivalence study (Reigner 1998, reference [12]). Capecitabine
1250 mg/m^2 BID was given in 3-week cycles (2 weeks on, 1 week off) in
the Phase III studies; PK sampling occurred on the first day of treatment
cycles 2 and 4. Across the three studies, 90% of patients received
between 1650 and 2300 mg per dose (Methods: page describing model
development).

Baseline covariates screened for inclusion were gender, race, age, body
weight, body surface area (BSA), creatinine clearance (CLCR), liver
metastasis status, Karnofsky performance status, albumin, alkaline
phosphatase (ALP), AST, ALT, total bilirubin, and most-recent total
bilirubin. Only three retained the >10% individual-deviation and
p < 0.001 backwards-deletion criteria: ALP on apparent 5-FU clearance,
CLCR on apparent FBAL clearance and volume, and BSA on apparent FBAL
volume. **The Blesch 2003 review does not tabulate baseline demographic
distributions** (numeric medians / ranges live in the Phase III source
publications [10] and [11]); the same is true of the centering values
used in the multiplicative covariate model. See the Assumptions and
deviations section below.

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

# Source trace

The per-parameter origin is recorded as an in-file comment next to each
`ini()` entry in `inst/modeldb/specificDrugs/Blesch_2003_capecitabine.R`.
The table below collects them in one place.

| Equation / parameter | Value                       | Source location                                            |
|----------------------|-----------------------------|------------------------------------------------------------|
| `lka`                | log(1.09 1/h)               | Table 1 row KA (TV 1.09)                                   |
| `ltlag`              | log(5.52e-4 h)              | Table 1 row TLAG (TV 5.52E-4)                              |
| `lvc_dfur`           | log(90.6 L)                 | Table 1 row V1 (TV 90.6)                                   |
| `lcl_dfur`           | log(75.8 L/h)               | Table 1 row CL1 (TV 75.8)                                  |
| `lvc_5fu` FIXED      | log(17.8 L)                 | Table 1 row V2 (TV 17.8 FIXED; literature Heggie 1987)     |
| `lcl_5fu`            | log(1190 L/h)               | Table 1 row CL2 (TV 1190)                                  |
| `lvc_fbal`           | log(73.6 L)                 | Table 1 row V3 (TV 73.6)                                   |
| `lcl_fbal`           | log(27.5 L/h)               | Table 1 row CL3 (TV 27.5)                                  |
| `e_alp_cl_5fu`       | -0.169                      | Table 1 row APHCL2 (-0.169); Table 2 effect description    |
| `e_crcl_cl_fbal`     | +0.615                      | Table 1 row CLRCL3 (+0.615); Table 2 effect description    |
| `e_crcl_vc_fbal`     | +0.394                      | Table 1 row CLRV3 (+0.394); Table 2 effect description     |
| `e_bsa_vc_fbal`      | +0.812                      | Table 1 row BSAV3 (+0.812); Table 2 effect description     |
| `etalka`             | omega^2 = 0.39878           | Table 1 row "KA ISV %" (70% -> log(1+0.70^2))              |
| `etaltlag`           | omega^2 = 12.41             | Table 1 row "TLAG ISV %" (49,498% -> log(1+494.98^2))      |
| `etalvc_dfur` FIXED  | omega^2 = 0.08618           | Table 1 row "V1 ISV %" (30% FIXED -> log(1+0.30^2))        |
| `etalcl_dfur`        | omega^2 = 0.05598           | Table 1 row "CL1 ISV %" (24% -> log(1+0.24^2))             |
| `etalcl_5fu`         | omega^2 = 0.10336           | Table 1 row "CL2 ISV %" (33% -> log(1+0.33^2))             |
| `etalvc_fbal`        | omega^2 = 0.06537           | Table 1 row "V3 ISV %" (26% -> log(1+0.26^2))              |
| `etalcl_fbal`        | omega^2 = 0.09751           | Table 1 row "CL3 ISV %" (32% -> log(1+0.32^2))             |
| `propSd_dfur`        | 0.39                        | Table 1 row "Res. Error 5'-DFUR" (39% extensive)           |
| `propSd_5fu`         | 0.58                        | Table 1 row "Res. Error 5-FU" (58% extensive)              |
| `propSd_fbal`        | 0.34                        | Table 1 row "Res. Error FBAL" (34% extensive)              |
| `d/dt(depot)`        | -ka * depot                 | Page describing the structural model differential equations (Figure 6) |
| `d/dt(central_dfur)` | ka*depot - kel_dfur*central_dfur                | Figure 6 (sequential mass transfer)    |
| `d/dt(central_5fu)`  | kel_dfur*central_dfur - kel_5fu*central_5fu     | Figure 6                               |
| `d/dt(central_fbal)` | kel_5fu*central_5fu - kel_fbal*central_fbal     | Figure 6                               |
| `Cc_dfur`            | central_dfur / vc_dfur      | Figure 6 (apparent volume convention)                      |
| `Cc_5fu`             | central_5fu  / vc_5fu       | Figure 6                                                   |
| `Cc_fbal`            | central_fbal / vc_fbal      | Figure 6                                                   |

# Virtual cohort

Original observed data are not publicly available. The cohort below uses
a small virtual population (50 subjects) whose BSA distribution brackets
the Phase III dosing convention (1250 mg/m^2 BID -> per-patient dose
1250 * BSA mg). Baseline ALP, CRCL, and BSA distributions are sampled
from log-normal distributions centred on the reference values declared in
the model file (`ALP = 100 U/L`, `CRCL = 80 mL/min/1.73 m^2`,
`BSA = 1.73 m^2`); these are the working centering values used because
the Blesch review does not state the actual cohort medians (see Errata).
A single oral capecitabine dose is given at time 0 (replicating the
single-dose Phase I bioequivalence experiment that anchored the
structural model, Figure 2 of the source paper).

```{r cohort}
set.seed(20030723)  # PMID 12889740 date
n_subj <- 50L

subj <- tibble::tibble(
  id   = seq_len(n_subj),
  BSA  = round(pmin(pmax(rlnorm(n_subj, meanlog = log(1.73), sdlog = 0.12), 1.30), 2.20), 2),
  CRCL = round(pmin(pmax(rlnorm(n_subj, meanlog = log(80),   sdlog = 0.30), 30),   140),  1),
  ALP  = round(pmin(pmax(rlnorm(n_subj, meanlog = log(100),  sdlog = 0.45), 40),   500),  0)
)

# Per-patient dose: 1250 mg/m^2 x BSA m^2 = mg.
subj <- subj |> dplyr::mutate(dose_mg = round(1250 * BSA, 1))

obs_times <- seq(0.05, 24, by = 0.25)

make_one_subject <- function(row) {
  ev <- rxode2::et(amt = row$dose_mg, cmt = "depot", time = 0)
  ev <- rxode2::et(ev, time = obs_times, cmt = "Cc_dfur")
  ev <- as.data.frame(ev)
  ev$id   <- row$id
  ev$ALP  <- row$ALP
  ev$CRCL <- row$CRCL
  ev$BSA  <- row$BSA
  ev
}

events <- do.call(
  rbind,
  lapply(seq_len(nrow(subj)), function(i) make_one_subject(subj[i, ]))
)
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))
```

# Simulation

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

sim <- rxode2::rxSolve(
  mod,
  events = events,
  keep   = c("ALP", "CRCL", "BSA")
) |>
  as.data.frame()
```

For deterministic replication of typical-value profiles (Figure 2 of the
source paper shows mean plasma concentration time profiles after a single
1250 mg/m^2 dose in 25 patients), zero out the random effects and solve a
single typical-value patient at the centering covariate values.

```{r simulate-typical}
mod_typ <- mod |> rxode2::zeroRe()
events_typ <- {
  ev <- rxode2::et(amt = 1250 * 1.73, cmt = "depot", time = 0)
  ev <- rxode2::et(ev, time = obs_times, cmt = "Cc_dfur")
  ev <- as.data.frame(ev)
  ev$id   <- 1L
  ev$ALP  <- 100
  ev$CRCL <- 80
  ev$BSA  <- 1.73
  ev
}
sim_typ <- rxode2::rxSolve(mod_typ, events = events_typ) |>
  as.data.frame()
```

# Replicate published figures

## Figure 2 -- mean plasma concentration time profiles

Replicates Figure 2 of Blesch 2003. The paper's Figure 2 shows mean plasma
concentrations for capecitabine and four metabolites after a single
1250 mg/m^2 oral dose in 25 patients; the popPK model included only three
of these analytes (5'-DFUR, 5-FU, FBAL). The simulation below shows the
typical-value (zeroRe) prediction overlaid with a stochastic VPC median
and 5-95th percentile band from the 50-subject virtual cohort.

```{r figure-2}
sim_long <- sim |>
  dplyr::filter(time > 0) |>
  dplyr::select(id, time, Cc_dfur, Cc_5fu, Cc_fbal) |>
  tidyr::pivot_longer(
    cols      = c(Cc_dfur, Cc_5fu, Cc_fbal),
    names_to  = "analyte",
    values_to = "conc"
  ) |>
  dplyr::mutate(analyte = factor(
    analyte,
    levels = c("Cc_dfur", "Cc_5fu", "Cc_fbal"),
    labels = c("5'-DFUR", "5-FU", "FBAL")
  ))

vpc_summary <- sim_long |>
  dplyr::group_by(time, analyte) |>
  dplyr::summarise(
    Q05 = quantile(conc, 0.05, na.rm = TRUE),
    Q50 = quantile(conc, 0.50, na.rm = TRUE),
    Q95 = quantile(conc, 0.95, na.rm = TRUE),
    .groups = "drop"
  )

typ_long <- sim_typ |>
  dplyr::filter(time > 0) |>
  dplyr::select(time, Cc_dfur, Cc_5fu, Cc_fbal) |>
  tidyr::pivot_longer(
    cols      = c(Cc_dfur, Cc_5fu, Cc_fbal),
    names_to  = "analyte",
    values_to = "conc"
  ) |>
  dplyr::mutate(analyte = factor(
    analyte,
    levels = c("Cc_dfur", "Cc_5fu", "Cc_fbal"),
    labels = c("5'-DFUR", "5-FU", "FBAL")
  ))

ggplot(vpc_summary, aes(time, Q50)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.20, fill = "steelblue") +
  geom_line(colour = "steelblue") +
  geom_line(
    data    = typ_long,
    mapping = aes(time, conc),
    colour  = "black",
    linetype = "dashed"
  ) +
  facet_wrap(~analyte, scales = "free_y") +
  scale_y_log10() +
  labs(
    x       = "Time after dose (h)",
    y       = "Plasma concentration (ug/mL)",
    title   = "Figure 2 replication -- 5'-DFUR / 5-FU / FBAL mean plasma profiles",
    caption = "Solid line / ribbon: stochastic VPC median (5-95 percentile, 50 virtual patients) at 1250 mg/m^2.\nDashed line: typical-value (zeroRe) prediction at the centering covariates."
  )
```

## Covariate sensitivity -- Table 2 reproduction

Blesch 2003 Table 2 reports the effects of multiplicative changes in
ALP, CRCL, and BSA on the typical-value PK parameters and on systemic
exposure. We reproduce the table here from the model file's covariate
exponents and compare against the paper's percentages.

```{r table-2}
# Compute simulated changes for the typical patient under each Table 2
# scenario. The reference (centering) covariates are the values declared
# in the model file: ALP = 100, CRCL = 80, BSA = 1.73.
make_scenario <- function(label, ALP, CRCL, BSA) {
  ev <- rxode2::et(amt = 1250 * 1.73, cmt = "depot", time = 0)
  ev <- rxode2::et(ev, time = obs_times, cmt = "Cc_dfur")
  ev <- as.data.frame(ev)
  ev$id   <- 1L
  ev$ALP  <- ALP
  ev$CRCL <- CRCL
  ev$BSA  <- BSA
  sim_s <- rxode2::rxSolve(mod_typ, events = ev) |> as.data.frame()
  tibble::tibble(
    scenario = label,
    auc_5fu  = pracma::trapz(sim_s$time, sim_s$Cc_5fu),
    auc_fbal = pracma::trapz(sim_s$time, sim_s$Cc_fbal),
    cmax_fbal = max(sim_s$Cc_fbal, na.rm = TRUE)
  )
}
if (!requireNamespace("pracma", quietly = TRUE)) {
  # Simple trapezoidal helper as a fallback
  pracma_trapz <- function(x, y) sum(diff(x) * (head(y, -1) + tail(y, -1)) / 2)
} else {
  pracma_trapz <- pracma::trapz
}

# Re-implement using the fallback uniformly.
make_scenario <- function(label, ALP, CRCL, BSA) {
  ev <- rxode2::et(amt = 1250 * 1.73, cmt = "depot", time = 0)
  ev <- rxode2::et(ev, time = obs_times, cmt = "Cc_dfur")
  ev <- as.data.frame(ev)
  ev$id   <- 1L
  ev$ALP  <- ALP
  ev$CRCL <- CRCL
  ev$BSA  <- BSA
  sim_s <- rxode2::rxSolve(mod_typ, events = ev) |> as.data.frame()
  tibble::tibble(
    scenario  = label,
    auc_5fu   = pracma_trapz(sim_s$time, sim_s$Cc_5fu),
    auc_fbal  = pracma_trapz(sim_s$time, sim_s$Cc_fbal),
    cmax_fbal = max(sim_s$Cc_fbal, na.rm = TRUE)
  )
}

scenarios <- dplyr::bind_rows(
  make_scenario("Reference (ALP=100, CRCL=80, BSA=1.73)", 100, 80,   1.73),
  make_scenario("ALP x 2 (200)",                          200, 80,   1.73),
  make_scenario("ALP x 5 (500)",                          500, 80,   1.73),
  make_scenario("CRCL x 0.5 (40)",                        100, 40,   1.73),
  make_scenario("BSA x 1.3 (2.249)",                      100, 80,   2.249)
)

ref <- scenarios[1, ]
sens <- scenarios |>
  dplyr::mutate(
    pct_change_5fu_auc   = round(100 * (auc_5fu   / ref$auc_5fu   - 1), 1),
    pct_change_fbal_auc  = round(100 * (auc_fbal  / ref$auc_fbal  - 1), 1),
    pct_change_fbal_cmax = round(100 * (cmax_fbal / ref$cmax_fbal - 1), 1)
  ) |>
  dplyr::select(scenario,
                `5-FU AUC % change` = pct_change_5fu_auc,
                `FBAL AUC % change` = pct_change_fbal_auc,
                `FBAL Cmax % change` = pct_change_fbal_cmax)

knitr::kable(
  sens,
  caption = "Simulated covariate sensitivity. Compare against Blesch 2003 Table 2: ALP x 2 -> +12% 5-FU AUC; ALP x 5 -> +31%; CRCL x 0.5 -> +53% FBAL AUC and +41% FBAL Cmax; BSA x 1.3 -> -19% FBAL Cmax."
)
```

# PKNCA validation

PKNCA is run separately for each of the three analytes. The treatment
grouping variable is `analyte` (one entry per analyte) so per-analyte NCA
summaries can be compared head-to-head.

```{r pknca-dfur}
sim_nca_dfur <- sim |>
  dplyr::filter(!is.na(Cc_dfur)) |>
  dplyr::transmute(id, time, Cc = Cc_dfur, treatment = "5'-DFUR")

# Time-zero anchor (extravascular Cc=0 before dose).
sim_nca_dfur <- dplyr::bind_rows(
  sim_nca_dfur,
  sim_nca_dfur |> dplyr::distinct(id, treatment) |>
    dplyr::mutate(time = 0, Cc = 0)
) |>
  dplyr::distinct(id, treatment, time, .keep_all = TRUE) |>
  dplyr::arrange(id, treatment, time)

dose_df <- events |>
  dplyr::filter(evid == 1) |>
  dplyr::transmute(id, time, amt, treatment = "5'-DFUR")

conc_obj_dfur <- PKNCA::PKNCAconc(
  sim_nca_dfur, Cc ~ time | treatment + id,
  concu = "ug/mL", timeu = "h"
)
dose_obj_dfur <- PKNCA::PKNCAdose(
  dose_df, amt ~ time | treatment + id,
  doseu = "mg"
)

intervals <- data.frame(
  start       = 0,
  end         = Inf,
  cmax        = TRUE,
  tmax        = TRUE,
  aucinf.obs  = TRUE,
  half.life   = TRUE
)

nca_dfur <- PKNCA::pk.nca(PKNCA::PKNCAdata(conc_obj_dfur, dose_obj_dfur,
                                           intervals = intervals))
knitr::kable(summary(nca_dfur),
             caption = "5'-DFUR simulated NCA (single oral dose, 1250 mg/m^2).")
```

```{r pknca-5fu}
sim_nca_5fu <- sim |>
  dplyr::filter(!is.na(Cc_5fu)) |>
  dplyr::transmute(id, time, Cc = Cc_5fu, treatment = "5-FU")

sim_nca_5fu <- dplyr::bind_rows(
  sim_nca_5fu,
  sim_nca_5fu |> dplyr::distinct(id, treatment) |>
    dplyr::mutate(time = 0, Cc = 0)
) |>
  dplyr::distinct(id, treatment, time, .keep_all = TRUE) |>
  dplyr::arrange(id, treatment, time)

dose_df_5fu <- dose_df |> dplyr::mutate(treatment = "5-FU")
conc_obj_5fu <- PKNCA::PKNCAconc(
  sim_nca_5fu, Cc ~ time | treatment + id,
  concu = "ug/mL", timeu = "h"
)
dose_obj_5fu <- PKNCA::PKNCAdose(
  dose_df_5fu, amt ~ time | treatment + id,
  doseu = "mg"
)
nca_5fu <- PKNCA::pk.nca(PKNCA::PKNCAdata(
  conc_obj_5fu, dose_obj_5fu, intervals = intervals
))
knitr::kable(summary(nca_5fu),
             caption = "5-FU simulated NCA.")
```

```{r pknca-fbal}
sim_nca_fbal <- sim |>
  dplyr::filter(!is.na(Cc_fbal)) |>
  dplyr::transmute(id, time, Cc = Cc_fbal, treatment = "FBAL")

sim_nca_fbal <- dplyr::bind_rows(
  sim_nca_fbal,
  sim_nca_fbal |> dplyr::distinct(id, treatment) |>
    dplyr::mutate(time = 0, Cc = 0)
) |>
  dplyr::distinct(id, treatment, time, .keep_all = TRUE) |>
  dplyr::arrange(id, treatment, time)

dose_df_fbal <- dose_df |> dplyr::mutate(treatment = "FBAL")
conc_obj_fbal <- PKNCA::PKNCAconc(
  sim_nca_fbal, Cc ~ time | treatment + id,
  concu = "ug/mL", timeu = "h"
)
dose_obj_fbal <- PKNCA::PKNCAdose(
  dose_df_fbal, amt ~ time | treatment + id,
  doseu = "mg"
)
nca_fbal <- PKNCA::pk.nca(PKNCA::PKNCAdata(
  conc_obj_fbal, dose_obj_fbal, intervals = intervals
))
knitr::kable(summary(nca_fbal),
             caption = "FBAL simulated NCA.")
```

## Comparison against published exposures

Blesch 2003 does not tabulate population mean / median NCA values
directly; Figure 2 shows mean plasma concentration time curves at
1250 mg/m^2 but the AUC and Cmax point estimates per analyte are not
listed in the review text. As a sanity check we compare the simulated
typical-value (zeroRe) AUC against the analytic apparent-clearance
identity `AUC_inf = Dose / CL_x_apparent` and the simulated typical-value
Cmax against direct calculation from the time grid.

```{r analytic-check}
dose_mg <- 1250 * 1.73

analytic <- tibble::tibble(
  Analyte           = c("5'-DFUR", "5-FU", "FBAL"),
  `AUC_inf analytic (ug*h/mL)` =
    c(dose_mg / 75.8, dose_mg / 1190, dose_mg / 27.5),
  `AUC_inf simulated typical (ug*h/mL)` =
    c(
      pracma_trapz(sim_typ$time, sim_typ$Cc_dfur),
      pracma_trapz(sim_typ$time, sim_typ$Cc_5fu),
      pracma_trapz(sim_typ$time, sim_typ$Cc_fbal)
    ),
  `Cmax simulated typical (ug/mL)` =
    c(max(sim_typ$Cc_dfur), max(sim_typ$Cc_5fu), max(sim_typ$Cc_fbal))
)

knitr::kable(
  analytic,
  digits = c(0, 2, 2, 3),
  caption = "Analytic AUC = Dose / CL_x_apparent vs simulated typical-value AUC (single 2162.5 mg oral dose). The simulated AUC was integrated over 0-24 h on the simulation time grid, so it underestimates AUC_inf for the slowly-eliminated FBAL whose terminal phase extends beyond 24 h."
)
```

# Assumptions and deviations

- **Covariate centering values are not paper-derived.** Blesch 2003 does
  not tabulate the population's baseline medians for ALP, CRCL, or BSA
  (those numeric distributions live in the cited Phase III source
  publications, Hoff 2001 [10] and Van Cutsem 2001 [11], which are not
  on disk for this extraction). The model file declares ALP = 100 U/L,
  CRCL = 80 mL/min/1.73 m^2, BSA = 1.73 m^2 as the centering values
  applied in the multiplicative power covariate effects on CL2/F, CL3/F,
  and V3/F. These are clinically reasonable medians for an
  advanced-colorectal-cancer cohort but are not from the source paper
  itself. Users wishing to centre on a different reference need only
  redivide the covariate column by their preferred reference value
  (the effect coefficients -0.169 / +0.615 / +0.394 / +0.812 are
  paper-derived from Table 1 and do not depend on the centering choice).
- **CRCL assay assumption.** Blesch 2003 names the covariate "CLCR"
  without stating the renal-function assay used; era-typical for cancer
  popPK is Cockcroft-Gault in raw mL/min. We register the covariate as
  `CRCL` (canonical, mL/min/1.73 m^2) for naming consistency with the
  rest of nlmixr2lib, but downstream users who feed raw mL/min CrCl
  values into the model should be aware of the implicit BSA
  normalisation in the reference.
- **TLAG and its inter-individual variability are essentially
  unidentified.** Table 1 reports TV TLAG = 5.52e-4 h (about 2 seconds)
  with an ISV of 49,498% CV (omega^2 ~ 12.4) -- the absorption lag
  parameter and its variance were both estimated but the magnitudes
  indicate the data did not constrain them. The Blesch 2003 text
  describes the lag as having "turned out to be the most adequate"
  among the absorption models tested but the actual numeric values are
  not biologically meaningful. The model file encodes the published
  values verbatim; simulations should use `zeroRe()` for typical-value
  plotting (as done above) or pre-clamp the TLAG random effect to a
  reasonable magnitude (e.g. CV <= 100%) for stochastic VPCs.
- **Inter-occasion variability on KA and TLAG is not represented.** The
  Phase II breast-cancer cohort (Reigner 1999 [20]) supported the
  inclusion of an IOV term on both KA and TLAG (363-unit OFV drop). The
  static nlmixr2 model file does not represent IOV; downstream users
  that need cycle-to-cycle absorption variability should add an
  occasion-specific eta in their simulation harness.
- **Residual-error correlation (0.77) between 5'-DFUR and 5-FU is not
  encoded.** Table 1 reports the correlation between residual epsilons
  for 5'-DFUR and 5-FU as 0.77 (SE 0.0435). nlmixr2's residual-error
  syntax in `model()` does not directly support cross-output residual
  covariances, so the three proportional SDs (`propSd_dfur`,
  `propSd_5fu`, `propSd_fbal`) are independent here. The impact is on
  individual-level prediction intervals (the published model treats
  consecutive metabolite measurements as having correlated noise);
  population-level predictions are unaffected.
- **Extensive-sampling residual error chosen as the primary value.**
  Table 1 reports a two-level residual error per analyte
  (extensive / sparse): 39%/51% for 5'-DFUR, 58%/76% for 5-FU,
  34%/44% for FBAL. The model file uses the extensive-sampling estimates
  (the typical case for any density-rich dataset); users running
  sparse-sample-only simulations may wish to substitute the higher
  sparse values in their workflow.
- **FBAL residual via tau parameterisation.** Blesch 2003 estimated the
  FBAL residual variance as sigma_3^2 = (tau * sigma_dfur)^2 with
  tau = 0.767 (SE 0.121) fixed-effects parameter. The model file
  encodes the resulting %CV (34% extensive) directly rather than the
  derivation through tau; the directly tabulated 34% from Table 1 is
  used as the authoritative value (the implied 0.767 * 0.39 = 30%
  shows a small discrepancy with the table that is likely either
  rounding or a separate residual-variance baseline used during
  estimation).
- **5-FU volume V2 fixed at 17.8 L from external literature.** Table 1
  marks V2 as "TV fixed, no ISV" and the text identifies the value as
  literature (Heggie 1987). No ISV is estimated for V2; the
  identifiability sensitivity analysis showed V2 was not informative for
  the model, so a literature-derived fixed value is used.
- **PBPK model out of scope.** Blesch 2003 also describes a five-organ
  PBPK model (GI, blood, liver, tumour, non-eliminating tissues) for
  capecitabine + the three downstream-of-5'-DFCR metabolites. The PBPK
  parameter values are referenced from Tsukamoto et al. 2001 [reference
  30 in Blesch 2003] which is not on disk for this extraction, and the
  PBPK section of Blesch 2003 itself reports parameter values only in
  narrative form rather than in a tabulated form suitable for
  extraction. Only the popPK model "CAP7440" (Table 1) is implemented
  here. The conceptual simulations, Phase I logistic-regression DLT
  models, and the Phase III concentration-effect analyses are likewise
  out of scope for an nlmixr2 popPK extraction.
- **Apparent oral clearance convention.** All clearances and volumes
  are reported as oral apparent values (CL/F, V/F). The model uses
  these directly in the ODEs: a clearance of 1190 L/h on the 5-FU
  compartment means the entire mass flux entering the 5-FU pool from
  5'-DFUR is multiplied by 1190 / V_5-FU per hour, with the implicit
  assumption that the apparent-clearance values absorb both the
  molar-conversion stoichiometry and the upstream bioavailability /
  formation fractions. This is the same convention used in
  Urien_2005_capecitabine and in the parent Blesch et al. NONMEM
  control stream.
