Skip to contents

Model and source

  • Citation: Ji XW, Ji SM, He XR, Zhu X, Chen R, Lu W. Influences of renal function descriptors on population pharmacokinetic modeling of vancomycin in Chinese adult patients. Acta Pharmacol Sin. 2018;39(2):286-293. doi:10.1038/aps.2017.57 (published online 24 Aug 2017)
  • Description: One-compartment IV (intermittent-infusion) population PK model for vancomycin in Chinese adult patients (Ji 2017). Clearance is scaled by raw Cockcroft-Gault creatinine clearance (centered linear term, reference 80 mL/min) and by age (power of (75/age), reference 75 years); the volume of distribution is a single typical value. Developed from steady-state trough therapeutic-drug-monitoring data.
  • Article: Acta Pharmacol Sin 2018;39(2):286-293

The article was published online on 24 Aug 2017 (DOI aps.2017.57) and appeared in the 2018 print volume; the model file uses the online/DOI year (2017) in its name while the reference field carries the full 2018 print citation.

Population

The model was developed from routine therapeutic-drug-monitoring data on 160 hospitalized Chinese adults treated with intravenous vancomycin (1000 mg every 12 h) at Beijing Hospital, Beijing, China (Ji 2017 Table 1); a further 58 patients were held out for external validation (218 patients in total). None were on renal replacement therapy. Median age was 78 years (range 42-95), median body weight 65 kg (range 38-90), and median Cockcroft-Gault creatinine clearance 58.02 mL/min (range 5.45-224.0). 54 of 160 model-building subjects (33.75%) were female. The dataset contained 251 trough (Cmin) serum vancomycin concentrations sampled before the next dose; each patient contributed at least one sample (median 2, range 1-17). Concentrations were measured by TDx-FLx fluorescence polarization immunoassay (LOQ 2.0 mg/L) and parameters estimated in NONMEM 7 with FOCEI. The same information is available programmatically via readModelDb("Ji_2017_vancomycin")$population.

Source trace

Every numeric value in ini() carries an in-file comment pointing to the Ji 2017 source location. The table below collects them in one place for review.

Equation / parameter Value Source location
lcl (CL) 2.829 L/h Eq 16 / Table 3, row “CL (L/h)” (final model)
lvc (V) 52.14 L Eq 17 / Table 3, row “V (L)” (final model)
e_crcl_cl (theta_CLcr) 0.00842 Eq 16 / Table 3, row “theta Clcr_CL”
e_age_cl (theta_Age) 0.08143 Eq 16 + Abstract + Results text
etalcl (var 0.1051) 0.1051 Results text (“variances of 0.1051 and 0.083”)
etalvc (var 0.083) 0.083 Results text (“variances of 0.1051 and 0.083”)
propSd (26.79% CV) 0.2679 Table 3, row “CV (%)” (final model)
addSd 2.647 mg/L Table 3, row “Residual variability SD” (final)
CL covariate equation n/a Eq 16
Combined residual model n/a Eq 2
Exponential IIV model n/a Eq 1
CRCL reference (80) 80 mL/min Eq 16 / Results text
AGE reference (75) 75 years Eq 16 / Results text
1-cmt IV structural n/a Results para 1; Table 3 (only CL, V estimated)

The full clearance covariate model (Ji 2017 Eq 16) is

CL = 2.829 * (1 + 0.00842 * (CLcr - 80)) * (75 / Age)^0.08143 * exp(eta1)   (L/h)

and the volume of distribution (Eq 17) is V = 52.14 * exp(eta2) (L).

Virtual cohort

Original observed data are not publicly available. The cohort below covers four scenarios bracketing the paper’s covariate space: the typical model-building subject (median age, median CRCL), a good-renal-function subject, a poor-renal-function subject, and a younger high-clearance subject. All receive the studied regimen of 1000 mg every 12 h as a 1-hour IV infusion, simulated to steady state.

set.seed(20260527)

n_sub  <- 120L
tau    <- 12                      # dosing interval (h)
n_dose <- 14L                     # number of q12h doses -> steady state
dose_times <- seq(0, by = tau, length.out = n_dose)
last_dose  <- max(dose_times)     # 156 h
ss_end     <- last_dose + tau     # 168 h

# Observation grid: coarse over the whole horizon for the VPC, dense over the
# final (steady-state) dosing interval for NCA.
obs_times <- sort(unique(c(
  seq(0, ss_end, by = 3),
  seq(last_dose, ss_end, by = 0.5)
)))

build_arm <- function(label, age, crcl, id_offset) {
  ids <- id_offset + seq_len(n_sub)

  dose_rows <- tidyr::expand_grid(id = ids, time = dose_times) |>
    mutate(
      evid   = 1L,
      amt    = 1000,
      cmt    = "central",
      rate   = 1000 / 1,        # 1000 mg infused over 1 hour
      cohort = label,
      AGE    = age,
      CRCL   = crcl
    )

  obs_rows <- tidyr::expand_grid(id = ids, time = obs_times) |>
    mutate(
      evid   = 0L,
      amt    = 0,
      cmt    = NA_character_,
      rate   = 0,
      cohort = label,
      AGE    = age,
      CRCL   = crcl
    )

  bind_rows(dose_rows, obs_rows) |> arrange(id, time, desc(evid))
}

events <- bind_rows(
  build_arm("age78_crcl58",  78, 58,    0L),  # typical model-building subject
  build_arm("age78_crcl120", 78, 120, 120L),  # good renal function
  build_arm("age78_crcl20",  78, 20,  240L),  # poor renal function
  build_arm("age50_crcl120", 50, 120, 360L)   # younger, high clearance
)

stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))

Simulation

mod <- readModelDb("Ji_2017_vancomycin")
sim <- rxode2::rxSolve(
  mod,
  events = events,
  keep   = c("cohort", "AGE", "CRCL")
) |> as.data.frame()
#> ℹ parameter labels from comments will be replaced by 'label()'

For the typical-value reproduction of Eq 16 (no between-subject variability), also simulate with the random effects zeroed:

mod_typical <- mod |> rxode2::zeroRe()
#> ℹ parameter labels from comments will be replaced by 'label()'
sim_typical <- rxode2::rxSolve(
  mod_typical,
  events = events,
  keep   = c("cohort", "AGE", "CRCL")
) |> as.data.frame()
#> ℹ omega/sigma items treated as zero: 'etalcl', 'etalvc'
#> Warning: multi-subject simulation without without 'omega'

Replicate published figures

Ji 2017 Figure 2 is a visual predictive check of trough concentrations and Figure 1 shows observed-vs-predicted goodness-of-fit clouds; neither is a per-subject concentration-time curve that can be reproduced directly. The block below summarises the simulated steady-state concentration-time profile for each covariate cohort, illustrating the renal- and age-dependent accumulation that drives the paper’s dose-individualisation analysis.

sim |>
  filter(time >= last_dose) |>
  mutate(tad = time - last_dose) |>
  group_by(cohort, tad) |>
  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(aes(tad, Q50)) +
  geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25) +
  geom_line() +
  facet_wrap(~ cohort) +
  labs(
    x = "Time after last dose (h)",
    y = "Simulated vancomycin Cc (mg/L)",
    title = "Steady-state concentration over the final dosing interval",
    caption = "1000 mg q12h IV infusion (1 h); covariate cohorts bracket Ji 2017 Table 1. Ribbon = 5th-95th percentile."
  )

The clearance covariate relationships of Eq 16 (CL rises with creatinine clearance and falls with age) are reproduced directly from the packaged model’s typical-value clearance:

cov_grid <- tidyr::expand_grid(
  AGE  = c(50, 75, 95),
  CRCL = seq(10, 160, by = 10)
) |>
  mutate(CL = 2.829 * (1 + 0.00842 * (CRCL - 80)) * (75 / AGE)^0.08143)

ggplot(cov_grid, aes(CRCL, CL, colour = factor(AGE))) +
  geom_line() +
  labs(
    x = "Cockcroft-Gault creatinine clearance (mL/min)",
    y = "Typical clearance CL (L/h)",
    colour = "Age (years)",
    title = "Eq 16 clearance covariate model",
    caption = "Reference point: CL = 2.829 L/h at age 75 y and CRCL 80 mL/min."
  )

PKNCA validation

Ji 2017 does not publish an NCA table (Cmax / AUC); the model was built on trough concentrations and used to drive a dose-targeting simulation. The PKNCA block below characterises the steady-state interval metrics (Cmax,ss, Tmax, Cmin/Ctrough = trough, Cavg, AUC0-tau) over the final dosing interval for each covariate cohort, providing a one-table audit of the simulated steady-state exposure. The treatment grouping is cohort.

sim_nca <- sim |>
  filter(!is.na(Cc), time >= last_dose) |>
  select(id, time, Cc, cohort)

dose_df <- events |>
  filter(evid == 1, time == last_dose) |>
  select(id, time, amt, cohort)

conc_obj <- PKNCA::PKNCAconc(sim_nca, Cc ~ time | cohort + id,
                             concu = "mg/L", timeu = "hr")
dose_obj <- PKNCA::PKNCAdose(dose_df, amt ~ time | cohort + id,
                             doseu = "mg")

intervals <- data.frame(
  start   = last_dose,
  end     = ss_end,
  cmax    = TRUE,
  tmax    = TRUE,
  cmin    = TRUE,
  ctrough = TRUE,
  cav     = TRUE,
  auclast = TRUE
)

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

nca_summary <- summary(nca_res)
knitr::kable(
  nca_summary,
  caption = "Simulated steady-state NCA parameters by covariate cohort (1000 mg q12h IV infusion, final dosing interval)."
)
Simulated steady-state NCA parameters by covariate cohort (1000 mg q12h IV infusion, final dosing interval).
Interval Start Interval End cohort N AUClast (hr*mg/L) Cmax (mg/L) Cmin (mg/L) Tmax (hr) Cav (mg/L) Ctrough (mg/L)
156 168 age50_crcl120 120 247 [34.2] 31.5 [24.0] 12.1 [58.4] 1.00 [1.00, 1.00] 20.6 [34.2] NC
156 168 age78_crcl120 120 248 [35.3] 31.8 [24.4] 11.9 [65.0] 1.00 [1.00, 1.00] 20.6 [35.3] NC
156 168 age78_crcl20 120 709 [32.3] 69.0 [27.3] 49.7 [39.1] 1.00 [1.00, 1.00] 59.1 [32.3] NC
156 168 age78_crcl58 120 417 [29.8] 45.0 [23.8] 25.8 [40.8] 1.00 [1.00, 1.00] 34.7 [29.8] NC

Comparison against published values

Ji 2017 reports no Cmax / AUC NCA table, so there is no published NCA row to compare against directly. The two checks below validate that the packaged model reproduces the paper’s structural parameter relationships.

# Typical clearance at the published reference point and at illustrative
# covariate values, computed (a) by hand from Eq 16 and (b) from the
# zero-random-effect simulation.
ref_check <- sim_typical |>
  group_by(cohort, AGE, CRCL) |>
  summarise(CL_model = unique(cl), V_model = unique(vc), .groups = "drop") |>
  mutate(
    CL_eq16 = 2.829 * (1 + 0.00842 * (CRCL - 80)) * (75 / AGE)^0.08143,
    V_eq17  = 52.14
  ) |>
  select(cohort, AGE, CRCL, CL_eq16, CL_model, V_eq17, V_model)

knitr::kable(
  ref_check,
  caption = "Typical CL (Eq 16) and V (Eq 17): hand-computed vs packaged-model values.",
  digits = 3
)
Typical CL (Eq 16) and V (Eq 17): hand-computed vs packaged-model values.
cohort AGE CRCL CL_eq16 CL_model V_eq17 V_model
age50_crcl120 50 120 3.909 3.909 52.14 52.14
age78_crcl120 78 120 3.770 3.770 52.14 52.14
age78_crcl20 78 20 1.395 1.395 52.14 52.14
age78_crcl58 78 58 2.298 2.298 52.14 52.14

The packaged model returns CL = 2.829 L/h and V = 52.14 L at the reference subject (age 75 y, CRCL 80 mL/min), matching Ji 2017 Eq 16-17 / Table 3 exactly, and reproduces the hand-computed Eq 16 clearance at every cohort. Across the renal-function range the simulated steady-state troughs span roughly 14 mg/L (high clearance) to ~50 mg/L (CRCL 20 mL/min) for a fixed 1000 mg q12h regimen, consistent with the paper’s finding that renal function dominates vancomycin exposure and that dose individualisation is required to keep troughs within the 10-15 / 15-20 mg/L targets.

Assumptions and deviations

  • Age covariate coefficient (0.08143, not 0.8143). Ji 2017 Eq 16, the Abstract, and the Results text all state the age exponent as 0.08143. Table 3 prints theta Age_CL = 0.8143 (RSE 53.68%) with bootstrap median 0.8373 – a 10x discrepancy. The packaged model uses 0.08143 because three independent statements (the model-defining equation, the abstract, and the Results narrative) agree on it, and only the single Table 3 cell (plus its bootstrap row) carries the larger value, which is a dropped-leading-zero typographical error. The directionality is also a cross-check: the paper states vancomycin excretion decreases as renal function diminishes with age, which (75/Age)^0.08143 reproduces (CL falls as age rises above 75). Europe PMC (PMID 28836582) lists no erratum or corrigendum for this article.
  • Additive residual error units (mg/L, not ng/mL). Table 3 labels the additive residual row “Residual variability SD (ng/mL)” = 2.647, but the vancomycin concentration unit is mg/L throughout the paper (Table 1, LOQ 2.0 mg/L, target troughs in mg/L). An additive SD of 2.647 ng/mL (= 0.0026 mg/L) would be negligible and incompatible with the authors’ choice of a combined error model, whereas 2.647 mg/L is a sensible additive term near the 2.0 mg/L LOQ. The packaged model therefore treats 2.647 as mg/L; the “(ng/mL)” column label is read as a units typo.
  • One-compartment IV, no absorption compartment. The Abstract and Results describe “first-order absorption” while the Discussion says “zero-order absorption”, but vancomycin was given by intravenous infusion and Table 3 estimates only CL and V (no absorption rate constant). The drug is therefore dosed directly into the central compartment as an IV infusion; no depot / ka is included, since none was estimated and inventing one is not supported by the source.
  • IIV variances taken from the Results text. The Results state the eta variances directly (“variances of 0.1051 and 0.083, respectively”) for CL and V; these go into ini() as the omega values (etalcl ~ 0.1051, etalvc ~ 0.083). They reproduce the Table 3 “IIV (%)” rows on the square-root scale (sqrt(0.1051) = 32.4%; sqrt(0.083) = 28.8%).
  • Infusion duration. The paper records “continuous infusion of vancomycin (1000 mg q12 h)” with trough sampling before the next dose, i.e. intermittent q12h infusions. The infusion duration is not stated; the vignette assumes a 1-hour infusion (a common vancomycin practice and the same convention used in the Goti 2018 vancomycin vignette). The infusion duration has negligible effect on the modeled trough concentrations.
  • Year in the file name. The article was published online in 2017 (DOI 10.1038/aps.2017.57) and in print in 2018 (Acta Pharmacol Sin 39(2):286-293). The model file / vignette name uses 2017 (online/DOI year); the reference field gives the full 2018 print citation.
  • Dose-individualisation supplements not used. The dosing-regimen tables (Tables S1-S4) referenced for the 10-15 and 15-20 mg/L trough targets are simulation outputs in the journal’s supplementary information and were not available on disk. They contain no model parameters (all final estimates are in Eq 16-17 and Table 3), so their absence does not affect the packaged model.
  • Virtual-cohort demographics. Race / ethnicity beyond “Chinese adults” is not reported and is not a model covariate; the virtual cohort fixes age and CRCL per arm to illustrate the covariate effects rather than sampling the full joint demographic distribution.