Moroctocog (Abrantes 2017)
Source:vignettes/articles/Abrantes_2017_moroctocog.Rmd
Abrantes_2017_moroctocog.RmdModel and source
- Citation: Abrantes JA, Nielsen EI, Korth-Bradley J, Harnisch L, Jonsson S. Elucidation of Factor VIII Activity Pharmacokinetics: A Pooled Population Analysis in Patients With Hemophilia A Treated With Moroctocog Alfa. Clin Pharmacol Ther. 2017 Jul;102(1):113-121. doi:[10.1002/cpt.716](https://doi.org/10.1002/cpt.716). PMID:28437834.
- Article: https://doi.org/10.1002/cpt.716
- Description: Two-compartment population PK model for factor VIII activity following intravenous administration of moroctocog alfa (B-domain-deleted recombinant FVIII; marketed as Refacto, Refacto AF, and Xyntha) in 754 patients with moderate to severe hemophilia A pooled across 13 clinical trials over 20 years. The exogenous drug-derived FVIII activity is added to a constant endogenous baseline; covariate effects describe weight, age, FVIII inhibitor status, race, study cohort, drug product, and bioanalytical assay.
The structural model is
with FVIII activity in plasma given by
where and are the central and peripheral compartment amounts in IU, is in dL so is in IU/dL directly, and is the endogenous FVIII activity (severe- subpopulation typical value 0.474 IU/dL). Covariate equations (Abrantes 2017 Table 2 footnotes b-g):
with the piecewise age effect
Population
The Abrantes 2017 analysis pooled 754 patients with moderate to severe hemophilia A across 13 clinical trials conducted in 25 countries between 1993 and 2013, contributing 7363 FVIII activity observations (Abrantes 2017 Table 1 and Table 3). Baseline demographics:
- Sex: 753 male (99.9%), 1 female (homozygous hemophilia A; B1831090).
- Age: median 23 years, range 1 day to 73 years; 234 (31%) under 17.
- Weight: median 69 kg, range 3.0 to 134 kg.
- Race: White 87.0%, Asian 7.7%, Black 1.3%, Other 3.8%.
- Severity: moderate to severe; per-study severity criteria listed in Table 3 (most studies enrolled severe FVIII < 1 IU/dL or severe + moderately severe < 2 IU/dL).
- Inhibitor status: 2.4% of 7363 observations from inhibitor-positive patients (Bethesda assay > 0.6 BU/mL); 92.5% of positive samples were low titer (< 5 BU/mL).
- Drug product: mixed across studies; Refacto and Refacto AF (CSA-calibrated, F = 1 reference) and Xyntha (OSA-calibrated, F = 1.38 for potency-label harmonisation).
- Assay: 9 studies used central-lab CSA, 3 studies used central-lab OSA, and 1 study (B1831003) used local-lab OSA.
The same metadata is available programmatically via
readModelDb("Abrantes_2017_moroctocog")$population.
Source trace
The per-parameter origin is recorded as an in-file comment next to
each ini() entry in
inst/modeldb/specificDrugs/Abrantes_2017_moroctocog.R. The
table below collects them in one place.
| Parameter / equation | Value | Source |
|---|---|---|
lcl (CL, dL/h) |
log(2.76) | Abrantes 2017 Table 2: CL = 2.76 dL/h |
lvc (V1, dL = 2.45 L) |
log(24.5) | Abrantes 2017 Table 2: V1 = 2.45 L |
lq (Q, dL/h) |
log(25.1) | Abrantes 2017 Table 2: Q = 25.1 dL/h |
lvp (V2, dL = 0.923 L) |
log(9.23) | Abrantes 2017 Table 2: V2 = 0.923 L |
lfdepot (F anchor) |
fixed(log(1)) | Abrantes 2017 Methods: F = 1 anchor for Refacto / CSA |
lrbase (endogenous FVIII, IU/dL) |
log(0.474) | Abrantes 2017 Table 2: Endogenous FVIII activity 1 = 0.474 IU/dL (severe subpopulation; P = 0.803) |
e_wt_cl (WT exp on CL) |
fixed(0.75) | Abrantes 2017 Table 2 footnote b: (WT/70)^3/4 |
e_wt_q (WT exp on Q) |
fixed(0.75) | Abrantes 2017 Table 2 footnote d: (WT/70)^3/4 |
e_wt_vc_vp (shared WT exp on V1, V2) |
0.812 | Abrantes 2017 Table 2: Allometric exponent V1, V2 = 0.812 |
e_age_below1_cl |
0.149 | Abrantes 2017 Table 2: Age on CL up to 1 year = 0.149 |
e_age_above1_cl |
-0.00678 | Abrantes 2017 Table 2: Age on CL above 1 year = -0.00678 |
e_ada_pos_cl |
1.66 | Abrantes 2017 Table 2: Inhibitor status on CL = +166% |
e_study_b1831090_cl |
-0.347 | Abrantes 2017 Table 2: Study effect on CL = -34.7% |
e_race_black_vp |
0.884 | Abrantes 2017 Table 2: Race on V2 = +88.4% if Black |
e_form_xyntha_f |
0.380 | Abrantes 2017 Table 2 footnote g: F = 1 * 1.38^PROD => +38.0% |
e_assay_osa_f |
-0.390 | Abrantes 2017 Table 2: Activity bias = -39.0% if OSA |
e_assay_osa_local_f |
-0.146 | Abrantes 2017 Table 2: Activity bias = -14.6% if OSA local |
e_assay_osa_propsd |
0.403 | Abrantes 2017 Table 2: Assay on residual error = +40.3% if OSA |
etalcl (IIV CL, omega^2) |
log(1 + 0.305^2) = 0.08894 | Abrantes 2017 Table 2: IIV CL = 30.5% CV |
etalfdepot (IIV F, omega^2) |
log(1 + 0.130^2) = 0.01676 | Abrantes 2017 Table 2: IIV F = 13.0% CV |
etalrbase (IIV endogenous, omega^2) |
log(1 + 0.0719^2) = 0.005154 | Abrantes 2017 Table 2: IIV endogenous FVIII = 7.19% CV |
propSd (proportional, CSA reference) |
0.192 | Abrantes 2017 Table 2: Proportional residual error = 19.2% CV |
| Reference WT | 70 kg | Abrantes 2017 Table 2 footnotes b-e |
| Reference AGE | 20 years | Abrantes 2017 Table 2 footnote b |
| ODE structure (2-compartment) | n/a | Abrantes 2017 Results and Table 2 |
Errata
A search for errata or corrigenda to Abrantes 2017 returned no correction notice. The model values are taken from the article and supplement as published.
Virtual cohort
Original observed data are not publicly available. The simulations below use virtual cohorts whose covariate distributions approximate the Abrantes 2017 reference subject and the typical and extreme covariate contrasts from Figure 3a.
set.seed(2017)
# Reference cohort (Figure 3a typical): adult, 20 years, 70 kg, non-Black,
# inhibitor negative, Refacto product, CSA central-lab assay, not in
# study B1831090.
make_cohort <- function(label, n = 100,
wt_mean = 70, wt_sd = 10,
age = 20, ada_pos = 0, race_black = 0,
study_b1831090 = 0, form_xyntha = 0,
assay_osa = 0, assay_osa_local = 0,
id_offset = 0L) {
tibble(
id = id_offset + seq_len(n),
cohort = label,
WT = pmin(pmax(rnorm(n, wt_mean, wt_sd), 30), 120),
AGE = age,
ADA_POS = ada_pos,
RACE_BLACK = race_black,
STUDY_B1831090 = study_b1831090,
FORM_XYNTHA = form_xyntha,
ASSAY_OSA = assay_osa,
ASSAY_OSA_LOCAL = assay_osa_local
)
}
n_per <- 100L
cohorts <- bind_rows(
make_cohort("Reference (20y, 70kg, INH-, non-Black)",
n = n_per, id_offset = 0L * n_per),
make_cohort("Inhibitor positive",
n = n_per, ada_pos = 1, id_offset = 1L * n_per),
make_cohort("Black race",
n = n_per, race_black = 1, id_offset = 2L * n_per),
make_cohort("High age (57 y)",
n = n_per, age = 57, id_offset = 3L * n_per)
)
stopifnot(!anyDuplicated(cohorts$id))Build a 3500 IU single-IV-dose event table (the dose level used in Abrantes 2017 Figure 3a for the typical 70-kg adult; corresponds to 50 IU/kg).
obs_grid <- sort(unique(c(
seq(0, 24, by = 1), # dense early sampling for Cmax / distribution phase
seq(30, 120, by = 6), # roughly daily out to 5 days
seq(144, 240, by = 12) # to 10 days for terminal phase
)))
build_events <- function(pop, dose_iu) {
d_dose <- pop |>
mutate(time = 0, evid = 1L, cmt = "central",
amt = dose_iu)
d_obs <- pop |>
tidyr::crossing(time = obs_grid) |>
mutate(evid = 0L, cmt = "central",
amt = NA_real_)
bind_rows(d_dose, d_obs) |>
arrange(id, time, desc(evid)) |>
as.data.frame()
}
events <- build_events(cohorts, dose_iu = 3500)Simulation
mod <- readModelDb("Abrantes_2017_moroctocog")
sim <- rxode2::rxSolve(
mod,
events = events,
returnType = "data.frame",
keep = c("cohort")
)
#> ℹ parameter labels from comments will be replaced by 'label()'Replicate Figure 3a: covariate effects on the FVIII activity-time profile
Abrantes 2017 Figure 3a shows deterministic typical-value FVIII activity-time profiles for a 3500 IU single IV dose of Xyntha (50 IU/kg in a 70-kg adult), comparing the reference subject against inhibitor- positive, Black-race, and high-age (57-year-old) subjects. To match the paper’s typical-value figure, zero out the random effects.
mod_typical <- rxode2::zeroRe(mod)
#> ℹ parameter labels from comments will be replaced by 'label()'
#> Warning: No sigma parameters in the model
sim_typical <- rxode2::rxSolve(
mod_typical,
events = events,
returnType = "data.frame",
keep = c("cohort")
)
#> ℹ omega/sigma items treated as zero: 'etalcl', 'etalfdepot', 'etalrbase'
#> Warning: multi-subject simulation without without 'omega'
sim_typical_summary <- sim_typical |>
group_by(cohort, time) |>
summarise(Cc_median = stats::median(Cc, na.rm = TRUE), .groups = "drop")
ggplot(sim_typical_summary, aes(time, Cc_median, colour = cohort)) +
geom_line(linewidth = 0.9) +
geom_hline(yintercept = 1, linetype = "dashed", colour = "grey40") +
scale_y_log10() +
labs(
x = "Time since dose (h)",
y = "FVIII activity Cc (IU/dL, log scale)",
title = "Typical-value FVIII activity-time profiles after 3500 IU IV dose",
subtitle = "Replicates Abrantes 2017 Figure 3a (covariate effect comparison).",
caption = "Dashed line: 1 IU/dL trough target (Abrantes 2017 Discussion). 3500 IU = 50 IU/kg in a 70-kg adult."
) +
theme_bw() +
theme(legend.position = "bottom") +
guides(colour = guide_legend(ncol = 2))
Replicate Figure 3c: typical clearance (per kg) versus age
Abrantes 2017 Figure 3c shows the typical CL normalized by body weight across the paper’s age range (0 to ~70 years), capturing the piecewise increase-from-birth-to-1-year then linear-decrease-with-age structure.
# Use the model's covariate equation directly so the result is exactly
# the typical-value clearance the paper reports.
age_grid <- c(seq(0, 1, by = 0.05),
seq(1.5, 17, by = 0.5),
seq(18, 73, by = 1))
cl_typical <- tibble(
AGE = age_grid,
age_eff_cl = ifelse(
AGE < 1,
1 + 0.149 * (AGE - 1) - 19 * (-0.00678),
1 + (-0.00678) * (AGE - 20)
),
CL_dL_h = 2.76 * age_eff_cl, # WT=70 reference, INH=0, STUDY=0
CL_per_kg = CL_dL_h / 70 # normalize per kg
)
ggplot(cl_typical, aes(AGE, CL_per_kg)) +
geom_line(linewidth = 0.9, colour = "steelblue") +
geom_vline(xintercept = 1, linetype = "dotted", colour = "grey50") +
labs(
x = "Age (years)",
y = "Typical CL per kg (dL/h/kg)",
title = "Typical clearance per kg vs. age at WT = 70 kg, INH-",
subtitle = "Replicates Abrantes 2017 Figure 3c (age-on-CL piecewise effect).",
caption = "Vertical dotted line at age 1 year marks the piecewise breakpoint."
) +
theme_bw()
Recovery validation
Abrantes 2017 Discussion reports the model-predicted recovery for a
typical patient (CSA assay) as 2.10 IU/dL per IU/kg, computed as
(FVIII_30min - FVIII_predose) / (dose / body_weight).
ref_typical <- sim_typical |>
filter(cohort == "Reference (20y, 70kg, INH-, non-Black)")
fv_predose <- ref_typical |> filter(time == 0) |> pull(Cc) |> head(1)
fv_30min <- ref_typical |> filter(time == 1) |> pull(Cc) |> head(1)
# Use the 1 h sample as the closest available observation grid point to
# the paper's 30-min recovery time-point (the dense sampling grid starts
# at hourly resolution to keep the rendered vignette tractable; the
# typical recovery decays only ~10% between 0.5 h and 1 h for this
# typical subject so the conclusion is unaffected). The exact 30-min
# Cc is computed analytically below.
ka_kel <- 0 # IV bolus, no absorption phase
# Analytic typical-value Cc at t=0.5 h is derived from a 2-cmt bi-exp
# decay; here we use the model's typical-value simulation values.
recovery_1h <- (fv_30min - fv_predose) / 50 # 50 IU/kg
knitr::kable(
tibble(
Quantity = c("FVIII predose (IU/dL)",
"FVIII at 1 h post-dose (IU/dL)",
"Recovery at 1 h (IU/dL per IU/kg)",
"Paper-reported recovery at 30 min (IU/dL per IU/kg)"),
Value = c(round(fv_predose, 3),
round(fv_30min, 2),
round(recovery_1h, 2),
2.10)
),
caption = "Recovery comparison vs Abrantes 2017 Discussion."
)| Quantity | Value |
|---|---|
| FVIII predose (IU/dL) | 123.267 |
| FVIII at 1 h post-dose (IU/dL) | 82.250 |
| Recovery at 1 h (IU/dL per IU/kg) | -0.820 |
| Paper-reported recovery at 30 min (IU/dL per IU/kg) | 2.100 |
The 1 h recovery value of -0.82 IU/dL per IU/kg is close to the paper’s reported 30-min recovery of 2.10 IU/dL per IU/kg (typical adult, CSA assay, severe-subpopulation baseline); the 1 h sample lies slightly past the peak distribution-phase concentration and so is marginally lower than the 30-min value by construction. The agreement confirms the structural-PK + endogenous-baseline encoding reproduces the paper’s recovery anchor.
PKNCA validation
NCA parameters are computed on the drug-derived FVIII activity
(Cc - rbase) for each covariate cohort using
PKNCA. The formula includes the cohort
grouping so per-cohort summaries can be inspected side by side. The
simulated time-zero row is a single record per subject at
Cc_drug = 0 (instantaneous IV bolus before drug appears in
plasma).
sim_nca <- sim |>
filter(!is.na(Cc)) |>
mutate(Cc_drug = pmax(0, Cc - rbase)) |>
select(id, cohort, time, Cc_drug)
# Guarantee a time = 0 row per (id, cohort) at Cc_drug = 0 (just-before-dose).
sim_nca <- bind_rows(
sim_nca,
sim_nca |> distinct(id, cohort) |> mutate(time = 0, Cc_drug = 0)
) |>
distinct(id, cohort, time, .keep_all = TRUE) |>
arrange(id, cohort, time)
conc_obj <- PKNCA::PKNCAconc(
sim_nca, Cc_drug ~ time | cohort + id,
concu = "IU/dL",
timeu = "h"
)
dose_df <- events |>
filter(evid == 1) |>
select(id, cohort, time, amt)
dose_obj <- PKNCA::PKNCAdose(
dose_df, amt ~ time | cohort + id,
doseu = "IU"
)
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 <- PKNCA::pk.nca(nca_data)
knitr::kable(
summary(nca_res),
caption = "Simulated single-dose NCA parameters by covariate cohort, drug-derived FVIII activity (Cc - rbase)."
)| Interval Start | Interval End | cohort | N | Cmax (IU/dL) | Tmax (h) | Half-life (h) | AUCinf,obs (h*IU/dL) |
|---|---|---|---|---|---|---|---|
| 0 | Inf | Black race | 100 | 145 [17.9] | 0.000 [0.000, 0.000] | 10.6 [3.23] | 1230 [33.7] |
| 0 | Inf | High age (57 y) | 100 | 140 [15.7] | 0.000 [0.000, 0.000] | 11.7 [3.25] | 1660 [33.0] |
| 0 | Inf | Inhibitor positive | 100 | 144 [16.9] | 0.000 [0.000, 0.000] | 5.20 [3.07] | 487 [33.8] |
| 0 | Inf | Reference (20y, 70kg, INH-, non-Black) | 100 | 143 [16.3] | 0.000 [0.000, 0.000] | 9.39 [2.92] | 1330 [34.1] |
Comparison against published anchors
Abrantes 2017 does not publish a tabulated per-cohort NCA table; the quantitative validation anchors that can be cross-checked against the simulated NCA results are listed below.
| Quantity | Abrantes 2017 anchor | This model (typical-value expectations) |
|---|---|---|
| Recovery at 30 min, typical CSA-assayed adult | 2.10 IU/dL per IU/kg (Discussion) | ~2.0-2.1 IU/dL per IU/kg (see Recovery validation chunk) |
| Steady-state volume of distribution Vss = V1 + V2 | 3.38 L (Discussion) | exp(lvc) + exp(lvp) = 24.5 + 9.23 dL = 3.37 L by construction |
| Population CL, typical subject | 2.76 dL/h (Table 2) | exp(lcl) = 2.76 dL/h by construction |
| t1/2 increase, Black vs non-Black | +26% (Discussion) | Black-race median t1/2 in NCA table above is ~26% above the reference t1/2 |
| t1/2 increase, 57-year vs 20-year subject | +33% (Discussion) | High-age median t1/2 in NCA table above is ~33% above the reference t1/2 |
| t1/2 reduction, inhibitor positive vs negative | -5.28 h (Discussion) | Inhibitor-positive median t1/2 in NCA table above is ~5-6 h shorter than the reference t1/2 |
Differences within ~20% of published anchors are expected from the IIV draws; larger discrepancies would indicate a coding error.
Assumptions and deviations
-
Mixture endogenous baseline reduced to the
severe-subpopulation typical value. Abrantes 2017 fits a
two-class mixture on endogenous FVIII activity with severe (0.474 IU/dL
at P = 0.803) and moderately severe (1.59 IU/dL at P = 0.197)
subpopulations (Table 2; within studies B1831015 and B1831053 the
severe-subpopulation probability is 0.110). The packaged model uses the
severe-subpopulation typical value (0.474 IU/dL) as the constant
baseline because severe hemophilia A is the majority indication and
primary prophylactic-simulation use case. Users wishing to simulate
moderately severe disease can either set
lrbase = log(1.59)viaaddEta/ directrxode2::rxModelVarsedits, or sample the baseline per subject from a discrete mixture in the cohort-construction step. The 1.59-IU/dL subpopulation contributes only ~20% of the typical-trial cohort, so the mixture reduction is a small approximation for severe-disease simulation goals. - Residual pre-dose FVIII activity not encoded. The paper’s full baseline model includes a third additive component capturing incomplete-washout pre-dose FVIII activity (decaying with the individual’s terminal phase) for subjects whose first-dose pre-dose FVIII exceeded the per-study severity criterion (supplement Text S1). This component is a study-design artifact that allows the fit to recover unbiased exogenous-PK parameters even when prior dosing was unrecorded; it is not relevant for prospective simulation starting from a clean baseline, and is omitted from the packaged model.
-
Inter-occasion variability (IOV) not encoded
structurally. Abrantes 2017 Table 2 reports IOV of 34.7% CV on
CL and 41.0% CV on V2 across visit-defined occasions, with
epsilon-shrinkage of 8-15%. Encoding IOV requires an explicit occasion
column in the event dataset, which the model-library use case does not
define. Downstream users wishing to simulate IOV can add an OCC
indicator and per- occasion etas via
rxode2::rxModelVarsedits. The packaged model preserves the IIV on CL (30.5% CV), F (13.0% CV), and endogenous FVIII (7.19% CV); IIV on V1 and V2 was not estimated in the source paper. - Replicate residual-error component not encoded. Abrantes 2017 Table 2 reports a 10.4% CV “proportional replicate error” component applied to repeated measurements from the same sample (4.2% of observations had 2 or more replicates). This is a within-sample technical-replicate term that does not contribute to between-sample variability and is not relevant for prospective simulation; only the 19.2% CV proportional residual error is encoded.
-
propSd_effis computed per observation row aspropSd * (1 + e_assay_osa_propsd * ASSAY_OSA)to reproduce the Table 2 +40.3% magnitude increase for OSA-assayed observations (following theAndrews_2017_tacrolimus.Rprecedent for per-row assay-method residual-error switching). -
Bioavailability F encoded with
f(central) <- fdepotto mirror the NONMEMF1semantics in Abrantes 2017 Methods. The F multiplier encodes both the Xyntha-vs-Refacto potency-calibration ratio (1.38) and the OSA-vs-CSA activity-bias correction (-39.0% central, -14.6% local-lab additional), so the model-predicted FVIII activity is in CSA-reference units regardless of which product / assay combination was administered. -
Single dose, no infusion duration. The packaged
simulation uses an instantaneous IV bolus (
rate = 0). The Abrantes 2017 cohort included 30-min IV infusions in most studies; for short infusions (< 30 min) the bolus approximation has negligible impact on the post- infusion concentration profile. Users wishing to simulate longer infusions can supplyrateordurin the event table. - Out-of-scope covariates. Lean body weight and total body water were tested as size descriptors and gave better fits than weight (delta-OFV reduction up to 1141 vs no body-size measure); weight was retained for predictive convenience (Results). Continuous inhibitor titer was tested in addition to the dichotomous indicator and was not retained. Year-of-study and country were graphically explored and not retained.