---
title: "Oseltamivir (Kamal 2013)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Oseltamivir (Kamal 2013)}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

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

# Model and source

* Citation: `r rxode2::rxode(readModelDb("Kamal_2013_oseltamivir"))$reference`
* Description: `r rxode2::rxode(readModelDb("Kamal_2013_oseltamivir"))$description`
* Article: <https://doi.org/10.1128/AAC.02438-12>

The model is a joint two-compartment oseltamivir (prodrug, OP) plus
one-compartment oseltamivir carboxylate (OC) population PK model with
direct first-order conversion of OP to OC and full hepatic metabolism
(< 5 % of prodrug eliminated unchanged in urine; OC predominantly
cleared renally by glomerular filtration and tubular secretion). All
clearance and volume terms are apparent (conditioned on the absorbed
fraction F for the prodrug; OC terms are additionally conditioned on
the fraction metabolised to OC, assumed 1). Body weight is a power
covariate on the prodrug CLp/F and on both OC parameters CLm/F and
Vcm/F; creatinine clearance is a power covariate on CLm/F; age is a
linear additive term on Vcm/F. Inter-individual variability is
exponential on all seven structural parameters with two off-diagonal
covariances on the eta scale: (etalcl, etalcl_oselcarb) and (etalvp,
etalvc_oselcarb). Residual error is proportional only for OP (40.5 % CV) and
combined additive plus proportional for OC (14.0 % CV + 17.9 ng/mL).

# Population

Kamal 2013 Table 1 describes a pooled dataset of 390 subjects from 13
clinical trials (8 adult, 4 paediatric, 1 geriatric, and 1 renal
impairment study). The pooled cohort spans age 1 to 78 years (median
21), weight 8 to 115 kg (median 64.5), and creatinine clearance
13.9 to 178 mL/min/1.73 m^2 (median 95.1), with 241 males and 149
females (38.2 % female). Subjects span normal renal function
(N = 297 with CRCL >= 80) through mild (N = 73 with CRCL 50-80),
moderate (N = 19 with CRCL 30-49), and severe (N = 1 with CRCL < 30)
renal dysfunction. Disease state is a mix of healthy volunteers and
naturally / experimentally influenza-infected subjects; no PK
difference between infected and non-infected subjects was detected
(Kamal 2013 Results page 3473).

Subjects received single or repeated oral doses of oseltamivir
ranging from 20 to 1,000 mg; the standard influenza treatment regimen
is 75 mg every 12 hours for 5 days. Paediatric subjects ages 1-12
received 2 mg/kg twice daily by suspension; ages 1-2 received 30 mg
and ages 3-5 received 45 mg as single doses in a healthy-paediatric
sub-study. The analysis dataset contained 3,881 oseltamivir
concentrations and 4,402 OC concentrations (Kamal 2013 Results
page 3471). LLOQs were 1 ng/mL for OP and 8.8 ng/mL for OC; only 3
records below LLOQ were excluded, so no likelihood-based BQL handling
was needed.

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

# Source trace

The per-parameter origin is recorded as an in-file comment next to each
`ini()` entry in
`inst/modeldb/specificDrugs/Kamal_2013_oseltamivir.R`. The table below
collects them in one place for review; all values come from Kamal 2013
Table 2 (final-estimate column).

| Equation / parameter | Value | Source location |
|---|---|---|
| `ka` (OP absorption) | 0.775 1/h | Table 2 row 'ka' (3.74 % SEM) |
| `CLp/F` (OP apparent CL at 70 kg) | 519 L/h | Table 2 row 'CLp/F coefficient' (3.99 % SEM) |
| `Vcp/F` (OP apparent Vc) | 421 L | Table 2 row 'Vcp/F' (6.05 % SEM) |
| `CLd/F` (OP apparent Q) | 120 L/h | Table 2 row 'CLd/F' (4.95 % SEM) |
| `Vp/F` (OP apparent peripheral V) | 2,800 L | Table 2 row 'Vp/F' (7.46 % SEM) |
| `CLm/F` (OC apparent CL at 70 kg, CRCL 95) | 20.7 L/h | Table 2 row 'CLm/F coefficient' (3.36 % SEM) |
| `Vcm/F` (OC apparent V at 70 kg, age 21) | 238 L | Table 2 row 'Vcm/F coefficient' (5.16 % SEM) |
| Power of WT on CLp/F | 0.838 | Table 2 row 'Power of WT' under CLp/F |
| Power of WT on CLm/F | 0.560 | Table 2 row 'Power of WT' under CLm/F |
| Power of CRCL on CLm/F | 0.487 | Table 2 row 'Power of CL CR' |
| Power of WT on Vcm/F | 0.830 | Table 2 row 'Power of WT' under Vcm/F (18.7 % SEM) |
| Linear slope of age on Vcm/F | -2.25 L/year | Table 2 row 'Slope of age' (31.2 % SEM) |
| omega^2(ka) | 30.7 % CV | Table 2 row 'omega^2 for ka' |
| omega^2(CLp/F) | 42.1 % CV | Table 2 row 'omega^2 for CLp/F' |
| omega^2(Vcp/F) | 69.3 % CV | Table 2 row 'omega^2 for Vcp/F' |
| omega^2(CLd/F) | 62.1 % CV | Table 2 row 'omega^2 for CLd/F' |
| omega^2(Vp/F) | 63.7 % CV | Table 2 row 'omega^2 for Vp/F' |
| omega^2(CLm/F) | 38.3 % CV | Table 2 row 'omega^2 for CLm/F' |
| omega^2(Vcm/F) | 65.3 % CV | Table 2 row 'omega^2 for Vcm/F' |
| Cov(CLp/F, CLm/F) | 0.0987 (r^2 = 0.372) | Table 2 row 'Covariance (CLp/F, CLm/F)' |
| Cov(Vp/F, Vcm/F) | 0.218 (r^2 = 0.274) | Table 2 row 'Covariance (Vp/F, Vcm/F)' |
| sigma_CCV(OP) | 40.5 % CV | Table 2 row 'sigma^2 CCV for oseltamivir' |
| sigma_CCV(OC) | 14.0 % CV | Table 2 row 'sigma^2 CCV for OC' |
| sigma_ADD(OC) | 17.9 ng/mL = 0.0179 mg/L | Table 2 row 'sigma^2 ADD for OC' |
| ODE: `d/dt(depot) = -ka * depot` | n/a | Figure 1 schematic (page 3472) |
| ODE: `d/dt(central) = ka * depot - kel * central - k12 * central + k21 * peripheral1` | n/a | Figure 1 schematic; Methods 'Structural model development' page 3471 |
| ODE: `d/dt(peripheral1) = k12 * central - k21 * peripheral1` | n/a | Figure 1 schematic |
| ODE: `d/dt(central_oselcarb) = kel * central - kel_oselcarb * central_oselcarb` | n/a | Figure 1 schematic ('direct conversion of oseltamivir to OC'); Discussion page 3473 ('oseltamivir is completely converted to the OC metabolite') |

# Virtual cohort

Original observed data are not publicly available. Simulations below
use typical-value covariate combinations that match the published
Figure 4 cohorts (deterministic replication), and a 200-subject
stochastic virtual cohort approximating the pooled trial demographics
(Table 1 of the source paper) for the VPC.

```{r mod-load}
set.seed(2013L)
mod <- rxode2::rxode(readModelDb("Kamal_2013_oseltamivir"))
mod_typical <- rxode2::zeroRe(mod)
ref_age  <- 21
ref_wt   <- 70
ref_crcl <- 95
```

# Replicate published figures

## Figure 1 -- Schematic

Kamal 2013 Figure 1 (page 3472) is a schematic of the two-compartment
prodrug plus one-compartment metabolite structure with first-order
absorption and first-order OP -> OC conversion. The structure is
reproduced directly by the ODE block in
`inst/modeldb/specificDrugs/Kamal_2013_oseltamivir.R`.

## Figure 4A -- Renal-impairment impact on OC at steady state

Kamal 2013 Figure 4A (page 3474) plots typical population mean OC
concentration-time profiles at steady state for a 40-year-old, 70 kg
subject receiving the standard influenza-treatment regimen
(75 mg every 12 h for 5 days) at CRCL = 120, 80, 50, and 30
mL/min/1.73 m^2. The paper reports that the CRCL = 30 subject shows
"an approximate 2-fold increase in OC exposure relative to a subject
with normal renal function (CRCL of 120)".

```{r figure-4a, fig.cap = "Replicates Figure 4A of Kamal 2013 (renal-function impact on OC PK at steady state)."}
dose_times <- seq(0, 108, by = 12)  # ten 12-hourly doses over 5 days
obs_times  <- sort(unique(c(seq(0, 132, by = 0.5), dose_times)))

make_typical <- function(id_offset, AGE, WT, CRCL, label) {
  doses <- tibble(
    id = id_offset + 1L, time = dose_times, evid = 1L,
    amt = 75, cmt = "depot"
  )
  obs <- tibble(
    id = id_offset + 1L, time = obs_times, evid = 0L,
    amt = 0, cmt = "Cc"
  )
  bind_rows(doses, obs) |>
    mutate(AGE = AGE, WT = WT, CRCL = CRCL, group = label) |>
    arrange(time, desc(evid))
}

crcl_panels <- bind_rows(
  make_typical(0L,    AGE = 40, WT = 70, CRCL = 120, label = "CRCL 120"),
  make_typical(100L,  AGE = 40, WT = 70, CRCL =  80, label = "CRCL 80"),
  make_typical(200L,  AGE = 40, WT = 70, CRCL =  50, label = "CRCL 50"),
  make_typical(300L,  AGE = 40, WT = 70, CRCL =  30, label = "CRCL 30")
)
stopifnot(!anyDuplicated(unique(crcl_panels[, c("id", "time", "evid")])))

sim_crcl <- rxode2::rxSolve(mod_typical, events = crcl_panels,
                            keep = c("group", "AGE", "WT", "CRCL")) |>
  as.data.frame()

sim_crcl_ss <- sim_crcl |>
  filter(time >= 108, time <= 132) |>
  mutate(t_in_interval = time - 108,
         group = factor(group, levels = c("CRCL 120","CRCL 80","CRCL 50","CRCL 30")))

ggplot(sim_crcl_ss, aes(t_in_interval, Cc_oselcarb, colour = group)) +
  geom_line(linewidth = 0.7) +
  scale_y_continuous(name = "OC concentration (mg/L)") +
  scale_x_continuous(name = "Time after morning dose at steady state (h)",
                     breaks = seq(0, 24, 6)) +
  labs(colour = NULL,
       title = "Figure 4A: typical OC profile at steady state by renal function",
       subtitle = "40-year-old, 70 kg, 75 mg q12h x 5 days") +
  theme_minimal()
```

```{r figure-4a-ratios}
auc24 <- sim_crcl_ss |>
  group_by(group) |>
  summarise(AUC_0_24 = PKNCA::pk.calc.auc(Cc_oselcarb, t_in_interval,
                                          method = "linear"),
            Cmax     = max(Cc_oselcarb),
            .groups = "drop")
ref_120 <- auc24 |> filter(group == "CRCL 120")
auc24 <- auc24 |>
  mutate(AUC_ratio_vs_120 = AUC_0_24 / ref_120$AUC_0_24,
         Cmax_ratio_vs_120 = Cmax / ref_120$Cmax)
knitr::kable(auc24, digits = 3,
             caption = "Simulated steady-state OC AUC0-24 and Cmax for the Figure 4A panels, with ratios versus CRCL 120 (paper reports an ~2-fold increase in OC exposure for CRCL 30 vs 120).")
```

## Figure 4B -- Weight and age impact on OC at steady state

Kamal 2013 Figure 4B (page 3474) plots typical population mean OC
profiles at steady state for 18-year-old and 55-year-old subjects with
CRCL 120, at weights 50, 70, and 90 kg. The paper reports "a 1.38-fold
increase in the maximum OC exposure was predicted as weight increases
from 50 to 90 kg for an 18-year-old subject" and that "the impact of
age was also demonstrated to be negligible as evident by the fact that
the maximal OC exposure increased only 1.08- to 1.17-fold between an
18-year-old and 55-year-old subject across these same weights".

```{r figure-4b, fig.cap = "Replicates Figure 4B of Kamal 2013 (weight and age impact on OC PK at steady state)."}
wt_age_panels <- bind_rows(
  make_typical(1000L, AGE = 18, WT = 50, CRCL = 120, label = "18y, 50 kg"),
  make_typical(1100L, AGE = 18, WT = 70, CRCL = 120, label = "18y, 70 kg"),
  make_typical(1200L, AGE = 18, WT = 90, CRCL = 120, label = "18y, 90 kg"),
  make_typical(1300L, AGE = 55, WT = 50, CRCL = 120, label = "55y, 50 kg"),
  make_typical(1400L, AGE = 55, WT = 70, CRCL = 120, label = "55y, 70 kg"),
  make_typical(1500L, AGE = 55, WT = 90, CRCL = 120, label = "55y, 90 kg")
)
stopifnot(!anyDuplicated(unique(wt_age_panels[, c("id", "time", "evid")])))

sim_wt <- rxode2::rxSolve(mod_typical, events = wt_age_panels,
                          keep = c("group", "AGE", "WT", "CRCL")) |>
  as.data.frame() |>
  mutate(group = factor(group, levels = c(
    "18y, 50 kg","18y, 70 kg","18y, 90 kg",
    "55y, 50 kg","55y, 70 kg","55y, 90 kg")),
    age_band = ifelse(AGE == 18, "18-year-old", "55-year-old"),
    wt_band  = paste0(WT, " kg"))

sim_wt_ss <- sim_wt |>
  filter(time >= 108, time <= 132) |>
  mutate(t_in_interval = time - 108)

ggplot(sim_wt_ss, aes(t_in_interval, Cc_oselcarb, colour = wt_band)) +
  geom_line(linewidth = 0.7) +
  facet_wrap(~ age_band) +
  scale_y_continuous(name = "OC concentration (mg/L)") +
  scale_x_continuous(name = "Time after morning dose at steady state (h)",
                     breaks = seq(0, 24, 6)) +
  labs(colour = "Body weight",
       title = "Figure 4B: typical OC profile by weight and age (CRCL 120)",
       subtitle = "75 mg q12h x 5 days") +
  theme_minimal()
```

```{r figure-4b-ratios}
wt_age_summary <- sim_wt_ss |>
  group_by(age_band, wt_band) |>
  summarise(Cmax = max(Cc_oselcarb),
            AUC_0_24 = PKNCA::pk.calc.auc(Cc_oselcarb, t_in_interval, method = "linear"),
            .groups = "drop")

# Within-age weight ratios (90 kg vs 50 kg).
wt_ratios <- wt_age_summary |>
  select(age_band, wt_band, Cmax) |>
  pivot_wider(names_from = wt_band, values_from = Cmax) |>
  mutate(Cmax_ratio_90_vs_50 = `90 kg` / `50 kg`)

knitr::kable(wt_ratios, digits = 3,
             caption = "Simulated steady-state OC Cmax 90 kg vs 50 kg, by age band. Paper reports 1.38-fold increase across this weight range for an 18-year-old.")

# Within-weight age ratios (55 vs 18 years).
age_ratios <- wt_age_summary |>
  select(age_band, wt_band, Cmax) |>
  pivot_wider(names_from = age_band, values_from = Cmax) |>
  mutate(Cmax_ratio_55_vs_18 = `55-year-old` / `18-year-old`)

knitr::kable(age_ratios, digits = 3,
             caption = "Simulated steady-state OC Cmax 55-year-old vs 18-year-old, by weight band. Paper reports 1.08- to 1.17-fold over the same weight range.")
```

# Stochastic VPC: 200-subject virtual cohort

A 200-subject stochastic cohort spanning the published demographic
range provides a between-subject sanity check on the model. The virtual
cohort distribution approximates Table 1 in spirit but is not a
literal demographic resampling.

```{r vpc-cohort}
n_subj <- 200L

vpc_cov <- tibble(
  id   = seq_len(n_subj),
  AGE  = pmin(pmax(round(rnorm(n_subj, mean = 30, sd = 18)), 1L), 78L),
  WT   = pmin(pmax(round(rnorm(n_subj, mean = 64, sd = 22)), 8L), 115L),
  CRCL = pmin(pmax(round(rnorm(n_subj, mean = 95, sd = 25)), 14L), 178L)
)

vpc_doses <- vpc_cov |>
  tidyr::crossing(time = dose_times) |>
  mutate(evid = 1L, amt = 75, cmt = "depot")

vpc_obs <- vpc_cov |>
  tidyr::crossing(time = obs_times) |>
  mutate(evid = 0L, amt = 0, cmt = "Cc")

vpc_events <- bind_rows(vpc_doses, vpc_obs) |>
  arrange(id, time, desc(evid))
stopifnot(!anyDuplicated(unique(vpc_events[, c("id", "time", "evid")])))

sim_vpc <- rxode2::rxSolve(mod, events = vpc_events,
                           keep = c("AGE","WT","CRCL"), nSub = 1L) |>
  as.data.frame()
```

```{r vpc-figure, fig.cap = "Median and 5-95 percent intervals of simulated OC plasma concentrations at steady state across the 200-subject virtual cohort (75 mg q12h)."}
sim_vpc_ss <- sim_vpc |>
  filter(time >= 108, time <= 132) |>
  mutate(t_in_interval = time - 108) |>
  group_by(t_in_interval) |>
  summarise(Q05_oselcarb = quantile(Cc_oselcarb, 0.05),
            Q50_oselcarb = quantile(Cc_oselcarb, 0.50),
            Q95_oselcarb = quantile(Cc_oselcarb, 0.95),
            Q05_op = quantile(Cc,    0.05),
            Q50_op = quantile(Cc,    0.50),
            Q95_op = quantile(Cc,    0.95),
            .groups = "drop")

vpc_long <- sim_vpc_ss |>
  pivot_longer(-t_in_interval,
               names_to = c(".value","analyte"),
               names_pattern = "Q(\\d+)_(.*)") |>
  rename(Q05 = `05`, Q50 = `50`, Q95 = `95`) |>
  mutate(analyte = factor(analyte, levels = c("op","oc"),
                          labels = c("Oseltamivir (OP)","Oseltamivir carboxylate (OC)")))

ggplot(vpc_long, aes(t_in_interval, Q50)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25, fill = "steelblue") +
  geom_line(colour = "steelblue4", linewidth = 0.7) +
  facet_wrap(~ analyte, scales = "free_y") +
  scale_x_continuous(name = "Time after morning dose at steady state (h)",
                     breaks = seq(0, 24, 6)) +
  scale_y_continuous(name = "Plasma concentration (mg/L)") +
  labs(title = "Stochastic VPC at steady state, 200 virtual subjects") +
  theme_minimal()
```

# PKNCA validation

NCA is run separately for OP and OC on the typical-value Figure 4A
panels (one PKNCA block per analyte; treatment-grouping variable is the
covariate scenario label so per-group AUC and Cmax line up with the
paper's commentary).

```{r pknca-oc}
nca_grid <- sim_crcl |>
  filter(time >= 108, time <= 132) |>
  mutate(time = time - 108)

conc_oselcarb  <- nca_grid |> select(id, time, Cc_oselcarb, group) |>
  rename(Cc = Cc_oselcarb)
dose_oselcarb  <- nca_grid |>
  group_by(id, group) |>
  slice_min(time, n = 1, with_ties = FALSE) |>
  ungroup() |>
  mutate(amt = 75, time = 0) |>
  select(id, time, amt, group)

conc_obj_oselcarb <- PKNCA::PKNCAconc(conc_oselcarb, Cc ~ time | group + id)
dose_obj_oselcarb <- PKNCA::PKNCAdose(dose_oselcarb, amt ~ time | group + id)

intervals_oselcarb <- data.frame(
  start = 0, end = 24,
  cmax = TRUE, tmax = TRUE, auclast = TRUE, half.life = TRUE
)

nca_data_oselcarb <- PKNCA::PKNCAdata(conc_obj_oselcarb, dose_obj_oselcarb, intervals = intervals_oselcarb)
nca_res_oselcarb  <- PKNCA::pk.nca(nca_data_oselcarb)

nca_table_oselcarb <- as.data.frame(nca_res_oselcarb$result) |>
  select(group, PPTESTCD, PPORRES) |>
  pivot_wider(names_from = PPTESTCD, values_from = PPORRES)

knitr::kable(nca_table_oselcarb, digits = 3,
             caption = "Simulated OC NCA parameters across the steady-state 12-hour interval (cmax in mg/L, tmax in h, auclast in mg*h/L, half-life in h).")
```

```{r pknca-op}
conc_op  <- nca_grid |> select(id, time, Cc, group)
conc_obj_op <- PKNCA::PKNCAconc(conc_op, Cc ~ time | group + id)
dose_obj_op <- PKNCA::PKNCAdose(dose_oselcarb, amt ~ time | group + id)

intervals_op <- data.frame(
  start = 0, end = 12,
  cmax = TRUE, tmax = TRUE, auclast = TRUE, half.life = TRUE
)

nca_data_op <- PKNCA::PKNCAdata(conc_obj_op, dose_obj_op, intervals = intervals_op)
nca_res_op  <- PKNCA::pk.nca(nca_data_op)

nca_table_op <- as.data.frame(nca_res_op$result) |>
  select(group, PPTESTCD, PPORRES) |>
  pivot_wider(names_from = PPTESTCD, values_from = PPORRES)

knitr::kable(nca_table_op, digits = 3,
             caption = "Simulated OP NCA parameters across the steady-state 12-hour dosing interval.")
```

## Comparison against published values

The paper does not report NCA parameters in a table; instead it reports
covariate-effect ratios in the Discussion (page 3474). The relevant
benchmarks and the simulated values:

| Comparison | Paper value | Simulated value |
|---|---|---|
| OC AUC at SS, CRCL 30 vs 120 (40 y, 70 kg) | ~2-fold | `r round(auc24$AUC_ratio_vs_120[auc24$group == "CRCL 30"], 2)`-fold |
| OC AUC at SS, CRCL 50 vs 120 (40 y, 70 kg) | not quantified in text | `r round(auc24$AUC_ratio_vs_120[auc24$group == "CRCL 50"], 2)`-fold |
| OC Cmax at SS, WT 90 vs 50 kg (18 y, CRCL 120) | 1.38-fold | `r round(wt_ratios$Cmax_ratio_90_vs_50[wt_ratios$age_band == "18-year-old"], 2)`-fold |
| OC Cmax at SS, 55 y vs 18 y, range across weights | 1.08-1.17-fold | `r sprintf("%.2f-%.2f", min(age_ratios$Cmax_ratio_55_vs_18), max(age_ratios$Cmax_ratio_55_vs_18))`-fold |

The CRCL 50 mL/min/1.73 m^2 scenario (referenced in the paper
Discussion page 3474 as having "0.51- to 0.71-fold decrease in CLm/F"
relative to CRCL 120, equivalent to a 1.41- to 1.96-fold increase in
OC AUC) is also covered by the simulated AUC table above.

# Assumptions and deviations

- **Inter-individual variability omega^2 conversion.** Kamal 2013
  Table 2 reports the diagonal IIV terms as lognormal % CV (e.g.
  "42.1 % CV" for CLp/F) and the two off-diagonal covariances
  (CLp/F-CLm/F, Vp/F-Vcm/F) as numerical values with associated r^2.
  The variances on the eta scale are computed in the model file via
  the canonical conversion omega^2 = log(CV^2 + 1). The off-diagonal
  covariances are carried verbatim from Table 2 (0.0987 and 0.218).
  The paper's reported r^2 values (0.372 and 0.274) are computed
  using the small-omega approximation r ~= omega_xy / (CV_x * CV_y)
  rather than the strict log-scale correlation; under the strict
  conversion the implied correlations are slightly higher (~0.66 and
  ~0.62 respectively). The chosen encoding preserves both the
  lognormal-correct diagonal variances and the literal numerical
  covariance values from Table 2; the resulting variance-covariance
  matrix is positive-definite for both 2x2 blocks.
- **Vcm/F age dependence is additive, not multiplicative.** The Table
  2 equation is `Vcm/F = 238*(WT/70)^0.830 - 2.25*(AGE - 21)`. The
  age effect is subtracted from the WT-scaled volume rather than
  applied as a percentage. Outside the fitted age x weight range the
  additive form can yield a negative typical Vcm/F (e.g. a 30 kg
  90-year-old); simulations with covariate combinations far outside
  the original dataset (paediatric weight + geriatric age) should be
  sanity-checked. Within the cohort range (1-78 y, 8-115 kg) the
  equation stays positive.
- **CLp/F is treated as the OP -> OC conversion clearance with
  100 % metabolism.** The paper assumes complete conversion of
  oseltamivir to OC because the prodrug is a high-extraction drug
  with < 5 % excreted unchanged in urine (Kamal 2013 Discussion
  page 3473). The implementation routes the entire OP central-
  compartment elimination flux into the OC central compartment;
  mass balance is satisfied in mass units. The molecular-weight
  ratio between OP (312.4 g/mol) and OC (284.4 g/mol) is absorbed
  into the "apparent" parameter scaling and is not applied as an
  explicit MW correction; this matches the original NONMEM ADVAN13
  implementation.
- **Residual-error notation.** Kamal 2013 Table 2 labels the residual
  rows "sigma^2 CCV" and "sigma^2 ADD" but the numerical values are
  reported as SDs (% CV for the proportional CCV term; ng/mL for the
  additive ADD term). The values 40.5 %, 14.0 %, and 17.9 ng/mL are
  encoded as `propSd`, `propSd_oselcarb`, and `addSd_oselcarb` respectively on
  the linear concentration scale (mg/L for the OC additive SD), and
  the cross-check at the bounds reproduces the paper's reported
  combined-error range of "49.8 % to 14.3 % CV for plasma OC
  concentrations ranging from 0.05 to 6 mg/L" (Kamal 2013 Results
  page 3473).
- **Race was screened and dropped.** Race was evaluated as a
  candidate categorical covariate but was not retained in the final
  model (Kamal 2013 Methods 'Covariate evaluation' page 3471 and
  Results page 3473). No race covariate is encoded.
- **No drug-drug interactions, ESRD, or neonatal data.** The pooled
  PK dataset in Kamal 2013 excluded drug-drug interaction studies,
  patients with end-stage renal disease on hemodialysis, and an
  infant cohort (< 1 year) that was not yet available at the time
  of the original analysis. The model should not be extrapolated to
  those populations without external validation.
- **Creatinine clearance derivation.** In adults aged 18 or older
  CLCR was computed via Cockcroft-Gault with ideal body weight
  substituted when actual weight exceeded IBW and the result
  BSA-normalised to 1.73 m^2; SCr was floored at 0.7 mg/dL. In
  paediatric and adolescent subjects aged 1-17, CLCR was computed
  via the revised Schwartz equation (`0.413 * HTCM / SCr`) with SCr
  floored at 0.2 mg/dL. Users feeding the model with their own
  population should provide CRCL in mL/min/1.73 m^2 derived by the
  same method appropriate to the subject's age band; the canonical
  CRCL register entry documents this BSA-normalised scope.
