---
title: "Voriconazole (Friberg 2012)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Voriconazole (Friberg 2012)}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

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

# Model and source

* Citation: `r readModelDb("Friberg_2012_voriconazole")()$reference`
* Description: `r readModelDb("Friberg_2012_voriconazole")()$description`
* Article: [Antimicrob Agents Chemother 56(6):3032-3042](https://doi.org/10.1128/AAC.05761-11)

# Population

Friberg 2012 pooled five voriconazole PK studies (Friberg 2012 Tables 1 and 2):
112 immunocompromised children (2 to <12 y, Studies 1-3), 26 immunocompromised
adolescents (12 to <17 y, Study 4), and 35 healthy adults (22-55 y, Study 5).
Children and adolescents were mostly hospitalized transplant recipients
receiving multiple concomitant medications; adults were healthy volunteers
under tight protocol control. Median (range) weight was 20.1 kg (10.8-54.9) in
children, 57.1 kg (30.4-92.2) in adolescents, and 76.0 kg (49.0-97.0) in
adults. The cohort was 41.6% female and approximately 72% Caucasian. CYP2C19
genotype distribution was 2.3% UM, 56.6% EM, 38.7% HEM, and 2.9% PM; four
children in Study 3 and two adolescents in Study 4 with missing CYP2C19
information were assumed to be EM. Voriconazole was administered as IV
infusions and as oral suspension (POS) or tablets at 3-8 mg/kg or 200-350 mg
q12h depending on cohort and age (Table 1). The total dataset comprised 3336
plasma concentrations.

The same baseline information is available programmatically via the model's
`population` metadata (`readModelDb("Friberg_2012_voriconazole")()$population`).

# Structural model

The final model is a two-compartment PK model with first-order oral absorption
and mixed linear plus nonlinear (Michaelis-Menten) elimination, with a
time-dependent maximum velocity (`Vmax`). The Vmax inhibition function decays
from the peak Vmax,1 at 1 h post-dose toward an asymptote
`Vmax,1 * (1 - Vmax,inh)` with half-maximum inhibition at `T50` hours after
the start of dosing:

```
Vmax(T) = Vmax,1 * (1 - Vmax,inh * (T - 1) / ((T - 1) + (T50 - 1)))  for T >= 1
```

All clearance terms (CL, Q, Vmax,1) are allometrically scaled with an exponent
of 0.75 and the central / peripheral volumes (V2, V3) with an exponent of 1.0
against a 70 kg reference adult (Methods 'Structural-model description'). Four
structural parameters are population-specific (Vmax,inh, Q, ka, Alag), and
children enrolled in Study 1 carry an additional -0.382 fractional modifier on
both Km and Vmax,1 (Table 3 thetaSTDY1,ped). Adult CYP2C19 heterozygous
extensive metabolizers (HEM, modern IM) and poor metabolizers (PM) have their
non-linear clearance fully blocked (Vmax,inh = 100%); other CYP2C19 phenotypes
in adults and all pediatric / adolescent subjects use the logit-derived
fractional inhibition (`expit(1.50 - 0.390 * (AGE < 12)) = 0.818` for adults
and adolescents, `0.752` for children).

# Source trace

Per-parameter source locations are recorded as in-file comments in
`inst/modeldb/specificDrugs/Friberg_2012_voriconazole.R`; the table below
consolidates them.

| Equation / parameter | Value | Source location |
|---|---|---|
| 2-cpt + first-order absorption + linear + MM elimination | structural | Methods, Fig 1, Results 'Model development' |
| Allometric exponent on CL / Q / Vmax,1 | 0.75 (fixed) | Methods 'Structural-model description', Table 3 footnote c |
| Allometric exponent on V2 / V3 | 1.0 (fixed) | Methods 'Structural-model description' |
| `Km` = 1.15 ug/mL | typical adult/adolescent | Table 3 thetaKm |
| Study 1 pediatric modifier on Km / Vmax,1 | -0.382 | Table 3 thetaSTDY1,ped |
| `Vmax,1` = 114 mg/h per 70 kg | typical adult/adolescent | Table 3 thetaVmax,1 |
| `logit(Vmax,inh)` = 1.50 | typical | Table 3 thetaVmax,inh |
| AGE < 12 shift on logit(Vmax,inh) | -0.390 | Table 3 thetaAGE<12 |
| `T50` = 2.41 h | typical | Table 3 thetaT50 |
| `CL` = 6.16 L/h per 70 kg | typical | Table 3 thetaCL |
| `V2` = 79.0 L per 70 kg | typical | Table 3 thetaV2 |
| `V3` = 103 L per 70 kg | typical | Table 3 thetaV3 |
| `Q` = 15.5 L/h per 70 kg (adult) | typical | Table 3 thetaQ |
| Non-adult uplift on Q | +0.637 | Table 3 thetaQ,notSTDY5,adult |
| `logit(F1)` = 0.585 (F1 ~ 0.642) | typical | Table 3 thetaF1 |
| `ka` (children) | 1.19 /h | Table 3 thetaka |
| Adolescent shift on ka | -0.615 | Table 3 thetaSTDY4,adol |
| `ka` (adults) | 100 /h (fixed) | Table 3 thetaSTDY5,adult ka |
| `Alag` (adults) | 0.949 h | Table 3 thetaAlag |
| Non-adult shift on Alag | -0.874 | Table 3 thetaAlag,notSTDY5,adult |
| Joint Km / Vmax,1 IIV omega | 1.36 | Table 3 omega Km-Vmax,1 |
| Pediatric Vmax,1 IIV omega | 0.239 | Table 3 omega Vmax,1,ped |
| Children Km / Vmax,1 correlation | 0.81 | Results 'Voriconazole parameter estimates' |
| Adult Vmax,1 scaling factor on joint eta | 0.584 | Table 3 thetaVmax,scale,adult |
| Adolescent Vmax,1 scaling factor on joint eta | 0.208 | Table 3 thetaVmax,scale,adol |
| CL IIV omega (adults) | 0.435 | Table 3 omega CL |
| Non-adult CL IIV multiplicative factor | 1.70 | Table 3 theta_eta_CL,notSTDY5,adult |
| V2 / V3 / Q IIV omegas | 0.136 / 0.769 / 0.424 | Table 3 omega V2, V3, Q |
| F1 IIV omega (non-adult) | 1.67 | Table 3 omega F,notSTDY5,adult |
| F1 IIV omega (adult) | 0.686 | Table 3 omega F,STDY5,adult |
| Box-Cox lambda on F1 eta | 0.367 | Table 3 thetaBC-F |
| ka IIV omega (non-adult) | 0.898 | Table 3 omega ka |
| Residual SD Study 1 (ped) | 0.593 | Table 3 thetaSTDY1,ped |
| Residual SD Study 2 (ped) | 0.425 | Table 3 thetaSTDY2,ped |
| Residual SD Studies 3+4 (ped / adol) | 0.365 | Table 3 thetaSTDY3,4,ped,adol |
| Residual SD Study 5 adult IV | 0.0912 | Table 3 thetaSTDY5,adult |
| Residual SD Study 5 adult extra oral | 0.132 | Table 3 thetaSTDY5,adult,oral |
| Residual SD non-adult eta omega | 0.456 | Table 3 omega RE |

# Virtual cohort

Original observed data are not publicly available. The simulations below build
typical-value (`zeroRe()`) virtual subjects to reproduce Table 4 typical
parameter values and Table 6 predicted exposures. A simple helper builds a
single-subject event table with constant covariates.

```{r cohort}
mod         <- readModelDb("Friberg_2012_voriconazole")()
mod_typical <- rxode2::zeroRe(mod)

make_event_table <- function(wt_kg, age_yr, stdy_vori, cyp_im, cyp_pm,
                             dose_loading_mgkg, dose_maintenance_mgkg,
                             route = c("iv", "oral"), n_maintenance_doses = 13L,
                             tau = 12, sample_grid = seq(0, 168, by = 0.25),
                             max_oral_mg = NA_real_, id = 1L) {
  route <- match.arg(route)
  cmt_load <- if (route == "iv") "central" else "depot"
  cmt_main <- cmt_load
  amt_load <- dose_loading_mgkg * wt_kg
  amt_main <- dose_maintenance_mgkg * wt_kg
  if (!is.na(max_oral_mg) && route == "oral") amt_main <- pmin(amt_main, max_oral_mg)
  ev <- rxode2::et(amt = amt_load, cmt = cmt_load, time = 0)
  if (n_maintenance_doses >= 1L) {
    ev <- rxode2::et(ev, amt = amt_main, cmt = cmt_main, time = tau,
                     addl = n_maintenance_doses - 1L, ii = tau)
  }
  ev <- rxode2::et(ev, sample_grid)
  ev_df <- as.data.frame(ev)
  ev_df$WT          <- wt_kg
  ev_df$AGE         <- age_yr
  ev_df$STUDY_VORI   <- stdy_vori
  ev_df$CYP2C19_IM  <- cyp_im
  ev_df$CYP2C19_PM  <- cyp_pm
  ev_df$ORAL_VORI   <- as.integer(route == "oral")
  ev_df$id          <- id
  ev_df
}
```

# Replicate published typical-value clearance (Figure 3)

Figure 3 of Friberg 2012 plots the predicted total clearance (linear plus
nonlinear) at a fixed concentration of 5 mg/L versus time across age groups.
The replication below computes the same quantity directly from the typical
structural equations.

```{r figure-3, fig.cap = "Reproduces Figure 3 of Friberg 2012: predicted total clearance at Cp = 5 mg/L versus time after the start of dosing for three typical subjects (70-kg adult CYP2C19 EM; 50-kg adolescent; 20-kg child)."}
clearance_curve <- function(wt_kg, age_yr, stdy_vori, cyp_im, cyp_pm,
                            cp = 5, t_grid = seq(0.05, 12, by = 0.05)) {
  km_typ <- 1.15 * (1 + (-0.382) * (stdy_vori == 1))
  vmax1_typ <- 114 * (wt_kg / 70)^0.75 * (1 + (-0.382) * (stdy_vori == 1))
  cl_typ <- 6.16 * (wt_kg / 70)^0.75
  lgt_vmax_inh <- 1.50 + (-0.390) * (age_yr < 12)
  vmax_inh_typ <- 1.0 / (1.0 + exp(-lgt_vmax_inh))
  is_hem_or_pm_adult <- (stdy_vori == 5) * pmax(cyp_im, cyp_pm)
  vmax_inh <- vmax_inh_typ * (1 - is_hem_or_pm_adult) + 1.0 * is_hem_or_pm_adult
  t50 <- 2.41
  teff <- pmax(t_grid - 1, 0)
  vmax_t <- vmax1_typ * (1 - vmax_inh * teff / (teff + (t50 - 1)))
  cl_nonlin <- vmax_t / (cp + km_typ)
  data.frame(time = t_grid, cl_total = cl_typ + cl_nonlin)
}

curves <- bind_rows(
  cbind(clearance_curve(70, 35, 5, 0, 0), group = "Adult (70 kg, CYP2C19 EM)"),
  cbind(clearance_curve(50, 14, 4, 0, 0), group = "Adolescent (50 kg)"),
  cbind(clearance_curve(20,  5, 3, 0, 0), group = "Child (20 kg)")
)

ggplot(curves, aes(time, cl_total, colour = group)) +
  geom_line(size = 0.9) +
  scale_y_log10(limits = c(1, 200)) +
  labs(x = "Time after start of dosing (h)",
       y = "Predicted total CL at Cp = 5 mg/L (L/h)",
       colour = NULL,
       title = "Replicates Figure 3 of Friberg 2012",
       caption = "Total CL = linear CL + Vmax(T)/(Cp + Km).") +
  theme(legend.position = "top")
```

The adult and adolescent curves drop from ~25 L/h at 1 h to a ~9 L/h asymptote
during maintenance (ratio nonlinear:linear ~ 2.5 -> 0.49, paragraph 'Clearance'
of the Results), and the child curve decreases less steeply because the
maximum Vmax inhibition (`expit(1.50 - 0.390) = 75.2%`) is lower than the adult
value of 81.8% (Table 4).

# Replicate Table 4 typical-value parameters

Table 4 of Friberg 2012 tabulates the typical PK parameters for representative
70-kg adults, 55-kg adolescents, 45-kg adolescents / children, and 20-kg
children. The block below reconstructs the same table from the model's
structural equations and shows it side by side with the published values.

```{r table-4}
typical_parameters <- function(wt_kg, age_yr, stdy_vori) {
  km    <- 1.15 * (1 + (-0.382) * (stdy_vori == 1))
  vmax1 <- 114  * (wt_kg / 70)^0.75 * (1 + (-0.382) * (stdy_vori == 1))
  cl    <- 6.16 * (wt_kg / 70)^0.75
  v2    <- 79.0 * (wt_kg / 70)
  v3    <- 103  * (wt_kg / 70)
  is_not_stdy5 <- as.integer(stdy_vori != 5)
  q     <- 15.5 * (wt_kg / 70)^0.75 * (1 + 0.637 * is_not_stdy5)
  lgt_vmax_inh <- 1.50 + (-0.390) * (age_yr < 12)
  vmax_inh_pct <- 100 * (1 / (1 + exp(-lgt_vmax_inh)))
  ka <- if (stdy_vori == 5) 100 else if (stdy_vori == 4) 1.19 * (1 - 0.615) else 1.19
  alag <- if (stdy_vori == 5) 0.949 else 0.949 * (1 - 0.874)
  data.frame(
    Km = km, Vmax1 = vmax1, Vmax_inh_pct = vmax_inh_pct,
    CL = cl, V2 = v2, V3 = v3, Q = q, ka = ka, Alag = alag
  )
}

table4 <- bind_rows(
  cbind(group = "70-kg adult (Studies 2-5 reference)",       typical_parameters(70, 35, 5)),
  cbind(group = "55-kg adolescent (Study 4)",                typical_parameters(55, 14, 4)),
  cbind(group = "45-kg adolescent (Study 4)",                typical_parameters(45, 13, 4)),
  cbind(group = "45-kg child (Studies 2-3)",                 typical_parameters(45,  8, 3)),
  cbind(group = "20-kg child (Studies 2-3)",                 typical_parameters(20,  5, 3))
)

knitr::kable(
  table4,
  digits = c(0, 2, 1, 0, 1, 1, 1, 1, 2, 3),
  caption = "Replicates Table 4 of Friberg 2012: typical PK parameters for representative subjects."
)
```

Comparing against Friberg 2012 Table 4: 70-kg adult Vmax,1 114 mg/h, CL 6.16
L/h, V2 79.0 L, V3 103 L, Q 15.5 L/h; 55-kg adolescent Vmax,1 95.1 mg/h, CL
5.09 L/h, Q 21.2 L/h; 45-kg adolescent Vmax,1 81.8 mg/h, CL 4.38 L/h; 20-kg
child Vmax,1 44.6 mg/h, CL 2.38 L/h, Q 9.92 L/h. Vmax,inh in the table is 82%
for adolescents / adult UM-EM and 75% for children. The replicated values
match Table 4 to the rounding shown.

# Simulate IV maintenance regimens and validate AUC0-12 against Table 6 / Table 3 ratios

Friberg 2012 Table 6 reports the predicted geometric-mean AUC0-12 for the
pediatric recommended doses based on a 40-subject simulated cohort using
individual empirical-Bayes parameters from Study 3 plus young adolescents (12-14
y, <50 kg). For the typical-value validation below, the model is run with
zeroed random effects for representative weights and the predicted AUC0-12 is
compared against the Results section's reported median values for the same
regimens.

```{r simulate-iv}
solve_typical <- function(events_df) {
  rxode2::rxSolve(mod_typical, events_df, returnType = "data.frame")
}

# Adult reference (Study 5): 6 mg/kg LD then 4 mg/kg IV q12h.
adult_events <- make_event_table(
  wt_kg = 70, age_yr = 35, stdy_vori = 5, cyp_im = 0, cyp_pm = 0,
  dose_loading_mgkg = 6, dose_maintenance_mgkg = 4, route = "iv",
  n_maintenance_doses = 14L
)
adult_sim <- solve_typical(adult_events)

# Child (study 3 typical, 20 kg): 9 mg/kg LD then 8 mg/kg IV q12h.
child_events_iv <- make_event_table(
  wt_kg = 20, age_yr = 5, stdy_vori = 3, cyp_im = 0, cyp_pm = 0,
  dose_loading_mgkg = 9, dose_maintenance_mgkg = 8, route = "iv",
  n_maintenance_doses = 14L
)
child_sim_iv <- solve_typical(child_events_iv)

# Child (study 3 typical, 20 kg): 9 mg/kg LD then 9 mg/kg oral q12h (350 mg cap).
child_events_oral <- make_event_table(
  wt_kg = 20, age_yr = 5, stdy_vori = 3, cyp_im = 0, cyp_pm = 0,
  dose_loading_mgkg = 9, dose_maintenance_mgkg = 9, route = "oral",
  n_maintenance_doses = 14L, max_oral_mg = 350
)
child_sim_oral <- solve_typical(child_events_oral)

auc_over <- function(sim, t_start, t_end) {
  sub <- subset(sim, time >= t_start & time <= t_end)
  sub <- sub[order(sub$time), ]
  cc  <- sub$Cc
  tt  <- sub$time
  sum(diff(tt) * (cc[-1] + cc[-length(cc)]) / 2)
}

t_ss_start <- 156   # last full q12h interval well into steady state
t_ss_end   <- 168

auc_table <- data.frame(
  group  = c("Adult IV 4 mg/kg q12h (typical 70 kg)",
             "Child IV 8 mg/kg q12h (typical 20 kg)",
             "Child PO 9 mg/kg q12h, 350 mg cap (typical 20 kg)"),
  AUC012_typical = c(
    auc_over(adult_sim,     t_ss_start, t_ss_end),
    auc_over(child_sim_iv,  t_ss_start, t_ss_end),
    auc_over(child_sim_oral, t_ss_start, t_ss_end)
  ),
  AUC012_paper_median = c(37.9, 24.3, 15.1)
)

auc_table$ratio_typical_to_paper <- round(
  auc_table$AUC012_typical / auc_table$AUC012_paper_median, 2
)

knitr::kable(auc_table, digits = 2,
  caption = "Typical-value AUC0-12 at steady state versus published median AUC0-12 (Results 'Simulations in children').")
```

Friberg 2012 reports the simulated *median* AUC0-12 across a population in
each scenario (Results 'Simulations in children'); the values shown here are
typical-value AUCs (no IIV) so they are expected to be lower than the published
medians for cases where the distribution is right-skewed. The ratios
above quantify the typical-vs-median gap; deterministic AUCs land in the same
order of magnitude as the published medians and the ranking across regimens is
preserved.

# PKNCA validation

PKNCA is used for steady-state AUC0-tau and the accumulation comparison. The
formula `Cc ~ time | regimen + id` carries the dose-group label so the summary
rolls up per regimen.

```{r pknca}
prepare_pknca <- function(sim, events_df, regimen_label) {
  sim$id        <- 1L
  sim$regimen   <- regimen_label
  events_df$regimen <- regimen_label
  events_df$id  <- 1L
  doses_df <- subset(events_df, !is.na(amt) & amt > 0)
  list(
    conc  = subset(sim,     !is.na(Cc),  select = c("id", "time", "Cc", "regimen")),
    doses = doses_df[, c("id", "time", "amt", "regimen")]
  )
}

p_adult     <- prepare_pknca(adult_sim,     adult_events,     "Adult IV 4 mg/kg q12h")
p_child_iv  <- prepare_pknca(child_sim_iv,  child_events_iv,  "Child IV 8 mg/kg q12h")
p_child_oral <- prepare_pknca(child_sim_oral, child_events_oral, "Child PO 9 mg/kg q12h")

conc_all <- bind_rows(p_adult$conc, p_child_iv$conc, p_child_oral$conc)
dose_all <- bind_rows(p_adult$doses, p_child_iv$doses, p_child_oral$doses)

# Make ids disjoint across regimens.
conc_all$id <- match(conc_all$regimen, unique(conc_all$regimen))
dose_all$id <- match(dose_all$regimen, unique(dose_all$regimen))

conc_obj <- PKNCA::PKNCAconc(conc_all, Cc ~ time | regimen + id,
                             concu = "ug/mL", timeu = "h")
dose_obj <- PKNCA::PKNCAdose(dose_all, amt ~ time | regimen + id,
                             doseu = "mg")

intervals <- data.frame(
  start    = t_ss_start,
  end      = t_ss_end,
  cmax     = TRUE,
  cmin     = TRUE,
  tmax     = TRUE,
  auclast  = TRUE,
  cav      = TRUE
)

nca_data <- PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
suppressWarnings(nca_res <- PKNCA::pk.nca(nca_data))

nca_tbl <- as.data.frame(nca_res$result) |>
  dplyr::filter(PPTESTCD %in% c("cmax", "cmin", "tmax", "auclast", "cav")) |>
  tidyr::pivot_wider(id_cols = "regimen", names_from = "PPTESTCD",
                     values_from = "PPORRES")

knitr::kable(nca_tbl, digits = 2,
  caption = "PKNCA-derived steady-state NCA parameters at the last dosing interval (typical values, no IIV).")
```

The PKNCA-derived AUC0-tau values agree with the trapezoidal values in the
preceding section, confirming that the integration grid is fine enough to
characterise the post-dose decline.

# Assumptions and deviations

- **Vmax,1 inter-individual variability decoding.** Friberg 2012 Table 3
  footnote (e) reports the Vmax,1 IIV through a compound expression involving
  three random effects (the joint Km / Vmax,1 eta, a pediatric-specific eta,
  and an adolescent-specific eta) and two scaling thetas. The OCR rendering
  is ambiguous; the implementation here follows the interpretation that
  reproduces Table 4's IIV (CV% column) within rounding: adults use the joint
  Km / Vmax,1 eta scaled by `thetaVmax,scale,adult = 0.584` (effective omega
  `1.36 * 0.584 = 0.794`, CV% ~ 79%), adolescents use the same joint eta scaled
  by `thetaVmax,scale,adol = 0.208` (effective omega `0.283`, CV% ~ 28%), and
  children use a separate `etalvmax1_ped` with omega `0.239` (CV% ~ 24%). The
  81% Km / Vmax,1 children correlation is encoded as the covariance of the
  two etas in the joint block. The two scaling thetas are encoded as estimated
  parameters in `ini()`. For typical-value (zero-IIV) simulations the
  interpretation is immaterial; for VPC-style replications the IIV magnitudes
  match Table 4 within rounding.
- **F1 Box-Cox-transformed IIV.** The model retains the Table 3 footnote (f)
  Box-Cox transformation `ETATR,i = (exp(eta_i)^lambda - 1) / lambda` with
  `lambda = 0.367` on the logit(F1) eta. This produces a skewed F1 distribution
  consistent with the paper's reported pcVPC; for typical-value runs the
  Box-Cox transformation reduces to zero and the typical F1 is `expit(0.585) =
  0.642`.
- **Crossover ORAL_VORI indicator.** The Friberg 2012 NONMEM control stream
  switches the Study-5 adult residual error between IV-only (sigma = 0.0912)
  and oral (sigma = sqrt(0.0912^2 + 0.132^2) = 0.160) using a per-observation
  `Oral` indicator. The model file encodes this as the per-observation binary
  covariate `ORAL_VORI`; downstream users supplying an event table with both
  IV and oral phases for a study-5 subject must set `ORAL_VORI` to 1 on
  observation rows during the oral phase and 0 on observation rows during
  the IV phase.
- **Study assignment is subject-level.** The `STUDY_VORI` covariate is fixed
  per subject because population (child / adolescent / adult) and protocol
  arm are aligned in the paper's pooled dataset (no crossovers between
  populations). Users simulating new dosing scenarios should set `STUDY_VORI`
  consistently with `AGE` and with the residual-error / IIV structure they
  want to reproduce.
- **Time variable `t` is time since start of dosing.** The time-dependent
  Vmax inhibition function is parameterised against time since initiation of
  voriconazole therapy. In simulations the rxode2 simulation clock `t` is
  used directly; this assumes the first dose occurs at `t = 0` and the
  inhibition keeps accumulating monotonically. Simulations that need to
  reproduce a steady-state-only profile should run the simulation from
  `t = 0` and read the post-`5 * T50` portion of the trajectory rather than
  shifting the time origin.
- **Adult ka is structurally fixed at 100 /h.** The paper writes
  `ka = 100 FIX` for adults because the data cannot identify an absorption
  rate distinct from the Alag mechanism (Results 'Oral bioavailability').
  The model preserves this convention; downstream users fitting against
  this model should not unfix the adult ka.
- **CYP2C19 grouping.** The paper groups PM with HEM (modern IM) for the
  Vmax,inh = 100% effect in adults because the four pediatric / adolescent
  PMs had AUC0-12 values within the rest of the cohort. The model encodes
  this as `is_hem_or_pm_adult <- is_stdy5_adult * (CYP2C19_IM + CYP2C19_PM)`;
  for simulation of an adult PM or HEM subject set either or both
  indicators to 1 along with `STUDY_VORI = 5`.
