Acetaminophen in silico cotyledon perfusion (Mian 2021)
Source:vignettes/articles/Mian_2021_acetaminophen_placentaperfusion.Rmd
Mian_2021_acetaminophen_placentaperfusion.RmdModel and source
Citation: Mian P, Nolan B, van den Anker JN, van Calsteren K, Allegaert K, Lakhi N, Dallmann A. Mechanistic Coupling of a Novel in silico Cotyledon Perfusion Model and a Physiologically Based Pharmacokinetic Model to Predict Fetal Acetaminophen Pharmacokinetics at Delivery. Front Pediatr. 2021;9:733520. doi:10.3389/fped.2021.733520. PMCID: PMC8496351. Structure: Figure 3, Table 1 and Equations 1-13; fixed inputs: In silico Cotyledon Perfusion Model section; fitted values: Results. Compartment volume fractions, cotyledon perfusate volumes and surface-area scaling are not printed in the paper and are taken from the authors’ MoBi 9.1 project that the paper states is shared on the Open Systems Pharmacology GitHub (github.com/Open-Systems-Pharmacology/Pregnancy-Models, CotyledonPerfusionModel/CotyledonPerfusionModel.mbp3, commit 73b0acd4f0, 2021-09-23). Observed ex vivo data: Conings S et al. (reference 20 of the source paper), as deposited in the same MoBi project.
Description: Ex vivo (human term placenta, dual-side recirculating single-cotyledon perfusion). Seven-compartment mechanistic in silico cotyledon perfusion model of acetaminophen placental transfer: maternal reservoir, maternal perfusate in the intervillous space, intervillous interstitial space, trophoblasts, intravillous interstitial space, fetal perfusate in the villous capillaries, and fetal reservoir. Perfusate recirculates between each reservoir and its half of the cotyledon; drug crosses the endothelium into the interstitial spaces (Schmitt interstitial partition coefficients), the apical trophoblast membrane with asymmetric influx/efflux permeability factors f_in and f_out, and the basolateral trophoblast membrane, with a fitted trophoblast:perfusate partition coefficient. Fitted in MoBi to ex vivo perfusion data (Mian 2021 Equations 1-13). The paper’s whole-body maternal-fetal PBPK model (PK-Sim / MoBi), into which the fitted placental parameters were copied, is NOT reproduced here; only the self-contained ex vivo placental-transfer model is.
Open-access full text: https://europepmc.org/article/MED/PMC8496351
Authors’ MoBi project for the cotyledon model: https://github.com/Open-Systems-Pharmacology/Pregnancy-Models/tree/master/CotyledonPerfusionModel
What this file is, and what it is not
Mian and colleagues built two models and coupled them:
| # | Model | Implementation | In this file? |
|---|---|---|---|
| 1 |
In silico cotyledon perfusion model: seven
compartments, Figure 3, Table 1, Equations 1-13; f_in,
f_out and the placental partition coefficient fitted to ex
vivo perfusion data |
MoBi 9.1 | yes |
| 2 | Whole-body maternal-fetal PBPK model for acetaminophen (Figures 1-2), into which the fitted placental parameters were copied to predict umbilical-vein concentrations at delivery (Figures 6-7) | PK-Sim / MoBi | no |
Model 2 is the authors’ earlier pregnancy PBPK model (Mian et al., Clin Pharmacokinet 2020;59:97-110 and 911-925) with its structure unchanged (“All other model parameters were kept the same as published previously”). Its organ volumes, blood flows, tissue partition coefficients and enzyme reference concentrations are computed inside the Open Systems Pharmacology software and are not printed in any of the papers, so it is not reproduced here.
Model 1 is self-contained. The paper prints its complete ODE system (Equations 1-11 for the individual exchange processes, Equations 12-13 for the assembled 7 x 7 system), the experimental flows and volumes, the protein binding and tissue-composition inputs, the trophoblast permeability, and the three fitted values. Three groups of geometric constants are not printed:
- the perfusate volumes of the two cotyledon halves (20 mL each);
- the interstitial and trophoblast fractions of the 23 mL intervillous and 35 mL intravillous cotyledon volumes; and
- the endothelial surface-area proportionality factor and the volume-scaling formula for the basolateral trophoblast surface area.
The paper states that the model “is freely shared on OSP GitHub”, and
the authors’ MoBi project was published there on the article’s
publication day (Open-Systems-Pharmacology/Pregnancy-Models, commit
73b0acd4f0, 2021-09-23). The maintainers read these
constants from that project. They also checked that its fitted values
agree with the paper (f_in = 0.0596, f_out =
0.0507, partition coefficient 4.313 against the printed 0.060, 0.051 and
4.31), as do its trophoblast permeability (4.29 x 10^-2 cm/min) and
villous surface area (1178.3 dm^2 / 35). The project also contains the
455 ex vivo observations used for the fit, which matches the paper’s “18
data sets comprising 455 data values”. They are reproduced below, and
the validation runs against them.
Population
The model describes isolated human term placentas, not a patient population. One cotyledon per placenta was dual-perfused in a recirculating circuit (data of Conings et al., reference 20 of the paper): maternal flow 14 mL/min, fetal flow 6 mL/min, maternal and fetal reservoirs of 280 and 284 mL. The maternal and fetal perfusates contained 40 and 30 mg/mL bovine serum albumin, which gives acetaminophen unbound fractions of 0.84 and 0.88. Acetaminophen was added at an initial concentration of about 10 mg/L to the fetal reservoir in 4 experiments (Figure 4A-D) or to the maternal reservoir in 10 experiments (Figure 4E-N). Both reservoirs were then sampled for 210 min. The whole-body arm of the paper (Table 2: 34 women from Nitsche et al. and 43 from Mehraban et al., oral acetaminophen 1000 mg at delivery) evaluates model 2 and is out of scope.
Source trace
| Quantity (model name) | Value | Source |
|---|---|---|
Maternal flow Q_M (q_mat) |
14 mL/min | Text below Equation 2 |
Fetal flow Q_F (q_fet) |
6 mL/min | Text below Equation 2 |
Maternal / fetal reservoir volume (v_mres,
v_fres) |
280 / 284 mL | Text below Equation 2 |
Intervillous / intravillous cotyledon volume (v_mcot,
v_fcot) |
23 / 35 mL | Text below Equation 4 |
Cotyledon perfusate volumes (v_mperf,
v_fperf) |
20 / 20 mL | MoBi project (not printed) |
Vascular fractions (fvas_mcot,
fvas_fcot) |
0.674 / 0.168 | MoBi project (not printed) |
Interstitial fractions (fint_mcot,
fint_fcot) |
0.1018 / 0.4066 | MoBi project (not printed) |
| Trophoblast volume | (1 - 0.168 - 0.4066) x 35 mL = 14.9 mL | MoBi project formula 1 - f_int - f_vas
|
Unbound fraction, maternal / fetal (fu,
fu_fetus) |
0.84 / 0.88 | Text below Equation 4 |
Interstitial and perfusate water content (fwater_int,
fwater_perf) |
0.935 / 0.926 | Text below Equation 5 |
Interstitial-to-perfusate protein ratio
(fprot_int_perf) |
0.37 | Text below Equation 5 |
Interstitial partition coefficients (kp_mint,
kp_fint) |
Equation 5 (Schmitt) | Equation 5 |
Endothelial permeability (p_endo) |
100 cm/min | Text below Equation 4 |
| Endothelial surface areas | 9500 1/dm x fraction vascular x volume | MoBi project (not printed); paper: “scaling the local surface area from the cotyledon volume” |
Basolateral surface area (sa_fint_cell) |
(V [mL] / 1.2)^0.75 x 7.54 x 100 dm^2 | MoBi project (not printed); paper: “calculated as already described above” |
Trophoblast permeability (p_tro) |
4.29 x 10^-2 cm/min | Text below Equation 11 |
Apical villous surface area (sa_villi) |
1178 dm^2 / 35 cotyledons | Text below Equation 11 |
f_in (lfin) |
0.060 (95% CI half-width 0.0058) | Results |
f_out (lfout) |
0.051 (95% CI half-width 0.0061) | Results |
K_FM_cell:perf = K_F_cell:perf
(lkp_trophoblast) |
4.31 (95% CI half-width 0.57) | Results |
| Reservoir / cotyledon perfusate exchange | Equations 1-2 | Methods |
| Endothelial exchange, maternal and fetal | Equations 3-4 | Methods |
| Basolateral trophoblast exchange | Equations 9-10 | Methods |
| Apical trophoblast exchange | Equation 11 | Methods |
| Assembled ODE system | Equations 12-13 | Methods |
| Observed ex vivo data (455 values) | Figure 4 | MoBi project, Conings et al. |
The partition coefficient enters Equation 10 as
fu / K_F_cell:perf: the paper states that
K_F_cell:perf was multiplied by fu_fetus / fu,
which turns fu_fetus / (K x fu_fetus / fu) in Equation 9
into the fu / K of Equation 10. The MoBi project implements
Equation 10 in exactly this form.
Observed ex vivo data
Concentrations in umol/L and times in min, as stored in the authors’
MoBi project. amt_ug is the acetaminophen amount added to
the dosed reservoir.
mw_apap <- 151.16 # g/mol, acetaminophen
obs_raw <- tibble::tribble(
~experiment, ~dosed, ~side, ~amt_ug, ~time_min, ~conc,
508, "fetal", "fetal", 2842, "0.1 3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "64.80 63.64 60.49 57.64 55.33 52.72 48.10 43.51 40.13 37.62 34.92 33.54 32.50 31.73 30.63 29.70 28.77",
508, "fetal", "maternal", 2842, "3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "0.53 0.99 2.67 5.10 7.16 11.15 14.68 17.54 19.71 21.28 22.48 23.41 23.99 24.71 25.52 26.31",
510, "fetal", "fetal", 2720.9, "0.1 3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "60.20 58.99 58.14 57.14 56.27 54.17 51.32 48.11 45.47 42.78 40.88 39.05 36.67 35.35 34.30 32.79 30.56",
510, "fetal", "maternal", 2720.9, "3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "0.13 0.67 2.14 2.40 3.59 5.79 9.28 11.51 13.47 15.21 16.96 18.67 19.34 20.51 22.05 22.99",
512, "fetal", "fetal", 2572.1, "0.1 3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "58.90 57.44 56.16 54.51 53.74 52.50 49.33 45.08 41.92 39.04 37.09 34.94 34.29 32.95 31.35 30.33 29.70",
512, "fetal", "maternal", 2572.1, "3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "0.06 0.36 1.23 2.48 3.81 6.17 9.27 11.94 14.29 15.81 17.62 18.69 19.55 20.31 21.43 22.03",
515, "fetal", "fetal", 2639, "0.1 3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "60.21 58.84 55.96 54.59 52.22 50.00 45.82 41.78 37.81 35.28 33.19 31.99 30.96 29.42 29.08 27.46 26.21",
515, "fetal", "maternal", 2639, "6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "0.91 1.64 3.46 5.38 8.24 11.96 14.91 16.91 18.10 19.02 20.18 20.98 21.45 22.18 23.03",
353, "maternal", "fetal", 2850, "3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "0.36 1.75 3.52 5.24 7.38 11.05 14.75 17.32 19.77 21.19 22.73 23.22 24.58 24.30 25.98 25.21",
353, "maternal", "maternal", 2850, "0.01 3 6 10 15 20 30 45 60 75 90 105 120 135 150 180 210", "66.66 59.30 53.44 51.09 46.74 44.48 39.71 36.78 33.07 30.28 29.17 32.68 26.89 26.68 26.52 24.97 24.17",
357, "maternal", "fetal", 2850, "6.0001 10.0001 15.0001 20.0001 30.0001 45.0001 60.0001 75.0001 90.0001 105 120 135 150 180 210", "1.65 2.88 4.58 6.66 9.86 13.88 17.34 20.69 22.57 24.14 26.00 27.52 27.76 29.12 30.15",
357, "maternal", "maternal", 2850, "0.01 3.0001 6.0001 10.0001 15.0001 20.0001 30.0001 45.0001 60.0001 75.0001 90.0001 105 120 135 150 180 210", "66.67 62.60 58.63 55.43 54.09 51.33 48.10 43.73 39.69 39.26 37.46 36.13 35.13 33.66 33.33 32.93 31.69",
369, "maternal", "fetal", 2860, "6.0002 10.0002 15.0002 20.0002 30.0002 45.0002 60.0002 75.0002 90.0002 105 120 135 150 180 210", "1.42 2.81 5.38 7.10 10.04 13.90 18.16 19.92 21.64 23.63 23.91 23.94 25.04 26.28 26.94",
369, "maternal", "maternal", 2860, "0.01 3.0002 6.0002 10.0002 15.0002 20.0002 30.0002 45.0002 60.0002 75.0002 90.0002 105 120 135 150 180 210", "67.22 62.59 61.35 56.62 53.53 50.30 45.88 41.50 37.57 34.87 32.22 30.99 30.43 27.73 28.88 34.13 30.12",
374, "maternal", "fetal", 2850, "6.0003 10.0003 15.0003 20.0003 30.0003 45.0003 60.0003 75.0003 90.0003 105 120 135 150 180 210", "0.73 1.72 2.91 4.50 6.75 9.92 12.30 14.55 16.14 17.80 18.32 19.85 20.31 21.77 20.24",
374, "maternal", "maternal", 2850, "0.01 3.0003 6.0003 10.0003 15.0003 20.0003 30.0003 45.0003 60.0003 75.0003 90.0003 105 120 135 150 180 210", "65.23 62.02 59.22 58.01 55.55 53.73 49.17 45.52 41.79 39.18 39.03 36.25 35.68 33.66 32.16 30.89 22.56",
378, "maternal", "fetal", 2850, "3.0004 6.0004 10.0004 15.0004 20.0004 30.0004 45.0004 60.0004 75.0004 90.0004 105 120 135 150 180 210", "0.37 1.97 3.74 5.72 7.43 10.45 13.82 16.76 17.66 19.43 20.49 20.70 21.35 23.13 23.93 23.70",
378, "maternal", "maternal", 2850, "0.01 3.0004 6.0004 10.0004 15.0004 20.0004 30.0004 45.0004 60.0004 75.0004 90.0004 105 120 135 150 180 210", "65.92 60.63 51.79 47.90 44.51 40.73 36.61 33.68 29.42 28.77 27.52 25.46 25.16 25.62 22.87 26.06 22.62",
380, "maternal", "fetal", 2850, "6.0005 10.0005 15.0005 20.0005 30.0005 45.0005 60.0005 75.0005 90.0005 105.001 120.001 135 150 180 210", "1.68 3.37 5.44 8.25 11.69 15.12 19.15 21.42 23.15 24.74 25.43 26.20 27.69 27.81 27.96",
380, "maternal", "maternal", 2850, "0.01 3.0005 6.0005 10.0005 15.0005 20.0005 30.0005 45.0005 60.0005 75.0005 90.0005 105.001 120.001 135 150 180 210", "62.80 58.67 56.46 54.24 51.64 49.19 45.62 41.37 37.08 35.06 33.41 31.39 30.72 29.71 29.63 28.85 27.28",
383, "maternal", "fetal", 2850, "5.9999 9.9999 14.9999 19.9999 29.9999 44.9999 59.9999 74.9999 89.9999 105 120 135 150 180 210", "1.37 2.93 4.81 6.28 9.61 13.27 16.58 18.95 21.45 22.33 23.46 24.12 25.95 27.53 25.87",
383, "maternal", "maternal", 2850, "0.01 2.9999 5.9999 9.9999 14.9999 19.9999 29.9999 44.9999 59.9999 74.9999 89.9999 105 120 135 150 180 210", "63.59 61.26 57.33 54.58 51.84 49.52 45.20 40.60 36.23 33.57 31.52 30.30 29.92 28.31 28.62 27.44 26.79",
409, "maternal", "fetal", 2820, "5.9998 9.9998 14.9998 19.9998 29.9998 44.9998 59.9998 74.9998 89.9998 105 120 135 150 180 210", "1.62 3.48 5.85 7.73 11.21 15.77 18.27 22.96 22.15 23.28 24.10 24.48 25.15 25.64 26.83",
409, "maternal", "maternal", 2820, "0.01 2.9998 5.9998 9.9998 14.9998 19.9998 29.9998 44.9998 59.9998 74.9998 89.9998 105 120 135 150 180 210", "63.01 56.20 54.58 51.01 46.73 44.04 41.07 36.02 33.58 31.25 29.57 28.37 27.16 26.75 25.81 25.42 25.16",
413, "maternal", "fetal", 2810, "2.9997 5.9997 9.9997 14.9997 19.9997 29.9997 44.9997 59.9997 74.9997 89.9997 106 120 135 150 180 210", "0.21 1.07 2.51 4.10 5.65 8.20 11.76 14.35 16.11 17.60 18.78 19.95 20.59 21.15 21.85 22.29",
413, "maternal", "maternal", 2810, "0.01 2.9997 5.9997 9.9997 14.9997 19.9997 29.9997 44.9997 59.9997 74.9997 89.9997 106 120 135 150 180 210", "62.64 60.69 57.45 55.04 51.65 49.30 46.43 40.98 37.69 35.81 33.56 33.07 30.81 29.77 29.40 28.56 27.75",
416, "maternal", "fetal", 2760, "2.9996 5.9996 9.9996 14.9996 19.9996 29.9996 44.9996 59.9996 74.9996 89.9996 106 120 135 150 180 210", "3.02 4.03 5.53 7.36 8.93 12.25 16.93 18.83 20.56 22.28 23.54 24.05 24.55 24.80 25.48 24.72",
416, "maternal", "maternal", 2760, "0.0099 2.9996 5.9996 9.9996 14.9996 19.9996 29.9996 44.9996 59.9996 74.9996 89.9996 106 120 135 150 180 210", "51.32 49.01 47.10 46.61 44.66 42.58 38.70 36.24 31.59 30.06 27.95 26.12 26.13 25.27 24.24 24.49 24.59"
)
obs <- obs_raw |>
mutate(
time = strsplit(time_min, " "),
conc = strsplit(conc, " ")
) |>
select(-time_min) |>
tidyr::unnest(c(time, conc)) |>
mutate(time = as.numeric(time), conc = as.numeric(conc))
stopifnot(nrow(obs) == 455, length(unique(obs$experiment)) == 14)
obs |>
count(dosed, side) |>
knitr::kable()| dosed | side | n |
|---|---|---|
| fetal | fetal | 68 |
| fetal | maternal | 63 |
| maternal | fetal | 154 |
| maternal | maternal | 170 |
Simulation
One subject per experiment. The dose is the added amount in umol,
placed in the reservoir that was dosed. Observation rows are on the two
reservoir states, and the model returns the reservoir concentrations
Cmaternal and Cfetal at each row.
experiments <- obs |>
distinct(experiment, dosed, amt_ug) |>
arrange(desc(dosed), experiment) |>
mutate(
id = row_number(),
dose_umol = amt_ug / mw_apap,
dose_cmt = paste0(dosed, "_reservoir")
)
make_events <- function(times) {
doses <- experiments |>
transmute(id, time = 0, amt = dose_umol, cmt = dose_cmt, evid = 1L)
obs_rows <- tidyr::expand_grid(id = experiments$id, time = times) |>
mutate(amt = 0, cmt = "maternal_reservoir", evid = 0L)
bind_rows(doses, obs_rows) |>
arrange(id, time, desc(evid))
}
tgrid <- sort(unique(c(seq(0, 240, by = 1), obs$time)))
sim <- rxSolve(mod, make_events(tgrid), returnType = "data.frame") |>
left_join(experiments, by = "id")
head(sim[, c("id", "time", "Cmaternal", "Cfetal", "Ctrophoblast")])
#> id time Cmaternal Cfetal Ctrophoblast
#> 1 1 0.0000 67.33641 0.000000e+00 0.000000e+00
#> 2 1 0.0099 67.30319 9.156723e-09 7.269306e-04
#> 3 1 0.0100 67.30285 9.460864e-09 7.412769e-04
#> 4 1 0.1000 67.01089 1.045629e-05 6.816223e-02
#> 5 1 1.0000 64.82232 8.333428e-03 4.934945e+00
#> 6 1 2.0000 63.25268 5.235010e-02 1.447272e+01Replicate published figures
Figure 4: observed and simulated reservoir concentrations
sim_long <- sim |>
select(experiment, dosed, time, Cmaternal, Cfetal) |>
pivot_longer(c(Cmaternal, Cfetal), names_to = "side", values_to = "conc") |>
mutate(side = if_else(side == "Cmaternal", "maternal", "fetal"))
ggplot(sim_long, aes(time / 60, conc, colour = side)) +
geom_line() +
geom_point(data = obs, shape = 1) +
facet_wrap(~ paste0(dosed, "-dosed, ", experiment), ncol = 4) +
labs(
x = "Time (h)", y = "Acetaminophen (umol/L)", colour = "Reservoir",
caption = "Replicates Figure 4 of Mian 2021 (panels A-D fetal-dosed, E-N maternal-dosed)."
) +
theme_bw()
Figure 5: sensitivity to the placental partition coefficient
The paper’s local sensitivity analysis re-simulates the experiments with the partition coefficient set to 0.76 (the Rodgers-Rowland prediction), 2.5 and the fitted 4.31, with all other values unchanged. It reports that “pooled over all individual experiments, the MPE was 375%, 131, and -62.6%”.
These numbers only make sense on one scale. Each is the sum of the
per-observation prediction errors 100 x (pred - obs) / obs
within an experiment, averaged over the 14 experiments. That is the
per-observation mean multiplied by 455 / 14 = 32.5, so the fitted
model’s -62.6% corresponds to a per-observation mean error of about
-2%.
sens_mpe <- function(k) {
s <- rxSolve(mod, make_events(sort(unique(obs$time))),
params = c(lkp_trophoblast = log(k)), returnType = "data.frame"
) |>
left_join(experiments, by = "id") |>
mutate(time = round(time, 4)) |>
select(experiment, time, Cmaternal, Cfetal)
obs |>
mutate(time = round(time, 4)) |>
left_join(s, by = c("experiment", "time")) |>
mutate(
pred = if_else(side == "maternal", Cmaternal, Cfetal),
pe = 100 * (pred - conc) / conc
) |>
group_by(experiment) |>
summarise(sum_pe = sum(pe), mean_pe = mean(pe), .groups = "drop") |>
summarise(
mpe_paper_scale = mean(sum_pe),
mpe_per_observation = sum(sum_pe) / nrow(obs)
) |>
mutate(k = k)
}
mpe_tab <- bind_rows(lapply(c(0.76, 2.5, 4.31), sens_mpe)) |>
mutate(published = c(375, 131, -62.6))
mpe_tab |>
mutate(k = format(k)) |>
select(k, published, mpe_paper_scale, mpe_per_observation) |>
dplyr::rename(
"Partition coefficient" = k,
"Published MPE (%)" = published,
"Model, paper scale (%)" = mpe_paper_scale,
"Model, per observation (%)" = mpe_per_observation
) |>
knitr::kable(digits = 1)| Partition coefficient | Published MPE (%) | Model, paper scale (%) | Model, per observation (%) |
|---|---|---|---|
| 0.76 | 375.0 | 377.7 | 11.6 |
| 2.50 | 131.0 | 132.7 | 4.1 |
| 4.31 | -62.6 | -61.4 | -1.9 |
# The model is deterministic, so the only difference from the published values
# is solver tolerance and the rounding of the printed inputs (fu 0.84 / 0.88,
# f_in 0.060, f_out 0.051); measured differences are 2.7, 1.7 and 1.2 points
# (the unrounded values in the authors' MoBi project give 375.0, 131.4 and
# -62.0). A mis-transcribed flow, volume or permeability moves these by tens
# to hundreds of points.
stopifnot(all(abs(mpe_tab$mpe_paper_scale - mpe_tab$published) < 5))
sens_curves <- bind_rows(lapply(c(0.76, 2.5, 4.31), function(k) {
rxSolve(mod, make_events(seq(0, 210, by = 2)),
params = c(lkp_trophoblast = log(k)), returnType = "data.frame"
) |>
left_join(experiments, by = "id") |>
mutate(k = factor(k))
}))
ggplot(sens_curves, aes(time / 60, colour = k)) +
geom_line(aes(y = Cmaternal)) +
geom_line(aes(y = Cfetal), linetype = 2) +
geom_point(data = obs, aes(time / 60, conc), inherit.aes = FALSE, shape = 1, size = 0.8) +
facet_wrap(~ paste0(dosed, "-dosed, ", experiment), ncol = 4) +
labs(
x = "Time (h)", y = "Acetaminophen (umol/L)", colour = "Partition\ncoefficient",
caption = "Replicates Figure 5 of Mian 2021 (solid: maternal reservoir; dashed: fetal reservoir)."
) +
theme_bw()
Derived quantities stated in the paper
The paper converts the fitted factors into directional permeabilities: “2.56 x 10^-3 and 2.18 x 10^-3 cm/min” for maternal-to-fetal and fetal-to-maternal transfer.
p <- setNames(ui$iniDf$est, ui$iniDf$name)
p_cm_min <- 4.29e-2
perm <- c(
influx = p_cm_min * exp(p[["lfin"]]),
efflux = p_cm_min * exp(p[["lfout"]])
)
perm
#> influx efflux
#> 0.0025740 0.0021879
# 4.29e-2 x 0.060 = 2.57e-3 and 4.29e-2 x 0.051 = 2.19e-3; the paper's 2.56e-3
# and 2.18e-3 come from the unrounded fitted factors (0.0596, 0.0507).
stopifnot(abs(perm[["influx"]] / 2.56e-3 - 1) < 0.01, abs(perm[["efflux"]] / 2.18e-3 - 1) < 0.01)The abstract says that “simulated steady state concentrations in the
trophoblasts were 4.31-fold higher than those in the perfusate”. The ex
vivo circuit is a closed chain with no loops, so at steady state every
flux is zero. The trophoblast-to-perfusate ratio then follows from
Equations 10-11: K x f_in / f_out against the maternal
perfusate and K x fu_fetus / fu against the fetal
perfusate.
k_tro <- 4.31
ratio_closed <- c(
vs_maternal_perfusate = k_tro * 0.060 / 0.051,
vs_fetal_perfusate = k_tro * 0.88 / 0.84
)
ratio_closed
#> vs_maternal_perfusate vs_fetal_perfusate
#> 5.070588 4.515238
late <- sim |>
filter(time == 240) |>
mutate(ratio_maternal_reservoir = Ctrophoblast / Cmaternal) |>
select(experiment, dosed, ratio_maternal_reservoir)
summary(late$ratio_maternal_reservoir)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 4.980 4.980 4.980 5.029 5.110 5.153The simulated trophoblast concentration at 240 min is about 5 times
the maternal reservoir concentration, and at full steady state it is
5.07 times the maternal perfusate and 4.52 times the fetal perfusate.
The paper’s “4.31-fold” is the fitted partition coefficient itself,
which holds exactly only when f_in = f_out and
fu = fu_fetus. The model is used as printed and this is
recorded in the deviations below.
Mass balance and the closed-form steady state
The perfusion circuit has no elimination, so the total amount must be
conserved. Because the circuit is a chain, the steady state has a closed
form in terms of the printed parameters: with C_M the
maternal perfusate concentration, the maternal reservoir is at
C_M, the intervillous interstitium at
kp_mint x C_M, the trophoblasts at
K x f_in / f_out x C_M, the fetal perfusate and reservoir
at (f_in / f_out) x (fu / fu_fetus) x C_M and the
intravillous interstitium at kp_fint times that.
ev_mb <- et(amt = 18.5, cmt = "maternal_reservoir") |>
et(c(0, 30, 210, 2000, 20000), cmt = "maternal_reservoir")
mb <- rxSolve(mod, ev_mb, rtol = 1e-10, atol = 1e-12, maxsteps = 1e6, returnType = "data.frame")
states <- c(
"maternal_reservoir", "maternal_perfusate", "maternal_interstitial",
"trophoblast", "fetal_interstitial", "fetal_perfusate", "fetal_reservoir"
)
mb$total <- rowSums(mb[, states])
mb[, c("time", "total", "Cmaternal", "Cfetal", "Ctrophoblast")]
#> time total Cmaternal Cfetal Ctrophoblast
#> 1 0 18.5 66.07143 0.000000 0.0000
#> 2 30 18.5 45.12408 8.904474 113.3849
#> 3 210 18.5 25.95043 27.625960 127.5363
#> 4 2000 18.5 25.23299 28.336508 127.9461
#> 5 20000 18.5 25.23299 28.336508 127.9461
# Numerical conservation error under rtol = 1e-10; measured about 1e-10.
stopifnot(max(abs(mb$total / 18.5 - 1)) < 1e-7)
fin <- exp(p[["lfin"]])
fout <- exp(p[["lfout"]])
kp_mint <- (p[["fwater_int"]] + p[["fprot_int_perf"]] * (1 / p[["fu"]] - p[["fwater_perf"]])) * p[["fu"]]
kp_fint <- (p[["fwater_int"]] + p[["fprot_int_perf"]] * (1 / p[["fu_fetus"]] - p[["fwater_perf"]])) * p[["fu_fetus"]]
r_fet <- (fin / fout) * (p[["fu"]] / p[["fu_fetus"]])
vol <- c(
p[["v_mres"]] + p[["v_mperf"]],
p[["fint_mcot"]] * p[["v_mcot"]],
(1 - p[["fvas_fcot"]] - p[["fint_fcot"]]) * p[["v_fcot"]],
p[["fint_fcot"]] * p[["v_fcot"]],
p[["v_fperf"]] + p[["v_fres"]]
)
conc_rel <- c(1, kp_mint, exp(p[["lkp_trophoblast"]]) * fin / fout, kp_fint * r_fet, r_fet)
c_m_ss <- 18.5 / sum(vol * conc_rel)
ss <- mb[mb$time == 20000, ]
cmp_ss <- c(
maternal = ss$Cmaternal / c_m_ss,
fetal = ss$Cfetal / (r_fet * c_m_ss),
trophoblast = ss$Ctrophoblast / (exp(p[["lkp_trophoblast"]]) * fin / fout * c_m_ss)
)
cmp_ss
#> maternal fetal trophoblast
#> 1 1 1
# At 20000 min the slowest mode has decayed completely; measured agreement ~1e-9.
stopifnot(max(abs(cmp_ss - 1)) < 1e-6)At equilibrium the fetal reservoir sits 1.123-fold above the maternal
reservoir, because f_in exceeds f_out. The
experiments stop at 210 min, before this plateau is reached (Figure
4).
PKNCA
The paper reports no non-compartmental summary of the ex vivo experiments, so this block is descriptive only. It summarises the concentration in the receiving reservoir over the 0-210 min experiment, grouped by dosing direction.
recv <- sim |>
filter(time <= 210) |>
mutate(
Cc = if_else(dosed == "maternal", Cfetal, Cmaternal),
treatment = paste0(dosed, "-to-", if_else(dosed == "maternal", "fetal", "maternal"))
) |>
filter(!is.na(Cc)) |>
select(id, time, Cc, treatment)
dose_df <- experiments |>
transmute(id, time = 0, amt = dose_umol,
treatment = paste0(dosed, "-to-", if_else(dosed == "maternal", "fetal", "maternal")))
conc_obj <- PKNCAconc(recv, Cc ~ time | treatment + id)
dose_obj <- PKNCAdose(dose_df, amt ~ time | treatment + id)
intervals <- data.frame(start = 0, end = 210, cmax = TRUE, tmax = TRUE, auclast = TRUE)
nca <- pk.nca(PKNCAdata(conc_obj, dose_obj, intervals = intervals))
summary(nca)
#> start end treatment N auclast cmax tmax
#> 0 210 fetal-to-maternal 4 3590 [4.29] 23.7 [4.29] 210 [210, 210]
#> 0 210 maternal-to-fetal 10 4250 [1.09] 28.0 [1.09] 210 [210, 210]
#>
#> Caption: auclast, cmax: geometric mean and geometric coefficient of variation; tmax: median and range; N: number of subjectsAssumptions and deviations
- Model 2 (the whole-body PBPK) is not reproduced. Its physiology and partition coefficients are software outputs that none of the papers print. The umbilical-vein MPE / MAPE of Figures 6-7 therefore cannot be checked here.
-
Constants taken from the authors’ MoBi project. The
cotyledon perfusate volumes (20 mL each), the vascular and interstitial
volume fractions of both cotyledon halves, the endothelial surface-area
factor (9500 1/dm) and the basolateral surface-area formula are not
printed in the paper. They were read from the project the paper points
to (OSP GitHub, Pregnancy-Models, commit
73b0acd4f0). The endothelial exchange is not rate-limiting (100 cm/min over 56-147 dm^2), so the two endothelial surface areas have no visible effect. The fractions set the interstitial and trophoblast volumes, and those matter. -
Printed rather than unrounded values. The file uses
the printed values
fu0.84 /fu_fetus0.88,f_in0.060,f_out0.051 andK4.31 rather than the project’s unrounded 0.8409 / 0.8757, 0.0596, 0.0507 and 4.313. The Figure 5 MPE check reproduces the paper to within 3 points (377.7, 132.7 and -61.4 against 375, 131 and -62.6). - Maternal intracellular compartment omitted. The MoBi project carries an intracellular sub-compartment in the maternal cotyledon half, but its only transport is multiplied by zero. That matches the paper’s statement that the decidua is absent from the ex vivo tissue, so the model has seven states, as in Figure 3.
-
“4.31-fold” trophoblast accumulation. As shown
above, the fitted partition coefficient does not equal the simulated
steady-state trophoblast-to-perfusate ratio (5.07 against the maternal
perfusate) when
f_indiffers fromf_out. The equations are used as printed. -
No variability. The parameters were fitted by
deterministic least-squares (Monte-Carlo optimisation in MoBi). No
between-placenta variability or residual error was estimated, so the
file has no
etaor error terms. -
Units. Amounts are in umol and concentrations in
umol/L, as in the paper and the project. Volumes are in L,
permeabilities in dm/min and surface areas in dm^2, so that
P x SAis in L/min. To convert a mass dose, divide the mg amount by 151.16 g/mol and multiply by 1000 (e.g. 2.8 mg = 18.5 umol).