Skip to contents

Model and source

Li 2017 reports three separately fitted population PK models for pomalidomide, differing only in how renal function enters apparent clearance, plus a simulation model that adds the measured dialyzer clearance on top of the categorical fit. Each is packaged as its own model file; all four point at this one article.

Model Renal function enters as Source
Li_2017_pomalidomide_renalcat four-level categorical variable Table 3
Li_2017_pomalidomide_crcl continuous Cockcroft-Gault CrCl, reverse hockey stick Table 5, CrCl column
Li_2017_pomalidomide_egfr continuous MDRD eGFR, reverse hockey stick Table 5, eGFR column
Li_2017_pomalidomide_hemodialysis categorical, plus a gated dialyzer clearance Table 3 + Equation 6 / Figures 5-6
  • Citation: Li Y, Wang X, O’Mara E, Dimopoulos MA, Sonneveld P, Weisel KC, Matous J, Siegel DS, Shah JJ, Kueenburg E, Sternas L, Cavanaugh C, Zaki M, Palmisano M, Zhou S. Population pharmacokinetics of pomalidomide in patients with relapsed or refractory multiple myeloma with various degrees of impaired renal function. Clin Pharmacol Adv Appl. 2017;9:133-145. doi:10.2147/CPAA.S144606
  • Article: https://doi.org/10.2147/CPAA.S144606 (open access; PMC5685150)
mods <- lapply(
  c(
    renalcat = "Li_2017_pomalidomide_renalcat",
    crcl = "Li_2017_pomalidomide_crcl",
    egfr = "Li_2017_pomalidomide_egfr",
    hemodialysis = "Li_2017_pomalidomide_hemodialysis"
  ),
  function(nm) rxode2::rxode(readModelDb(nm))
)
#> ℹ parameter labels from comments will be replaced by 'label()'
#> ℹ parameter labels from comments will be replaced by 'label()'
#> ℹ parameter labels from comments will be replaced by 'label()'
#> ℹ parameter labels from comments will be replaced by 'label()'
vapply(mods, function(u) paste(u$state, collapse = " + "), character(1))
#>          renalcat              crcl              egfr      hemodialysis 
#> "depot + central" "depot + central" "depot + central" "depot + central"

All four are one-compartment models with first-order oral absorption. The categorical and hemodialysis models additionally carry the Table 3 absorption lag time; the two continuous models do not, because Table 5 reports no lag time.

Population

Sixty-three patients with relapsed or refractory multiple myeloma (rrMM) were pooled from two Celgene studies – CC-4047-MM-008 (Phase 1, n = 20) and CC-4047-MM-013 (Phase 2, n = 43) – and dosed with 2-4 mg oral pomalidomide once daily together with low-dose dexamethasone. Median age was 69 years (range 46-86) and median body weight 78.2 kg (range 39.9-116.6); median CrCl was 28.3 mL/min (range 8.7-115.4) and median eGFR 27 mL/min/1.73 m^2 (range 5-84) (Li 2017 Table 2). The cohort was deliberately enriched for renal impairment (Table 1): 8 patients with normal renal function, 15 with moderate impairment, 30 with severe impairment not requiring dialysis, and 10 with severe impairment requiring hemodialysis. Sex distribution and race/ethnicity are not reported.

The same information is available programmatically:

str(mods$renalcat$population, max.level = 1)
#> List of 13
#>  $ species       : chr "human"
#>  $ n_subjects    : num 63
#>  $ n_studies     : num 2
#>  $ age_range     : chr "46-86 years"
#>  $ age_median    : chr "69 years"
#>  $ weight_range  : chr "39.9-116.6 kg"
#>  $ weight_median : chr "78.2 kg"
#>  $ disease_state : chr "relapsed or refractory multiple myeloma (rrMM) with normal, moderately impaired, or severely impaired renal fun"| __truncated__
#>  $ dose_range    : chr "2-4 mg once daily, oral"
#>  $ renal_function: chr "CrCl median 28.3 mL/min (range 8.7-115.4); eGFR median 27 mL/min/1.73 m^2 (range 5-84). Group sizes (Table 1): "| __truncated__
#>  $ co_medication : chr "low-dose dexamethasone"
#>  $ regions       : chr "North America (USA, Canada) and Europe (France, Germany, Greece, Italy, Netherlands, Spain, UK, Austria)"
#>  $ notes         : chr "Pooled intensive and sparse plasma sampling from studies CC-4047-MM-008 (Phase 1, n = 20) and CC-4047-MM-013 (P"| __truncated__

Source trace

Every ini() entry carries an in-file comment pointing at its source location. Collected here for review:

Source trace for every ini() parameter and every nonstandard model() equation.
Model Parameter Value Source
renalcat / hemodialysis lka 0.724 1/h Table 3, Ka
renalcat / hemodialysis lvc 58.300 L Table 3, V/F
renalcat / hemodialysis lcl 5.130 L/h Table 3, CL/F normal
renalcat / hemodialysis ltlag 0.154 h Table 3, Tlag
renalcat / hemodialysis e_renalimp_mod_cl 1.020 Table 3, CL/F ratio group 2 vs 1
renalcat / hemodialysis e_renalimp_sev_cl 1.010 Table 3, CL/F ratio group 3 vs 1
renalcat / hemodialysis e_rrt_hemodial_status_cl 0.724 Table 3, CL/F ratio group 4 vs 1
renalcat / hemodialysis etalka 0.782 Table 3, omega^2 (Ka)
renalcat / hemodialysis etalvc, etalcl block 0.139 / 0.163 / 0.198 Table 3, omega^2 (V/F), omega(V/F):omega(CL/F), omega^2 (CL/F)
renalcat / hemodialysis expSd 0.5840 Table 3, delta^2 = 0.341; sqrt(0.341)
hemodialysis lcl_hemodialysis 12 L/h Results, median CL_D from 7 patients via Equation 6
crcl lka 0.68 1/h Table 5, CrCl column, Ka
crcl lvc 60.7 L Table 5, CrCl column, V/F
crcl lcl_nonren 3.71 L/h Table 5, CrCl column, Intercept
crcl e_crcl_cl_renal 0.0469 L/h per mL/min Table 5, CrCl column, Slope
crcl crcl_hinge 37.7 mL/min Table 5, CrCl column, CrCl0
crcl etalka / etalvc / etalcl_nonren / etae_crcl_cl_renal 0.986 / 0.0293 / 0.163 / 0.3 Table 5, CrCl column, omega^2 rows
crcl expSd 0.5925 Table 5, delta^2 = 0.351; sqrt(0.351)
egfr lka 0.678 1/h Table 5, eGFR column, Ka
egfr lvc 60.5 L Table 5, eGFR column, V/F
egfr lcl_nonren 3.96 L/h Table 5, eGFR column, Intercept
egfr e_crcl_cl_renal 0.0483 L/h per mL/min/1.73 m^2 Table 5, eGFR column, Slope
egfr crcl_hinge 26.0 mL/min/1.73 m^2 Table 5, eGFR column, eGFR0
egfr etalka / etalvc / etalcl_nonren / etae_crcl_cl_renal 0.99 / 0.0278 / 0.147 / 0.516 Table 5, eGFR column, omega^2 rows
egfr expSd 0.5925 Table 5, delta^2 = 0.351; sqrt(0.351)
all IIV form P_i = P * exp(eta) n/a Equation 1
all Residual ln(Cobs) = ln(Cpred) + eps n/a Equation 2
renalcat / hemodialysis Categorical covariate form P = theta * (1 + theta_cov * Z) n/a Equation 5
hemodialysis CL_D = Q * (Ca - Cv) / Ca n/a Equation 6
crcl / egfr Reverse hockey stick CL/F = intercept + slope * min(marker, marker0) n/a Equation 7

Two readings that had to be settled

The Table 3 off-diagonal is a covariance, not a correlation. Table 3’s row omega(V/F):omega(CL/F) = 0.163 sits between two omega^2 rows and the table’s Notes define only omega^2. Three checks agree it is the block covariance: the Results prose says “the estimated IIV and associated covariance were reasonably precise”; the NONMEM $OMEGA BLOCK convention reports the off-diagonal as a covariance; and the bootstrap 90% CI for that row (0.088-0.236) brackets the geometric mean of the two variance CIs (sqrt(0.069*0.121) = 0.091 and sqrt(0.236*0.273) = 0.254), which only holds if the off-diagonal tracks sqrt(var_V * var_CL) across the whole bootstrap distribution. The implied correlation is therefore 0.982 and the block is positive definite:

om <- matrix(c(0.139, 0.163, 0.163, 0.198), 2, 2)
c(
  correlation = 0.163 / sqrt(0.139 * 0.198),
  determinant = det(om),
  min_eigenvalue = min(eigen(om)$values)
)
#>    correlation    determinant min_eigenvalue 
#>     0.98253405     0.00095300     0.00285203
stopifnot(det(om) > 0, min(eigen(om)$values) > 0)

A near-degenerate V/F-CL/F block is the expected signature of an oral model: both parameters carry the same unestimated 1/F, so shared bioavailability variability dominates each of them.

The dialyzer clearance is additive, not a replacement. See the hemodialysis section below, where the two readings are simulated side by side against the paper’s own reported exposure ratios.

Virtual cohort

Original observed data are not publicly available. The cohort below places 150 virtual subjects in each of the paper’s four renal-function groups and doses them 4 mg once daily for 10 days, with observations over the final (steady-state) dosing interval.

# set.seed() seeds R's RNG, NOT rxode2's simulation RNG, and rxode2 partitions
# its streams per solver thread -- so this cohort differs between a 16-thread
# workstation and a 2-core CI runner. Every assertion below is written to hold
# for any cohort the model can produce (or is run on zeroRe() typical values,
# which are fully deterministic).
set.seed(20171108)

N_PER_GROUP <- 150L # <= 200/arm cap
DOSE_MG <- 4
N_DOSES <- 10L
TAU <- 24

groups <- tibble::tribble(
  ~group, ~label, ~RENALIMP_MOD, ~RENALIMP_SEV, ~RRT_HEMODIAL_STATUS,
  "Group 1", "Normal", 0, 0, 0,
  "Group 2", "Moderate", 1, 0, 0,
  "Group 3", "Severe, no HD", 0, 1, 0,
  "Group 4", "Severe, HD", 0, 0, 1
)

make_cohort <- function(g, id_offset) {
  subj <- tibble(
    id = id_offset + seq_len(N_PER_GROUP),
    group = g$group,
    label = g$label,
    RENALIMP_MOD = g$RENALIMP_MOD,
    RENALIMP_SEV = g$RENALIMP_SEV,
    RRT_HEMODIAL_STATUS = g$RRT_HEMODIAL_STATUS
  )
  dose <- subj |>
    mutate(time = 0, amt = DOSE_MG, evid = 1L, cmt = "depot", ii = TAU, addl = N_DOSES - 1L)
  # Observations over the LAST dosing interval only. cmt is the ODE STATE
  # `central`, never the algebraic observable `Cc`.
  obs <- subj |>
    tidyr::crossing(time = (N_DOSES - 1L) * TAU + seq(0, TAU, by = 0.25)) |>
    mutate(amt = NA_real_, evid = 0L, cmt = "central", ii = 0, addl = 0L)
  bind_rows(dose, obs) |> arrange(id, time, desc(evid))
}

events <- bind_rows(lapply(seq_len(nrow(groups)), function(i) {
  make_cohort(groups[i, ], id_offset = (i - 1L) * N_PER_GROUP)
}))

# Disjoint IDs across cohorts are mandatory: rxSolve treats id as the subject
# key and silently merges duplicates into one subject receiving the summed dose.
stopifnot(
  !anyDuplicated(unique(events[, c("id", "time", "evid")])),
  length(unique(events$id)) == nrow(groups) * N_PER_GROUP
)

Simulation

sim <- rxode2::rxSolve(
  mods$renalcat,
  events = events,
  keep = c("group", "label")
) |>
  as.data.frame() |>
  mutate(tad = time - (N_DOSES - 1L) * TAU)

# Typical-value (zeroRe) profiles, one per group -- fully deterministic.
typ_events <- events |>
  group_by(group) |>
  filter(id == min(id)) |>
  ungroup()
sim_typ <- rxode2::rxSolve(
  rxode2::zeroRe(mods$renalcat),
  events = typ_events,
  keep = c("group", "label")
) |>
  as.data.frame() |>
  mutate(tad = time - (N_DOSES - 1L) * TAU)
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> Warning: multi-subject simulation without without 'omega'

stopifnot(nrow(sim) > 0, !anyNA(sim$Cc), all(sim$Cc >= 0))

Replicate published figures

Figure 3 – steady-state profiles by renal-function group

# Replicates Figure 3 of Li 2017: median steady-state plasma concentration
# profiles with a 90% interval, by renal-function group.
sim |>
  group_by(tad, label) |>
  summarise(
    Q05 = quantile(Cc, 0.05),
    Q50 = quantile(Cc, 0.50),
    Q95 = quantile(Cc, 0.95),
    .groups = "drop"
  ) |>
  ggplot(aes(tad, Q50, colour = label, fill = label)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.15, colour = NA) +
  geom_line(linewidth = 0.8) +
  labs(
    x = "Time after dose (h)", y = "Pomalidomide (ng/mL)",
    colour = NULL, fill = NULL,
    title = "Figure 3 - steady-state profiles by renal function group",
    caption = "Replicates Figure 3 of Li 2017 (4 mg once daily, day 10)."
  ) +
  theme_bw()

The four groups overlie one another almost exactly except for the hemodialysis group, which sits higher – the paper’s central finding that renal impairment short of dialysis does not alter pomalidomide exposure.

Figure 4 – apparent clearance versus renal function

# Replicates Figure 4 of Li 2017: the reverse-hockey-stick relationship between
# CL/F and CrCl (panel A) or eGFR (panel B). Typical values, so deterministic.
cl_curve <- function(model, marker_grid) {
  ev <- rxode2::et(amt = DOSE_MG, cmt = "depot")
  ev <- rxode2::et(ev, 0:1)
  vapply(marker_grid, function(x) {
    d <- as.data.frame(ev)
    d$CRCL <- x
    unique(rxode2::rxSolve(rxode2::zeroRe(model), d, returnType = "data.frame")$cl)
  }, numeric(1))
}

marker_grid <- seq(0, 120, by = 1)
curves <- bind_rows(
  tibble(marker = marker_grid, cl = cl_curve(mods$crcl, marker_grid), panel = "A: Cockcroft-Gault CrCl (mL/min)"),
  tibble(marker = marker_grid, cl = cl_curve(mods$egfr, marker_grid), panel = "B: MDRD eGFR (mL/min/1.73 m^2)")
)
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'

ggplot(curves, aes(marker, cl)) +
  geom_line(linewidth = 0.9, colour = "firebrick") +
  geom_hline(yintercept = 5.13, linetype = "dotted") +
  facet_wrap(~panel, scales = "free_x") +
  ylim(0, 10) +
  labs(
    x = "Renal function marker", y = "Pomalidomide CL/F (L/h)",
    title = "Figure 4 - CL/F vs renal function (reverse hockey stick)",
    caption = paste(
      "Replicates Figure 4 of Li 2017. Dotted line is the 5.13 L/h",
      "normal-renal-function CL/F of the categorical model (Table 3)."
    )
  ) +
  theme_bw()

# Deterministic structural gates on Equation 7. These are exact arithmetic on
# typical values (no cohort, no RNG), so they are asserted tightly.
knee <- tibble::tribble(
  ~model, ~hinge, ~intercept, ~slope,
  "crcl", 37.7, 3.71, 0.0469,
  "egfr", 26.0, 3.96, 0.0483
) |>
  rowwise() |>
  mutate(
    cl_at_zero = cl_curve(mods[[model]], 0),
    cl_at_knee = cl_curve(mods[[model]], hinge),
    cl_far_above = cl_curve(mods[[model]], 120),
    plateau_expected = intercept + slope * hinge
  ) |>
  ungroup()
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl_nonren', 'etae_crcl_cl_renal'

knitr::kable(
  knee |>
    dplyr::rename(
      "Model" = model, "Breakpoint" = hinge, "Intercept (L/h)" = intercept,
      "Slope" = slope, "CL/F at marker 0" = cl_at_zero,
      "CL/F at breakpoint" = cl_at_knee, "CL/F at marker 120" = cl_far_above,
      "Expected plateau" = plateau_expected
    ),
  digits = 4,
  caption = "Reverse-hockey-stick structure: the linear arm meets the flat arm continuously at the breakpoint."
)
Reverse-hockey-stick structure: the linear arm meets the flat arm continuously at the breakpoint.
Model Breakpoint Intercept (L/h) Slope CL/F at marker 0 CL/F at breakpoint CL/F at marker 120 Expected plateau
crcl 37.7 3.71 0.0469 3.71 5.4781 5.4781 5.4781
egfr 26.0 3.96 0.0483 3.96 5.2158 5.2158 5.2158

stopifnot(
  # Intercept is recovered exactly at marker = 0.
  all(abs(knee$cl_at_zero - knee$intercept) < 1e-8),
  # The two arms meet continuously: plateau = intercept + slope * breakpoint.
  all(abs(knee$cl_at_knee - knee$plateau_expected) < 1e-8),
  # Flat above the breakpoint.
  all(abs(knee$cl_far_above - knee$cl_at_knee) < 1e-8)
)

# Cross-model consistency the paper itself asserts: the intercept (non-renal
# clearance) is "approximately 70%" of the 5.13 L/h total body clearance, and
# the plateau reproduces that total.
pct_nonrenal <- knee$intercept / 5.13 * 100
plateau_vs_total <- knee$plateau_expected / 5.13 * 100
stopifnot(
  all(pct_nonrenal > 65), all(pct_nonrenal < 82), # paper: "roughly 70%"
  all(abs(plateau_vs_total - 100) < 10) # plateau agrees with Table 3 CL/F
)

The independently fitted group-4 clearance of the categorical model and the non-renal intercept of the continuous model agree to within a tenth of a percent – patients on dialysis have essentially no renal function, so their CL/F should equal the non-renal intercept, and it does:

cross <- tibble(
  quantity = c(
    "Categorical model, group 4 CL/F = 5.13 * 0.724",
    "Continuous CrCl model, non-renal intercept",
    "Continuous eGFR model, non-renal intercept"
  ),
  value_L_per_h = c(5.13 * 0.724, 3.71, 3.96)
)
knitr::kable(cross, digits = 3, caption = "Two independent fits agree on pomalidomide's non-renal clearance.")
Two independent fits agree on pomalidomide’s non-renal clearance.
quantity value_L_per_h
Categorical model, group 4 CL/F = 5.13 * 0.724 3.714
Continuous CrCl model, non-renal intercept 3.710
Continuous eGFR model, non-renal intercept 3.960
stopifnot(abs(5.13 * 0.724 - 3.71) / 3.71 < 0.05)

PKNCA validation

NCA is run over the final steady-state dosing interval, stratified by renal-function group.

sim_nca <- sim |>
  dplyr::filter(!is.na(Cc)) |>
  dplyr::mutate(time = tad) |>
  dplyr::select(id, time, Cc, label)

# Guarantee a time = 0 record per subject so PKNCA can anchor AUC0-tau. For an
# extravascular steady-state interval the trough carried into t = 0 is the
# value already simulated there, so distinct() keeps the simulated row and the
# synthetic Cc = 0 row is only a fallback if the grid ever lacks t = 0.
sim_nca <- bind_rows(
  sim_nca,
  sim_nca |> distinct(id, label) |> mutate(time = 0, Cc = 0)
) |>
  distinct(id, label, time, .keep_all = TRUE) |>
  arrange(id, label, time)

conc_obj <- PKNCA::PKNCAconc(sim_nca, Cc ~ time | label + id)

dose_df <- sim_nca |>
  distinct(id, label) |>
  mutate(time = 0, amt = DOSE_MG)
dose_obj <- PKNCA::PKNCAdose(dose_df, amt ~ time | label + id)

intervals <- data.frame(
  start = 0, end = TAU,
  cmax = TRUE, tmax = TRUE, auclast = TRUE, cmin = TRUE
)

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

nca_summary <- as.data.frame(nca_res) |>
  filter(PPTESTCD %in% c("cmax", "tmax", "auclast", "cmin")) |>
  group_by(label, PPTESTCD) |>
  summarise(median = median(PPORRES), .groups = "drop") |>
  tidyr::pivot_wider(names_from = PPTESTCD, values_from = median)

nca_summary |>
  dplyr::rename(
    "Renal group" = label,
    "AUC0-24 (ng*h/mL)" = auclast,
    "Cmax (ng/mL)" = cmax,
    "Cmin (ng/mL)" = cmin,
    "Tmax (h)" = tmax
  ) |>
  knitr::kable(digits = 1, caption = "Median steady-state NCA by renal-function group (150 virtual subjects per group).")
Median steady-state NCA by renal-function group (150 virtual subjects per group).
Renal group AUC0-24 (ng*h/mL) Cmax (ng/mL) Cmin (ng/mL) Tmax (h)
Moderate 784.7 58.3 11.9 3.2
Normal 777.1 57.2 11.4 3.5
Severe, HD 1047.3 65.2 21.1 3.5
Severe, no HD 823.8 57.7 12.9 3.5

stopifnot(nrow(nca_summary) == 4, !anyNA(nca_summary$auclast))

Comparison against published NCA

Li 2017 Table 4 reports the mean AUC0-24 at steady state from 200 Monte Carlo trials per renal-function group. The comparison below uses typical-value (zeroRe) profiles, which are deterministic and therefore reproducible across machines; the paper’s Monte Carlo means land within ~2% of them.

typ_nca <- sim_typ |>
  filter(!is.na(Cc)) |>
  mutate(time = tad) |>
  select(id, time, Cc, label)
typ_nca <- bind_rows(
  typ_nca,
  typ_nca |> distinct(id, label) |> mutate(time = 0, Cc = 0)
) |>
  distinct(id, label, time, .keep_all = TRUE) |>
  arrange(id, label, time)

typ_conc <- PKNCA::PKNCAconc(typ_nca, Cc ~ time | label + id)
typ_dose <- PKNCA::PKNCAdose(
  typ_nca |> distinct(id, label) |> mutate(time = 0, amt = DOSE_MG),
  amt ~ time | label + id
)
typ_res <- PKNCA::pk.nca(PKNCA::PKNCAdata(
  typ_conc, typ_dose,
  intervals = data.frame(start = 0, end = TAU, auclast = TRUE, cmax = TRUE, tmax = TRUE)
))

published <- tibble::tribble(
  ~label, ~auclast,
  "Normal", 787.8,
  "Moderate", 773.5,
  "Severe, no HD", 789.7,
  "Severe, HD", 1070.0
)

cmp <- nlmixr2lib::ncaComparisonTable(
  simulated = typ_res,
  reference = published,
  by = "label",
  params = "auclast",
  units = c(auclast = "ng*h/mL"),
  tolerance_pct = 20
)
knitr::kable(
  cmp,
  caption = "Simulated typical-value AUC0-24 at steady state vs Li 2017 Table 4. * differs by >20%."
)
Simulated typical-value AUC0-24 at steady state vs Li 2017 Table 4. * differs by >20%.
NCA parameter label Reference Simulated % diff
AUClast (ng*h/mL) Normal 788 780 -1.0%
AUClast (ng*h/mL) Moderate 774 765 -1.2%
AUClast (ng*h/mL) Severe, no HD 790 772 -2.2%
AUClast (ng*h/mL) Severe, HD 1070 1080 +0.7%
sim_auc <- as.data.frame(typ_res) |>
  filter(PPTESTCD == "auclast") |>
  select(label, sim = PPORRES) |>
  left_join(published, by = "label") |>
  mutate(
    pct_diff = (sim - auclast) / auclast * 100,
    sim_norm = sim / sim[label == "Normal"] * 100,
    pub_norm = auclast / auclast[label == "Normal"] * 100
  )

knitr::kable(
  sim_auc |>
    dplyr::rename(
      "Renal group" = label, "Simulated AUC0-24" = sim, "Li 2017 Table 4" = auclast,
      "% difference" = pct_diff, "Simulated, normalized (%)" = sim_norm,
      "Li 2017, normalized (%)" = pub_norm
    ),
  digits = 1,
  caption = "Absolute and normalized steady-state exposure vs Li 2017 Table 4."
)
Absolute and normalized steady-state exposure vs Li 2017 Table 4.
Renal group Simulated AUC0-24 Li 2017 Table 4 % difference Simulated, normalized (%) Li 2017, normalized (%)
Moderate 764.5 773.5 -1.2 98.0 98.2
Normal 779.8 787.8 -1.0 100.0 100.0
Severe, HD 1077.1 1070.0 0.7 138.1 135.8
Severe, no HD 772.1 789.7 -2.2 99.0 100.2

# Deterministic (typical-value) gates. Realised |% difference| was
# 1.0 / 1.2 / 2.2 / 0.7 across the four groups; 6 leaves headroom for solver
# and grid differences while still breaking on a mis-transcribed clearance,
# dose or unit, all of which move exposure by tens of percent.
stopifnot(max(abs(sim_auc$pct_diff)) < 6)

# The normalized exposures are the paper's headline claim: groups 1-3 within a
# few percent of each other, group 4 about 35% higher. Realised spread against
# the published normalized values was <= 2.3 percentage points.
stopifnot(
  max(abs(sim_auc$sim_norm - sim_auc$pub_norm)) < 5,
  # Groups 2 and 3 are indistinguishable from normal (paper: 98.2%, 100.2%).
  all(abs(sim_auc$sim_norm[sim_auc$label %in% c("Moderate", "Severe, no HD")] - 100) < 5),
  # Group 4 is materially higher (paper: 135.8%; abstract: "approximately 35%").
  sim_auc$sim_norm[sim_auc$label == "Severe, HD"] > 125,
  sim_auc$sim_norm[sim_auc$label == "Severe, HD"] < 150
)

# Mass balance: at steady state AUC0-tau * CL/F must return the dose exactly,
# independent of Ka, lag time and volume. Cc is in ng/mL and CL/F in L/h, so
# the product is in ng and 1e6 ng = 1 mg.
cl_by_group <- c("Normal" = 5.13, "Moderate" = 5.13 * 1.02, "Severe, no HD" = 5.13 * 1.01, "Severe, HD" = 5.13 * 0.724)
recovered_mg <- sim_auc$sim * cl_by_group[sim_auc$label] * 1000 / 1e6
stopifnot(all(abs(recovered_mg - DOSE_MG) / DOSE_MG < 0.005))

Hemodialysis (Figures 5 and 6)

Li 2017 measured the dialyzer clearance directly from paired arterial-side and venous-side plasma samples (Equation 6) and found a median CL_D of about 12 L/h in 7 patients – roughly twice pomalidomide’s 5 L/h total body clearance. It then simulated two scenarios:

  • Scenario 1 – hemodialysis begins after the dose. Reported exposure: approximately 50-70% of a non-dialysis day.
  • Scenario 2 – hemodialysis is completed before the dose. Reported exposure: approximately 83-91% of a non-dialysis day.
HD_HOURS <- 4
LAST_DOSE <- (N_DOSES - 1L) * TAU

hd_events <- function(hd_start_rel) {
  # hd_start_rel: hours relative to the last dose at which the session begins.
  # NA = no dialysis. Negative = session ends at/before the dose (scenario 2).
  #
  # The observation grid must SPAN the dialysis window, including the
  # pre-dose part of it. A time-varying covariate only takes a value on rows
  # that exist: with observations starting at the last dose, a session running
  # from -4 h to 0 h would touch no rows at all and the dialysis arm would
  # silently never switch on (exposure would come back as exactly 100% of a
  # non-dialysis day). The grid therefore starts 8 h before the last dose.
  dose <- tibble(
    id = 1L, time = 0, amt = DOSE_MG, evid = 1L, cmt = "depot",
    ii = TAU, addl = N_DOSES - 1L
  )
  obs <- tibble(
    id = 1L,
    time = seq(LAST_DOSE - 8, LAST_DOSE + TAU, by = 0.1),
    amt = NA_real_, evid = 0L, cmt = "central", ii = 0, addl = 0L
  )
  d <- bind_rows(dose, obs) |>
    arrange(id, time, desc(evid)) |>
    mutate(
      RENALIMP_MOD = 0, RENALIMP_SEV = 0, RRT_HEMODIAL_STATUS = 1,
      RRT_HEMODIAL_ACTIVE = if (is.na(hd_start_rel)) {
        0
      } else {
        as.numeric(time >= LAST_DOSE + hd_start_rel &
          time < LAST_DOSE + hd_start_rel + HD_HOURS)
      }
    )
  d
}

hd_auc <- function(hd_start_rel) {
  d <- rxode2::rxSolve(
    rxode2::zeroRe(mods$hemodialysis),
    events = hd_events(hd_start_rel),
    # locf, not the default linear interpolation: RRT_HEMODIAL_ACTIVE is a 0/1
    # gate and linear interpolation would ramp it across each grid step.
    covsInterpolation = "locf",
    returnType = "data.frame"
  )
  d <- d[d$time >= LAST_DOSE & d$time <= LAST_DOSE + TAU, ]
  sum(diff(d$time) * (head(d$Cc, -1) + tail(d$Cc, -1)) / 2)
}

ref_auc <- hd_auc(NA)
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
scen1 <- tibble(start_h = c(0.5, 1, 2, 3, 4, 6, 8)) |>
  mutate(auc = vapply(start_h, hd_auc, numeric(1)), pct = auc / ref_auc * 100)
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
scen2_pct <- hd_auc(-HD_HOURS) / ref_auc * 100
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'

knitr::kable(
  scen1 |>
    dplyr::rename(
      "HD start, h after dose" = start_h,
      "AUC0-24 (ng*h/mL)" = auc,
      "% of non-dialysis day" = pct
    ),
  digits = 1,
  caption = "Scenario 1 (Figure 5): hemodialysis begins after the dose. Li 2017 reports 50-70%."
)
Scenario 1 (Figure 5): hemodialysis begins after the dose. Li 2017 reports 50-70%.
HD start, h after dose AUC0-24 (ng*h/mL) % of non-dialysis day
0.5 633.8 58.8
1.0 621.5 57.7
2.0 624.4 58.0
3.0 646.3 60.0
4.0 676.0 62.8
6.0 740.6 68.8
8.0 801.8 74.4

Scenario 2 (Figure 6), with the 4 h session completed immediately before the dose, gives 87% of a non-dialysis day, against the paper’s reported 83-91%.

# The paper's abstract says dialysis "increased total body pomalidomide
# clearance from 5 L/h to 12 L/h", which reads like a REPLACEMENT rule, while
# Equation 6 defines CL_D as an extraction clearance across an extracorporeal
# circuit operating in PARALLEL with the body -- an ADDITIVE arm. The two
# readings are distinguishable against the paper's own reported ratios.
cl4 <- 5.13 * 0.724
replacement <- rxode2::rxode2({
  ka <- 0.724
  vc <- 58.3
  cl <- (1 - HDACT) * 3.71448 + HDACT * 12
  d / dt(depot) <- -ka * depot
  d / dt(central) <- ka * depot - cl / vc * central
  alag(depot) <- 0.154
  Cc <- 1000 * central / vc
})
rep_auc <- function(hd_start_rel) {
  d <- hd_events(hd_start_rel)
  d$HDACT <- d$RRT_HEMODIAL_ACTIVE
  r <- rxode2::rxSolve(replacement, d, covsInterpolation = "locf", returnType = "data.frame")
  r <- r[r$time >= LAST_DOSE & r$time <= LAST_DOSE + TAU, ]
  sum(diff(r$time) * (head(r$Cc, -1) + tail(r$Cc, -1)) / 2)
}
rep_ref <- rep_auc(NA)
rep_s1 <- vapply(scen1$start_h, function(h) rep_auc(h) / rep_ref * 100, numeric(1))

reading <- tibble(
  Reading = c("Additive (packaged model)", "Replacement"),
  `Scenario 1 range (%)` = c(
    sprintf("%.0f-%.0f", min(scen1$pct), max(scen1$pct)),
    sprintf("%.0f-%.0f", min(rep_s1), max(rep_s1))
  ),
  `Scenario 2 (%)` = c(
    sprintf("%.0f", scen2_pct),
    sprintf("%.0f", rep_auc(-HD_HOURS) / rep_ref * 100)
  ),
  `Li 2017 reports` = c("50-70 / 83-91", "50-70 / 83-91")
)
knitr::kable(reading, caption = "The additive reading of CL_D reproduces the paper's reported exposure ratios; the replacement reading sits too high.")
The additive reading of CL_D reproduces the paper’s reported exposure ratios; the replacement reading sits too high.
Reading Scenario 1 range (%) Scenario 2 (%) Li 2017 reports
Additive (packaged model) 58-74 87 50-70 / 83-91
Replacement 68-80 90 50-70 / 83-91

stopifnot(
  # Deterministic typical-value quantities (zeroRe, no cohort and no RNG), so
  # these are stable across machines and thread counts. Realised 57.7-74.4%
  # for scenario 1 and 86.5% for scenario 2, against the paper's 50-70% and
  # 83-91%. The bounds keep headroom around those while still breaking on a
  # mis-transcribed CL_D, session length or clearance, each of which moves the
  # ratio by tens of percent.
  min(scen1$pct) > 45, min(scen1$pct) < 65,
  max(scen1$pct) < 80,
  scen2_pct > 80, scen2_pct < 95,
  # Dialysis must materially reduce exposure -- guards against a silently
  # inert gate (the cl_total trap), which would give exactly 100%.
  max(scen1$pct) < 90,
  # The additive reading sits lower than the replacement reading throughout,
  # which is what makes the paper's 50-70% band discriminate them.
  all(scen1$pct < rep_s1)
)
# Replicates Figures 5 and 6 of Li 2017.
prof <- function(hd_start_rel, lab) {
  d <- rxode2::rxSolve(
    rxode2::zeroRe(mods$hemodialysis),
    events = hd_events(hd_start_rel), covsInterpolation = "locf",
    returnType = "data.frame"
  )
  d <- d[d$time >= LAST_DOSE & d$time <= LAST_DOSE + TAU, ]
  tibble(tad = d$time - LAST_DOSE, Cc = d$Cc, scenario = lab)
}
bind_rows(
  prof(NA, "No dialysis"),
  prof(1, "Scenario 1: HD starts 1 h after dose"),
  prof(4, "Scenario 1: HD starts 4 h after dose"),
  prof(-HD_HOURS, "Scenario 2: HD completed before dose")
) |>
  ggplot(aes(tad, Cc, colour = scenario)) +
  geom_line(linewidth = 0.8) +
  labs(
    x = "Time after dose (h)", y = "Pomalidomide (ng/mL)", colour = NULL,
    title = "Figures 5 and 6 - effect of hemodialysis timing",
    caption = "Replicates Figures 5 and 6 of Li 2017 (4 h session, group-4 typical patient)."
  ) +
  theme_bw() +
  theme(legend.position = "bottom", legend.direction = "vertical")
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'
#> ℹ omega/sigma items treated as zero: 'etalka', 'etalvc', 'etalcl'

This is the paper’s clinical conclusion: giving pomalidomide after the dialysis session preserves most of the exposure, whereas dosing before a session loses roughly a third to a half of it.

Assumptions and deviations

  • Four model files, one paper. Li 2017 fitted three separate NONMEM models (Table 3 categorical, Table 5 CrCl, Table 5 eGFR) and then simulated a fourth configuration by adding the measured CL_D to the categorical fit. Each is packaged separately so that no file mixes estimated with measured parameters; Li_2017_pomalidomide_renalcat is an exact transcription of Table 3 and Li_2017_pomalidomide_hemodialysis is that model plus the gated dialyzer arm.
  • Renal-group encoding. The paper’s four-level categorical covariate is encoded as three mutually exclusive binary indicators against a normal-renal-function reference. Groups 3 and 4 share the same renal classification (CrCl < 30 mL/min or eGFR < 30 mL/min/1.73 m^2) and differ only in whether the patient requires dialysis, so group 4 is carried by RRT_HEMODIAL_STATUS (a dialysis treatment-status flag) rather than a further RENALIMP_* severity band. The paper’s “moderate” band (30 < eGFR < 45 mL/min/1.73 m^2) is narrower than the usual FDA/EMA 30-59 definition; RENALIMP_MOD carries the paper’s own band.
  • The plateau of Equation 7 is not separately tabulated. Equation 7 states only that CL/F = constant above the breakpoint. No plateau parameter appears in Table 5, so the relationship is implemented as a continuous hinge whose plateau is the value the linear arm reaches at the breakpoint (5.478 L/h for CrCl, 5.216 L/h for eGFR). Both agree with the 5.13 L/h normal-renal-function CL/F of Table 3 to within 7%, which is the arithmetic support for the continuity reading.
  • CL_D is an observed median, not an estimate. The 12 L/h dialyzer clearance comes from Equation 6 applied to 7 patients, with no reported uncertainty or IIV, so it is encoded as fixed() with no eta. It is also mixed with apparent clearances (CL/F) in the paper’s own simulations even though an extracorporeal extraction clearance is not divided by bioavailability; that inconsistency is the paper’s and is reproduced here so the packaged model matches Figures 5 and 6.
  • Residual error is log-normal, not proportional. Equation 2 writes ln(Cij) = ln(Cmij) + eij, i.e. additive on the natural-log scale, which is nlmixr2’s lnorm() and not prop(). expSd is sqrt(delta^2).
  • Bootstrap CI labelling in Table 5. The CrCl column of Table 5 is headed “95% bootstrap CI” while the eGFR column and all of Table 3 are headed “90% bootstrap CI”, and the Methods describe a single 90% CI (5th-95th percentile) bootstrap procedure throughout. The CrCl heading appears to be a typographical slip. No model parameter is affected – only the interval annotations in the source-trace comments.
  • MDRD female factor. Li 2017 Equation 4 prints the female multiplier as 0.724, whereas the published MDRD-175 equation uses 0.742; the printed value looks like a digit transposition. This affects only how a user would derive an eGFR covariate value, never a model parameter, and users supplying their own eGFR column are unaffected. The model file records the published MDRD value in covariateData$CRCL$notes.
  • Sex and race are not reported in Table 2, so the virtual cohorts above carry no sex or race covariates. Neither is needed: the final models retain renal function as their only covariate (“None of the other tested covariates were significant enough to be included in the final model”).
  • Cohort dosing. Simulations use 4 mg once daily, the upper end of the paper’s 2-4 mg range and the dose at which Table 4’s absolute AUC values are reproduced. Because the models are linear, exposures at 2 mg are exactly half.
  • Cc carries no residual error. The percentiles plotted above are individual predictions (IIV only). The expSd residual term applies to simulated observations, not to Cc.