Skip to contents
library(nlmixr2lib)
library(rxode2)
#> rxode2 5.0.2 using 2 threads (see ?getRxThreads)
#>   no cache: create with `rxCreateCache()`
library(PKNCA)
#> 
#> Attaching package: 'PKNCA'
#> The following object is masked from 'package:stats':
#> 
#>     filter
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)

Evolocumab population PK replication (Kuchimanchi 2018)

Kuchimanchi et al. (2018) characterised the population pharmacokinetics of evolocumab, a fully human IgG2 monoclonal antibody against proprotein convertase subtilisin/kexin type 9 (PCSK9), in 3414 subjects pooled across 11 clinical studies spanning phase 1, 2, and 3 (healthy volunteers plus patients with hypercholesterolemia, including heterozygous familial hypercholesterolemia and statin-intolerance cohorts). The final model is a one-compartment model with first-order SC absorption from a depot compartment and parallel linear plus Michaelis–Menten (target-mediated) elimination from the central compartment. Body weight entered as a power effect on CL, V, and Vmax; female sex multiplied V; statin monotherapy, ezetimibe use (functionally the statin + ezetimibe combination-therapy indicator), and baseline PCSK9 modified Vmax. The absorption rate constant (ka), SC bioavailability (F), Michaelis–Menten constant (km), and Vmax typical value were fixed in the updated phase 3 population PK model.

This vignette reproduces typical-value concentration–time profiles for the two commercial regimens (140 mg SC Q2W and 420 mg SC QM), documents the parameter provenance in a source-trace table, and validates the simulated NCA (PKNCA) steady-state exposures against the published mean Cmax values.

Model and source

  • Citation: Kuchimanchi M, Monine M, Kandadi Muralidharan K, Woodhead JL, Horner TJ. Population pharmacokinetics and exposure–response modeling and simulation for evolocumab in healthy volunteers and patients with hypercholesterolemia. J Pharmacokinet Pharmacodyn. 2019;46(2):133–148.
  • Article: doi:10.1007/s10928-018-9592-y.
  • No errata were identified (PubMed search Kuchimanchi 2018 evolocumab erratum, 2026-04-24, returned no results).

Population

Kuchimanchi 2018 Table 2 (phase 1, 2, and 3 pooled column; N = 3414):

Field Value
N subjects 3414 (receiving evolocumab; pooled from 5474 across all arms)
N observations 16 179 evolocumab concentrations
N studies 11 (1 phase 1a, 1 phase 1b, 4 phase 2, 5 phase 3)
Age 18–80 years (mean 57)
Weight 41–175 kg (mean 84.2)
Sex 50% female / 50% male
Race / ethnicity 87% White, 7% Black, 4% Asian, 2% other
Disease state Healthy volunteers (phase 1a) + hypercholesterolemia patients
Baseline PCSK9 Mean 402 ng/mL (range 15.5–1233)
Baseline albumin Mean 4.3 g/dL (range 2.6–5.6)
HeFH (%) 9%
Diabetes (%) 11%
Statin (any) (%) ~72%
Ezetimibe (%) 12%
Dose range 7–420 mg IV or SC across single- and multiple-dose regimens
Phase 3 regimens 140 mg SC Q2W and 420 mg SC QM
Reference patient 84 kg male, no lipid-lowering meds, baseline PCSK9 = 425 ng/mL

The population metadata is also available programmatically via readModelDb("Kuchimanchi_2018_evolocumab")$population.

Source trace

Every numeric value in the model file inst/modeldb/specificDrugs/Kuchimanchi_2018_evolocumab.R is sourced from Kuchimanchi 2018. Final estimates are the updated phase 3 population PK model column in Table 3; Vmax and km were fixed in that column from the phase 1+2 run because phase 3 used only two dose regimens.

Quantity Source location Value used
Structural model (1-cmt, linear + MM) Methods § PopPK analysis / Figure 1a Depot → central, CL + V·Vmax·C/(km+C)
F (SC bioavailability) Table 3 0.72 (FIXED)
ka Table 3 0.319 day-1 (FIXED)
CL Table 3 0.105 L/day
V Table 3 5.18 L
Vmax Table 3 9.85 nM/day (FIXED)
km Table 3 27.3 nM (FIXED)
Reference body weight Methods, reference-patient definition 84 kg (male)
WT exponent on CL Table 3 0.276
WT exponent on V Table 3 1.04
Female exponent on V Table 3 1.11
WT exponent on Vmax Table 3 0.145
Statin (monotherapy) exponent on Vmax Table 3 1.13
Statin + ezetimibe exponent on Vmax Table 3 1.20
Baseline PCSK9 exponent on Vmax Table 3 0.194
Reference PCSK9 Methods, reference-patient definition 425 ng/mL (= 5.9 nM)
IIV on CL Table 3 54.3% CV
IIV on V Table 3 28.3% CV
IIV on Vmax Table 3 31.1% CV
IIV on ka Table 3 74.6% CV (FIXED)
IIV on km Table 3 0% (FIXED)
Full-block CL/V/Vmax omega structure Table 3 note; Table 4 referenced but Correlations not published — diagonal used
actually E-R parameters (see Assumptions and deviations)
Proportional residual error Table 3 0.282 (28.2% CV)
Additive residual error Table 3 5.41 nM (= 0.767 µg/mL at MW 141.8 kDa)
Evolocumab molecular weight FDA-approved Repatha label 141 800 g/mol

PCSK9 MW (~72 kDa), used only to cross-check the paper’s nM↔︎ng/mL conversion (5.9 nM ≈ 425 ng/mL), is not a model parameter.

Virtual cohort

The original patient-level data are not public. To replicate the paper’s reference-patient Cmax we simulate a small typical-value cohort at the two commercial regimens (140 mg SC Q2W and 420 mg SC QM) with the model’s random effects zeroed (rxode2::zeroRe()), i.e. a single “average” subject per regimen matching the Methods-section reference definition (84 kg male, no lipid-lowering medication, baseline PCSK9 = 425 ng/mL).

set.seed(20260424)

reference_covariates <- tibble::tibble(
  WT          = 84,
  SEXF        = 0L,
  STATIN_MONO = 0L,
  EZE         = 0L,
  PCSK9       = 425
)

make_regimen <- function(amt, ii, addl, label) {
  ev <- rxode2::et(amt = amt, cmt = "depot", ii = ii, addl = addl) |>
    rxode2::et(seq(0, 12 * 14, by = 0.5))
  df <- as.data.frame(ev)
  df$id          <- 1L
  df$WT          <- reference_covariates$WT
  df$SEXF        <- reference_covariates$SEXF
  df$STATIN_MONO <- reference_covariates$STATIN_MONO
  df$EZE         <- reference_covariates$EZE
  df$PCSK9       <- reference_covariates$PCSK9
  df$regimen     <- label
  df
}

events <- dplyr::bind_rows(
  make_regimen(amt = 140, ii = 14, addl = 11, label = "140 mg SC Q2W"),
  make_regimen(amt = 420, ii = 28, addl = 5,  label = "420 mg SC QM")  |>
    dplyr::mutate(id = 2L)
)
stopifnot(!anyDuplicated(unique(events[, c("id", "time", "evid")])))

Simulation

mod <- readModelDb("Kuchimanchi_2018_evolocumab")
ui  <- rxode2::rxode(mod)
#>  parameter labels from comments will be replaced by 'label()'

# Typical-value prediction: no between-subject variability and no residual error.
mod_typical <- rxode2::zeroRe(ui)
sim <- rxode2::rxSolve(mod_typical, events = events, keep = c("regimen"))
#>  omega/sigma items treated as zero: 'etalcl', 'etalvc', 'etalvmax', 'etalka'
#> Warning: multi-subject simulation without without 'omega'

Replicate published figures

ggplot(sim, aes(time, Cc, colour = regimen)) +
  geom_line(linewidth = 0.7) +
  labs(x = "Time (day)", y = "Serum evolocumab (µg/mL)",
       colour = "Regimen",
       title = "Typical serum evolocumab concentration-time profiles",
       caption = "Reference patient: 84 kg male, no lipid-lowering Rx, PCSK9 = 425 ng/mL.") +
  theme_minimal(base_size = 11)
Typical serum evolocumab concentration time-course after 140 mg SC Q2W and 420 mg SC QM (reference patient). Replicates the shape and range of Figure 4a/4c of Kuchimanchi 2018.

Typical serum evolocumab concentration time-course after 140 mg SC Q2W and 420 mg SC QM (reference patient). Replicates the shape and range of Figure 4a/4c of Kuchimanchi 2018.

ggplot(sim, aes(time, Cc, colour = regimen)) +
  geom_line(linewidth = 0.7) +
  scale_y_log10() +
  labs(x = "Time (day)", y = "Serum evolocumab (µg/mL, log)",
       colour = "Regimen") +
  theme_minimal(base_size = 11)
#> Warning in scale_y_log10(): log-10 transformation introduced
#> infinite values.
Same simulation on a log scale, showing the dose-proportional scaling between Q2W and QM trough concentrations.

Same simulation on a log scale, showing the dose-proportional scaling between Q2W and QM trough concentrations.

PKNCA validation

Use PKNCA to compute steady-state AUC, Cmax, Tmax, Cmin, and Cavg over the last dosing interval of each regimen (days 154–168 for Q2W, days 140–168 for QM). We keep observations between the final dose and the end of simulation, one per regimen, so NCA runs on the steady-state window.

tau_by_regimen <- c("140 mg SC Q2W" = 14, "420 mg SC QM" = 28)

sim_nca <- sim |>
  dplyr::filter(!is.na(Cc)) |>
  dplyr::mutate(
    tau       = tau_by_regimen[regimen],
    dose_last = 12 * 14 - tau
  ) |>
  dplyr::filter(time >= dose_last) |>
  dplyr::mutate(tad = time - dose_last) |>
  dplyr::select(id, time, tad, Cc, regimen)

dose_df <- events |>
  dplyr::filter(evid == 1) |>
  dplyr::group_by(id, regimen) |>
  dplyr::slice_tail(n = 1) |>     # final dose only
  dplyr::ungroup() |>
  dplyr::select(id, time, amt, regimen)

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

intervals <- data.frame(
  start   = c(12 * 14 - 14, 12 * 14 - 28),
  end     = c(12 * 14,      12 * 14),
  cmax    = TRUE,
  tmax    = TRUE,
  cmin    = TRUE,
  auclast = TRUE,
  cav     = TRUE
)

nca_res <- PKNCA::pk.nca(
  PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
)
#> Warning: Requesting an AUC range starting (0) before the first measurement (14)
#> is not allowed
nca_tbl <- as.data.frame(nca_res$result) |>
  dplyr::select(regimen, PPTESTCD, PPORRES) |>
  tidyr::pivot_wider(names_from = PPTESTCD, values_from = PPORRES)
#> Warning: Values from `PPORRES` are not uniquely identified; output will contain
#> list-cols.
#>  Use `values_fn = list` to suppress this warning.
#>  Use `values_fn = {summary_fun}` to summarise duplicates.
#>  Use the following dplyr code to identify duplicates.
#>   {data} |>
#>   dplyr::summarise(n = dplyr::n(), .by = c(regimen, PPTESTCD)) |>
#>   dplyr::filter(n > 1L)
knitr::kable(nca_tbl,
             caption = "Steady-state NCA parameters from the simulated reference patient.")
Steady-state NCA parameters from the simulated reference patient.
regimen auclast cmax cmin tmax cav
140 mg SC Q2W 202.8204, NA 17.73123, 17.73123 9.112862, 9.112862 4.5, 18.5 14.48717, NA
420 mg SC QM 438.6985, 1119.6855 44.65999, 55.49947 19.12768, 18.82097 0.0, 6.5 31.33561, 39.98877

Comparison against published Cmax

Kuchimanchi 2018 Results, paragraph following Table 3, reports mean observed unbound evolocumab Cmax of 18.6 µg/mL after 140 mg SC Q2W and 59 µg/mL after 420 mg SC QM. These values are population means observed across the phase 1–3 dataset (i.e., they include between-subject variability and covariate effects that differ from the Methods-defined reference patient), so an exact match is not expected for the typical-value simulation here; agreement within ~10% would be a reasonable sanity check. The Tmax of the SC profile is not reported as a typical value in the paper; the simulated Tmax is driven by the fixed ka = 0.319 day-1 and the regimen-specific dose accumulation.

cmax_obs <- tibble::tibble(
  regimen = c("140 mg SC Q2W", "420 mg SC QM"),
  cmax_paper_ugmL = c(18.6, 59)
)
cmax_sim <- sim |>
  dplyr::filter(time >= 12 * 14 - 28) |>  # within last QM interval window
  dplyr::group_by(regimen) |>
  dplyr::filter(time >= (12 * 14 - tau_by_regimen[regimen[1]])) |>
  dplyr::summarise(cmax_sim_ugmL = max(Cc), .groups = "drop")
cmax_cmp <- dplyr::left_join(cmax_obs, cmax_sim, by = "regimen") |>
  dplyr::mutate(pct_diff = round(100 * (cmax_sim_ugmL - cmax_paper_ugmL)
                                  / cmax_paper_ugmL, 1))
knitr::kable(cmax_cmp,
  caption = "Simulated (typical-value) steady-state C~max~ vs published mean observed C~max~.")
Simulated (typical-value) steady-state Cmax vs published mean observed Cmax.
regimen cmax_paper_ugmL cmax_sim_ugmL pct_diff
140 mg SC Q2W 18.6 17.73123 -4.7
420 mg SC QM 59.0 55.49947 -5.9

Assumptions and deviations

  • IIV block matrix approximated as diagonal. Kuchimanchi 2018 states that CL, V, and Vmax share a full-block variance matrix and refers the reader to “Table 4” for the inter-parameter correlations. However, the paper’s Table 4 is the exposure–response model parameter table and does not list the population-PK omega-block correlations; the correlations are not published anywhere in the article or supplement. The model file therefore encodes independent diagonal IIV on CL, V, and Vmax. This understates the individual-level covariance structure relative to the published fit (in particular the high CL–Vmax correlation that the paper calls out as influencing body-weight covariate-effect precision) but has no effect on typical-value (rxode2::zeroRe()) simulation or on population-level summaries.
  • Exposure–response (Emax) model not packaged. The paper additionally reports an Emax-type exposure–response model (Table 4) linking AUCwk8–12 to LDL-C at the mean of weeks 10 and 12. That model is a cross-sectional algebraic relationship rather than a dynamic PK/PD ODE, so it is not a natural fit for the nlmixr2lib library. Only the population PK model is packaged here.
  • Molecular weight used to convert between the paper’s target-unit scale (nM) and the model’s concentration scale (µg/mL) is 141 800 g/mol (evolocumab, FDA-approved Repatha label). The paper does not state the molecular weight explicitly; the same value reproduces the paper’s 5.9 nM ≈ 425 ng/mL reference-PCSK9 relationship within rounding when the PCSK9 molecular weight (~72 kDa) is applied to PCSK9.
  • Reference patient characteristics used in the virtual cohort are the Methods-section reference definition: 84 kg male, not on lipid-lowering medication, baseline PCSK9 = 425 ng/mL. Body weight distribution and PCSK9 distribution in the broader trial population (which shifts observed mean Cmax slightly relative to the reference patient) are not reproduced in this typical-value simulation.
  • Time-fixed covariates. All covariates in the model file (WT, SEXF, STATIN_MONO, EZE, PCSK9) are treated as baseline time-fixed. Kuchimanchi 2018’s dataset used baseline values for these covariates; concomitant-medication status was required to be stable (>4 weeks of administration before study day 1) in the exposure–response analysis, though the popPK analysis used any duration of administration.