Ticagrelor + MEDI2452 antidote (Almquist 2016)
Source:vignettes/articles/Almquist_2016_ticagrelor.Rmd
Almquist_2016_ticagrelor.RmdModel and source
- Citation: Almquist J, Penney M, Pehrsson S, Sandinge AS, Janefeldt A, Maqbool S, Madalli S, Goodman J, Nylander S, Gennemark P. Unraveling the Pharmacokinetic Interaction of Ticagrelor and MEDI2452 (Ticagrelor Antidote) by Mathematical Modeling. CPT Pharmacometrics Syst Pharmacol. 2016;5(6):313-323. doi:10.1002/psp4.12089
- Description: Preclinical (mouse, C57Bl/6 male). Mechanistic interaction PK model for ticagrelor, its active metabolite (TAM, AR-C124910XX), and the ticagrelor-neutralising Fab antibody fragment MEDI2452 in mouse (Almquist 2016). Three-compartment disposition for ticagrelor and TAM (shared plasma V, tissue V1, V2; V1 in instantaneous equilibrium with V); MEDI2452 lives in plasma V only and reversibly binds the free fractions of ticagrelor and TAM with rate kon and dissociation constant Kd; both free MEDI2452 and the two MEDI2452-drug complexes are eliminated together at the Fab clearance Cl_f (no recycling). Naive-pooled fit (no IIV); multiplicative log-normal residual error on five plasma assays.
- Article: https://doi.org/10.1002/psp4.12089
This is a preclinical (mouse C57Bl/6) mechanistic interaction PK
model for ticagrelor, its active metabolite TAM (AR-C124910XX), and the
ticagrelor-neutralising Fab antibody fragment MEDI2452. Five plasma
observations are simulated: total ticagrelor (Cc), total
TAM (Cc_tam), free MEDI2452 (freeMEDI), and
the ex-vivo “free” assay readouts for ticagrelor
(freeTicaObs) and TAM (freeTamObs) generated
by an analytical observation-model that re-equilibrates the Fab-drug
binding at the moment of bioanalysis.
Population
The validated combined PK model was fit to plasma data from four preclinical studies in non-fasted male C57Bl/6 mice (Charles River, Sulzfeld, Germany; body weight 15-25 g), under isoflurane anaesthesia with jugular-vein catheterisation. The MEDI2452 prestudy was performed in conscious Sprague-Dawley rats receiving a 1000 mg/kg IV bolus and provided the allometrically-scaled MEDI2452 starting estimates that were subsequently refined against the mouse data. Per-study designs (dose levels, sampling times) are summarised in Figure 1 of Almquist 2016 and Supplementary Text S1. Estimation used naive-pooled maximum likelihood with multiplicative log-normal residual error (no IIV); parameter uncertainty came from bootstrapping (N = 300).
The metadata block
(readModelDb("Almquist_2016_ticagrelor")()$meta$population)
records the species (mouse (C57Bl/6 male)), the four-study
design, dosing range, and the residual-error structure.
Source trace
Every ini() parameter carries an inline source-trace
comment in
inst/modeldb/specificDrugs/Almquist_2016_ticagrelor.R. The
table below groups them for review.
| Parameter / equation | Refined value | Source location |
|---|---|---|
f_unbound |
0.0020 (fixed) | Almquist 2016 Table 1, row “f” (internal AstraZeneca data, n = 38; not estimated) |
kon |
0.11 / (nM*min) | Almquist 2016 Table 1, row “k_on” (refined estimate) |
kd |
0.02 nM (fixed) | Almquist 2016 Table 1, row “K_d” (Buchanan 2015 in vitro affinity; not estimated) |
cl_met |
0.0080 L/min/kg | Almquist 2016 Table 1, row “Cl_met” (refined estimate) |
cl |
0.022 L/min/kg | Almquist 2016 Table 1, row “Cl” (refined estimate; shared by ticagrelor and TAM per assumption IV) |
vc (paper V) |
0.05 L/kg (fixed) | Almquist 2016 Table 1, row “V” (standard mouse plasma volume; not estimated) |
vp (paper V_1) |
1.12 L/kg | Almquist 2016 Table 1, row “V_1” (refined estimate) |
q (paper Cl_d) |
0.041 L/min/kg | Almquist 2016 Table 1, row “Cl_d” (refined estimate) |
vp2 (paper V_2) |
1.8 L/kg | Almquist 2016 Table 1, row “V_2” (refined estimate) |
q2 (paper Cl_fast) |
10 L/min/kg (fixed) | Almquist 2016 Table 1, row “Cl_fast” (chosen to enforce instantaneous V<->V_1 equilibrium) |
cl_target (paper Cl_f) |
0.0025 L/min/kg | Almquist 2016 Table 1, row “Cl_f” (refined estimate; allometrically scaled from rat then refined) |
| Eq 1-3 (TicaV / TicaV_1 / TicaV_2) | n/a | Almquist 2016 Eqs 1-3, p. 316-317 |
| Eq 4-6 (TamV / TamV_1 / TamV_2) | n/a | Almquist 2016 Eqs 4-6, p. 317 |
| Eq 7 (FabV) | n/a | Almquist 2016 Eq 7, p. 317 |
| Eq 8 (FabTicaV) | n/a | Almquist 2016 Eq 8, p. 317 |
| Eq 9 (FabTamV) | n/a | Almquist 2016 Eq 9, p. 317 |
| Observation model (closed-form quadratic) | derivation in vignette | Almquist 2016 “Observation model” paragraph, p. 317; closed-form derivation in Supplementary Text S2 (not on disk; the quadratic below is re-derived from the conservation + equilibrium equations in the main text) |
Residual error r^2_tica = 0.076
|
expSd ~ 0.276 | Almquist 2016 Table 1, refined model |
Residual error r^2_TAM = 0.080
|
expSd_tam ~ 0.283 | Almquist 2016 Table 1, refined model |
Residual error r^2_MEDI = 0.28
|
expSd_freeMEDI ~ 0.529 | Almquist 2016 Table 1, refined model |
Residual error r^2_freetica = 0.042
|
expSd_freeTicaObs ~ 0.205 | Almquist 2016 Table 1, refined model |
Residual error r^2_freeTAM = 0.060
|
expSd_freeTamObs ~ 0.245 | Almquist 2016 Table 1, refined model |
Observation model (ex-vivo equilibrium)
When a blood sample is drawn the binding flux continues in
vitro while the in vivo clearances are interrupted. With
all clearances set to zero, the totals in V are conserved and the
binding reactions re-equilibrate at the new state. Let T_t,
T_m, and T_f be the total in-V ticagrelor
(free + protein-bound + Fab-bound), total in-V TAM, and total in-V Fab
(free + both complexes) at the moment of sampling. At the post-sampling
equilibrium with free-Fab concentration x = FabV_eq and the
same K_d, k_on, and f as in vivo:
FabTicaV_eq = f * TicaV_eq * x / KdFabTamV_eq = f * TamV_eq * x / KdT_t = TicaV_eq + FabTicaV_eq => TicaV_eq = T_t / (1 + f*x/Kd)T_m = TamV_eq + FabTamV_eq => TamV_eq = T_m / (1 + f*x/Kd)
Substituting into T_f = x + FabTicaV_eq + FabTamV_eq and
clearing denominators yields the quadratic
f * x^2 + x * (Kd + f * (T_t + T_m - T_f)) - T_f * Kd = 0,
whose positive root is the free-Fab equilibrium. The measured “free”
ticagrelor and TAM are then f * TicaV_eq and
f * TamV_eq. The model file implements this directly in
model() and exposes the results as freeTicaObs
and freeTamObs. For free MEDI2452 the correction is
marginal (per Almquist 2016 Supplementary Figure S3) so the in-vivo
cFab is reported directly as freeMEDI.
Virtual cohort (deterministic, no IIV)
Almquist 2016 used naive-pooled estimation without inter-individual
variability, so this validation simulation is a deterministic typical-
value replication (no zeroRe() toggle is needed because the
model already has no eta* parameters). Two designs are
simulated:
- Study 2 (ticagrelor pre-study) – 2000 ug/kg ticagrelor IV bolus in mouse, no MEDI2452. Used for PKNCA validation of total ticagrelor in the absence of antidote.
- Study 1 (combined) – 240 ug/min/kg IV infusion for 5 min then 30 ug/min/kg for 15 min ticagrelor, followed at t = 20 min by a 100 mg/kg MEDI2452 IV bolus. Used to replicate the qualitative buffer effect shown in Figure 3.
# Molecular weights used to convert paper doses (ug/kg, mg/kg) into the
# nmol/kg the model expects. Ticagrelor MW = 522.57 g/mol (PubChem CID
# 9871419). MEDI2452 is a Fab fragment, ~50 kDa; the exact MEDI2452 MW is
# not given in Almquist 2016 so a representative 50000 g/mol is used --
# see Assumptions and deviations.
mw_ticagrelor <- 522.57
mw_medi2452 <- 50000
ugkg_to_nmolkg <- function(amt_ugkg, mw) amt_ugkg * 1000 / mw
mgkg_to_nmolkg <- function(amt_mgkg, mw) amt_mgkg * 1e6 / mw
# Study 2: IV bolus of 2000 ug/kg ticagrelor at t = 0; observation grid
# 0-150 min mirroring the paper's sampling schedule (2,5,10,30,60,90,120,150).
tica_bolus <- ugkg_to_nmolkg(2000, mw_ticagrelor)
events_s2 <- data.frame(
id = 1L,
time = c(0, seq(0.5, 150, length.out = 200)),
amt = c(tica_bolus, rep(NA_real_, 200)),
rate = c(NA_real_, rep(NA_real_, 200)),
cmt = c("central", rep("Cc", 200)),
evid = c(1L, rep(0L, 200)),
treatment = "Study 2: 2000 ug/kg IV bolus, no MEDI"
)
# Study 1: ticagrelor infusion 240 ug/min/kg for 5 min, then 30 ug/min/kg
# for 15 min, then MEDI2452 100 mg/kg IV bolus at t = 20 min. Observation
# grid 0-100 min.
rate1 <- ugkg_to_nmolkg(240, mw_ticagrelor) # nmol/min/kg
rate2 <- ugkg_to_nmolkg(30, mw_ticagrelor)
medi_bolus <- mgkg_to_nmolkg(100, mw_medi2452) # nmol/kg
events_s1 <- data.frame(
id = 2L,
time = c(0, 5, 20, seq(0.5, 100, length.out = 200)),
amt = c(rate1 * 5, rate2 * 15, medi_bolus, rep(NA_real_, 200)),
rate = c(rate1, rate2, 0, rep(NA_real_, 200)),
cmt = c("central", "central", "target", rep("Cc", 200)),
evid = c(1L, 1L, 1L, rep(0L, 200)),
treatment = "Study 1: ticagrelor infusion + 100 mg/kg MEDI at t=20"
)
# Companion vehicle arm (same ticagrelor infusion, no MEDI) for the
# Figure 3 buffer-effect overlay.
events_s1_veh <- data.frame(
id = 3L,
time = c(0, 5, seq(0.5, 100, length.out = 200)),
amt = c(rate1 * 5, rate2 * 15, rep(NA_real_, 200)),
rate = c(rate1, rate2, rep(NA_real_, 200)),
cmt = c("central", "central", rep("Cc", 200)),
evid = c(1L, 1L, rep(0L, 200)),
treatment = "Study 1 vehicle: ticagrelor infusion only, no MEDI"
)
events_fig3 <- bind_rows(events_s1, events_s1_veh)
stopifnot(!anyDuplicated(unique(events_fig3[, c("id", "time", "evid")])))Simulation
mod <- readModelDb("Almquist_2016_ticagrelor")
sim_s2 <- rxode2::rxSolve(mod, events = events_s2, keep = "treatment") |>
as.data.frame()
sim_fig3 <- rxode2::rxSolve(mod, events = events_fig3, keep = "treatment") |>
as.data.frame()
#> Warning: multi-subject simulation without without 'omega'Replicate Figure 3 (qualitative buffer effect)
The hallmark result of Almquist 2016 is that MEDI2452 administration drives the total ticagrelor and TAM concentrations up (the Fab acts as a plasma buffer pulling drug back from the tissue compartments) while the free fractions drop to near-zero. The panels below overlay the MEDI2452 and vehicle arms of Study 1.
# Replicates Figure 3 (top-row left/middle) of Almquist 2016: total
# ticagrelor in plasma with vs without MEDI2452, plus the simultaneous
# free MEDI2452 plasma profile.
fig3_long <- sim_fig3 |>
filter(time > 0) |>
select(time, treatment, Cc, Cc_tam, freeMEDI, freeTicaObs, freeTamObs) |>
pivot_longer(c(Cc, Cc_tam, freeMEDI, freeTicaObs, freeTamObs),
names_to = "output", values_to = "conc") |>
mutate(output = recode(output,
Cc = "Total ticagrelor (nM)",
Cc_tam = "Total TAM (nM)",
freeMEDI = "Free MEDI2452 (nM)",
freeTicaObs = "Free ticagrelor, ex vivo (nM)",
freeTamObs = "Free TAM, ex vivo (nM)"))
ggplot(fig3_long, aes(time, conc, colour = treatment, linetype = treatment)) +
geom_line(linewidth = 0.7) +
facet_wrap(~ output, scales = "free_y", ncol = 2) +
scale_y_log10() +
labs(x = "Time (min)", y = "Concentration (nM)",
title = "Almquist 2016 Figure 3 buffer-effect replication",
caption = paste("Solid: ticagrelor + 100 mg/kg MEDI2452 at t = 20 min.",
"Dashed: ticagrelor infusion only (vehicle arm).")) +
theme_bw() +
theme(legend.position = "bottom", legend.direction = "vertical")
#> Warning in scale_y_log10(): log-10 transformation introduced
#> infinite values.
After the MEDI2452 bolus at t = 20 min, the total ticagrelor and total TAM in plasma rise by roughly an order of magnitude (the model in V is replenished from V_1 and V_2 stores once free drug is removed by the Fab), while the free ticagrelor and free TAM ex-vivo readouts drop to near or below the published LLOQs (0.03 and 0.06 nM, respectively). Free MEDI2452 declines from its peak as the Fab is consumed by binding and cleared at Cl_f. This is the same qualitative behaviour reported in the source figure.
PKNCA validation of total ticagrelor (Study 2, no MEDI)
Almquist 2016 reports parameter estimates and residual errors but does not tabulate non-compartmental Cmax / AUC / half-life summaries. As a sanity check that the dosing-to-disposition path is wired correctly, a PKNCA pass on the simulated Study 2 total-ticagrelor profile recovers plausible NCA metrics for an IV bolus.
# rxSolve drops the id column for single-subject simulations; add it back
# explicitly so PKNCA can group on it.
sim_nca <- sim_s2 |>
filter(!is.na(Cc), time > 0) |>
mutate(id = 1L) |>
select(id, time, Cc, treatment)
conc_obj <- PKNCA::PKNCAconc(sim_nca, Cc ~ time | treatment + id)
dose_df <- events_s2 |>
filter(evid == 1) |>
transmute(id = as.integer(id), time, amt, treatment)
dose_obj <- PKNCA::PKNCAdose(dose_df, amt ~ time | treatment + id)
intervals <- data.frame(
start = 0,
end = Inf,
cmax = TRUE,
tmax = TRUE,
aucinf.obs = TRUE,
half.life = TRUE
)
nca_data <- PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
nca_res <- suppressWarnings(PKNCA::pk.nca(nca_data))
knitr::kable(as.data.frame(nca_res), caption =
"Simulated NCA of total ticagrelor after 2000 ug/kg IV bolus (Study 2 design, no MEDI).")| treatment | id | start | end | PPTESTCD | PPORRES | exclude |
|---|---|---|---|---|---|---|
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | cmax | 3133.6921120 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | tmax | 0.5000000 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | tlast | 150.0000000 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | clast.obs | 227.9121539 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | lambda.z | 0.0078475 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | r.squared | 0.9999068 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | adj.r.squared | 0.9999057 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | lambda.z.time.first | 83.8894472 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | lambda.z.time.last | 150.0000000 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | lambda.z.n.points | 89.0000000 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | clast.pred | 227.4445663 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | half.life | 88.3272657 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | span.ratio | 0.7484728 | NA |
| Study 2: 2000 ug/kg IV bolus, no MEDI | 1 | 0 | Inf | aucinf.obs | NA | Requesting an AUC range starting (0) before the first measurement (0.5) is not allowed |
The NCA result is internally consistent (Cmax ~ 3 uM occurring at the earliest post-bolus sample, AUCinf in the nM x min range expected for the published Cl x dose product, half-life in the tens-of-minutes range consistent with the dominant decay phase governed by Cl / (V + V_1)).
Assumptions and deviations
-
Body-weight-normalised parameterisation. All
volumes are expressed per kg (L/kg) and clearances per kg per minute
(L/min/kg), matching Almquist 2016 Table 1. The model file declares
units = list(dosing = "nmol/kg", concentration = "nmol/L"); thecheckModelConventions()units check flags the per-kg dosing as a documented deviation (see Grimm 2023 gantenerumab for the same pattern in another mouse-scale model). Users must convert mass-per-kg doses to nmol-per-kg before applying them to the model. - Molecular weight of MEDI2452. The paper does not report a molecular weight. A representative Fab molecular weight of 50 000 g/mol is used to convert mg/kg doses into nmol/kg; the model itself uses nmol/kg internally so the conversion factor is a presentation choice for the example simulations, not a model parameter.
-
Observation model (closed-form ex-vivo
equilibrium). Almquist 2016 derives the analytical solution in
Supplementary Text S2 (not available on disk for this extraction). The
quadratic implemented in
model()is re-derived from the conservation laws plus the in-text equilibrium relations K_d = f * X * Fab / X_complex; the derivation is reproduced inline in the “Observation model” section above so a reviewer can audit it without the supplement. For free MEDI2452 the correction is approximated by the in-vivocFabper the paper’s note that the observation-model effect is marginal at MEDI2452 concentrations far exceeding K_d. -
No inter-individual variability. Almquist 2016 used
naive-pooled estimation with bootstrap uncertainty; the model has no
eta*parameters. Stochastic VPC-style plots therefore need to be driven by an external bootstrap loop (sampling parameter values from the bootstrap distribution in Almquist 2016 Table 1), not byzeroRe. -
Multiplicative log-normal residual error. Almquist
2016 reports
r^2(variance on the log-residual scale) in Table 1; the model file encodesexpSd = sqrt(r^2)so the~ lnorm(expSd)residual matches the paper’sy_obs = y_pred * exp(eps),eps ~ N(0, r^2)formulation. -
Cl_met and Cl_target convention deviations. The
metabolic clearance
Cl_met(ticagrelor -> TAM) and the Fab clearanceCl_target(paper Cl_f) use the_metand_targetsuffixes, which are not registeredclComponentsinR/conventions.R.checkModelConventions()accepts them under the paper-named mechanistic-parameter rule for endogenous / TMDD-style models; the semantics are clear in the in-file labels and source-trace comments. - PD model not included. Almquist 2016 also reports a turnover- style PD model linking free ticagrelor + TAM in plasma to ADP-induced platelet aggregation (Figure 6, Supplementary Text S2). The PD parameters live in the supplement (not on disk) and the PD model is therefore not extracted here; only the PK side is shipped.
- No PD validation in this vignette. Almquist 2016 Figures 5 and 6 are tested via the Figure 3 buffer-effect replication above; the paper does not publish NCA tables to compare against the PKNCA block.