Empagliflozin (Baron 2016)
Source:vignettes/articles/Baron_2016_empagliflozin.Rmd
Baron_2016_empagliflozin.RmdModel and source
- Citation: Baron KT, Macha S, Broedl UC, Nock V, Retlich S, Riggs M. Population Pharmacokinetics and Exposure-Response (Efficacy and Safety/Tolerability) of Empagliflozin in Patients with Type 2 Diabetes. Diabetes Ther. 2016;7(3):455-471. doi:10.1007/s13300-016-0174-y
- Description: Two-compartment population PK with lagged first-order absorption for empagliflozin in patients with type 2 diabetes (T2DM), coupled with two indirect-response PK/PD models for fasting plasma glucose (FPG) and glycated hemoglobin (HbA1c). The drug effect on FPG elimination is driven by steady-state AUC (AUCss = DOSE_EMPA_MGD * 1e6 / MW / CL) via an Emax function (Gmax, AUC50); FPG in turn drives HbA1c production with a boundary-condition baseline (HbA1climit). Pooled popPK/PD analysis of 4065 T2DM patients (PK n = 2761 active) from two phase I, four phase II, and four phase III studies (Baron 2016 Diabetes Therapy).
- Article: https://doi.org/10.1007/s13300-016-0174-y
- Supplement: https://static-content.springer.com/esm/art%3A10.1007%2Fs13300-016-0174-y/MediaObjects/13300_2016_174_MOESM1_ESM.docx
Population
The pooled popPK / PD dataset (Baron 2016 Tables 1, 2, and S2) comprised 4065 type 2 diabetes (T2DM) patients across two phase I, four phase II, and four phase III empagliflozin studies; 2761 were on active empagliflozin (1 - 50 mg PO once daily), 1469 received placebo. Median age 58.0 years (range 36.0 - 76.0), median BMI 29.1 kg / m2, 45.5 % female. Race: 55.3 % non-Black / non-Asian, 2.73 % Black, 42.0 % Asian (the high Asian fraction reflects a Japanese phase IIb dose-ranging trial). Median baseline FPG 8.38 mmol / L; median baseline HbA1c 7.90 %; median eGFR 81.8 mL / min / 1.73 m2. The PK dataset (12 503 empagliflozin concentrations) excludes placebo subjects; the FPG / HbA1c datasets (25 361 FPG and 22 012 HbA1c observations) include placebo arms.
The same information is available programmatically via
readModelDb("Baron_2016_empagliflozin")$population.
Source trace
Per-parameter origin is recorded in the in-file comments of
inst/modeldb/specificDrugs/Baron_2016_empagliflozin.R. The
summary below points to the published table or methods passage for each
block.
| Equation / parameter block | Value (typical) | Source location |
|---|---|---|
| 2-cmt PK with first-order abs + lag | n / a | Baron 2016 Methods “Population PK Analysis – Model Development” |
| TV_CL = 10.6 L / h | 10.6 | Table S1 row TV_CL |
| TV_V2 (now vc) = 3.14 L | 3.14 | Table S1 row TV_V2 |
| Q / F = 6.34 L / h | 6.34 | Table S1 row Q / F |
| TV_V3 (now vp) = 70.6 L | 70.6 | Table S1 row TV_V3 |
| TV_ka = 0.196 / h | 0.196 | Table S1 row TV_ka |
| ALAG1 = 0.5 h (FIXED) | 0.500 | Methods + Table S1 footnote |
| CL covariate effects (12 covariates) | see model file | Table S1 rows theta_1 - theta_12 |
| V2, V3, ka covariate effects | see model file | Table S1 rows theta_13 - theta_25 |
| IIV CL, V3, ka (correlated CL, V3) | omega^2 | Table S1 rows omega^2 |
| Proportional residual (late phase) | sqrt(0.128) | Table S1 row sigma^2_prop (Studies 3-4-6-10) |
| FPG indirect-response ODE | n / a | Methods Eq. 1 |
| STIM = Gmax * AUCss / (AUC50 + AUCss) | n / a | Methods STIM equation |
| BFPG steady-state baseline kFPGin = BFPG * kFPGout | n / a | Methods derivation |
| IBFPG (Studies 6-10) = 14.2 mmol / L | 14.2 | Table S3 row IBFPG (Studies 6-10) |
| BFPG covariate effects (11 covariates) | see model file | Table S3 rows theta_1 - theta_11 |
| kFPGout = 0.0407 / h (FIXED) | 0.0407 | Table S3 row kFPGout (RSE N / A, CI [0.0407, 0.0407]) |
| TV_Gmax = 0.217 | 0.217 | Table S3 row TV_Gmax (21.7 %) |
| Gmax covariate effects (11 covariates) | see model file | Table S3 rows theta_12 - theta_22 |
| AUC50 = 703 nM*h | 703 | Table S3 row AUC50 |
| IIV BFPG, Gmax | see model file | Table S3 rows omega^2_BFPG / Gmax |
| Proportional FPG residual | sqrt(0.0236) | Table S3 row sigma^2_prop |
| HbA1c indirect-response ODE | n / a | Methods Eq. 2 |
| Ratio kHbA1cin / kHbA1cout = 0.466 | 0.466 | Table S4 row Ratio |
| HbA1climit (Studies 6-10) = 3.99 % | 3.99 | Table S4 row HbA1climit (Studies 6-10) |
| TV_kHbA1cout = 1.59e-3 / h | 1.59e-3 | Table S4 row TV_kHbA1cout |
| kHbA1cout covariate effects (7) | see model file | Table S4 rows theta_1 - theta_7 |
| IIV kHbA1cout | see model file | Table S4 row omega^2_kHbA1cout |
| Proportional HbA1c residual | sqrt(0.00321) | Table S4 row sigma^2_prop_HbA1c |
| MW_empa = 450.91 g / mol (C23H27ClO7) | 450.91 | PubChem CID 11949646 / DrugBank DB09038 |
Virtual cohort
Original individual patient data are not publicly available. The simulations below use a virtual cohort whose covariate distributions match the published population (Baron 2016 Tables 2 and S2). Two dose arms are simulated: 10 mg and 25 mg empagliflozin PO once daily for 24 weeks, 200 subjects per arm (the cap recommended by the extraction skill).
set.seed(20260624)
mod <- readModelDb("Baron_2016_empagliflozin")()
mw_empa <- 450.91
# Helper: build one dose-cohort event table.
# - Subject covariates approximate the Baron 2016 PK / PD dataset medians and
# percentiles (Table 2): truncated log-normal for AGE, BMI, CRCL, baseline
# FPG; near-fixed for the lab covariates (ALT, AST, ALP, LDH, TPRO) since
# their covariate effects on CL are clinically negligible.
# - Categorical covariates use the marginal frequencies in Table S2.
# - Observation times: dense for PK over the first dose interval, then sparse
# weekly for FPG / HbA1c out to 24 weeks (4032 h).
make_cohort <- function(n, dose_mg, id_offset = 0L) {
subj <- tibble::tibble(
id = id_offset + seq_len(n),
AGE = pmin(pmax(rnorm(n, 58, 10), 36), 76), # years
BMI = pmin(pmax(rnorm(n, 29.1, 4.5), 21), 42.4), # kg / m2
CRCL = pmin(pmax(rnorm(n, 81.8, 25), 33.4), 128), # mL / min / 1.73 m2
TPRO = pmin(pmax(rnorm(n, 720, 35), 600), 850), # g / L (canonical; paper g / dL * 10)
ALT = pmin(pmax(rnorm(n, 25, 12), 10), 75), # U / L
AST = pmin(pmax(rnorm(n, 21, 8), 12), 52), # U / L
ALP = pmin(pmax(rnorm(n, 73, 22), 41), 129), # U / L
LDH = pmin(pmax(rnorm(n, 162, 30), 114), 247), # U / L
FPG = pmin(pmax(rnorm(n, 8.38, 1.8), 4.83), 13.6), # mmol / L (observed baseline)
T_DIAG_DIAB = pmax(rgamma(n, shape = 4, scale = 2), 0.1), # years; ~ median 8, floor 0.1
SEXF = rbinom(n, 1, 0.455),
SMOKE_NEVER = rbinom(n, 1, 0.627),
SMOKE_CURRENT = rbinom(n, 1, 0.132),
RACE_ASIAN = rbinom(n, 1, 0.420),
RACE_BLACK = rbinom(n, 1, 0.0273),
CONMED_METFORMIN = rbinom(n, 1, 0.376),
CONMED_SULFONYLUREA = rbinom(n, 1, 0.296), # ~ +metformin and sulfonylurea fraction
CONMED_PIOGLITAZONE = rbinom(n, 1, 0.10), # Study 7 backbone is pioglitazone +/- metformin (~ 10% overall)
DOSE_EMPA_MGD = dose_mg
)
# Enforce SMOKE_NEVER and SMOKE_CURRENT mutual exclusion
both_one <- subj$SMOKE_NEVER == 1L & subj$SMOKE_CURRENT == 1L
subj$SMOKE_CURRENT[both_one] <- 0L
# Dosing: empagliflozin PO QD x 168 days (4032 h). cmt = "depot" is the
# absorption-compartment ODE state.
doses <- subj |>
tidyr::expand_grid(time = seq(0, 4032 - 24, by = 24)) |>
dplyr::mutate(amt = dose_mg, evid = 1L, cmt = "depot")
# Single unified observation grid -- one obs row per time, anchored at
# cmt = "central" (the ODE state) with dvid = 1L. rxSolve returns Cc,
# glucose, and hba1c as columns at every output row, so a single anchor
# cmt covers all three endpoints. dvid = 1L resolves the multi-endpoint
# PK / PD model's dvid -> cmt mapping (see known-vignette-failure-patterns
# pattern 5b and the Germovsek_2018_meropenem.Rmd precedent).
obs_times <- sort(unique(c(
seq(0.5, 24, by = 0.5), # day 1 dense PK
24 * 7 * 12 + c(0, 1, 2, 4, 8, 12, 24), # week 12 PK day
seq(0, 4032, by = 24 * 7) # weekly grid for FPG / HbA1c
)))
obs <- subj |>
tidyr::expand_grid(time = obs_times) |>
dplyr::mutate(amt = NA_real_, evid = 0L, cmt = "central", dvid = 1L)
dplyr::bind_rows(doses |> dplyr::mutate(dvid = NA_integer_), obs) |>
dplyr::arrange(id, time, dplyr::desc(evid))
}
events <- dplyr::bind_rows(
make_cohort(200, dose_mg = 10, id_offset = 0L) |> dplyr::mutate(treatment = "10 mg QD"),
make_cohort(200, dose_mg = 25, id_offset = 200L) |> dplyr::mutate(treatment = "25 mg QD")
)
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))Simulation
sim <- rxode2::rxSolve(
mod,
events = events,
keep = c("treatment")
) |> as.data.frame()
dim(sim)
#> [1] 31600 51Replicate published figures
PK steady-state on day 1
The published Table S1 PK has no observed concentration figure in the main paper, but the typical-value AUC for 10 and 25 mg QD can be compared with the “AUCss / reference AUCss” exposures shown in Baron 2016 Figure 1b (median typical-AUCss ~ 2000 nMh for 10 mg and ~ 5000 nMh for 25 mg). The plot below shows the median (line) and 5 - 95 % envelope (ribbon) of simulated Cc over the first dose interval and at week 12 steady state.
pk_day1 <- sim |>
dplyr::filter(time > 0, time <= 24, !is.na(Cc), Cc > 0) |>
dplyr::group_by(treatment, time) |>
dplyr::summarise(
Q05 = stats::quantile(Cc, 0.05),
Q50 = stats::quantile(Cc, 0.50),
Q95 = stats::quantile(Cc, 0.95),
.groups = "drop"
)
ggplot(pk_day1, aes(time, Q50, fill = treatment, color = treatment)) +
geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25, color = NA) +
geom_line(linewidth = 0.8) +
labs(
x = "Time after first dose (h)", y = "Empagliflozin concentration (nM)",
title = "Day 1 empagliflozin PK by dose group (10 vs 25 mg QD)",
caption = "Median (line) and 5 - 95 % envelope (ribbon) from 200 simulated subjects per arm."
) +
scale_y_log10() +
theme_bw()
FPG and HbA1c trajectories over 24 weeks
Replicates the qualitative pattern of Baron 2016 Figures S5 (FPG VPC) and S7 (HbA1c VPC), restricted to median and 95 % envelope.
pd_week <- sim |>
dplyr::filter(!is.na(glucose), !is.na(hba1c)) |>
dplyr::mutate(week = time / (24 * 7))
# FPG trajectory
fpg_summary <- pd_week |>
dplyr::group_by(treatment, week) |>
dplyr::summarise(
fpg_q05 = stats::quantile(glucose, 0.05),
fpg_q50 = stats::quantile(glucose, 0.50),
fpg_q95 = stats::quantile(glucose, 0.95),
.groups = "drop"
)
p_fpg <- ggplot(fpg_summary, aes(week, fpg_q50, color = treatment, fill = treatment)) +
geom_ribbon(aes(ymin = fpg_q05, ymax = fpg_q95), alpha = 0.2, color = NA) +
geom_line(linewidth = 0.8) +
labs(x = "Week of treatment", y = "FPG (mmol / L)",
title = "Simulated FPG over 24 weeks (Baron 2016 Eq. 1)") +
theme_bw()
# HbA1c trajectory
hba1c_summary <- pd_week |>
dplyr::group_by(treatment, week) |>
dplyr::summarise(
hba_q05 = stats::quantile(hba1c, 0.05),
hba_q50 = stats::quantile(hba1c, 0.50),
hba_q95 = stats::quantile(hba1c, 0.95),
.groups = "drop"
)
p_hba <- ggplot(hba1c_summary, aes(week, hba_q50, color = treatment, fill = treatment)) +
geom_ribbon(aes(ymin = hba_q05, ymax = hba_q95), alpha = 0.2, color = NA) +
geom_line(linewidth = 0.8) +
labs(x = "Week of treatment", y = "HbA1c (%)",
title = "Simulated HbA1c over 24 weeks (Baron 2016 Eq. 2)") +
theme_bw()
print(p_fpg)
print(p_hba)
Comparison against published Table 3 (HbA1c reductions at 24 weeks)
Baron 2016 Table 3 reports the model-predicted median change-from-baseline HbA1c at 24 weeks for the overall PK / PD population on 10 and 25 mg QD as roughly -0.5 % and -0.55 %. The simulated medians from this implementation are shown below.
baseline <- sim |>
dplyr::filter(!is.na(hba1c), time == 0) |>
dplyr::select(id, treatment, hba1c_baseline = hba1c)
week24 <- sim |>
dplyr::filter(!is.na(hba1c), time == 24 * 7 * 24) |> # exactly 24 weeks
dplyr::select(id, treatment, hba1c_week24 = hba1c)
cfb <- dplyr::inner_join(baseline, week24, by = c("id", "treatment")) |>
dplyr::mutate(delta_hba1c = hba1c_week24 - hba1c_baseline)
simulated <- cfb |>
dplyr::group_by(treatment) |>
dplyr::summarise(
n = dplyr::n(),
delta_hba1c_median = stats::median(delta_hba1c),
delta_hba1c_q025 = stats::quantile(delta_hba1c, 0.025),
delta_hba1c_q975 = stats::quantile(delta_hba1c, 0.975),
.groups = "drop"
)
# Published reference: Baron 2016 Table 3 (predicted change from baseline HbA1c at 24 w)
# Pooled-population row not given verbatim; use the eGFR 60-90 row (largest subpopulation):
# 10 mg: -0.53 ( -0.67, -0.37 ) ; 25 mg: -0.59 ( -0.74, -0.44 )
published <- tibble::tibble(
treatment = c("10 mg QD", "25 mg QD"),
delta_hba1c_published_median = c(-0.53, -0.59),
delta_hba1c_published_q025 = c(-0.67, -0.74),
delta_hba1c_published_q975 = c(-0.37, -0.44)
)
cmp <- dplyr::full_join(simulated, published, by = "treatment")
knitr::kable(
cmp,
caption = paste(
"Simulated vs. Baron 2016 Table 3 (eGFR 60 - 90 mL / min / 1.73 m2 row used as a reference",
"because the unstratified-overall row is not tabulated). Differences within +/- 0.1 %",
"(absolute) are expected given the virtual cohort vs the actual phase II / III cohort."
),
digits = 3
)| treatment | n | delta_hba1c_median | delta_hba1c_q025 | delta_hba1c_q975 | delta_hba1c_published_median | delta_hba1c_published_q025 | delta_hba1c_published_q975 |
|---|---|---|---|---|---|---|---|
| 10 mg QD | 200 | -0.566 | -1.612 | -0.181 | -0.53 | -0.67 | -0.37 |
| 25 mg QD | 200 | -0.667 | -1.859 | -0.193 | -0.59 | -0.74 | -0.44 |
PKNCA validation (day 1 single-dose Cmax, Tmax, AUC0-24, half-life)
The Baron 2016 paper does not tabulate per-dose-group NCA values directly, but the population-typical 10 mg and 25 mg AUCss are pegged in Figure 1b at approximately 2000 nMh and 5000 nMh respectively. The PKNCA block below computes day 1 AUC0-24 (a proxy for steady-state AUC at typical CL with empagliflozin’s relatively short half-life), Cmax, Tmax, and apparent half-life per dose arm.
sim_nca <- sim |>
dplyr::filter(!is.na(Cc), time <= 24) |>
dplyr::select(id, time, Cc, treatment)
# Guarantee a time=0 row per (id, treatment) so PKNCA anchors AUC0- at 0
sim_nca <- dplyr::bind_rows(
sim_nca,
sim_nca |> dplyr::distinct(id, treatment) |>
dplyr::mutate(time = 0, Cc = 0)
) |>
dplyr::distinct(id, treatment, time, .keep_all = TRUE) |>
dplyr::arrange(id, treatment, time)
conc_obj <- PKNCA::PKNCAconc(sim_nca, Cc ~ time | treatment + id)
# Doses: first dose per subject for day 1 NCA
dose_df <- events |>
dplyr::filter(evid == 1L, time == 0) |>
dplyr::select(id, time, amt, treatment)
dose_obj <- PKNCA::PKNCAdose(dose_df, amt ~ time | treatment + id)
intervals <- data.frame(
start = 0,
end = 24,
cmax = TRUE,
tmax = TRUE,
auclast = TRUE,
half.life = TRUE
)
nca_data <- PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
nca_res <- PKNCA::pk.nca(nca_data)
# Publication-reference: typical AUCss at 10 / 25 mg QD from Baron 2016 Figure 1b
# (qualitative; AUCss ~ 2000 / 5000 nM*h). AUClast over the first 24 h with
# accumulation < 10 % (empagliflozin t1 / 2 ~ 12 h) approximates AUCss to within
# ~ 15 %.
published <- tibble::tribble(
~treatment, ~cmax, ~tmax, ~auclast, ~half.life,
"10 mg QD", 500, 1.5, 1800, 12,
"25 mg QD", 1250, 1.5, 4500, 12
)
cmp_nca <- nlmixr2lib::ncaComparisonTable(
simulated = nca_res,
reference = published,
by = "treatment",
units = c(cmax = "nM", auclast = "nM*h", tmax = "h", half.life = "h"),
tolerance_pct = 25
)
knitr::kable(
cmp_nca,
caption = paste(
"Day 1 NCA vs published-typical reference (Baron 2016 Figure 1b qualitative",
"ranges; the paper does not tabulate per-dose-group day 1 NCA). Starred rows",
"differ from reference by > 25 %."
),
align = c("l", "l", "r", "r", "r", "r")
)| NCA parameter | treatment | Reference | Simulated | % diff |
|---|---|---|---|---|
| Cmax (nM) | 10 mg QD | 500 | 261 | -47.8%* |
| Cmax (nM) | 25 mg QD | 1250 | 697 | -44.3%* |
| Tmax (h) | 10 mg QD | 1.5 | 1.5 | +0.0% |
| Tmax (h) | 25 mg QD | 1.5 | 1.5 | +0.0% |
| AUClast (nM*h) | 10 mg QD | 1800 | 2010 | +11.7% |
| AUClast (nM*h) | 25 mg QD | 4500 | 5290 | +17.7% |
| t½ (h) | 10 mg QD | 12 | 10.9 | -9.0% |
| t½ (h) | 25 mg QD | 12 | 11.3 | -5.6% |
Assumptions and deviations
- Late-phase residual error used for Cc. Baron 2016 Table S1 reports two proportional residual variances (Studies 1-2-5: 16.9 % CV; Studies 3-4-6-10: 37.0 % CV). The model file encodes only the late-phase value because Studies 6-10 are the registration / phase III trials and dominate the dataset; the early-phase Studies 1-2-5 residual is documented in the model file comment.
- Outlier CWRES residual not propagated. Table S1 records a separate additive-on-log-scale residual (variance 3.50e+05 nM, intended to retain ~ 1.74 % of CWRES outlier observations) – this is a fitting accommodation for misspecified collection times, not a property of the underlying concentration noise, and is omitted from simulation.
-
Study-specific intrinsic baselines (IBFPG, HbA1climit)
collapsed to Studies 6-10 values. Table S3 reports per-study
IBFPG values (Study 1 = 12.8, Study 2 = 14.1, Studies 3-4 = 14.7, Study
5 = 14.8, Studies 6-10 = 14.2 mmol / L) and Table S4 reports per-study
HbA1climit (Studies 3-4 = 3.57 %, Studies 6-10 = 3.99 %). The packaged
model uses the Studies 6-10 values (14.2 mmol / L and 3.99 %), which are
the late-phase phase III values relevant to the registration cohort. For
reproducing earlier-phase studies, override the
libfpgandhba1climitparameters with the appropriate per-study value. - Smoking covariate recoded. Baron 2016 Table S1 uses never-smoker as the reference for the 3-level smoking categorical (CL multipliers theta_4 = 1.02 for ex-smoker and theta_5 = 1.06 for current-smoker, both vs never). The packaged model uses the canonical SMOKE_NEVER + SMOKE_CURRENT pair with former smoker as the reference (covariate-columns.md convention) and recodes the coefficients accordingly: cl_smoke_never = 1 / 1.02 = 0.9804 and cl_smoke_current = 1.06 / 1.02 = 1.0392. The model output is mathematically identical to the paper’s encoding; only the reference category differs.
- Empagliflozin MW. 450.91 g / mol used for the mg <-> nM dose / exposure conversion (C23H27ClO7; PubChem CID 11949646, DrugBank DB09038).
- Virtual cohort. Demographics generated from Table 2 and Table S2 marginal summaries (truncated normal for continuous covariates; marginal binomial for categoricals). The joint distribution of correlated covariates (e.g. CRCL by AGE) is not preserved; simulated outcomes are summarised at the population median rather than per-subgroup.
- Day 1 NCA proxy for steady-state AUC. Empagliflozin’s terminal half-life is ~ 12 h, so day-1 AUC0-24 is approximately 80 - 90 % of AUCss; the comparison table acknowledges this and uses a +/- 25 % tolerance rather than the default 20 %.
- Logistic-regression safety models not implemented. Baron 2016 also reports logistic-regression exposure-response analyses for confirmed hypoglycemia, UTI, genital infection, and volume depletion. These are not part of the ODE-based popPK / PD core and are not implemented in this extraction; the four odds-ratio summaries (Baron 2016 Results paragraph “Exposure-Response Analysis (Safety)”) remain in the paper as published.