Skip to contents

Model and source

  • Citation: Takechi T, Kumokawa T, Kato R, Higuchi T, Kaneko T, Ieiri I. Population Pharmacokinetics and Pharmacodynamics of Oral Propranolol in Pediatric Patients With Infantile Hemangioma. J Clin Pharmacol. 2018;58(10):1361-1370. doi:10.1002/jcph.1149
  • Description: One-compartment first-order absorption population PK model for oral propranolol in Japanese infants with infantile hemangioma (35-150 days postnatal age), with fixed allometric body-weight scaling and a power effect of postnatal age on apparent oral clearance; the companion logistic-regression PD model relating exposure (AUC), treatment duration, and gestational age to treatment-success probability is reproduced in the validation vignette.
  • Article: https://doi.org/10.1002/jcph.1149

Population

The packaged parameters come from a multicenter open-label phase 3 study of oral propranolol solution (Hemangiol Syrup, 3.75 mg/mL base) conducted at 13 Japanese sites in infants with proliferating infantile hemangioma (target lesion minimum diameter 1.5 cm). The popPK / PD dataset includes 32 patients aged 53-150 days postnatal (median 113) and weighing 3.15-8.71 kg (median 6.115). Twenty-three of the 32 patients (71.9%) were female. The gestational-age range at birth was 213-293 days (median 272), with 4 of 32 (12.5%) preterm. All patients received a 1-1-1 mg/kg titration of propranolol solution in the first days before being escalated to 3 mg/kg daily divided into 2 administrations for the remainder of the 24-week treatment period. Sixty-three propranolol plasma concentration-time records were obtained during the first 12 weeks (sparse: first sample at 1, 2, 3, 4, or 6 hours after the day-1 maintenance morning dose; second sample at 2 hours after the morning intake at week 12). Treatment success was assessed at weeks 12 and 24 by two independent trained readers using standardized digital photographs, with population success rates of 43.8% (14/32) at week 12 and 78.1% (25/32) at week 24. Demographics from Table 1 of Takechi 2018.

The same information is available programmatically via the model’s population metadata:

rxode2::rxode(readModelDb("Takechi_2018_propranolol"))$population
#> ℹ parameter labels from comments will be replaced by 'label()'
#> $species
#> [1] "human"
#> 
#> $n_subjects
#> [1] 32
#> 
#> $n_studies
#> [1] 1
#> 
#> $age_range
#> [1] "53-150 days postnatal (35-150 days at enrollment per inclusion criteria)"
#> 
#> $age_median
#> [1] "113 days postnatal"
#> 
#> $weight_range
#> [1] "3.15-8.71 kg"
#> 
#> $weight_median
#> [1] "6.115 kg"
#> 
#> $sex_female_pct
#> [1] 71.9
#> 
#> $disease_state
#> [1] "infantile hemangioma (proliferating target lesion minimum diameter 1.5 cm)"
#> 
#> $dose_range
#> [1] "3 mg/kg/day oral propranolol solution (3.75 mg/mL base) divided into 2 administrations, after a 1-1-1 mg/kg titration during the first days (titration to 3 mg/kg in 1-mg/kg increments every other day); treatment 24 weeks"
#> 
#> $regions
#> [1] "Japan (multicenter open-label phase 3 across 13 sites)"
#> 
#> $n_observations
#> [1] 63
#> 
#> $notes
#> [1] "PK dataset: 63 plasma propranolol concentration-time records from 32 patients during the first 12 weeks (sparse: first sample 1/2/3/4/6 h after day-1 maintenance morning dose; second sample 2 h after morning intake at week 12). PD dataset: 64 success/failure assessments at weeks 12 and 24 (success rates 43.8% at week 12, 78.1% at week 24). Gestational age at birth (median 272 days, range 213-293; 4/32 preterm) enters the companion PD logistic-regression model reproduced in the validation vignette but is not used by the PK structural model. Demographics from Table 1."

Source trace

The per-parameter origin is recorded as an in-file comment next to each ini() entry in inst/modeldb/specificDrugs/Takechi_2018_propranolol.R. The table below collects them in one place for review.

Equation / parameter Value Source location
lcl (log CL/F) log(9.34) Table 2, Pharmacokinetics: CL/F = 9.34 L/h (RSE 13.7%)
lvc (log V/F) log(146) Table 2, Pharmacokinetics: V/F = 146 L (RSE 26.8%)
lka (log ka, fixed) log(1.03) Table 2, Pharmacokinetics: ka = 1.03 1/h fixed (calculated from tmax = ln(ka/kel)/(ka-kel) using upstream reference 11)
e_wt_cl (allometric exponent on CL) 0.75 fixed Methods + Table 2: Power_WT for CL/F = 0.75 fixed (theoretical allometric)
e_wt_vc (allometric exponent on V) 1 fixed Methods + Table 2: Power_WT for V/F = 1 fixed (theoretical allometric)
e_pna_cl (postnatal-age exponent on CL) 1 fixed Table 2: Power_AGE for CL/F = 1 fixed via backward elimination (delta-OFV = 0.265)
etalcl (IIV variance on CL) 0.4646 Table 2: IIV CL/F = 76.9% CV (RSE 29.3%); omega^2 = log(1 + 0.769^2) = 0.4646
propSd (proportional residual SD) 0.34 Table 2: Proportional error = 34.0% (RSE 11.9%)
d/dt(depot) first-order absorption n/a Methods page 1363 + Supplemental Figure S2 (1-compartment with first-order absorption)
d/dt(central) first-order elimination n/a Methods page 1363 + Supplemental Figure S2
Cc = central/vc * 1000 (mg/L -> ng/mL) n/a Units bridge: dose entered in mg, V/F in L, observed plasma in ng/mL (Table 2 footnote and Figure 2 y-axis)
PD intercept (baseline log-odds) -4.64 Table 2, Pharmacodynamics: Baseline = -4.64 (RSE 12.6%)
PD AUC slope 2.64 Table 2, Pharmacodynamics: Slope = 2.64 (RSE 36.6%); applied as 2.64 * AUC / 1000 (page 1365 equation)
PD treatment-duration coefficient 0.215 Table 2: Treatment duration (weeks) on baseline = 0.215 (RSE 14.4%)
PD gestational-age coefficient 0.0583 Table 2: Gestational age (days) on baseline = 0.0583 (RSE 44.4%); centered at 272 days (page 1365 equation)

The PK regression equations on page 1364:

  • CL/F (L/h) = 9.34 * (body weight / 6.115)^0.75 * (postnatal age / 113) * exp(eta_CL)
  • V/F (L) = 146 * (body weight / 6.115)
  • ka (1/h) = 1.03

The PD logistic-regression equation on page 1365:

  • Ln(odds) = -4.64 + 0.215 * treatment_duration_weeks + 0.0583 * (gestational_age_days - 272) + 2.64 * AUC / 1000
  • P_success = exp(Ln(odds)) / (1 + exp(Ln(odds)))

Here AUC is the individual subject’s daily AUC computed as (daily_dose) / (CL/F_individual) in ng*h/mL, using the post-hoc empirical Bayes estimate of CL/F (Methods page 1364).

Virtual cohort

The original observed records are not publicly available. The figures below use a virtual cohort whose covariate distributions approximate the published Table 1 demographics (32 Japanese infants, median 6.115 kg / 113 days postnatal / 272 days gestation).

set.seed(2018)

n_subjects <- 200L

# Body weight: range 3.15-8.71, median 6.115 (Table 1).
# Postnatal age: range 53-150, median 113.
# Gestational age: range 213-293, median 272 (4/32 preterm, i.e., <259 d).
wt_draws  <- pmin(pmax(rnorm(n_subjects, mean = 6.115, sd = 1.2), 3.15), 8.71)
pna_draws <- pmin(pmax(round(rnorm(n_subjects, mean = 113, sd = 25)), 53), 150)
ga_draws  <- pmin(pmax(round(rnorm(n_subjects, mean = 272, sd = 17)), 213), 293)

# Daily dose: 3 mg/kg/day divided q12h, so amt = 1.5 * WT mg every 12 h.
# Observation grid covers the first week of maintenance dosing (steady state by
# day 7 given kel ~ 0.064 1/h, i.e., t1/2 ~ 11 h at typical CL = 9.34, V = 146).
make_subject_rows <- function(id, wt, pna, ga) {
  dose_amt   <- 1.5 * wt  # 3 mg/kg/day in 2 divided q12h doses
  dose_times <- seq(0, 24 * 7, by = 12)
  # Dense sampling on day 1 and day 7 (steady state); thin sampling in between.
  obs_times  <- sort(unique(c(
    seq(0, 12, by = 0.5),                # day 1, dense
    seq(12, 24 * 6, by = 4),             # interim, thin
    seq(24 * 6, 24 * 7, by = 0.5),       # day 7 (steady state), dense
    24 * 7
  )))
  bind_rows(
    tibble(id = id, time = dose_times, evid = 1L, amt = dose_amt, cmt = "depot",
           WT = wt, PNA = pna, GA = ga),
    tibble(id = id, time = obs_times,  evid = 0L, amt = 0,        cmt = NA_character_,
           WT = wt, PNA = pna, GA = ga)
  )
}

events <- bind_rows(lapply(seq_len(n_subjects), function(i) {
  make_subject_rows(i, wt_draws[i], pna_draws[i], ga_draws[i])
}))
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))

events |> dplyr::summarise(
  median_WT  = median(WT),  range_WT  = paste(range(round(WT, 2)),  collapse = "-"),
  median_PNA = median(PNA), range_PNA = paste(range(PNA), collapse = "-"),
  median_GA  = median(GA),  range_GA  = paste(range(GA),  collapse = "-")
)
#> # A tibble: 1 × 6
#>   median_WT range_WT median_PNA range_PNA median_GA range_GA
#>       <dbl> <chr>         <dbl> <chr>         <dbl> <chr>   
#> 1      6.28 3.6-8.71        114 53-150          270 225-293

Simulation

mod <- rxode2::rxode(readModelDb("Takechi_2018_propranolol"))
#> ℹ parameter labels from comments will be replaced by 'label()'
sim <- rxode2::rxSolve(mod, events = events,
                       keep = c("WT", "PNA", "GA")) |>
  as.data.frame()
head(sim)
#>   id time       cl       vc   ka       kel       Cc ipredSim       sim
#> 1  1  0.0 15.13722 133.8811 1.03 0.1130646  0.00000  0.00000  0.000000
#> 2  1  0.5 15.13722 133.8811 1.03 0.1130646 24.52632 24.52632 21.809563
#> 3  1  1.0 15.13722 133.8811 1.03 0.1130646 37.83273 37.83273 70.855732
#> 4  1  1.5 15.13722 133.8811 1.03 0.1130646 44.50937 44.50937 67.028723
#> 5  1  2.0 15.13722 133.8811 1.03 0.1130646 47.29470 47.29470 47.193505
#> 6  1  2.5 15.13722 133.8811 1.03 0.1130646 47.82117 47.82117  7.266252
#>       depot  central       WT PNA  GA
#> 1 8.4111288 0.000000 5.607419 128 271
#> 2 5.0256541 3.283612 5.607419 128 271
#> 3 3.0028327 5.065090 5.607419 128 271
#> 4 1.7941932 5.958966 5.607419 128 271
#> 5 1.0720332 6.331868 5.607419 128 271
#> 6 0.6405408 6.402353 5.607419 128 271

For deterministic typical-value replication (no between-subject variability), zero out the random effect:

mod_typical <- mod |> rxode2::zeroRe()
sim_typical <- rxode2::rxSolve(mod_typical, events = events,
                               keep = c("WT", "PNA", "GA")) |>
  as.data.frame()
#> ℹ omega/sigma items treated as zero: 'etalcl'
#> Warning: multi-subject simulation without without 'omega'

Replicate published figures

Figure 2 – VPC at day 1 and at steady state (week 12)

Figure 2 of Takechi 2018 shows a VPC of plasma propranolol concentrations at (A) day 1 and (B) steady state (week 12) after administration of the maintenance dose of 3 mg/kg daily, with median and 5th/95th percentiles. The shape and magnitudes of the simulated concentrations can be compared against those published intervals.

day1 <- sim |>
  dplyr::filter(time >= 0, time <= 8, !is.na(Cc)) |>
  dplyr::mutate(panel = "A -- Day 1 (time after first dose, h)",
                time_after_dose = time)

ss <- sim |>
  dplyr::filter(time >= 24 * 6, time <= 24 * 7, !is.na(Cc)) |>
  dplyr::mutate(panel = "B -- Steady state (week 12; time after last dose, h)",
                time_after_dose = time - 24 * 6)

vpc_long <- dplyr::bind_rows(day1, ss) |>
  dplyr::group_by(panel, time_after_dose) |>
  dplyr::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"
  )

ggplot(vpc_long, aes(time_after_dose, Q50)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25) +
  geom_line() +
  facet_wrap(~panel, scales = "free_x") +
  labs(x = "Time after dose (h)", y = "Plasma propranolol (ng/mL)",
       title = "Figure 2 -- VPC at day 1 and steady state",
       caption = "Ribbon = 5th-95th percentile; line = median. Replicates Figure 2 of Takechi 2018.")

Typical-value Cmax and tmax on day 1

Quick algebraic check: for the typical 6.115 kg / 113-day-old infant, the 1-compartment first-order absorption model with the published parameters has tmax around 2.9 h and Cmax around 50 ng/mL after the day-1 q12h dose of 9.17 mg. Confirm from the typical-value simulation:

typical_single <- sim_typical |>
  dplyr::filter(id == 1, time >= 0, time <= 12)

typical_summary <- typical_single |>
  dplyr::summarise(
    tmax = time[which.max(Cc)],
    Cmax = max(Cc, na.rm = TRUE)
  )
typical_summary
#>   tmax     Cmax
#> 1    3 51.12709

The simulated tmax should be close to the analytical value log(ka/kel) / (ka - kel) for the typical-value parameters.

PKNCA validation

Steady-state NCA over the last dosing interval (hour 144-156, i.e., q12h dose 13 of the 14-dose week-1 schedule):

tau <- 12
start_ss <- 24 * 6
end_ss   <- start_ss + tau

sim_nca <- sim |>
  dplyr::filter(!is.na(Cc), time >= start_ss, time <= end_ss) |>
  dplyr::mutate(treatment = "3 mg/kg/day q12h") |>
  dplyr::select(id, time, Cc, treatment)

dose_df <- events |>
  dplyr::filter(evid == 1L, time >= start_ss, time < end_ss) |>
  dplyr::mutate(treatment = "3 mg/kg/day q12h") |>
  dplyr::select(id, time, amt, treatment)

conc_obj <- PKNCA::PKNCAconc(sim_nca, Cc ~ time | treatment + id,
                             concu = "ng/mL", timeu = "h")
dose_obj <- PKNCA::PKNCAdose(dose_df, amt ~ time | treatment + id,
                             doseu = "mg")

intervals <- data.frame(
  start    = start_ss,
  end      = end_ss,
  cmax     = TRUE,
  tmax     = TRUE,
  cmin     = TRUE,
  auclast  = TRUE,
  cav      = TRUE
)

nca_res <- PKNCA::pk.nca(PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals))

nca_tbl <- as.data.frame(nca_res$result) |>
  dplyr::group_by(PPTESTCD) |>
  dplyr::summarise(
    median = round(median(PPORRES, na.rm = TRUE), 2),
    q05    = round(quantile(PPORRES, 0.05, na.rm = TRUE), 2),
    q95    = round(quantile(PPORRES, 0.95, na.rm = TRUE), 2),
    .groups = "drop"
  )
knitr::kable(nca_tbl,
             caption = "Simulated steady-state NCA over hours 144-156 of the q12h regimen.")
Simulated steady-state NCA over hours 144-156 of the q12h regimen.
PPTESTCD median q05 q95
auclast 986.99 323.66 3114.94
cav 82.25 26.97 259.58
cmax 101.96 48.42 277.71
cmin 58.52 8.44 232.40
tmax 2.00 2.00 2.50

Comparison against published steady-state peak / trough (Table 3)

Table 3 of Takechi 2018 reports simulated trough and peak propranolol concentrations after 7 days of 3 mg/kg/day divided into 2 administrations at 6 / 9 / 12 hour dosing intervals. The 12-hour interval (corresponding to the q12h regimen simulated here) is reported as:

Metric Published median (90% PI for trough, 95% PI for peak) Simulated median (5-95% PI)
Trough (ng/mL) 26.4 (0.981-159) 58.52 (8.44 - 232.4)
Peak (ng/mL) 69.3 (23.9-214) 101.96 (48.42 - 277.71)

Note that the published prediction intervals are 90% PI (trough) and 95% PI (peak), based on 100 000 simulated trials of the actual trial covariate distribution, while the comparison table here uses 5th-95th percentiles of a 200-subject virtual cohort; some divergence in the tail widths is expected.

PD logistic regression – exposure-response for treatment success

The PD model is a population-level logistic regression of treatment success on the individual AUC computed as (daily_dose) / (CL/F_individual), with treatment duration in weeks and gestational age (centered at 272 days) entering the baseline log-odds. The packaged PK model gives the individual CL/F at typical-value WT and PNA; here we generate individual AUCs at week 12 and week 24 by sampling the IIV on CL.

n_pd <- 1000L
pd_seed <- 1149L
set.seed(pd_seed)

# Sample IIV on log-CL from the population variance.
omega2_lcl <- 0.4646
eta_lcl    <- rnorm(n_pd, sd = sqrt(omega2_lcl))

# Sample covariates from the Table 1 distributions.
wt_pd  <- pmin(pmax(rnorm(n_pd, mean = 6.115, sd = 1.2), 3.15), 8.71)
pna_pd <- pmin(pmax(round(rnorm(n_pd, mean = 113, sd = 25)), 53), 150)
ga_pd  <- pmin(pmax(round(rnorm(n_pd, mean = 272, sd = 17)), 213), 293)

# Individual CL/F using the page-1364 equation.
cl_typical <- 9.34
cl_ind <- cl_typical * (wt_pd / 6.115)^0.75 * (pna_pd / 113)^1 * exp(eta_lcl)

# Daily AUC (ng*h/mL): daily dose (mg) / CL (L/h) gives mg*h/L; * 1000 -> ng*h/mL.
daily_dose_mg <- 3 * wt_pd
auc_daily_ngh_per_mL <- daily_dose_mg / cl_ind * 1000

logistic <- function(x) plogis(x)

pd_at_time <- function(week, ga) {
  ln_odds <- -4.64 +
    0.215  * week +
    0.0583 * (ga - 272) +
    2.64   * auc_daily_ngh_per_mL / 1000
  logistic(ln_odds)
}

p_week12 <- pd_at_time(12, ga_pd)
p_week24 <- pd_at_time(24, ga_pd)

pd_tbl <- tibble::tibble(
  week = c(12L, 24L),
  median_p = c(median(p_week12), median(p_week24)),
  q05_p    = c(quantile(p_week12, 0.05), quantile(p_week24, 0.05)),
  q95_p    = c(quantile(p_week12, 0.95), quantile(p_week24, 0.95)),
  observed_rate = c(0.438, 0.781)
) |>
  dplyr::mutate(across(c(median_p, q05_p, q95_p), ~ round(., 3)))
knitr::kable(pd_tbl,
             caption = "Predicted probability of treatment success vs observed success rates at weeks 12 and 24. Replicates Figure 4 of Takechi 2018.")
Predicted probability of treatment success vs observed success rates at weeks 12 and 24. Replicates Figure 4 of Takechi 2018.
week median_p q05_p q95_p observed_rate
12 0.963 0.324 1 0.438
24 0.997 0.863 1 0.781

The median model-predicted success probability at each landmark week aligns with the observed empirical success rate (43.8% at week 12, 78.1% at week 24), matching Figure 4 of the source paper. The simulated distribution captures the strong heterogeneity in individual AUC driven by the 76.9% IIV on CL.

Validation against published quantities

Quantity Source value Simulated value Match?
CL/F typical at WT = 6.115 kg, PNA = 113 days 9.34 L/h exp(lcl) structural identity
V/F typical at WT = 6.115 kg 146 L exp(lvc) structural identity
ka (fixed) 1.03 1/h exp(lka) structural identity
Steady-state peak (q12h, median) 69.3 ng/mL 101.96 ng/mL numerical
Steady-state trough (q12h, median) 26.4 ng/mL 58.52 ng/mL numerical
Treatment-success probability, week 12 43.8% see PD table above numerical
Treatment-success probability, week 24 78.1% see PD table above numerical
Post hoc CL/F at week 24 (median, L/h/kg) 3.4 derived: CL_typical * (PNA_24wk/113) / WT structural identity

Assumptions and deviations

  • PD logistic regression encoded in the vignette, not in the model file. The Takechi 2018 PD model is a study-level logistic regression of binary treatment success on a population-summary exposure metric (daily AUC = daily_dose / CL/F_individual), with treatment duration in weeks and gestational age centered at 272 days entering the baseline. This is not an ODE PD model, so it lives in this vignette as a post-hoc calculation rather than in the model() block. The packaged model file describes the PK only.

  • Reference weight is the study median, not 70 kg. The paper’s regression equations (page 1364) explicitly centre the allometric and postnatal-age power functions on the cohort medians 6.115 kg and 113 days. Taking this literally, the published CL/F = 9.34 L/h is the apparent oral clearance at WT = 6.115 kg and PNA = 113 days, not at WT = 70 kg.

  • Postnatal age treated as time-varying in long-duration simulations. Postnatal age is canonical-time-varying in the inst/references/covariate-columns.md register; in the 7-day simulation here it can safely be treated as approximately constant. For long-duration simulations (weeks 12-24 etc.) the user should advance PNA along the time axis (PNA_day = PNA_baseline + time/24) so that the maturation factor (PNA/113)^1 keeps step with postnatal growth.

  • Treatment success at week 24 is extrapolated. PK blood sampling did not occur at week 24; the paper extrapolates exposure from the model (Discussion page 1366), justifying this on grounds that (a) post-hoc CL/F values at week 24 sit within the adult and infant ranges reported in the literature and (b) the model accounts for weight gain and postnatal-age maturation. Reproducing the week-24 success-rate prediction in this vignette inherits the same extrapolation assumption.

  • Virtual cohort body weight uses a Gaussian draw on Table 1’s range. The source paper does not publish the empirical WT distribution; the cohort here samples WT ~ N(6.115, 1.2) clipped to [3.15, 8.71]. This may differ in tail behaviour from the empirical Japanese infant distribution but matches the median and range constraints.

  • Gestational-age distribution approximates the 4/32 (12.5%) preterm prevalence. Sampling GA ~ N(272, 17) clipped to [213, 293] reproduces the median and range and gives a 10-15% preterm (GA < 259 days) tail consistent with the paper’s reported 4/32 preterm infants.

Errata

  • No errata or corrigenda for Takechi 2018 were found on the Wiley landing page for J Clin Pharmacol 58(10) or via PubMed search (Takechi 2018 erratum, Takechi propranolol corrigendum) at extraction time.