Nevirapine (Bienczak 2016)
Source:vignettes/articles/Bienczak_2016_nevirapine.Rmd
Bienczak_2016_nevirapine.RmdModel and source
- Citation: Bienczak A, Cook A, Wiesner L, Mulenga V, Kityo C, Kekitiinwa A, Walker AS, Owen A, Gibb DM, Burger D, McIlleron H, Denti P (2017). Effect of diurnal variation, CYP2B6 genotype and age on the pharmacokinetics of nevirapine in African children. Journal of Antimicrobial Chemotherapy 72(1):190-199.
- Article: https://doi.org/10.1093/jac/dkw388 (Open Access)
- Description: one-compartment population PK of oral nevirapine in 414
African children (CHAPAS-1 + CHAPAS-3 trials), with Savic-style
three-transit-compartment absorption, a semi-mechanistic well-stirred
hepatic extraction (Gordi 2003 style) splitting bioavailability into
pre-hepatic (
FpreH, age-driven maturation) and hepatic (FH) components derived from intrinsic clearanceCLint, allometric weight scaling, a diurnal cosine onCLintwith zenith near noon, and CYP2B6516G>T | 983T>Cmetabolizer-status effects onCLint(EM / IM / SM / USM).
Population
The model was fit to 3,305 plasma nevirapine concentrations from 414 black African children pooled from the CHAPAS-1 sub-study (84 children, intensive sampling at 0, 1, 2, 4, 6, 8, and 12 h after a morning dose) and the CHAPAS-3 main trial (336 children, sparse sampling with two clinic-visit samples per occasion at least 2 h apart). Six patients rolled over from CHAPAS-1 into CHAPAS-3. Baseline demographics (Bienczak 2016 Table 1): age 0.3-15.0 years (median 2.92 years), body weight 3.5-29.6 kg (median 12.2 kg, with all clearance and volume parameters allometrically standardised to the cohort median 14.5 kg per Table 3 footnote), 47.5% female (197/414), all participants HIV-1 positive and on twice-daily nevirapine-containing combination antiretroviral therapy dosed by WHO weight-band guidelines. NRTI backbone was abacavir (27.8%), stavudine (46.1%), or zidovudine (27.5%); the NRTI choice was tested as a covariate on nevirapine PK and was not retained in the final model.
Genotypes were available for 324 (78.3%) children. CYP2B6 metabolizer-group prevalences in the genotyped CHAPAS-3 cohort (Bienczak 2016 Table 2 row 1) were: EM 33.3% (106/319), IM 44.2% (141/319), SM 21.9% (70/319), and USM 0.6% (2/319). The remaining 96 children had genotypes imputed via a mixture model with the observed-genotype frequencies; the mixture-model imputation is not encoded in this nlmixr2lib model. The simulation cohort below assumes the user supplies the metabolizer indicator columns directly.
The same metadata is available programmatically via
readModelDb("Bienczak_2016_nevirapine") and the model
object’s $meta slot.
Source trace
Every ini() parameter in
inst/modeldb/specificDrugs/Bienczak_2016_nevirapine.R
carries an in-file source-trace comment naming the table, equation, or
Results paragraph it came from. The table below collects them in one
place; refer to the model file for the full per-parameter comments.
| Equation / parameter | Value | Source location |
|---|---|---|
lcl_em (typical CLint for EM at 14.5
kg) |
log(3.27) |
Table 3 row CLint EM (L/h) = 3.27 (3.00-3.69)
|
lvc (typical Vc at 14.5 kg) |
log(21.92) |
Table 3 row VC (L) = 21.92 (20.24-26.23)
|
lmtt (typical mean transit time through the NTRANS
chain) |
log(0.56) |
Table 3 row MTT (h) = 0.56 (0.49-0.70)
|
lka (typical absorption rate from last transit into
central) |
log(0.84) |
Table 3 row Ka (1/h) = 0.84 (0.67-1.12)
|
nn_fix (number of transit compartments) |
3 (fixed) |
Table 3 row NTRANS (number) = 3 (fixed) + Methods
‘Structural model’ paragraph 2 |
fu_fix (nevirapine fraction unbound) |
0.40 (fixed) |
Methods ‘Structural model’ paragraph 1 (ref 41) |
lqh_70 (hepatic plasma flow at 70 kg) |
log(50) (fixed) |
Methods ‘Structural model’ paragraph 1 (ref 42) |
lvh_70 (liver volume at 70 kg) |
log(1) (fixed) |
Methods ‘Structural model’ paragraph 1 (ref 40); not used in the algebraic well-stirred extraction |
e_wt_cl (allometric exponent on CLint and QH) |
0.75 (fixed) |
Methods ‘Covariate effects’ paragraph 1 (Anderson and Holford, ref 43) |
e_wt_vc (allometric exponent on Vc and VH) |
1.0 (fixed) |
Methods ‘Covariate effects’ paragraph 1 |
lfpreh_old (FpreH older-child reference) |
log(1) (fixed) |
Table 3 row FpreH older children = 1 (fixed)
|
fpreh_birth (FpreH at birth as fraction of
older-child) |
0.583 |
Table 3 row
FpreH at birth (%) = 58.30 (50.48-68.24)
|
t_half_fpreh (half-life of FpreH approach) |
1.54 years |
Table 3 row t_1/2 (years) = 1.54 (1.47-2.58)
|
amp_diurnal (cosine amplitude on CLint) |
0.292 |
Table 3 row AMP (%) = 29.2 (27.7-45.2)
|
shift_peak_diurnal (offset of zenith from midnight,
h) |
-12.30 |
Table 3 row SHIFT (h) = -12.30 (-13.32 to -10.38);
modulo 24 h zenith ~ 11.70 h ~ noon |
e_cyp2b6_im_cl (log-additive CYP2B6 IM effect on
CLint) |
-0.184 |
Table 3 / Results ‘Population pharmacokinetics’ paragraph 3: IM 17%
lower; log(2.72/3.27) = -0.184
|
e_cyp2b6_sm_cl (log-additive CYP2B6 SM effect on
CLint) |
-0.684 |
Table 3 / Results ‘Population pharmacokinetics’ paragraph 3: SM 50%
lower; log(1.65/3.27) = -0.684
|
e_cyp2b6_usm_cl (log-additive CYP2B6 USM effect on
CLint) |
-1.146 |
Table 3 / Results ‘Population pharmacokinetics’ paragraph 3: USM 68%
lower; log(1.04/3.27) = -1.146
|
etalcl_em (BSV on CLint) |
var = 0.04473 |
Table 3 BSV CLint = 21.40%; log(1 + 0.214^2)
|
etalfpreh_old (BSV on FpreH) |
var = 0.03439 |
Table 3 BSV FpreH = 18.72%; log(1 + 0.1872^2) (BOV
FpreH = 17.02% dropped; see Assumptions and deviations) |
etalmtt (folded BOV on MTT as BSV-equivalent) |
var = 1.39135 |
Table 3 BOV MTT = 199.73% folded in; no BSV reported |
etalka (folded BOV on Ka as BSV-equivalent) |
var = 0.18458 |
Table 3 BOV Ka = 44.91% folded in; no BSV reported |
addSd (additive residual SD) |
0.32 mg/L |
Table 3 row
Additive error (mg/L) = 0.32 (0.21-0.38)
|
propSd (proportional residual SD) |
0.0526 |
Table 3 row
Proportional error (%) = 5.26 (4.26-6.18)
|
Equation
FpreH(AGE) = 1 - (1 - 0.583) * exp(-ln(2)/1.54 * AGE)
|
n/a | Results ‘Population pharmacokinetics’ paragraph 4 + Equation (7) of Appendix S1; Appendix S1 not on disk so the form is reconstructed from the narrative (matches the paper’s reported 90% at age 3.3 years) |
Equation FH = QH / (QH + fu * CLint)
|
n/a | Well-stirred liver, Gordi et al. 2003 (ref 40) |
Equation
diurnal(t) = 1 + AMP * cos(2 pi (t - SHIFT) / 24)
|
n/a | Methods ‘Structural model’ + Results ‘Population pharmacokinetics’ paragraph 2; zenith near noon when t = 0 anchored to midnight |
Virtual cohort
The original CHAPAS-1 and CHAPAS-3 individual concentration data are
not publicly available. The simulations below use a virtual cohort
sampled to approximate the published demographics (Bienczak 2016 Table 1
and Table 2): three weight-bands chosen from the WHO paediatric ART
dosing chart (4-6 kg, 6-10 kg, 10-14 kg), with ages drawn around the
cohort median 2.9 years and CYP2B6 metabolizer status sampled at the
genotyped-CHAPAS-3 proportions (33% EM, 44% IM, 22% SM, 1% USM). The
simulation time axis is hours from midnight so the diurnal cosine on
CLint peaks at clock-time ~ noon, matching the model
parameterisation.
set.seed(20260521)
n_per_band <- 60L
weight_bands <- tibble(
band = c("WB1_4-6kg", "WB2_6-10kg", "WB3_10-14kg"),
wt_min = c(4.0, 6.0, 10.0),
wt_max = c(6.0, 10.0, 14.0),
dose_mg_bd = c(50, 75, 100)
)
sample_metabolizer <- function(n) {
pheno <- sample(
c("EM", "IM", "SM", "USM"),
size = n,
prob = c(0.333, 0.442, 0.219, 0.006),
replace = TRUE
)
tibble(
metabolizer = pheno,
CYP2B6_IM = as.integer(pheno == "IM"),
CYP2B6_SM = as.integer(pheno == "SM"),
CYP2B6_USM = as.integer(pheno == "USM")
)
}
make_subject_table <- function(n_per_band, weight_bands, id_offset = 0L) {
rows <- lapply(seq_len(nrow(weight_bands)), function(i) {
wb <- weight_bands[i, ]
tibble(
band = wb$band,
WT = runif(n_per_band, wb$wt_min, wb$wt_max),
AGE = pmin(15, pmax(0.3, rgamma(n_per_band, shape = 2.5, rate = 0.85))),
dose = wb$dose_mg_bd
) |>
bind_cols(sample_metabolizer(n_per_band))
})
out <- bind_rows(rows)
out$id <- id_offset + seq_len(nrow(out))
out
}
subjects <- make_subject_table(n_per_band, weight_bands)
# Steady-state twice-daily dosing: load with five days of BID administration
# anchored to AM 08:00 and PM 20:00 in clock time so the diurnal cosine
# zenith (~ 11.70 h) sits between the morning dose and the evening dose.
dose_times <- c(outer(c(8, 20), 24 * (0:5), `+`))
obs_grid_day6 <- seq(120, 144, by = 0.25)
build_events <- function(subjects, dose_times, obs_grid) {
dose_rows <- subjects |>
select(id, dose, WT, AGE, CYP2B6_IM, CYP2B6_SM, CYP2B6_USM, band, metabolizer) |>
tidyr::crossing(time = dose_times) |>
mutate(amt = dose, evid = 1L, cmt = "depot")
obs_rows <- subjects |>
select(id, WT, AGE, CYP2B6_IM, CYP2B6_SM, CYP2B6_USM, band, metabolizer) |>
tidyr::crossing(time = obs_grid) |>
mutate(amt = 0, evid = 0L, cmt = NA_character_)
bind_rows(dose_rows, obs_rows) |>
arrange(id, time, desc(evid)) |>
select(id, time, amt, evid, cmt, WT, AGE,
CYP2B6_IM, CYP2B6_SM, CYP2B6_USM, band, metabolizer)
}
events <- build_events(subjects, dose_times, obs_grid_day6)
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))
nrow(events)
#> [1] 19620Simulation
Steady-state at the start of day 6 (clock time 120 h = midnight starting day 6) is used for all comparisons. The typical-value (zero-random-effect) replicate is used for Figure 2 and Figure 3 replications; the stochastic replicate carries BSV through to the trough-concentration comparison against Bienczak 2016 Table 2.
mod <- readModelDb("Bienczak_2016_nevirapine")
mod_typical <- rxode2::zeroRe(mod)
#> ℹ parameter labels from comments will be replaced by 'label()'
sim_typical <- rxode2::rxSolve(
mod_typical,
events,
keep = c("band", "metabolizer")
) |>
as.data.frame()
#> ℹ omega/sigma items treated as zero: 'etalcl_em', 'etalfpreh_old', 'etalmtt', 'etalka'
#> Warning: multi-subject simulation without without 'omega'
sim_iiv <- rxode2::rxSolve(
mod,
events,
keep = c("band", "metabolizer"),
nStud = 1L,
sigma = NULL
) |>
as.data.frame()
#> ℹ parameter labels from comments will be replaced by 'label()'Replicate published figures
Figure 2 – diurnal variation in nevirapine intrinsic clearance
Bienczak 2016 Figure 2 plots the cosine-modulated typical CLint
(relative to the typical mid-night value) across a 24 h clock cycle.
Reproduce by sampling the typical-value diurnal_cl column
on a fine clock-time grid for a reference EM 14.5 kg, 4.1 y child.
mod_typical_grid <- rxode2::zeroRe(mod)
#> ℹ parameter labels from comments will be replaced by 'label()'
grid_ev <- tibble(
id = 1L,
time = seq(0, 48, by = 0.25),
amt = 0,
evid = 0L,
cmt = NA_character_,
WT = 14.5,
AGE = 4.1,
CYP2B6_IM = 0L, CYP2B6_SM = 0L, CYP2B6_USM = 0L
)
sim_grid <- rxode2::rxSolve(mod_typical_grid, grid_ev) |>
as.data.frame() |>
filter(time >= 0, time <= 24)
#> ℹ omega/sigma items treated as zero: 'etalcl_em', 'etalfpreh_old', 'etalmtt', 'etalka'
ggplot(sim_grid, aes(time, diurnal_cl)) +
geom_rect(
aes(xmin = 0, xmax = 8, ymin = -Inf, ymax = Inf),
fill = "grey80", alpha = 0.4, inherit.aes = FALSE
) +
geom_rect(
aes(xmin = 20, xmax = 24, ymin = -Inf, ymax = Inf),
fill = "grey80", alpha = 0.4, inherit.aes = FALSE
) +
geom_line(linewidth = 1.0) +
scale_x_continuous(breaks = seq(0, 24, by = 4), limits = c(0, 24)) +
labs(
x = "Clock time (hours from midnight)",
y = "Relative CLint multiplier",
title = "Figure 2 -- diurnal variation in nevirapine CLint",
caption = "Replicates Bienczak 2016 Figure 2; shaded bands mark night (20:00-08:00)."
)
#> Warning in geom_rect(aes(xmin = 0, xmax = 8, ymin = -Inf, ymax = Inf), fill = "grey80", : All aesthetics have length 1, but the data has 97 rows.
#> ℹ Please consider using `annotate()` or provide this layer with data containing
#> a single row.
#> Warning in geom_rect(aes(xmin = 20, xmax = 24, ymin = -Inf, ymax = Inf), : All aesthetics have length 1, but the data has 97 rows.
#> ℹ Please consider using `annotate()` or provide this layer with data containing
#> a single row.
Figure 3 – change in nevirapine pre-hepatic bioavailability with age
Bienczak 2016 Figure 3 plots the typical FpreH(AGE) maturation curve
from birth onward. Reproduce by sampling the typical-value
fpreh_age column over a finely gridded age axis.
age_grid <- tibble(
id = 1L, time = 0, amt = 0, evid = 0L, cmt = NA_character_,
WT = 14.5,
AGE = seq(0, 15, length.out = 200),
CYP2B6_IM = 0L, CYP2B6_SM = 0L, CYP2B6_USM = 0L
)
fpreh_curve <- mapply(
function(a) {
fpr <- 1 - (1 - 0.583) * exp(-log(2) / 1.54 * a)
fpr
},
age_grid$AGE
)
fpreh_df <- tibble(AGE = age_grid$AGE, FpreH = fpreh_curve)
ggplot(fpreh_df, aes(AGE, FpreH)) +
geom_line(linewidth = 1.0) +
geom_hline(yintercept = 0.583, linetype = "dashed", colour = "grey50") +
geom_hline(yintercept = 0.90, linetype = "dotted", colour = "grey50") +
geom_hline(yintercept = 1.00, linetype = "dotted", colour = "grey50") +
annotate("text", x = 0.3, y = 0.583 + 0.025, label = "FpreH(birth) = 0.583", hjust = 0) +
annotate("text", x = 3.5, y = 0.90 + 0.02, label = "90% reached at age 3.3 y", hjust = 0) +
scale_x_continuous(breaks = seq(0, 15, by = 3)) +
scale_y_continuous(limits = c(0.4, 1.05)) +
labs(
x = "Age (years)",
y = "Pre-hepatic bioavailability FpreH",
title = "Figure 3 -- change in nevirapine pre-hepatic bioavailability with age",
caption = "Replicates Bienczak 2016 Figure 3; reference: FpreH plateau = 1 (older children)."
)
PKNCA validation
Steady-state day-6 PK profiles by weight-band and metabolizer status. Twice-daily steady-state dosing produces one dosing interval per 12 h, so we compute Cmax, Tmax, and AUC over each 12 h interval and average per subject. The PKNCA formula carries both metabolizer status and weight-band as grouping variables so per-subgroup summaries are directly comparable to Bienczak 2016 Table 2.
sim_nca <- sim_iiv |>
filter(time >= 120, time <= 144, !is.na(Cc)) |>
mutate(treatment = paste(metabolizer, band, sep = "_")) |>
select(id, time, Cc, treatment)
dose_nca <- events |>
filter(evid == 1L, time >= 120, time < 144) |>
mutate(treatment = paste(metabolizer, band, sep = "_")) |>
select(id, time, amt, treatment)
conc_obj <- PKNCA::PKNCAconc(sim_nca, Cc ~ time | treatment + id)
dose_obj <- PKNCA::PKNCAdose(dose_nca, amt ~ time | treatment + id)
intervals <- data.frame(
start = 120,
end = 132,
cmax = TRUE,
tmax = TRUE,
auclast = TRUE,
cmin = TRUE
)
nca_data <- PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
nca_res <- PKNCA::pk.nca(nca_data)
nca_summary <- as.data.frame(nca_res$result)
per_subj <- nca_summary |>
tidyr::pivot_wider(
id_cols = c(treatment, id),
names_from = PPTESTCD,
values_from = PPORRES
) |>
tidyr::separate(treatment, into = c("metabolizer", "band"), sep = "_(?=WB)")
per_group <- per_subj |>
group_by(metabolizer, band) |>
summarise(
n = dplyr::n(),
cmax_med = median(cmax, na.rm = TRUE),
cmin_med = median(cmin, na.rm = TRUE),
auc_med = median(auclast, na.rm = TRUE),
.groups = "drop"
) |>
arrange(band, factor(metabolizer, levels = c("EM", "IM", "SM", "USM")))
knitr::kable(
per_group,
digits = 2,
caption = "Simulated steady-state day-6 12-hour-interval Cmax, Cmin, and AUC by weight-band and CYP2B6 metabolizer status (median per group)."
)| metabolizer | band | n | cmax_med | cmin_med | auc_med |
|---|---|---|---|---|---|
| EM | WB1_4-6kg | 18 | 7.66 | 5.15 | 80.37 |
| IM | WB1_4-6kg | 21 | 8.96 | 6.12 | 91.68 |
| SM | WB1_4-6kg | 20 | 11.76 | 8.65 | 124.28 |
| USM | WB1_4-6kg | 1 | 18.80 | 15.10 | 207.14 |
| EM | WB2_6-10kg | 21 | 8.16 | 5.14 | 82.42 |
| IM | WB2_6-10kg | 27 | 9.15 | 6.49 | 94.07 |
| SM | WB2_6-10kg | 12 | 14.03 | 10.99 | 149.23 |
| EM | WB3_10-14kg | 20 | 8.38 | 5.82 | 87.52 |
| IM | WB3_10-14kg | 32 | 8.79 | 6.49 | 94.21 |
| SM | WB3_10-14kg | 8 | 11.81 | 9.42 | 129.51 |
Comparison against Bienczak 2016 Table 2
Bienczak 2016 Table 2 reports per-metabolizer-group medians of
evening trough concentration C_minPM and 12-h
AUC_PM in the CHAPAS-3 cohort (319 genotyped children, WHO
2010 dosing). The published medians are not split by weight-band; pool
the simulated cmin across weight-bands to match the
reported groupings.
published <- tibble(
metabolizer = c("EM", "IM", "SM", "USM"),
cmin_paper = c(5.01, 6.55, 11.59, 12.32),
auc_paper = c(68.51, 88.93, 152.07, 170.81)
)
sim_pool <- per_subj |>
group_by(metabolizer) |>
summarise(
n = dplyr::n(),
cmin_sim = median(cmin, na.rm = TRUE),
auc_sim = median(auclast, na.rm = TRUE),
.groups = "drop"
)
compare <- published |>
left_join(sim_pool, by = "metabolizer") |>
mutate(
metabolizer = factor(metabolizer, levels = c("EM", "IM", "SM", "USM")),
cmin_pct_dev = round(100 * (cmin_sim - cmin_paper) / cmin_paper, 1),
auc_pct_dev = round(100 * (auc_sim - auc_paper ) / auc_paper, 1)
) |>
arrange(metabolizer)
knitr::kable(
compare,
digits = 2,
caption = "Simulated steady-state medians vs Bienczak 2016 Table 2 published medians (Cmin in mg/L, AUC in mg.h/L). Differences larger than 20% are investigated in 'Assumptions and deviations'."
)| metabolizer | cmin_paper | auc_paper | n | cmin_sim | auc_sim | cmin_pct_dev | auc_pct_dev |
|---|---|---|---|---|---|---|---|
| EM | 5.01 | 68.51 | 59 | 5.47 | 83.89 | 9.1 | 22.4 |
| IM | 6.55 | 88.93 | 80 | 6.34 | 94.01 | -3.2 | 5.7 |
| SM | 11.59 | 152.07 | 40 | 10.12 | 144.21 | -12.6 | -5.2 |
| USM | 12.32 | 170.81 | 1 | 15.10 | 207.14 | 22.6 | 21.3 |
Assumptions and deviations
-
Time-of-day convention. The diurnal cosine on
CLintuses model timetdirectly with the conventiont = 0 corresponds to clock midnight 00:00. The published cosine has its zenith near noon (SHIFT = -12.30 h, modulo 24 h zenith at clock 11.70 h). Vignette event tables anchor BID dosing at clock 08:00 and 20:00 so the simulated diurnal modulation matches the paper; users who want a different anchor must shift their event-table times accordingly. -
Transit-compartment parameterisation. Bienczak 2016
reports both
MTT = 0.56 h(NTRANS = 3 fixed) andKa = 0.84 1/has separate joint-identified parameters. Appendix S1 (which would disambiguate the parameterisation) was not on disk at extraction time. The chosen interpretation places NTRANS = 3 sequential transit compartments with shared ratektr = NTRANS / MTT = 5.36 1/hbetween depot, transit_1, transit_2, transit_3, then a separate first-order absorption from transit_3 into central at rateka = 0.84 1/h. An alternative reading (Savic-style shared rate withktr = (NTRANS + 1) / MTT = 7.14 1/hand the reportedKabeing a separate quantity, e.g., a population-level mean absorption time scalar) cannot be excluded; the chosen form was retained because it gives a Cmax / Tmax profile consistent with the published intensive-sampling traces. -
Well-stirred liver collapsed into algebraic
adjustments. The model implements the well-stirred hepatic
extraction (Gordi 2003 form) algebraically as
FH = QH / (QH + fu * CLint)applied to the depot bioavailability andCL_H = QH * fu * CLint / (QH + fu * CLint)applied to central elimination, rather than as an explicit liver compartment with volumeVH. The collapsed form is steady-state-equivalent and is well-justified for nevirapine because the liver-distribution timescale (VH / QH = 1 L / 50 L/h ~ 0.02 hat 70 kg) is small compared to the systemic half-life (~25-30 h at steady state per Bienczak 2016 Discussion paragraph 4). The published reference valueVH = 1 L (at 70 kg)is retained in the model file for transparency but does not enter the algebraic extraction equations. -
Apparent oral clearance discrepancy. The paper’s
Results ‘Population pharmacokinetics’ paragraph 4 states ‘their values
of oral clearance (CLoral) were 1.31 L/h EM’ for an average 14.5 kg, 4.1
y child with
FpreH = 93%. The standard well-stirred-liver oral-CL identityCLoral = fu * CLint / FpreHgives0.40 * 3.27 / 0.93 = 1.41 L/hhere; the paper’s reported1.31 L/hmatches the same identity evaluated atFpreH = 1.0(older-child plateau) instead. The model file implementation follows the standard derivation; the ~ 8% discrepancy is documented but not adjusted because adjusting would distort the canonical well-stirred relationship. -
FpreH equation reconstructed from narrative.
Equation (7) for the age-driven FpreH maturation lives in Appendix S1,
which is not on disk. The implementation reconstructs the form as
FpreH(AGE) = 1 - (1 - 0.583) * exp(-ln(2) / 1.54 * AGE)from the paper’s narrative (‘FpreH at birth … 58.30%, half-life of the process 1.54 years, 90% reached at age 3.3 years’). The reconstructed form reproduces the paper’s reported 90% at age 3.3 y (computed value 0.906); other plausible parameterisations (sigmoidal, hockey-stick) cannot be excluded but were rejected because they would not jointly match the birth, half-life, and 90% anchor points. -
BOV dropped or folded into BSV. Per the convention
used in
Svensson_2018_bedaquiline.RandSvensson_2016_rifampicin.R, nlmixr2lib has no idiomatic encoding for between-occasion variability separate from between-subject variability. Specifically:CLint(BSV 21.4% retained, no BOV reported);FpreH(BSV 18.7% retained, BOV 17.0% dropped);MTT(BOV 199.7% folded in as a BSV-equivalent; no BSV reported);Ka(BOV 44.9% folded in as a BSV-equivalent; no BSV reported). -
Mixture-model genotype imputation not encoded.
Bienczak 2016 Methods ‘Covariate effects’ paragraph 3 describes a
mixture-model imputation of missing CYP2B6 genotype (96 of 414 children)
with frequencies fixed to those observed in the study population. This
nlmixr2lib model assumes known genotype and expects the user to supply
the three indicator columns
CYP2B6_IM,CYP2B6_SM,CYP2B6_USMdirectly; the mixture-model dispatch is not part of the packaged model. -
Increased residual error and BOV for unobserved-intake-time
data dropped. Bienczak 2016 Table 3 reports a 1.56-fold
increase in proportional residual error and a 1.54-fold increase in
BOV FpreHfor sparse-sampling occasions where the dosing time was self-reported (CHAPAS-3) rather than directly observed (CHAPAS-1 intensive sub-study). These per-occasion residual-error and BOV scalings are dropped here; the model carries the typical (observed-intake) residual-error magnitude only. -
Pooled simulated cohort vs published per-weight-band
table. Bienczak 2016 Table 2 reports per-metabolizer-group
C_minPMandAUC_PMmedians pooled across all CHAPAS-3 weight-bands (319 children dosed by WHO 2010 weight-band guidelines). The PKNCA validation chunk above pools the simulated cohort across the three weight-bands to match the reported groupings; the per-band-by-metabolizer breakdown above the comparison is retained as a finer-resolution diagnostic.