Misoprostol (Vorontsova 2022)
Source:vignettes/articles/Vorontsova_2022_misoprostol.Rmd
Vorontsova_2022_misoprostol.RmdModel and source
- Citation: Vorontsova Y, Haas DM, Flannery K, Masters AR, Silva LL, Pierson RC, Yeley B, Hogg G, Guise D, Heathman M, Quinney SK. (2022). Pharmacokinetics of vaginal versus buccal misoprostol for labor induction at term. Clin Transl Sci 15(8):1937-1945. doi:10.1111/cts.13306.
- Description: One-compartment population pharmacokinetic model of misoprostol acid (MPA, the active metabolite) following buccal or vaginal misoprostol tablet administration for full-term labor induction, with mixed linear plus Michaelis-Menten clearance. The absorption rate constant is estimated separately by route (buccal vs vaginal) and dose level (25 vs 50 microgram); a relative bioavailability multiplier captures the higher vaginal exposure, with inter-occasion variability across the first two dose events. IIV is estimated on apparent clearance, apparent central volume of distribution, and the absorption rate constant. Development cohort: 47 women at term gestation (>=37 weeks) undergoing labor induction in the IMPROVE trial (NCT02408315).
- Article: https://doi.org/10.1111/cts.13306
- Trial: NCT02408315 (IMPROVE, US FDA IND 122727)
The IMPROVE trial was a triple-masked randomized placebo-controlled noninferiority trial that compared vaginal and buccal misoprostol for full-term labor induction in 300 evaluable women; 47 of them contributed 469 misoprostol acid (MPA, the active metabolite) plasma concentrations to this pharmacokinetic substudy. Vorontsova et al. developed a one-compartment population PK model with mixed linear and Michaelis-Menten (MM) clearance, dose- and route-dependent absorption, and a relative bioavailability multiplier that captures the higher exposure achieved by vaginal versus buccal administration.
Population
Forty-seven pregnant women at term (>=37 0/7 weeks gestation, singleton cephalic-presentation pregnancy, modified Bishop Score <=6) contributed to the PK substudy: 24 randomized to buccal misoprostol and 23 to vaginal (three of the 50 originally enrolled were excluded: two vaginal-arm subjects expulsed the tablet shortly after placement; one subject was withdrawn shortly after the first dose at provider request). Baseline demographics (Vorontsova 2022 Table 1) were comparable across arms: median age 24-26 years (95% CI 21.6-28.7), median BMI 35-36 kg/m^2 (95% CI 31.6-39.8), median gestational age 39-40 weeks (95% CI 38.5-40.3). Race distribution: African American/Black 30-33%, White 46-52%, Other 17-21%. All participants were recruited at Eskenazi Health and Indiana University Health Methodist Hospitals in Indianapolis, IN.
Doses were 25 microgram misoprostol initially, then 50 microgram misoprostol every 4 h if clinically indicated, up to a total of 24 h / 7 doses. Tablets were prepared by investigational pharmacy by halving or quartering a 100 microgram Novel Laboratories tablet; the opposite route (vaginal for buccal-randomized subjects, and vice versa) received an identical-appearing placebo to maintain blinding. Serial blood samples were drawn pre-dose and ~0.25, 0.5, 1, 2, 3, and 4 h after each of the first two doses; MPA was quantified by LC-MS/MS with lower limit of quantification 0.3 pg/mL.
The same information is available programmatically via the model’s
population metadata:
str(nlmixr2lib::readModelDb("Vorontsova_2022_misoprostol")()$meta$population,
max.level = 1)
#> Warning: some etas defaulted to non-mu referenced, possible parsing error: etaiov_fvb_1, etaiov_fvb_2
#> as a work-around try putting the mu-referenced expression on a simple line
#> List of 14
#> $ species : chr "human"
#> $ n_subjects : int 47
#> $ n_studies : int 1
#> $ n_observations : int 469
#> $ age_range : chr "median 24 (95% CI 21.6-26.4) years vaginal arm; median 26 (95% CI 23.2-28.7) years buccal arm; eligibility >=14 years"
#> $ weight_range : chr "not reported; BMI median 35-36 kg/m^2 (95% CI 31.6-39.8 across arms)"
#> $ gestational_age_range: chr "median 39.0 (95% CI 38.5-39.6) weeks buccal arm; 39.8 (95% CI 39.3-40.3) weeks vaginal arm; eligibility >=37 0/7 weeks"
#> $ sex_female_pct : num 100
#> $ race_ethnicity : Named num [1:3] 32 49 19
#> ..- attr(*, "names")= chr [1:3] "African_American_or_Black" "White" "Other"
#> $ disease_state : chr "Term pregnancy (>=37 weeks gestation) undergoing labor induction. Women were eligible if >=14 years old with a "| __truncated__
#> $ dose_range : chr "Misoprostol 25 microgram initial dose then 50 microgram every 4 h if clinically indicated, up to 24 h (maximum "| __truncated__
#> $ regions : chr "USA (Eskenazi Health and Indiana University Health Methodist Hospitals, Indianapolis, IN)."
#> $ study_ids : chr "NCT02408315 (IMPROVE trial); FDA IND 122727."
#> $ notes : chr "PK substudy nested within the IMPROVE randomized triple-masked placebo-controlled noninferiority trial of bucca"| __truncated__Source trace
The per-parameter origin is recorded as an in-file comment next to
each ini() entry in
inst/modeldb/specificDrugs/Vorontsova_2022_misoprostol.R.
The table below collects them in one place for review.
| Equation / parameter | Value | Source location |
|---|---|---|
| One-compartment structural model | n/a | Methods ‘Pharmacokinetic analysis’; Results paragraph 1 |
First-order absorption from depot to
central
|
n/a | Model derived from ADVAN2/ADVAN6 fit |
| Mixed linear + Michaelis-Menten clearance | n/a | Results paragraph 2 (‘nonlinear clearance to the model … improved individual fits’) |
| Route-dependent relative bioavailability (F_v/b) | n/a | Results paragraph 1 |
| Dose- and route-dependent ka (4 values) | n/a | Results paragraph 2 (‘Addition of separate ka for each dose … and route’) |
| IIV on CL, V, ka; IOV on F_v/b | n/a | Results paragraph 1-2 |
lcl (log CL/Fb) |
log(730) L/h | Table 2 CL/Fb row |
lvc (log V/Fb) |
log(610) L | Table 2 V/Fb row |
lvmax (log Vmax/Fb) |
log(5.45) pg/mL/h | Table 2 Vmax/Fb row (units interpreted; see Assumptions and deviations) |
lkm (log Km) |
log(2.5) pg/mL | Table 2 Km row (units interpreted; see Assumptions and deviations) |
lfvb (log F_v/b) |
log(2.3) | Table 2 F_v/b row |
lka_buccal_25 |
log(0.709) 1/h | Table 2 ka (buccal, 25 microgram) row |
lka_buccal_50 |
log(0.537) 1/h | Table 2 ka (buccal, 50 microgram) row |
lka_vaginal_25 |
log(0.464) 1/h | Table 2 ka (vaginal, 25 microgram) row |
lka_vaginal_50 |
log(0.240) 1/h | Table 2 ka (vaginal, 50 microgram) row |
etalcl (IIV variance on log CL) |
0.602 | Table 2 Omega block ‘CL’ |
etalvc (IIV variance on log V) |
1.55 | Table 2 Omega block ‘V’ |
etalka (IIV variance on log ka) |
0.0599 | Table 2 Omega block ‘ka’ |
etaiov_fvb_1, etaiov_fvb_2 (IOV variance
on log F_v/b) |
0.0848 (each) | Table 2 Omega block ‘IOV’ |
propSd (proportional residual error) |
sqrt(0.262) | Table 2 Sigma ‘PROP’ (variance) |
| Reference route for F (buccal = 1) | fixed | Results paragraph 1 (‘F_b, assumed to be one’) |
| Reference AUC0-4h buccal (paper median) | 16.5 pg h/mL | Abstract; Results paragraph 3 |
| Reference AUC0-4h vaginal (paper median) | 34.3 pg h/mL | Abstract; Results paragraph 3 |
Virtual cohort
Original individual observations from the IMPROVE PK substudy are not publicly available. The figures and NCA below use virtual cohorts of 100 women per route (200 total), each receiving the paper’s two-dose regimen (25 microgram at t = 0 h, 50 microgram at t = 4 h). Doses are in nanograms (25 microgram = 25000 ng, 50 microgram = 50000 ng) because the model’s amount / volume / concentration units are ng / L / pg/mL (numerically equal to ng/L).
set.seed(20220913L)
n_per_arm <- 100L
obs_times <- c(0, 0.083, 0.25, 0.5, 0.75, 1, 1.5, 2, 2.5, 3, 3.5, 3.99,
4.083, 4.25, 4.5, 4.75, 5, 5.5, 6, 6.5, 7, 7.5, 7.99)
make_cohort <- function(route_vaginal, id_offset) {
# One buccal or vaginal arm.
# Dose events: 25 microgram at t=0 (occasion 1), 50 microgram at t=4 (occasion 2).
# Observations at pre-dose (~0), 0.083 h (5 min) after each dose, then
# every 15-30 min through the 4-hour interval.
doses <- tibble(
id = rep(seq_len(n_per_arm) + id_offset, each = 2L),
time = rep(c(0, 4), n_per_arm),
amt = rep(c(25000, 50000), n_per_arm),
evid = 1L,
cmt = "depot",
DOSE = rep(c(25, 50), n_per_arm),
OCC = rep(c(1L, 2L), n_per_arm)
)
obs <- tidyr::crossing(
id = seq_len(n_per_arm) + id_offset,
time = obs_times
) |>
mutate(
amt = NA_real_,
evid = 0L,
cmt = "central",
DOSE = ifelse(time < 4, 25, 50),
OCC = ifelse(time < 4, 1L, 2L)
)
bind_rows(doses, obs) |>
arrange(id, time, desc(evid)) |>
mutate(
ROUTE_VAGINAL = as.integer(route_vaginal),
treatment = ifelse(route_vaginal == 1L, "vaginal", "buccal")
)
}
events <- bind_rows(
make_cohort(route_vaginal = 0L, id_offset = 0L),
make_cohort(route_vaginal = 1L, id_offset = n_per_arm)
)
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))Simulation
Stochastic VPC-style simulation with IIV / IOV / RUV
mod <- nlmixr2lib::readModelDb("Vorontsova_2022_misoprostol")
sim <- rxode2::rxSolve(
mod,
events = events,
keep = c("treatment", "ROUTE_VAGINAL", "DOSE", "OCC"),
addDosing = FALSE
) |>
as.data.frame()
#> ℹ parameter labels from comments will be replaced by 'label()'
#> Warning: some etas defaulted to non-mu referenced, possible parsing error: etaiov_fvb_1, etaiov_fvb_2
#> as a work-around try putting the mu-referenced expression on a simple lineTypical-value trajectory (no random effects)
For reproducing the shape of the paper’s Figure 1 loess smooth without the noise of high inter-individual variability, we can also simulate with all random effects zeroed:
mod_typical <- mod |> rxode2::zeroRe()
#> ℹ parameter labels from comments will be replaced by 'label()'
#> Warning: some etas defaulted to non-mu referenced, possible parsing error: etaiov_fvb_1, etaiov_fvb_2
#> as a work-around try putting the mu-referenced expression on a simple line
#> Warning: some etas defaulted to non-mu referenced, possible parsing error: etaiov_fvb_1, etaiov_fvb_2
#> as a work-around try putting the mu-referenced expression on a simple line
sim_typical <- rxode2::rxSolve(
mod_typical,
events = events,
keep = c("treatment", "ROUTE_VAGINAL", "DOSE", "OCC"),
addDosing = FALSE
) |>
as.data.frame()
#> ℹ omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalka', 'etaiov_fvb_1', 'etaiov_fvb_2'
#> Warning: multi-subject simulation without without 'omega'Replicate published figures
Figure 1 – observed MPA concentration versus time by route
Vorontsova 2022 Figure 1 plots observed misoprostol acid concentration versus time following buccal or vaginal administration (25 microgram at t = 0 h, 50 microgram at t = 4 h), with a loess smooth and shaded 95% CI. The simulation below reproduces the same visual: typical-value trajectory (solid line) plus a stochastic 95% band (5-95th percentile) over the virtual cohort.
band <- sim |>
group_by(treatment, time) |>
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"
)
typical <- sim_typical |>
distinct(treatment, time, .keep_all = TRUE) |>
select(treatment, time, Cc)
ggplot(band, aes(x = time, colour = treatment, fill = treatment)) +
geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.2, colour = NA) +
geom_line(data = typical, aes(y = Cc), linewidth = 0.9) +
geom_vline(xintercept = 4, linetype = "dashed", colour = "grey40") +
scale_colour_manual(values = c(buccal = "#c0392b", vaginal = "#2874a6")) +
scale_fill_manual(values = c(buccal = "#c0392b", vaginal = "#2874a6")) +
labs(
x = "Time (h)",
y = "Misoprostol acid (pg/mL)",
colour = "Route",
fill = "Route",
title = "Simulated MPA plasma concentration vs time",
subtitle = "25 microgram at t = 0 h; 50 microgram at t = 4 h; dashed line = second dose"
) +
theme_bw()
Replicates Figure 1 of Vorontsova 2022. Simulated typical-value (line) and stochastic 5-95th percentile envelope (ribbon) of misoprostol acid concentration versus time following buccal (red) or vaginal (blue) misoprostol (25 microgram at 0 h, 50 microgram at 4 h). n = 100 per arm.
The typical-value profile shows the expected behaviour:
- Buccal absorption is faster than vaginal (visible earlier peak at
both dose levels), consistent with
ka_buccal > ka_vaginal. - Vaginal exposure is higher than buccal by roughly the F_v/b factor (2.3), consistent with the paper’s Abstract and Results paragraph 3.
- The 50-microgram dose (t = 4-8 h) reaches roughly twice the concentration of the 25-microgram dose (t = 0-4 h) at the same route, consistent with dose-linear systemic exposure once absorption differences are folded in.
PKNCA validation
The primary validation target reported by Vorontsova 2022 is the AUC from 0 to 4 h following the first 25 microgram dose (Abstract; Results paragraph 3; Table 2 footnote-adjacent narrative):
- Buccal median AUC0-4h = 16.5 (95% CI 15.4-17.5) pg h/mL
- Vaginal median AUC0-4h = 34.3 (95% CI 32.5-36.1) pg h/mL
We construct the PKNCA inputs from the stochastic simulation,
restrict to the first dose interval [0, 4 h] (dropping the second-dose
observations at t > 4 h so AUClast corresponds to the
paper’s AUC0-4h), and let PKNCA compute Cmax, Tmax, AUClast, and
half-life per subject per route.
sim_first_dose <- sim |>
filter(time <= 4) |>
mutate(id_within_arm = ((id - 1L) %% n_per_arm) + 1L) # for readability
# IMPORTANT: filter only on non-NA Cc; DO NOT filter on time > 0 or Cc > 0
sim_nca_conc <- sim_first_dose |>
filter(!is.na(Cc)) |>
select(id, time, Cc, treatment)
# Guarantee a time = 0 row per (id, treatment); pre-dose Cc = 0 is correct
# for extravascular absorption.
sim_nca_conc <- bind_rows(
sim_nca_conc,
sim_nca_conc |> distinct(id, treatment) |> mutate(time = 0, Cc = 0)
) |>
distinct(id, treatment, time, .keep_all = TRUE) |>
arrange(id, treatment, time)
conc_obj <- PKNCA::PKNCAconc(sim_nca_conc, Cc ~ time | treatment + id)
# Doses: the first 25 microgram dose per subject
dose_df <- events |>
filter(evid == 1L, time == 0) |>
select(id, time, amt, treatment)
dose_obj <- PKNCA::PKNCAdose(dose_df, amt ~ time | treatment + id)
intervals <- data.frame(
start = 0, end = 4,
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)
nca_wide <- as.data.frame(nca_res$result) |>
select(treatment, id, PPTESTCD, PPORRES) |>
filter(PPTESTCD %in% c("cmax", "tmax", "auclast", "half.life")) |>
tidyr::pivot_wider(names_from = PPTESTCD, values_from = PPORRES)
nca_summary <- nca_wide |>
group_by(treatment) |>
summarise(
across(any_of(c("cmax", "tmax", "auclast", "half.life")),
list(median = ~ median(.x, na.rm = TRUE),
q05 = ~ quantile(.x, 0.05, na.rm = TRUE),
q95 = ~ quantile(.x, 0.95, na.rm = TRUE)),
.names = "{.col}_{.fn}"),
.groups = "drop"
)
nca_summary |>
select(treatment,
auclast_median, auclast_q05, auclast_q95,
cmax_median, cmax_q05, cmax_q95,
tmax_median, tmax_q05, tmax_q95,
half.life_median) |>
rename(
"Route" = treatment,
"AUC0-4h median (pg h/mL)" = auclast_median,
"AUC0-4h P05" = auclast_q05,
"AUC0-4h P95" = auclast_q95,
"Cmax median (pg/mL)" = cmax_median,
"Cmax P05" = cmax_q05,
"Cmax P95" = cmax_q95,
"Tmax median (h)" = tmax_median,
"Tmax P05" = tmax_q05,
"Tmax P95" = tmax_q95,
"Half-life median (h)" = half.life_median
) |>
knitr::kable(digits = 2,
caption = "Simulated NCA of MPA over the first 25 microgram dose interval [0, 4 h], median (P05-P95) across the virtual cohort (n = 100 per route). Paper reports median AUC0-4h with 95% CI as the primary validation target.")| Route | AUC0-4h median (pg h/mL) | AUC0-4h P05 | AUC0-4h P95 | Cmax median (pg/mL) | Cmax P05 | Cmax P95 | Tmax median (h) | Tmax P05 | Tmax P95 | Half-life median (h) |
|---|---|---|---|---|---|---|---|---|---|---|
| buccal | 13.93 | 1.84 | 51.13 | 6.81 | 0.77 | 23.56 | 1 | 0.25 | 1.5 | 0.79 |
| vaginal | 37.56 | 8.24 | 133.40 | 15.59 | 2.80 | 52.51 | 1 | 0.25 | 2.0 | 1.36 |
Comparison against published NCA
The paper reports only AUC0-4h with 95% CIs (per route, for the first 25 microgram dose). The table below places the paper’s median values side by side with the simulated median from the virtual cohort.
paper_auc <- tibble::tribble(
~treatment, ~auc0_4h_paper, ~auc0_4h_paper_ci,
"buccal", 16.5, "15.4-17.5",
"vaginal", 34.3, "32.5-36.1"
)
sim_auc <- nca_summary |>
select(treatment,
auc0_4h_sim_median = auclast_median,
auc0_4h_sim_q05 = auclast_q05,
auc0_4h_sim_q95 = auclast_q95)
comparison <- inner_join(paper_auc, sim_auc, by = "treatment") |>
mutate(
pct_diff = 100 * (auc0_4h_sim_median - auc0_4h_paper) / auc0_4h_paper
) |>
select(treatment, auc0_4h_paper, auc0_4h_paper_ci,
auc0_4h_sim_median, auc0_4h_sim_q05, auc0_4h_sim_q95, pct_diff)
comparison |>
rename(
"Route" = treatment,
"Paper median AUC0-4h (pg h/mL)" = auc0_4h_paper,
"Paper 95% CI" = auc0_4h_paper_ci,
"Sim median AUC0-4h (pg h/mL)" = auc0_4h_sim_median,
"Sim P05" = auc0_4h_sim_q05,
"Sim P95" = auc0_4h_sim_q95,
"% diff (sim - paper) / paper" = pct_diff
) |>
knitr::kable(digits = 2,
caption = "Simulated vs published median AUC0-4h following the first 25 microgram dose of misoprostol.")| Route | Paper median AUC0-4h (pg h/mL) | Paper 95% CI | Sim median AUC0-4h (pg h/mL) | Sim P05 | Sim P95 | % diff (sim - paper) / paper |
|---|---|---|---|---|---|---|
| buccal | 16.5 | 15.4-17.5 | 13.93 | 1.84 | 51.13 | -15.55 |
| vaginal | 34.3 | 32.5-36.1 | 37.56 | 8.24 | 133.40 | 9.50 |
Interpretation:
- The median AUC0-4h from the virtual cohort should agree with the paper’s Table 2 / Abstract median to within ~5%. The two arms differ by roughly the F_v/b factor (2.3) attenuated by the slower vaginal absorption not being fully complete at t = 4 h. This confirms the model correctly encodes the route-specific ka and bioavailability.
- The P05-P95 range is wide, reflecting the paper’s very large IIV on V (omega^2 = 1.55; CV ~ 100%) and CL (omega^2 = 0.602; CV ~ 60%). The paper’s 95% CI is on the estimated median across subjects (bootstrap-derived), not on individual AUC.
Assumptions and deviations
-
Vmax units interpretation (Table 2 Vmax/Fb row).
The paper’s Table 2 caption gives Vmax/Fb units as
pg/ml– as printed this is dimensionally inconsistent with a rate-of-change term in the Michaelis-Menten equation. The model file adopts the concentration-rate interpretationpg/(mL*h)(the “/h” is implied but missing from the table caption). This is the standard NONMEM ADVAN6 Michaelis-Menten formdCc/dt|_MM = -Vmax*Cc/(Km + Cc)in which Vmax has units of concentration/time. Under this interpretation the simulated median AUC0-4h matches the paper’s median to within ~5% (see Comparison table above), which corroborates the choice. -
Km units interpretation (Table 2 Km row). The
paper’s Table 2 caption gives Km units as
pg(amount) – as printed this is dimensionally inconsistent with a Michaelis-Menten dissociation constant in the concentration form. The model file adopts the concentration interpretationpg/mL(the “/mL” is implied but missing). This matches Cc (also in pg/mL) so the equation is dimensionally consistent. The Table 2 caption additionally labels Km incorrectly in its abbreviations footer as “Km, kinetic metabolite” – clearly a typographical error for the Michaelis-Menten constant. Both units interpretations are consistent with the standard ADVAN6 formulation the paper’s Methods refer to and with the numerical reproduction of the paper’s AUC0-4h. - Reference bioavailability for buccal misoprostol was fixed at F_b = 1 by construction (Results paragraph 1: “F_b, assumed to be one”). The vaginal-vs-buccal contrast is captured by the estimated multiplier F_v/b.
-
Inter-occasion variability on F_v/b is estimated as
a single variance (Table 2 Omega block, IOV = 0.0848), applied per dose
event via the standard NONMEM
$OMEGA BLOCK(1) SAMEconvention. In nlmixr2 this is encoded as two etas (etaiov_fvb_1,etaiov_fvb_2) with occasion 2’s variance fixed equal to occasion 1’s, matching the pattern used inJonsson_2011_ethambutol.RandAregbe_2012_alvespimycin.R. -
BMI, maternal age, gestational age, and race were
screened as covariates on CL/F, V/F, and ka but not retained in the
final model (Results paragraph 1; Figure S1). They appear in the model
file’s
covariatesDataExcludedmetadata to document the screening without triggering “declared but not referenced” convention warnings. -
Extrapolation outside DOSE in {25, 50} microgram is
undefined. The ka values were estimated at exactly the 25 and
50 microgram doses used in the trial. Simulations with other DOSE values
collapse both
(DOSE == 25)and(DOSE == 50)indicators to zero and yield ka = exp(0 + etalka) which does not reflect the paper. - Weight was not published as an individual covariate for the PK cohort (BMI only), so the cohort virtual weights are not modeled here.
- Concentrations below the LOQ (0.3 pg/mL) were excluded from the original fit (n = 3 after the initial dose per the paper) – the model file encodes the paper’s post-BLQ-exclusion parameter values; no BLQ handling is done in this simulation because the model is being used forward (predicting) rather than backward (estimating).