Model and source
- Citation: Lv D, Li S, Li Y, Lin M, Zhai Y, Wu M, Qiu Y, Zhao Q, Liu J. Population Pharmacokinetic Modeling Analysis of ASC10, a Novel Antiviral Agent Targeted COVID-19, in Chinese Healthy Subjects. Drug Des Devel Ther. 2025;19:7391-7402. doi:10.2147/DDDT.S517282.
- Description: Population PK model of ASC10-A (also called NHC, beta-D-N4-hydroxycytidine), the active nucleoside metabolite of the oral double prodrug ASC10, in Chinese healthy adult volunteers (Lv 2025). ASC10 is under clinical development for COVID-19 and shares an active moiety with molnupiravir. Data pooled 57 subjects with 1,634 ASC10-A plasma concentrations from a Phase I trial (NCT05523141) with a multiple-ascending-dose part (50-800 mg BID x 5 days + one AM dose on day 6) and a fasted/fed food-effect part. The final model is a two-compartment disposition with first-order elimination and a two-transit-compartment absorption chain (rate constant KTR). Body weight enters as an estimated power on CL/F (exponent 0.903) and a fixed power on Vc/F (exponent 1.0), normalised to the median 61.4 kg. Food status enters KTR only: fed KTR is scaled by theta_KTR-food = 0.474, i.e., ~52.6% reduction relative to fasted, with no effect on relative bioavailability (F is fixed at 1). Residual error is combined additive (2.3 ng/mL, fixed) + proportional (SD = 0.41).
- Article: https://doi.org/10.2147/DDDT.S517282
Population
The model was fit to plasma concentrations of the active nucleoside metabolite ASC10-A (equivalent to NHC, beta-D-N4-hydroxycytidine) from a Phase I trial in Chinese healthy adult volunteers (ClinicalTrials.gov NCT05523141). Fifty-seven subjects contributed 1,634 observations across a multiple-ascending-dose (MAD) part (n = 45; 50-800 mg twice daily for 5 days plus a single morning dose on day 6) and an open-label crossover food-effect (FE) part (n = 12; single 800 mg dose fasted and fed, with >= 7 day washout). Median age was 31 years (range 18-44), median body weight 61.4 kg (range 47.1-77.9), and 42.1% of subjects were female; 55/57 (96.5%) were of Han ethnicity (Lv 2025 Table 1). LLOQ for ASC10-A by UPLC-MS/MS was 10.0 ng/mL; 22.6% of observations were BQL and were handled with the M3 likelihood-based method in NONMEM 7.4.
The same information is available programmatically via
readModelDb("Lv_2025_asc10a")()$population.
Source trace
The per-parameter origin is recorded as an in-file comment next to
each ini() entry in
inst/modeldb/specificDrugs/Lv_2025_asc10a.R. The table
below collects them in one place.
| Equation / parameter | Value | Source location |
|---|---|---|
| CL/F | 79.7 L/h | Lv 2025 Table 2 (Final Model Estimate) |
| Vc/F | 139 L | Lv 2025 Table 2 |
| Q/F | 1.24 L/h | Lv 2025 Table 2 |
| Vp/F | 31.6 L | Lv 2025 Table 2 |
| KTR (fasted) | 7.02 1/h | Lv 2025 Table 2 |
| F | 1 (fixed) | Lv 2025 Table 2 |
| theta_CL-WT (allometric) | 0.903 | Lv 2025 Table 2 |
| theta_Vc-WT (allometric, fixed) | 1 | Lv 2025 Table 2 |
| theta_KTR-food (fed multiplier on KTR) | 0.474 | Lv 2025 Table 2 |
| IIV CL (%CV) | 17.1 | Lv 2025 Table 2 |
| IIV Vc (%CV) | 10.3 | Lv 2025 Table 2 |
| IIV KTR (%CV) | 31.9 | Lv 2025 Table 2 |
| Proportional residual SD | 0.41 | Lv 2025 Table 2 |
| Additive residual SD | 2.3 ng/mL (fixed) | Lv 2025 Table 2 |
| Continuous covariate form | P = th * (cov/med)^theta | Lv 2025 Equation 1 |
| Categorical covariate form | P = th * theta^cov | Lv 2025 Equation 2 |
| Two-compartment disposition + 2 transits + first-order elimination | n/a | Lv 2025 Results ‘PopPK Model Development’ and Figure 1 |
Virtual cohort
Original observed data are not publicly available; the figures below use virtual populations whose covariate distributions approximate the published trial demographics. Cohort sizes are kept small to bound render time while still supporting quantile summaries.
set.seed(20260725)
tau <- 12 # dosing interval (h)
tlast <- 120 # time of the final (day-6 morning) dose in the MAD schedule
dose_times <- c(seq(0, 108, by = tau), tlast) # 10 BID doses + 1 morning dose on day 6
sample_wt <- function(n) {
wt <- rnorm(n, mean = 61.4, sd = 7.2)
pmin(pmax(wt, 47.1), 77.9)
}
make_cohort <- function(n, wt, fed, cohort_label, doses = dose_times,
obs_grid = seq(0, 12, by = 0.5),
id_offset = 0L) {
subj <- tibble(
id = id_offset + seq_len(n),
WT = wt,
FED = fed,
cohort = cohort_label
)
dose <- subj |>
tidyr::crossing(time = doses) |>
mutate(evid = 1L, amt = 800, cmt = "depot")
obs <- subj |>
tidyr::crossing(time = unique(obs_grid)) |>
mutate(evid = 0L, amt = NA_real_, cmt = "central")
dplyr::bind_rows(dose, obs) |>
dplyr::arrange(id, time, dplyr::desc(evid))
}
# MAD reference cohort: 100 subjects, fasted, 61.4 kg range. Observation
# grid is sparse over the ramp-up (every 6 h) and dense over the final
# dosing interval where the paper's AUCss / Cmax are measured.
cohort_ref <- make_cohort(
n = 100L, wt = sample_wt(100L), fed = 0L,
cohort_label = "800 mg BID x5d + AM day6 (fasted)",
obs_grid = c(seq(0, tlast, by = 6),
seq(tlast, tlast + 12, by = 0.5),
tlast + 24, tlast + 48)
)
# Single-dose food-effect cohorts (typical value only via zeroRe below).
cohort_fasted_sd <- make_cohort(
n = 1L, wt = 61.4, fed = 0L,
cohort_label = "800 mg single dose (fasted)",
doses = 0, id_offset = 1000L
)
cohort_fed_sd <- make_cohort(
n = 1L, wt = 61.4, fed = 1L,
cohort_label = "800 mg single dose (fed)",
doses = 0, id_offset = 2000L
)
# Body-weight quartile cohorts (typical value, fasted, single 800 mg dose)
# for the Figure 5-like exposure-vs-weight comparison. Values are the
# midpoints of the paper-reported range 47.1-77.9 kg (Lv 2025 Table 1).
wt_quartiles <- c("Min-Q1" = 51.0, "Q1-Median" = 58.0,
"Median-Q3" = 65.0, "Q3-Max" = 72.5)
cohorts_wt <- purrr::imap(wt_quartiles, function(wt_val, lbl) {
make_cohort(
n = 1L, wt = wt_val, fed = 0L,
cohort_label = paste0("WT: ", lbl,
" (", format(wt_val, nsmall = 1), " kg)"),
doses = 0,
id_offset = 3000L + 1000L * match(lbl, names(wt_quartiles))
)
}) |> dplyr::bind_rows()
events_typ <- dplyr::bind_rows(cohort_fasted_sd, cohort_fed_sd, cohorts_wt)
stopifnot(!anyDuplicated(unique(events_typ[, c("id", "time", "evid")])))
stopifnot(!anyDuplicated(unique(cohort_ref[, c("id", "time", "evid")])))Simulation
mod <- readModelDb("Lv_2025_asc10a")
sim_ref_iiv <- rxode2::rxSolve(
mod, events = cohort_ref,
keep = c("WT", "FED", "cohort")
) |> as.data.frame()
sim_typ <- rxode2::rxSolve(
rxode2::zeroRe(mod), events = events_typ,
keep = c("WT", "FED", "cohort")
) |> as.data.frame()
#> ℹ omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalktr'
#> Warning: multi-subject simulation without without 'omega'Replicate published figures
Figure 4 - steady-state concentration-time profile
Reproduces the ASC10-A steady-state concentration-time curve in Lv 2025 Figure 4 (right after the day-6 morning dose). The paper’s simulated geometric-mean Tmax after the final dose was 1.35 h.
sim_ss <- sim_ref_iiv |>
dplyr::filter(time >= tlast, time <= tlast + 12) |>
dplyr::mutate(t_since_last_dose = time - tlast) |>
dplyr::group_by(t_since_last_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(sim_ss, aes(t_since_last_dose, Q50)) +
geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25) +
geom_line(colour = "red") +
labs(x = "Time after final dose (h)", y = "ASC10-A concentration (ng/mL)",
title = "Figure 4 (ASC10-A) - steady-state concentration-time",
caption = "Replicates the ASC10-A curve in Lv 2025 Figure 4 (day-6 dosing interval).")
Figure 5 - covariate effects on typical exposure
Reproduces Figure 5: fed vs fasted absorption profiles and typical concentration-time curves across body-weight quartiles. Panels use typical-value (population-mean) profiles from a single 800 mg dose.
sim_typ |>
dplyr::filter(cohort %in% c("800 mg single dose (fasted)",
"800 mg single dose (fed)")) |>
ggplot(aes(time, Cc, colour = factor(FED, levels = c(0, 1),
labels = c("Fasted", "Fed")))) +
geom_line(linewidth = 0.9) +
labs(x = "Time after single 800 mg dose (h)",
y = "ASC10-A concentration (ng/mL)",
colour = "Food status",
title = "Figure 5 (food effect) - single-dose typical profile",
caption = paste(
"Fed KTR is scaled by theta_KTR-food = 0.474 relative to fasted",
"(Lv 2025 Table 2)."))
sim_typ |>
dplyr::filter(startsWith(cohort, "WT: ")) |>
ggplot(aes(time, Cc, colour = cohort)) +
geom_line(linewidth = 0.9) +
labs(x = "Time after single 800 mg dose (h)",
y = "ASC10-A concentration (ng/mL)",
colour = "WT stratum",
title = "Figure 5 (body-weight effect) - single-dose typical profile",
caption = paste(
"Body weight scales CL/F with exponent 0.903 and Vc/F with",
"exponent 1 (fixed), each normalised to 61.4 kg."))
PKNCA validation
Steady-state NCA (dosing interval 120-132 h)
Matches the paper’s simulation window: the AUCss quantity in Lv 2025 is AUC over 120-132 hours (the interval right after the final day-6 morning dose), and Cmax within that window.
sim_ss_nca <- sim_ref_iiv |>
dplyr::filter(!is.na(Cc)) |>
dplyr::select(id, time, Cc, cohort)
# Guarantee a time-zero row per (id, cohort) so PKNCA can anchor AUC0-*
# (extravascular; pre-dose Cc = 0).
sim_ss_nca <- dplyr::bind_rows(
sim_ss_nca,
sim_ss_nca |> dplyr::distinct(id, cohort) |>
dplyr::mutate(time = 0, Cc = 0)
) |>
dplyr::distinct(id, cohort, time, .keep_all = TRUE) |>
dplyr::arrange(id, cohort, time)
dose_df_ss <- cohort_ref |>
dplyr::filter(evid == 1L) |>
dplyr::select(id, time, amt, cohort)
conc_obj_ss <- PKNCA::PKNCAconc(sim_ss_nca, Cc ~ time | cohort + id,
concu = "ng/mL", timeu = "h")
dose_obj_ss <- PKNCA::PKNCAdose(dose_df_ss, amt ~ time | cohort + id,
doseu = "mg")
intervals_ss <- data.frame(
start = tlast,
end = tlast + tau,
cmax = TRUE,
tmax = TRUE,
cmin = TRUE,
auclast = TRUE
)
nca_ss <- PKNCA::pk.nca(
PKNCA::PKNCAdata(conc_obj_ss, dose_obj_ss, intervals = intervals_ss)
)Comparison against paper’s simulated values
Lv 2025 reports (for virtual patients weighing 61.4 kg, fasted, 800 mg q12h x 5 days) geometric-mean Cmax = 3374.13 ng/mL and AUC over 120-132 h (AUCss) = 10139.12 h*ng/mL; typical Tmax after the final dose was 1.35 h (Discussion; Figure 4 caption uses AUCss as AUC 120-132 h).
published <- tibble::tibble(
cohort = "800 mg BID x5d + AM day6 (fasted)",
cmax = 3374.13,
auclast = 10139.12,
tmax = tlast + 1.35
)
cmp <- nlmixr2lib::ncaComparisonTable(
simulated = nca_ss,
reference = published,
by = "cohort",
units = c(cmax = "ng/mL", auclast = "h*ng/mL", tmax = "h",
cmin = "ng/mL"),
tolerance_pct = 20
)
knitr::kable(
cmp,
caption = paste(
"Simulated (this vignette) vs. Lv 2025 simulated values at steady",
"state (120-132 h window). * differs from reference by >20%."),
align = c("l", "l", "l", "r", "r", "r")
)| NCA parameter | cohort | Reference | Simulated | % diff |
|---|---|---|---|---|
| Cmax (ng/mL) | 800 mg BID x5d + AM day6 (fasted) | 3370 | 4150 | +23.1%* |
| Tmax (h) | 800 mg BID x5d + AM day6 (fasted) | 121 | 1 | -99.2%* |
| AUClast (h*ng/mL) | 800 mg BID x5d + AM day6 (fasted) | 10100 | 10400 | +3.0% |
Flag any starred rows in the narrative and investigate the source - do not tune parameters to match.
Assumptions and deviations
- Cohort sizes are kept small (100 subjects for the MAD reference; 1 subject per typical-value profile for the covariate-effect figures) to bound render time. This is illustrative validation, not a production VPC; the model’s IIV / residual-error terms are the same regardless.
- Body weight in the MAD reference cohort is drawn from a truncated normal centred at 61.4 kg with SD 7.2 kg and clipped to the paper’s observed range 47.1-77.9 kg (Lv 2025 Table 1 reports median 61.4 and mean+/-SD 61.5+/-7.2 kg but does not publish the full distribution).
- Age, sex, BMI, and Han ethnicity were screened by the authors and
not retained in the final model. They are declared in
covariatesDataExcludedfor provenance but do not entermodel(). - Food status is modelled as a per-subject binary FED indicator (0 = fasted, 1 = fed). The paper’s FE part was a within-subject crossover, but the model treats food status as a fixed covariate on KTR only (Lv 2025 Table 2). The vignette therefore simulates fasted and fed as two disjoint typical-value profiles rather than a crossover.
- The paper reports IIV as omega with the caption “square root of
interindividual variance for parameters”. Values (17.1, 10.3, 31.9) are
interpreted as percent CV per the exponential-IIV convention described
in Methods and converted to log-normal
omega^2 = log(1 + CV^2). - BQL data (22.6% of observations) were handled with the M3 likelihood-based method in NONMEM during estimation; the packaged model has no explicit BQL treatment - downstream simulations always emit a continuous concentration.
- No observed-data VPC is possible because the source data are not public; the ribbon in the Figure 4 replication is a purely simulated envelope for illustration.