Paclitaxel (de Jonge 2005)
Source:vignettes/articles/deJonge_2005_paclitaxel.Rmd
deJonge_2005_paclitaxel.RmdModel and source
- Citation: de Jonge ME, Huitema ADR, Schellens JHM, Rodenhuis S, Beijnen JH. (2005). Population pharmacokinetics of orally administered paclitaxel formulated in Cremophor EL. British Journal of Clinical Pharmacology 59(3):325-334. doi:10.1111/j.1365-2125.2004.02325.x.
- Description: Semi-mechanistic population pharmacokinetic model for
orally administered paclitaxel formulated in Cremophor EL (CrEL) and
coadministered with cyclosporin A in adult cancer patients. Free
paclitaxel in the gastrointestinal tract (depot) absorbs first-order
(kabs) into a two-compartment plasma disposition (central + peripheral1;
linear elimination CL/F, volume V/F, intercompartmental clearance Q
derived from the paper’s k23 = Q/Vc and k32 = Q/Vp). A second GI-tract
paclitaxel pool (
bound) holds drug encapsulated in CrEL micelles; the depot <-> bound equilibrium is governed by a single rate constant keq whose forward binding rate scales with the GI-tract CrEL amount (cremophor), which itself decays first-order with rate kcrem. Bioavailability F1 is fixed at 1 with log-normal between-subject variability; the paper found no dose-dependence in F. Inter-occasion variability on CL collapses to between-subject variability in this packaged form because the source dataset’s occasion column is not encoded – see vignette Assumptions and deviations. - Article: de Jonge 2005, Br J Clin Pharmacol 59(3):325-334
de Jonge et al. (2005) developed a semi-mechanistic population
pharmacokinetic model for orally administered paclitaxel formulated in
Cremophor EL (CrEL) and coadministered with cyclosporin A in 55 adult
cancer patients (67 courses; 797 samples; oral dose range 60-360
mg/m^2). The structural innovation is a pair of gastrointestinal-tract
pools for paclitaxel – a free pool (depot) that absorbs
first-order into the central compartment, and a bound pool
(bound) representing paclitaxel encapsulated in CrEL
micelles. The free <-> bound equilibrium is governed by a single
rate constant whose forward direction scales with the GI-tract CrEL
amount, captured by a separate compartment (cremophor) that
decays first-order. As CrEL is eliminated from the gut, the equilibrium
shifts toward free paclitaxel, releasing drug for absorption.
Population
The model was fit to plasma paclitaxel concentration-time data pooled from four treatment protocols (de Jonge 2005 Table 1):
- Weekly 200 mg, n = 6 (not previously published).
- Single 60-360 mg/m^2 oral administration, n = 33 (Meerum Terwogt 1999).
- Two oral administrations 60-160 mg/m^2 with 7 h interval, n = 10 (Malingre 2000).
- Two oral 60 mg/m^2 administrations one week apart, with and without added CrEL (5 or 15 mL/m^2), n = 6 (Malingre 2001).
Baseline characteristics (de Jonge 2005 Table 2): age median 53 years (range 26-69), body weight median 71 kg (50-103), body surface area median 1.81 m^2 (1.52-2.22), 38 women and 17 men (~69% female). All patients had normal cardiac, renal, hepatic, haematopoietic, and pulmonary function. Patients fasted overnight and received a standard breakfast 2 h after each oral paclitaxel administration. Each paclitaxel administration was preceded by oral cyclosporin A 12-15 mg/kg (Neoral solution 10 min before, or capsules 30 min before, paclitaxel) which inhibits intestinal P-gp and CYP3A4 to permit measurable paclitaxel absorption. Patients who vomited within 1 h of paclitaxel were excluded. Estimation: NONMEM V level 1.1 double precision, FOCE-INTER.
Programmatic access:
mod <- readModelDb("deJonge_2005_paclitaxel")
rxode2::rxode(mod)$population
#> $species
#> [1] "human"
#>
#> $n_subjects
#> [1] 55
#>
#> $n_studies
#> [1] 4
#>
#> $age_range
#> [1] "26-69 years"
#>
#> $age_median
#> [1] "53 years"
#>
#> $weight_range
#> [1] "50-103 kg"
#>
#> $weight_median
#> [1] "71 kg"
#>
#> $bsa_range
#> [1] "1.52-2.22 m^2"
#>
#> $bsa_median
#> [1] "1.81 m^2"
#>
#> $sex_female_pct
#> [1] 69
#>
#> $disease_state
#> [1] "Adult cancer patients receiving oral paclitaxel for advanced solid tumours (six patients had advanced breast cancer continuing on oral paclitaxel after high-dose chemotherapy with cyclophosphamide / thiotepa / carboplatin and peripheral blood progenitor cell transplantation; the remaining 49 patients were from three previously published studies in solid tumours). All patients had normal cardiac, renal, hepatic, haematopoietic and pulmonary function."
#>
#> $dose_range
#> [1] "Oral paclitaxel 60-360 mg/m^2 once or twice daily; 67 courses; 797 samples. Each oral paclitaxel administration was preceded by oral cyclosporin A 12-15 mg/kg (Neoral solution 10 min before, or capsules 30 min before, paclitaxel) which inhibits intestinal P-gp and CYP3A4 to permit measurable paclitaxel absorption. Patients fasted overnight and received a standard breakfast 2 h post-dose. Patients who vomited within 1 h of paclitaxel were excluded."
#>
#> $regions
#> [1] "The Netherlands (Netherlands Cancer Institute / Slotervaart Hospital, Amsterdam)."
#>
#> $notes
#> [1] "Pooled across four treatment protocols (de Jonge 2005 Table 1): (1) weekly 200 mg, n=6 (not previously published); (2) one administration of 60-360 mg/m^2, n=33 (ref 23 -- Meerum Terwogt 1999); (3) two administrations 60-160 mg/m^2 with 7 h interval, n=10 (ref 24 -- Malingre 2000); (4) two administrations of 60 mg/m^2 one week apart, with and without added CrEL (5 or 15 mL/m^2), n=6 (ref 21 -- Malingre 2001). NONMEM V level 1.1 double precision, FOCE-INTER. Goodness-of-fit assessed via Xpose 2.0 in S-Plus 2000. Cremophor EL is the CrEL formulation vehicle in the i.v. paclitaxel solution Paxene (6 mg paclitaxel per mL of CrEL/ethanol 1:1 w/v); the oral formulation studied here is the i.v. solution swallowed with 100 mL of tap water. Multi-dose simulations: the structural model assumes the GI-tract CrEL pool `cremophor` is replenished to its normalised baseline at each oral paclitaxel administration. For single-dose simulations the model file sets `cremophor(0) <- 1` via the model() block. For multi-dose simulations the user must add explicit dosing events for the `cremophor` compartment with amt = 1 (normalised) at each oral paclitaxel administration time. Covariate analysis (Table 2): age, body weight, body surface area, serum creatinine, AST, ALT, alkaline phosphatase, GGT, serum albumin, total bilirubin, lactate dehydrogenase were tested on CL and V; none reached significance and none were retained."Source trace
| Equation / parameter | Value | Source location |
|---|---|---|
kabs (absorption rate, 1/h) |
0.62 (RSE 37.7%) | Table 3 |
CL/F (apparent clearance, L/h) |
127 (RSE 9.61%) | Table 3 |
V/F (apparent central volume, L) |
409 (RSE 16.8%) | Table 3 |
k23 (central -> peripheral, 1/h) |
0.241 (RSE 17.5%) | Table 3; reparameterised inline as
Q = k23 * Vc = 98.569 L/h
|
k32 (peripheral -> central, 1/h) |
0.0946 (RSE 12.9%) | Table 3; reparameterised inline as
Vp = Q / k32 = 1041.96 L
|
kcrem (CrEL elimination, 1/h) |
1.73 (RSE 12.4%) | Table 3 |
keq (equilibrium rate constant free <-> bound,
1/h) |
0.334 (RSE 43.4%) | Table 3 |
F1 (bioavailability) |
1 (FIXED) | Table 3 |
propSd (proportional residual SD, fraction) |
0.451 | Table 3 (residual proportional error 45.1%, RSE 10.2%) |
IIV on kabs (CV%) |
61.1% (RSE 33.5%) | Table 3; encoded as
omega^2 = log(1 + 0.611^2) = 0.31712
|
IIV on k23 translated to Q (CV%) |
31.3% (RSE 66.5%) | Table 3; encoded as IIV on Q
(omega^2 = log(1 + 0.313^2) = 0.09349); see
Assumptions |
IIV on F1 (CV%) |
55.0% (RSE 22.5%) | Table 3; encoded as
omega^2 = log(1 + 0.550^2) = 0.26429
|
IOV on CL (CV%) |
31.8% (RSE 38.3%) | Table 3; collapsed to between-subject IIV on CL
(omega^2 = log(1 + 0.318^2) = 0.09633); see
Assumptions |
| ODE: free GI-tract paclitaxel | – | Methods + Results; Figure 2 |
| ODE: bound (CrEL-encapsulated) paclitaxel | – | Methods + Results; Figure 2 |
| ODE: CrEL pool with first-order decay | – | Results; Figure 2 |
| ODE: two-compartment central / peripheral disposition | – | Methods + Results; Figure 2 |
The per-parameter origin is also recorded as in-file comments next to
each ini() entry in
inst/modeldb/specificDrugs/deJonge_2005_paclitaxel.R.
Mechanism: free <-> bound paclitaxel in the GI tract
The paper writes the GI-tract paclitaxel equilibrium as
keq = k15 / k51 (1/h)
with k15 the rate constant for free -> bound and
k51 the rate constant for bound -> free, modelled as “an
extremely rapid process” with the GI-tract CrEL amount influencing the
equilibrium. The published value is a single rate constant (0.334 /h)
without an explicit functional form for the CrEL-modulation of
k15 and k51. The packaged model uses the most
parsimonious mass-action mechanism consistent with the narrative:
- Forward (free -> bound):
k15 * depot = keq * cremophor * depot - Backward (bound -> free):
k51 * bound = keq * bound
At rapid equilibrium this gives
bound / depot = cremophor. When the normalised cremophor
pool sits at its baseline of 1 (right after an oral dose) about half the
GI-tract paclitaxel is bound; as cremophor decays
first-order with kcrem, the equilibrium shifts toward the
free pool and the drug becomes available for kabs-driven
absorption into central. This mechanism reproduces the paper’s narrative
– the absorption rate underestimate at later time-points in the
simple-absorption model (de Jonge 2005 Figure 3A) is corrected once the
bound-pool dynamics carry paclitaxel forward in time. See Assumptions
and deviations for additional discussion.
Virtual cohort
Original observed data are not publicly available. The simulations
below use a virtual cohort whose covariate distribution approximates the
published trial demographics (Table 2). Because the model has no
retained covariate effects (see Assumptions), only the dose group and
the cohort label need to travel through rxSolve.
set.seed(20260604)
make_cohort <- function(n, dose_mg, label, id_offset = 0L) {
ids <- id_offset + seq_len(n)
# Two simultaneous dosing events per subject: paclitaxel into `depot`,
# and a unit-amount normalised CrEL "dose" into `cremophor`. The
# paclitaxel dose carries the per-arm amount; the cremophor dose is
# always 1 because the pool is normalised so the GI binding equilibrium
# is independent of the absolute CrEL amount (the dose-independent-F
# finding of the source paper).
dose_pacl <- tibble(
id = ids,
time = 0,
amt = dose_mg,
cmt = "depot",
evid = 1L,
treatment = label
)
dose_crel <- tibble(
id = ids,
time = 0,
amt = 1,
cmt = "cremophor",
evid = 1L,
treatment = label
)
obs <- tidyr::expand_grid(
id = ids,
time = seq(0, 48, by = 0.25)
) |>
mutate(amt = NA_real_, cmt = NA_character_, evid = 0L, treatment = label)
dplyr::bind_rows(dose_pacl, dose_crel, obs) |>
arrange(id, time, desc(evid))
}
events <- dplyr::bind_rows(
make_cohort(60, 60, "60 mg", id_offset = 0L),
make_cohort(60, 100, "100 mg", id_offset = 100L),
make_cohort(60, 200, "200 mg", id_offset = 200L),
make_cohort(60, 360, "360 mg", id_offset = 300L)
)
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))Simulation
mod_rx <- rxode2::rxode(mod)
sim <- rxode2::rxSolve(mod_rx, events = events, keep = c("treatment"))
sim <- as.data.frame(sim)For deterministic replication, zero out the random effects:
mod_typical <- mod_rx |> rxode2::zeroRe()
sim_typical <- rxode2::rxSolve(
mod_typical,
events = events,
keep = c("treatment")
) |> as.data.frame()
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalq', 'etalfdepot', 'etalcl'
#> Warning: multi-subject simulation without without 'omega'Replicate published figures
Figure 1 – single-administration concentration-time profile
The paper’s Figure 1 shows a typical individual plasma paclitaxel concentration-time curve after a single 60 mg/m^2 oral dose (absolute dose 103 mg in the depicted patient). The semi-log y-axis below reproduces that profile shape from a typical-value (no-IIV) simulation in our 100 mg arm (closest standard dose to the figure’s 103 mg).
sim_typical |>
filter(treatment == "100 mg", id == 101) |>
ggplot(aes(time, Cc)) +
geom_line(linewidth = 0.8) +
scale_y_log10() +
labs(
x = "Time (h)",
y = "Plasma paclitaxel (mg/L, log scale)",
title = "Typical-value profile after a single 100 mg oral dose",
caption = "Compare to Figure 1 of de Jonge 2005 (60 mg/m^2 absolute 103 mg)."
)
#> Warning in scale_y_log10(): log-10 transformation introduced infinite values.
Figure 2 – dose-AUC relationship
Figure 4 of the paper plots observed AUC versus dose for orally administered paclitaxel and shows the absence of dose-proportionality. The simulation below reproduces the same shape: AUC0-48 increases with dose but the slope flattens at higher doses because the bound-pool dynamics extend the absorption time-window and the body has more time to eliminate already- absorbed paclitaxel before later doses arrive.
auc_df <- sim |>
group_by(treatment, id) |>
summarise(
auc0_48 = sum(diff(time) * (head(Cc, -1) + tail(Cc, -1)) / 2),
.groups = "drop"
)
dose_levels <- c("60 mg" = 60, "100 mg" = 100, "200 mg" = 200, "360 mg" = 360)
auc_df$dose <- dose_levels[auc_df$treatment]
ggplot(auc_df, aes(dose, auc0_48)) +
geom_jitter(width = 8, alpha = 0.35) +
stat_summary(fun = median, geom = "point", colour = "steelblue", size = 3) +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, linewidth = 0.5,
colour = "steelblue", linetype = 2) +
scale_x_continuous(breaks = dose_levels) +
labs(
x = "Paclitaxel dose (mg)",
y = "AUC 0-48 h (mg*h/L)",
title = "Dose vs simulated AUC 0-48 h",
caption = "Compare to Figure 4 of de Jonge 2005 (dose vs AUC after oral paclitaxel)."
)
PKNCA validation
PKNCA computes Cmax, Tmax, AUC0-48 (last), and apparent half-life on the simulated arms. Treatment grouping is by dose level so the per-arm summaries are comparable side-by-side.
sim_nca <- sim |>
filter(!is.na(Cc), Cc > 0) |>
select(id, time, Cc, treatment)
dose_df <- events |>
filter(evid == 1L, cmt == "depot") |>
select(id, time, amt, treatment)
conc_obj <- PKNCA::PKNCAconc(
sim_nca, Cc ~ time | treatment + id,
concu = "mg/L", timeu = "h"
)
dose_obj <- PKNCA::PKNCAdose(
dose_df, amt ~ time | treatment + id,
doseu = "mg"
)
intervals <- data.frame(
start = 0,
end = 48,
cmax = TRUE,
tmax = TRUE,
auclast = TRUE,
half.life = TRUE
)
nca <- PKNCA::pk.nca(PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals))
#> Warning: Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
#> Requesting an AUC range starting (0) before the first measurement (0.25) is not allowed
nca_tbl <- as.data.frame(nca$result) |>
filter(PPTESTCD %in% c("cmax", "tmax", "auclast", "half.life")) |>
group_by(treatment, PPTESTCD) |>
summarise(
median = median(PPORRES, na.rm = TRUE),
q05 = quantile(PPORRES, 0.05, na.rm = TRUE),
q95 = quantile(PPORRES, 0.95, na.rm = TRUE),
.groups = "drop"
)
knitr::kable(
nca_tbl,
digits = 3,
caption = "Simulated NCA parameters by oral paclitaxel dose group."
)| treatment | PPTESTCD | median | q05 | q95 |
|---|---|---|---|---|
| 100 mg | auclast | NA | NA | NA |
| 100 mg | cmax | 0.082 | 0.033 | 0.193 |
| 100 mg | half.life | 13.304 | 10.867 | 20.247 |
| 100 mg | tmax | 1.750 | 1.000 | 3.500 |
| 200 mg | auclast | NA | NA | NA |
| 200 mg | cmax | 0.131 | 0.049 | 0.379 |
| 200 mg | half.life | 14.067 | 9.856 | 18.091 |
| 200 mg | tmax | 2.000 | 1.000 | 3.762 |
| 360 mg | auclast | NA | NA | NA |
| 360 mg | cmax | 0.272 | 0.103 | 0.760 |
| 360 mg | half.life | 14.239 | 10.186 | 21.514 |
| 360 mg | tmax | 2.000 | 1.000 | 3.750 |
| 60 mg | auclast | NA | NA | NA |
| 60 mg | cmax | 0.042 | 0.016 | 0.155 |
| 60 mg | half.life | 14.641 | 10.315 | 20.018 |
| 60 mg | tmax | 1.750 | 1.238 | 4.012 |
Comparison against the published narrative
The source paper does not tabulate per-dose-group NCA summaries; it reports qualitative observations – Tmax was between 1 and 4 h after a single oral dose, paclitaxel concentrations followed a two-compartment disposition shape with substantial interpatient variability (~6-fold), and AUC was non-proportional with dose (de Jonge 2005 Results and Figure 4). The simulated Tmax band straddles 1-4 h across dose arms, the simulated AUC spread is wide and consistent with the reported large IIV, and the AUC slope vs dose is gentler than dose-proportional. There is no published side-by-side table to compare against numerically; the dose-vs-AUC plot above and the simulated Tmax distribution carry the comparison instead.
Assumptions and deviations
-
keqmechanistic form. The paper writeskeq = k15 / k51with units of 1/h and reports a single rate-constant value (0.334) while stating that the GI-tract CrEL amount influences the equilibrium. The paper does not write out the explicit functional form. The packaged model usesk_forward = keq * cremophor(so the forward binding rate scales linearly with the normalised GI-tract CrEL amount) andk_backward = keq(so the dissociation rate is a constant). This is the most parsimonious mass-action mechanism that reproduces the narrative; the steady-state ratiobound / depot = cremophorfalls smoothly to zero as the CrEL pool empties, so the apparent absorption rate increases with time. A control stream is not on disk; reviewers comparing this implementation to the original NONMEM code may wish to confirm the exact$DESform. The published Tmax (1-4 h), the shape of Figure 3 (residuals improved after introducing the bound pool), and the dose-vs-AUC non-proportionality (Figure 4) are all reproduced by the implementation above. -
CrEL pool normalisation. The compartment
cremophoris normalised to a unit-amount initial condition at each oral paclitaxel administration. The paper’s source studies dosed oral paclitaxel formulated in CrEL with a fixed paclitaxel-to-CrEL stoichiometry (6 mg paclitaxel per mL of CrEL/ethanol 1:1 w/v), and additionally tested CrEL doses of 5 or 15 mL/m^2 in a subset of patients. The paper found no significant dose-dependence in F across the studied range, so the model treats the CrEL pool as a normalised on/off contribution to the GI binding rather than a strictly scaled mass; this matches the reported dose-independent F and is consistent with the abstract’s “concentration of CrEL in the gastrointestinal tract decreased with time with a first order rate constant of 1.73 h^-1”. -
Multi-dose handling. The model file sets
cremophor(0) <- 1so a single oral paclitaxel administration attime = 0automatically pairs with a CrEL replenishment. For multi-dose simulations the user must add explicit dosing events into thecremophorcompartment withamt = 1at each oral paclitaxel administration time so each dose is accompanied by a fresh CrEL pool, as themake_cohort()helper above demonstrates. -
Reparameterisation from rate constants to
clearances. The paper parameterises the central / peripheral
exchange as rate constants
k23(0.241 /h) andk32(0.0946 /h). The packaged form uses the canonical CL / Vc / Q / Vp parameterisation, withQ = k23 * Vc = 0.241 * 409 = 98.569 L/handVp = Q / k32 = 98.569 / 0.0946 = 1041.96 L. The reparameterisation is exact at the typical-value level. The IIV onk23(CV 31.3%) is translated onto Q without changing its variance becauselog(k23) = log(Q) - log(Vc)andVccarries no IIV in this model (Var(log k23) = Var(log Q)). -
CL inter-occasion variability collapsed to between-subject
IIV. The source paper estimates an IOV on CL of 31.8% CV (RSE
38.3%) in addition to the IIV terms on
kabs,k23(-> Q), andF1reported in Table 3. nlmixr2lib has no canonical pattern for occasion-keyed IOV without an explicit OCC column on the simulation events, so the IOV variance is carried as ordinary between-subject IIV on the clearance log-typical-value (the same encoding pattern used bymodellib("Bellanti_2015_deferoxamine")for an IOV on CRT). The packaged model loses the within-subject between- occasion drift the paper estimates but preserves the population-level CL spread. -
F1 anchored at 1 with log-normal IIV. The paper
holds
F1 = 1 FIX(anchor for the apparent CL/F and V/F) and reports a 55.0% CV IIV on bioavailability. The packaged form encodes this withlfdepot <- fixed(log(1))andetalfdepot ~ 0.26429so the typical value of F is 1 and individual values areexp(etalfdepot)(log-normal). This is the standard NONMEM idiomF1 = THETA(j) * EXP(ETA(k))withTHETA(j) = 1 FIX. -
No retained covariate effects. The paper screened
age, body weight, body surface area, serum creatinine, AST, ALT,
alkaline phosphatase, gamma-glutamyl transferase, serum albumin, total
bilirubin, and lactate dehydrogenase (Table 2) on CL and V using a
centered-on-median power form, and found no statistically significant
relationships. The screened covariates are documented in the model
file’s
covariatesDataExcludedlist for provenance, but the model itself has no covariate-effect parameters. - Cyclosporin A coadministration baked into structural parameters. Every oral paclitaxel administration in the source dataset was paired with oral cyclosporin A 12-15 mg/kg (above the minimal required dose of 10 mg/kg for full P-gp / CYP3A4 inhibition, per Meerum Terwogt 1999 and Malingre 2000). The structural CL, V, kabs, and the GI binding dynamics are therefore conditional on coadministered CsA; applying this model to oral paclitaxel without CsA would be extrapolation outside the studied conditions.
-
Cremophor density and units. The model treats the
cremophorcompartment as a normalised dimensionless amount, not as physical millilitres or milligrams of CrEL. Users who want a CrEL mass-balance simulation would need to rescale the model so thatcremophorcarries the CrEL mass andkeqcarries the correspondingmL^-1 * h^-1ormg^-1 * h^-1units; the published rate-constant value (0.334 /h) cannot be reused directly under that rescaling.