---
title: "Liraglutide (Overgaard 2016)"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Liraglutide (Overgaard 2016)}
  %\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 rxode2::rxode2(readModelDb("Overgaard_2016_liraglutide"))$reference`
* Description: `r rxode2::rxode2(readModelDb("Overgaard_2016_liraglutide"))$description`
* Article: [Clin Pharmacokinet 2016;55(11):1413-1422](https://doi.org/10.1007/s40262-016-0410-7)
* Springer Open Access

# Population

The published analysis pooled 2923 overweight or obese adults across two
phase IIIa SCALE trials on liraglutide 3.0 mg once-daily subcutaneous
(Saxenda / NN8022): 2339 from SCALE Obesity and Prediabetes (Trial 1,
NN8022-1839; Pi-Sunyer 2015) and 584 from SCALE Diabetes (Trial 2,
NN8022-1922; Davies 2015). Baseline characteristics (Table 1 of the paper):

* Sex: 72.3% female (2112 / 2923), 27.7% male (811 / 2923).
* Age: mean 47.1 y (SD 12.3); 2.5% (73 / 2923) aged >= 70 y.
* Body weight: mean 106 kg (SD 21), range 60-234 kg; higher in males (mean
  118 kg) than females (mean 102 kg) despite similar BMI (mean 38 kg/m^2).
* Race: 84.9% White, 9.7% Black / African American, 3.3% Asian, 2.1% Other
  (pooling American Indian / Alaskan Native + Native Hawaiian or other
  Pacific Islander).
* Ethnicity: 10.5% Hispanic / Latino, 89.5% non-Hispanic / -Latino.
* Baseline glycaemic status: 30.7% normoglycaemic, 49.3% prediabetic (all in
  Trial 1), 20.0% T2DM (all in Trial 2).
* Renal function: 51% normal (eGFR >= 90 mL/min/1.73 m^2), 44% mild
  impairment, 5% moderate, < 0.1% severe.
* Dose: 93.5% on 3.0 mg once-daily SC (2732 subjects), 6.5% on 1.8 mg
  (Trial 2 SCALE Diabetes 1.8 mg arm, 191 subjects).

Dose escalation was weekly at 0.6 mg/week from 0.6 mg on day 1 up to the
subject's maintenance dose (3.0 mg by week 5). Subjects excluded from the
population PK analysis after inadequate dosing-history filtering: 1185 of
8859 records (Overgaard 2016 Sect. 2.1.1).

The `readModelDb("Overgaard_2016_liraglutide")$population` list carries the
same information programmatically.

# Structural model

One-compartment model with first-order absorption and first-order
elimination, parameterised by absorption rate `Ka`, apparent clearance
`CL/F`, and apparent central volume `V/F`. Covariate effects on `CL/F`
only. The full covariate model equation (Overgaard 2016 Sect. 2.2 and
Online Resource Table S1) is:

$$ \frac{CL/F_i}{TVCL} = \left(\frac{WT_i}{100}\right)^{\theta_{WT}}
\times \exp\left(\sum_{k} \theta_k \cdot X_{k,i}\right) \times \exp(\eta_i) $$

with `TVCL` the reference subject apparent clearance (female, < 70 y, 100 kg,
White, non-Hispanic / -Latino, non-diabetic, 3.0 mg once daily) and the sum
over the categorical covariates listed in Table S1.

# Source trace

Per-parameter provenance is recorded as an in-file comment beside each
`ini()` entry in `inst/modeldb/specificDrugs/Overgaard_2016_liraglutide.R`.
The table below collects them for review; values marked "Table S1" come from
the Online Resource Table S1 in the Springer supplementary material.

| Equation / parameter                | Value                     | Source location |
|-------------------------------------|---------------------------|-----------------|
| `lka` (Ka)                          | `fixed(log(0.0806))` 1/h  | Methods Sect. 2.2 (fixed from prior obese-subject popPK, data on file per ref [8]) |
| `lcl` (CL/F, reference)             | `log(0.86)` L/h           | Table S1 (RSE 2%, 95% CI 0.83-0.90) |
| `lvc` (V/F)                         | `log(24.60)` L            | Table S1 (RSE 9%, 95% CI 20.3-28.8) |
| `e_wt_cl`                           | `0.68`                    | Table S1 "Cov. weight" (RSE 5%, 95% CI 0.61-0.75); reference WT = 100 kg |
| `e_male_cl`                         | `0.27`                    | Table S1 "Cov. male" (RSE 6%, 95% CI 0.24-0.30); applied via `(1 - SEXF)` |
| `e_age_ge70_cl`                     | `-0.10`                   | Table S1 "Cov. age >=70 years" (RSE 45%, 95% CI -0.18 to -0.01) |
| `e_race_black_cl`                   | `-0.09`                   | Table S1 "Cov. Black" (RSE 26%, 95% CI -0.13 to -0.04) |
| `e_race_asian_cl`                   | `-0.001`                  | Table S1 "Cov. Asian" (RSE 913%, 95% CI -0.09 to 0.08) |
| `e_race_other_cl`                   | `-0.08`                   | Table S1 "Cov. Other" (RSE 57%, 95% CI -0.17 to -0.01) |
| `e_race_hispanic_cl`                | `0.08`                    | Table S1 "Cov. Hispanic" (RSE 26%, 95% CI 0.04-0.12) |
| `e_dis_prediab_cl`                  | `0.00`                    | Table S1 "Cov. prediabetes" (RSE 904%, 95% CI -0.05 to 0.06) |
| `e_dis_diab_cl`                     | `0.18`                    | Table S1 "Cov. diabetes" (RSE 14%, 95% CI 0.13-0.23); confounded with Trial 2 |
| `e_dose_1p8mg_cl`                   | `0.02`                    | Table S1 "Cov. 1.8 mg" (RSE 119%, 95% CI -0.03 to 0.08) |
| `etalcl` (IIV CL/F)                 | `log(1 + 0.247^2)`        | Table S1: 24.70 %CV (shrinkage 23.9%) |
| `etalvc` (IIV V/F)                  | `log(1 + 0.347^2)`        | Table S1: 34.70 %CV (shrinkage 83.2%; sparse-sampling limitation) |
| `propSd` (proportional RUV)         | `0.154`                   | Table S1: sigma 15.40 %CV (shrinkage 9.37%) |
| Structure                           | 1-cmt FO absorption / FO elimination | Methods Sect. 2.2, Online Resource S3 |
| Concentration units                 | nmol/L                    | Fig. 3 / Fig. 4 x-axis labels; LLOQ 30 pmol/L (Trials 1 + 2), 18 pmol/L (Trial 3) |
| Reference subject                   | Female, 100 kg, White, non-Hispanic, non-diabetic, < 70 y, 3.0 mg | Sect. 2.2 |

# Virtual cohort

Original observed data are not publicly available. The cohort below
approximates the pooled Overgaard 2016 Trials 1 + 2 baseline demographics
(Table 1) at a manageable simulation size of 200 subjects: 72.3% female,
body weight approximately Normal(mean 106, SD 21) truncated to the observed
60-234 kg range, 84.9% White, 9.7% Black, 3.3% Asian, 2.1% Other with the
race indicators encoded as mutually exclusive binaries, 10.5% Hispanic
ethnicity, 20% T2DM, 49.3% prediabetic. All simulated subjects receive the
3.0 mg once-daily SC maintenance dose (dominant 93.5% regimen).

Liraglutide molar mass is 3751.2 g/mol (C172H265N43O51); doses are entered
in nmol so that the simulated `Cc = central / Vc` is directly in nmol/L
(matching the paper's reported units).

```{r cohort}
set.seed(20160519) # publication date reference
n_subj <- 200L # per-arm cap per skill guidance

lira_mw <- 3751.2 # g/mol
dose_mg <- 3.0
dose_nmol <- dose_mg * 1e6 / lira_mw # 3 mg = 799.7 nmol

# Sample race indicators as a mutually exclusive multinomial matching Table 1.
race_probs <- c(White = 0.849, Black = 0.097, Asian = 0.033, Other = 0.021)
race_draw <- sample(names(race_probs), n_subj, replace = TRUE, prob = race_probs)

cohort <- tibble(
  id             = seq_len(n_subj),
  SEXF           = as.integer(runif(n_subj) < 0.723),
  WT             = pmin(pmax(rnorm(n_subj, mean = 106, sd = 21), 60), 234),
  AGE_GE70       = as.integer(runif(n_subj) < 0.025),
  RACE_BLACK     = as.integer(race_draw == "Black"),
  RACE_ASIAN     = as.integer(race_draw == "Asian"),
  RACE_OTHER     = as.integer(race_draw == "Other"),
  RACE_HISPANIC  = as.integer(runif(n_subj) < 0.105),
  DIS_PREDIAB    = as.integer(runif(n_subj) < 0.493),
  DIS_DIAB       = 0L, # sampled below so PREDIAB and DIAB are mutually exclusive
  DOSE_1P8MG     = 0L,
  treatment      = factor("3 mg QD (Overgaard 2016 pooled cohort)")
)

# T2DM and prediabetes are mutually exclusive per paper Sect. 3.1; enforce that.
cohort$DIS_DIAB[cohort$DIS_PREDIAB == 0L] <-
  as.integer(runif(sum(cohort$DIS_PREDIAB == 0L)) < 0.20 / (1 - 0.493))
cohort$DIS_DIAB[cohort$DIS_PREDIAB == 1L] <- 0L
```

An event table with once-daily SC dosing over 6 weeks provides steady-state
sampling on the final dosing interval.

```{r events}
sim_days <- 42L # 6 weeks to reach robust steady state
tau <- 24 # dosing interval, h
n_doses <- sim_days
dose_times <- seq(0, by = tau, length.out = n_doses)
final_dose_time <- dose_times[n_doses]

# Dense sampling on the final interval + coarse sampling earlier + t=0 defensively.
obs_times <- sort(unique(c(
  0,
  seq(0, final_dose_time, by = 6),
  final_dose_time + c(0, 0.5, 1, 2, 3, 4, 6, 8, 10, 12, 14, 16, 20, 24)
)))

dose_rows <- cohort |>
  tidyr::crossing(time = dose_times) |>
  dplyr::mutate(amt = dose_nmol, cmt = "depot", evid = 1L)

obs_rows <- cohort |>
  tidyr::crossing(time = obs_times) |>
  dplyr::mutate(amt = 0, cmt = "central", evid = 0L)

events <- dplyr::bind_rows(dose_rows, obs_rows) |>
  dplyr::select(id, time, amt, cmt, evid, SEXF, WT, AGE_GE70, RACE_BLACK,
    RACE_ASIAN, RACE_OTHER, RACE_HISPANIC, DIS_PREDIAB, DIS_DIAB, DOSE_1P8MG,
    treatment) |>
  dplyr::arrange(id, time, dplyr::desc(evid))
```

# Simulation

```{r simulate}
mod <- rxode2::rxode2(readModelDb("Overgaard_2016_liraglutide"))
conc_unit <- mod$units[["concentration"]]

keep_cov <- c("SEXF", "WT", "AGE_GE70", "RACE_BLACK", "RACE_ASIAN", "RACE_OTHER",
  "RACE_HISPANIC", "DIS_PREDIAB", "DIS_DIAB", "DOSE_1P8MG", "treatment")

sim <- rxode2::rxSolve(mod, events = events, keep = keep_cov)
```

# Replicate published figures

## Typical steady-state concentration profile

Overgaard 2016 does not publish a time-versus-concentration figure; the
paper's Fig. 3 shows steady-state exposure (AUC24 / dose) versus baseline
body weight. Below we plot the deterministic ("typical") steady-state
profile of the reference subject (100 kg female, White, non-Hispanic,
non-diabetic, < 70 y, 3.0 mg QD) over the final 24-h dosing interval.

```{r figure-typical}
mod_typical <- mod |> rxode2::zeroRe()

ref_cohort <- tibble(
  id = 1, SEXF = 1L, WT = 100, AGE_GE70 = 0L,
  RACE_BLACK = 0L, RACE_ASIAN = 0L, RACE_OTHER = 0L, RACE_HISPANIC = 0L,
  DIS_PREDIAB = 0L, DIS_DIAB = 0L, DOSE_1P8MG = 0L,
  treatment = factor("Reference: 100 kg female, non-diab, White, non-Hisp, <70y, 3 mg QD")
)

typical_doses <- ref_cohort |>
  tidyr::crossing(time = dose_times) |>
  dplyr::mutate(amt = dose_nmol, cmt = "depot", evid = 1L)
typical_obs <- ref_cohort |>
  tidyr::crossing(time = c(0, seq(0, final_dose_time + tau, by = 1))) |>
  dplyr::mutate(amt = 0, cmt = "central", evid = 0L)
typical_events <- dplyr::bind_rows(typical_doses, typical_obs) |>
  dplyr::select(id, time, amt, cmt, evid, tidyselect::all_of(keep_cov)) |>
  dplyr::arrange(id, time, dplyr::desc(evid))

sim_typical <- rxode2::rxSolve(mod_typical, events = typical_events, keep = keep_cov)

sim_typical |>
  dplyr::filter(!is.na(Cc)) |>
  ggplot(aes(time / 24, Cc)) +
  geom_line(linewidth = 0.8) +
  labs(x = "Time (days)",
    y = paste0("Liraglutide concentration (", conc_unit, ")"),
    title = "Typical steady-state profile (reference subject, 3 mg QD SC)",
    caption = "Deterministic typical-value prediction; approach to steady state.") +
  theme_minimal()
```

## Stochastic-cohort exposure summary

```{r figure-vpc}
sim |>
  dplyr::filter(!is.na(Cc), time > 0) |>
  dplyr::group_by(time) |>
  dplyr::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(aes(time / 24, Q50)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25) +
  geom_line() +
  labs(x = "Time (days)",
    y = paste0("Liraglutide concentration (", conc_unit, ")"),
    title = "Simulated 5-50-95 percentiles across 200-subject pooled cohort",
    caption = "Cohort covariates approximate Overgaard 2016 Table 1 (Trials 1 + 2 pooled).") +
  theme_minimal()
```

## Exposure vs body weight, stratified by sex (replicates Fig. 3a)

Fig. 3a of Overgaard 2016 shows dose-normalised steady-state AUC24 (nM h /
mg) vs baseline body weight, stratified by sex. Below we compute each
simulated subject's Cavg over the final dosing interval and convert to the
paper's AUC24 / dose metric.

```{r figure-3a}
cavg_by_id <- sim |>
  dplyr::filter(time >= final_dose_time, time <= final_dose_time + tau,
    !is.na(Cc)) |>
  dplyr::group_by(id, WT, SEXF, DIS_DIAB, DIS_PREDIAB) |>
  dplyr::summarise(Cavg_nmol_L = mean(Cc), .groups = "drop") |>
  dplyr::mutate(
    Sex = ifelse(SEXF == 1L, "Female", "Male"),
    Glycaemia = dplyr::case_when(
      DIS_DIAB == 1L    ~ "Diabetic",
      DIS_PREDIAB == 1L ~ "Prediabetic",
      TRUE              ~ "Normoglycaemic"
    ),
    AUC24_over_dose = Cavg_nmol_L * 24 / dose_mg # nM * h / mg
  )

ggplot(cavg_by_id, aes(WT, AUC24_over_dose, colour = Sex)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "loess", se = FALSE) +
  labs(x = "Baseline body weight (kg)",
    y = "AUC24 / dose (nM h / mg)",
    title = "Steady-state AUC24/dose vs body weight, by sex",
    caption = "Replicates the shape of Overgaard 2016 Fig. 3a. 3 mg QD SC, pooled cohort.") +
  theme_minimal()
```

## Exposure vs body weight, stratified by glycaemic status (replicates Fig. 3b)

```{r figure-3b}
ggplot(cavg_by_id, aes(WT, AUC24_over_dose, colour = Glycaemia)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "loess", se = FALSE) +
  labs(x = "Baseline body weight (kg)",
    y = "AUC24 / dose (nM h / mg)",
    title = "Steady-state AUC24/dose vs body weight, by glycaemic status",
    caption = "Replicates the shape of Overgaard 2016 Fig. 3b.") +
  theme_minimal()
```

# PKNCA validation on the reference subject

We compute Cmax, Tmax, Cmin, and AUC over the final 24-h dosing interval
for the reference subject using PKNCA (recipe: steady-state single-interval
NCA). The typical-value model (random effects zeroed) is used so the NCA
output is deterministic and can be compared to the closed-form
`AUC24_ss = Dose / CL` prediction.

```{r pknca}
# rxSolve drops the id column for single-subject typical-value runs; add it
# back explicitly before assembling the PKNCA input.
sim_typical_df <- as.data.frame(sim_typical) |>
  dplyr::mutate(id = 1L, treatment = ref_cohort$treatment)

nca_input <- sim_typical_df |>
  dplyr::filter(!is.na(Cc), time >= final_dose_time,
    time <= final_dose_time + tau) |>
  dplyr::mutate(time_rel = time - final_dose_time) |>
  dplyr::select(id, time = time_rel, Cc, treatment) |>
  dplyr::distinct(id, time, .keep_all = TRUE)

dose_df <- tibble(id = 1L, time = 0, amt = dose_nmol,
  treatment = ref_cohort$treatment)

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

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

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

knitr::kable(as.data.frame(nca_res$result) |>
  dplyr::select(PPTESTCD, PPORRES) |>
  dplyr::mutate(PPORRES = signif(PPORRES, 4)) |>
  dplyr::rename("NCA parameter" = PPTESTCD, "Value (units of Cc . h or Cc)" = PPORRES),
  caption = "Steady-state NCA for the reference subject (typical values, 3 mg QD SC).")
```

## Closed-form check of the reference AUC24

At steady state, `AUC24 = Dose / CL/F` for a once-daily regimen. For the
reference subject (`CL/F = 0.86 L/h`, `Dose = 3.0 mg`):

* `AUC24_ss = 3.0 mg / 0.86 L/h = 3.488 mg h / L = 3488 ng h / mL`
* Convert to molar: `3488 ng h / mL * 1e6 pg / mg / 3751.2 g/mol = 929.9 nM h`

The paper's Fig. 3 shows AUC24 / dose in the 250-500 nM h / mg range across
the pooled cohort; the reference-subject prediction of `929.9 / 3.0 = 310
nM h / mg` sits centrally within that empirical distribution.

```{r comparison}
ref_cl <- 0.86 # L/h
ref_auc_ss_mgh_L <- dose_mg / ref_cl # 3.488 mg h / L
ref_auc_ss_nMh   <- ref_auc_ss_mgh_L * 1e6 / lira_mw # 929.9 nM h

nca_auc_row <- as.data.frame(nca_res$result) |>
  dplyr::filter(PPTESTCD == "auclast")
nca_auc <- if (nrow(nca_auc_row) > 0) nca_auc_row$PPORRES[1] else NA_real_

compare_tbl <- tibble::tibble(
  Source = c("Closed-form Dose / CL",
    "Simulated typical AUClast (PKNCA)",
    "Ratio (simulated / closed-form)"),
  `AUC24 (nM h)` = c(
    sprintf("%.1f", ref_auc_ss_nMh),
    sprintf("%.1f", nca_auc),
    sprintf("%.3f", nca_auc / ref_auc_ss_nMh)
  )
)
knitr::kable(compare_tbl,
  caption = "Reference-subject AUC24 comparison. Match within a few percent confirms parameter transcription.")
```

# Comparison against published covariate effects (Fig. 2 forest plot)

Overgaard 2016 Fig. 2 reports steady-state AUC24 ratios for each covariate
level vs the reference subject, obtained by likelihood profiling. The
model-implied ratios below are computed as the ratio of `CL/F` for the
reference subject to `CL/F` for a subject who differs from the reference
only in the named covariate; since AUC24 is inversely proportional to CL/F,
this equals the AUC24 ratio.

```{r fig2-forest}
ref_cov <- list(SEXF = 1L, WT = 100, AGE_GE70 = 0L, RACE_BLACK = 0L,
  RACE_ASIAN = 0L, RACE_OTHER = 0L, RACE_HISPANIC = 0L,
  DIS_PREDIAB = 0L, DIS_DIAB = 0L, DOSE_1P8MG = 0L)

# Reference CL/F from the paper's Table S1
tvcl_ref <- 0.86 # L/h

# Compute typical CL/F using the model formula (see model file).
typical_cl <- function(cov) {
  cl_wt <- (cov$WT / 100)^0.68
  cl_covs <- exp(
    0.27  * (1 - cov$SEXF) +
    -0.10 * cov$AGE_GE70 +
    -0.09 * cov$RACE_BLACK +
    -0.001 * cov$RACE_ASIAN +
    -0.08 * cov$RACE_OTHER +
     0.08 * cov$RACE_HISPANIC +
     0.00 * cov$DIS_PREDIAB +
     0.18 * cov$DIS_DIAB +
     0.02 * cov$DOSE_1P8MG
  )
  tvcl_ref * cl_wt * cl_covs
}

perturb <- function(name, value) {
  modifyList(ref_cov, setNames(list(value), name))
}

cov_scenarios <- tibble::tribble(
  ~scenario,                                 ~cov,                                                 ~paper_AUC_ratio,
  "Body weight 60 kg (vs 100 kg)",           list(perturb("WT", 60)),                              1.41,
  "Body weight 234 kg (vs 100 kg)",          list(perturb("WT", 234)),                             0.56,
  "Male (vs female)",                        list(perturb("SEXF", 0L)),                            0.76,
  "Age >= 70 y (vs < 70 y)",                 list(perturb("AGE_GE70", 1L)),                        1.10,
  "Black / African American (vs White)",     list(perturb("RACE_BLACK", 1L)),                      1.09,
  "Asian (vs White)",                        list(perturb("RACE_ASIAN", 1L)),                      1.00,
  "Other (vs White)",                        list(perturb("RACE_OTHER", 1L)),                      1.08,
  "Hispanic (vs non-Hispanic)",              list(perturb("RACE_HISPANIC", 1L)),                   0.92,
  "T2DM (vs normoglycaemic)",                list(perturb("DIS_DIAB", 1L)),                        0.84,
  "Prediabetes (vs normoglycaemic)",         list(perturb("DIS_PREDIAB", 1L)),                     1.00,
  "1.8 mg (vs 3.0 mg)",                      list(perturb("DOSE_1P8MG", 1L)),                      0.98
)

forest_tbl <- cov_scenarios |>
  dplyr::rowwise() |>
  dplyr::mutate(
    cl_ref     = typical_cl(ref_cov),
    cl_scen    = typical_cl(cov[[1]]),
    model_AUC_ratio = cl_ref / cl_scen
  ) |>
  dplyr::ungroup() |>
  dplyr::mutate(
    `Paper (Fig. 2)`  = sprintf("%.2f", paper_AUC_ratio),
    `Model-implied`   = sprintf("%.2f", model_AUC_ratio),
    `Difference (%)`  = sprintf("%+.1f", 100 * (model_AUC_ratio - paper_AUC_ratio) / paper_AUC_ratio)
  ) |>
  dplyr::select(scenario, `Paper (Fig. 2)`, `Model-implied`, `Difference (%)`) |>
  dplyr::rename(Covariate = scenario)

knitr::kable(forest_tbl,
  caption = "Model-implied vs published AUC24 ratios (Overgaard 2016 Fig. 2). Rows within ~1% confirm the covariate implementation.")
```

# Assumptions and deviations

- Absorption rate constant `Ka` was fixed at 0.0806 h^-1 by Overgaard 2016
  based on a prior obese-subject multiple-dose popPK model (data on file
  per Overgaard 2016 ref [8]). Online Resource Sect. S1 notes the sparse
  sampling design cannot separately identify `Ka`; a sensitivity analysis
  varying `Ka` by +/- 25% left all parameters except `V/F` essentially
  unchanged, and only `V/F` shifted (17.7 - 29.7 L across the sensitivity
  range). We report the paper's headline `Ka = 0.0806 /h` (Table S1 rounds
  to 0.09).
- The printed `CL/F` covariate-model equation in Sect. 2.2 lists
  `E_weight * E_dose * E_sex * E_age * E_ethnicity * E_disease_status`
  but omits `E_race`, whereas Table S1 lists separate `Cov. Black`, `Cov.
  Asian`, `Cov. Other` coefficients that are clearly used in the model
  (Fig. 2 forest plot shows the three race levels). We interpret the
  printed equation as a typesetting omission and include the race effects
  in `cl_covs` per Table S1.
- `V/F` inter-individual variability (34.7% CV) was retained per Table S1
  but Online Resource Sect. S1 reports 83.2% shrinkage on the individual
  Bayesian estimates. Individual `V/F` predictions from this model should
  be interpreted with care; typical-value and AUC-oriented predictions are
  robust (low CL shrinkage 23.9% and low residual-error shrinkage 9.4%).
- The Hispanic ethnicity effect is encoded via the `RACE_HISPANIC` canonical
  covariate column (1 = Hispanic, 0 = non-Hispanic). Overgaard 2016 treats
  ethnicity as a covariate dimension separate from race (unlike, e.g.,
  Robbie 2012 palivizumab, which pooled Hispanic with the race indicators);
  the numerical column encoding is identical to the canonical form. See
  the register entry for `RACE_HISPANIC` and the per-model `covariateData`
  notes for the ethnicity-vs-race semantic.
- Race and ethnicity are sampled independently in the virtual cohort;
  Overgaard 2016 Table 1 does not tabulate the race x ethnicity joint
  distribution.
- Prediabetes and T2DM are enforced as mutually exclusive in the virtual
  cohort because Sect. 3.1 describes them as three separate baseline
  glycaemic-status categories (normoglycaemic, prediabetic, T2DM). All
  prediabetic subjects originated from Trial 1 and all T2DM subjects from
  Trial 2 (paper's Sect. 3.3.5); the marginal frequencies (49.3% and 20.0%
  respectively) are matched at the pooled-cohort level.
- Post hoc covariates (injection site, renal function) are not part of the
  covariate model implemented here. Overgaard 2016 Sect. 2.4 and Fig. 2
  confirm both are pharmacokinetically irrelevant (all AUC ratios inside
  the bioequivalence 0.80-1.25 limits). The paper's "high-exposure" (1631
  nM h) and "low-exposure" (297 nM h) scenarios in Sect. 3.3.7 include the
  small injection-site adjustment; without it, the model-only predictions
  are approximately 1580 and 310 nM h respectively (Sect. 3.3.7).
- The proportional error model reports 15.4 %CV on the log-normal residual
  variability (Table S1). This is applied via `Cc ~ prop(propSd)` with
  `propSd = 0.154`.
- Liraglutide molar mass (3751.2 g/mol) is used to convert the mg dose
  input to the nmol amount needed for `Cc` in nmol/L (LLOQ 30 pmol/L in
  Trials 1 + 2 per Sect. 2.5).
