Desmopressin (Agerso 2004)
Source:vignettes/articles/Agerso_2004_desmopressin.Rmd
Agerso_2004_desmopressin.RmdModel and source
- Citation: Agerso H, Seiding Larsen L, Riis A, Lovgren U, Karlsson MO, Senderovitz T. Pharmacokinetics and renal excretion of desmopressin after intravenous administration to healthy subjects and renally impaired patients. Br J Clin Pharmacol. 2004;58(4):352-358.
- Article: https://doi.org/10.1111/j.1365-2125.2004.02175.x
- Description: three-compartment IV PK model with simultaneous plasma and cumulative urinary-amount outputs; systemic clearance is split into renal and non-renal components, each modulated linearly by creatinine clearance.
Population
Twenty-four subjects (49-68 years) were enrolled, of whom 22 contributed to the final pharmacokinetic analysis (Methods ‘Study design’; two subjects were excluded because their plasma profiles showed an absorption phase incompatible with IV administration). Subjects were stratified by renal function into four groups (Results / Table 2):
- Group 1: normal renal function (n=6, mean CRCL 103 mL/min/1.73 m^2)
- Group 2: mild impairment (n=5, mean CRCL 72 mL/min/1.73 m^2)
- Group 3: moderate impairment (n=5, mean CRCL 37 mL/min/1.73 m^2)
- Group 4: severe impairment (n=6, mean CRCL 16 mL/min/1.73 m^2)
All received a single 2 ug IV dose (4 ug/mL, 0.5 mL over 1 min). Blood was sampled at 5, 15, 30, 45 min and 1, 1.5, 2, 3, 4, 6, 8, 12, 16, 24 h post-dose; urine was pooled over eight 3-hour intervals to 24 h.
Source trace
| Element | Value | Source |
|---|---|---|
| CL_r at CRCL=60 mL/min/1.73 m^2 | 2.41 L/h | Table 1, row CL_r |
| CL_nr at CRCL=60 mL/min/1.73 m^2 | 3.91 L/h | Table 1, row CL_nr |
| V1 (central) | 13.9 L | Table 1, row V1 |
| V2 (peripheral 1) | 12.5 L | Table 1, row V2 |
| V3 (peripheral 2) | 11.7 L | Table 1, row V3 |
| Q2 | 4.43 L/h | Table 1, row Q2 |
| Q3 | 27.5 L/h | Table 1, row Q3 |
| CRCL effect on CL_r | 1.74% per mL/min | Table 1, row ‘CrCL effect on CL_r’ |
| CRCL effect on CL_nr | 0.933% per mL/min | Table 1, row ‘CrCL effect on CL_nr’ |
| IIV CL_r (CV%) | 24% | Table 1, IIV column |
| IIV CL_nr (CV%) | 30% | Table 1, IIV column (corr 0.86 w/ V1) |
| IIV V1=V3 (single shared term, CV%) | 31% | Table 1 footnote ‘shared’ |
| Add error on plasma | 0.27 pg/mL | Table 1 |
| Prop error on plasma | 29% | Table 1 |
| Add error on urine amount | 4140 pg | Table 1 |
| Prop error on urine amount | 47% | Table 1 |
| Three-compartment structure | n/a | Results paragraph 2 (‘best described by a three-compartmental model’); Discussion |
| Renal/non-renal CL split + urine fit | n/a | Results paragraph 2 (‘possible to fit the plasma concentrations and the amounts excreted in urine simultaneously’) |
| Linear CRCL effect form | n/a | Results paragraph 2 + Table 1 footnote |
The per-parameter origin is also recorded as an in-file comment next
to each ini() entry in
inst/modeldb/specificDrugs/Agerso_2004_desmopressin.R.
Virtual cohort
set.seed(20040401)
# Build four CRCL groups matching Table 2 means and SDs. Per-subject CRCL is
# drawn from a truncated normal and bounded to the paper's observed CRCL
# range (10-144 mL/min/1.73 m^2) so the linear CRCL effect on CL stays in
# the validated region.
make_cohort <- function(n, mean_crcl, sd_crcl, group_label, id_offset) {
tibble(
id = id_offset + seq_len(n),
group = group_label,
CRCL = pmin(pmax(rnorm(n, mean = mean_crcl, sd = sd_crcl), 10), 144)
)
}
cohort <- bind_rows(
make_cohort(50, 103, 21, "Group 1 (normal)", id_offset = 0L),
make_cohort(50, 72, 6.8,"Group 2 (mild)", id_offset = 50L),
make_cohort(50, 37, 9.9,"Group 3 (moderate)", id_offset = 100L),
make_cohort(50, 16, 6.6,"Group 4 (severe)", id_offset = 150L)
)
dose_ng <- 2 * 1000 # 2 ug single IV bolus expressed in ng
obs_times <- c(5, 15, 30, 45) / 60 # min -> h
obs_times <- c(obs_times, c(1, 1.5, 2, 3, 4, 6, 8, 12, 16, 24))
dose_rows <- cohort %>%
transmute(id, time = 0, amt = dose_ng, evid = 1L, cmt = "central",
group, CRCL)
obs_rows_cc <- tidyr::expand_grid(cohort, time = obs_times) %>%
transmute(id, time, amt = NA_real_, evid = 0L, cmt = "Cc",
group, CRCL)
obs_rows_urine <- tidyr::expand_grid(cohort, time = c(3, 6, 9, 12, 15, 18, 21, 24)) %>%
transmute(id, time, amt = NA_real_, evid = 0L, cmt = "urineAmt",
group, CRCL)
events <- bind_rows(dose_rows, obs_rows_cc, obs_rows_urine) %>%
arrange(id, time, desc(evid))Simulation
mod <- readModelDb("Agerso_2004_desmopressin")
sim <- rxode2::rxSolve(
mod,
events = events,
keep = c("group", "CRCL")
) %>% as.data.frame()
#> ℹ parameter labels from comments will be replaced by 'label()'For deterministic typical-value replication, zero out the random effects:
mod_typical <- mod %>% rxode2::zeroRe()
#> ℹ parameter labels from comments will be replaced by 'label()'
sim_typical <- rxode2::rxSolve(
mod_typical,
events = events,
keep = c("group", "CRCL")
) %>% as.data.frame()
#> ℹ omega/sigma items treated as zero: 'etalcl_renal', 'etalcl_nonren', 'etalvc_vp2'
#> Warning: multi-subject simulation without without 'omega'Plasma concentration vs time by group
The paper’s Figure 1 shows goodness-of-fit panels (DV vs IPRED / PRED). Lacking the source observed data, the simulated plasma profiles by CRCL group are shown below – the steeper terminal slope at higher CRCL reflects the positive coupling between CRCL and total clearance.
sim %>%
filter(time > 0) %>%
group_by(time, group) %>%
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(time, Q50)) +
geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25) +
geom_line() +
facet_wrap(~ group) +
scale_y_log10() +
labs(x = "Time (h)", y = "Cc (pg/mL)",
title = "Plasma desmopressin by renal-function group",
caption = "Compare to Figure 1 (Agerso 2004); 5th-50th-95th simulated percentiles.")
CRCL vs CL_r and CL_nr (Figure 2)
The paper’s Figure 2 plots renal and non-renal clearance against creatinine clearance, with the model-predicted solid line. The model encodes the linear multiplicative effect on each component.
crcl_grid <- tibble(CRCL = seq(10, 145, by = 1)) %>%
mutate(
`CL_r (L/h)` = 2.41 * (1 + 0.0174 * (CRCL - 60)),
`CL_nr (L/h)` = 3.91 * (1 + 0.00933 * (CRCL - 60))
) %>%
pivot_longer(cols = c(`CL_r (L/h)`, `CL_nr (L/h)`),
names_to = "component", values_to = "value")
ggplot(crcl_grid, aes(CRCL, value)) +
geom_line() +
facet_wrap(~ component, scales = "free_y") +
labs(x = "CRCL (mL/min/1.73 m^2)", y = "Clearance (L/h)",
title = "Renal and non-renal clearance vs CRCL",
caption = "Replicates Figure 2 of Agerso 2004 (typical-value lines).")
Renal excretion fraction (fe) vs CRCL
The paper reports that the fraction of dose excreted in urine (fe) drops from ~47% in healthy subjects to ~21% in severely renally impaired patients (Results, Table 2). The simulation reproduces this gradient.
fe_summary <- sim_typical %>%
group_by(id, group, CRCL) %>%
summarise(urineAmt_pg = max(urineAmt, na.rm = TRUE), .groups = "drop") %>%
mutate(fe = urineAmt_pg / (dose_ng * 1000)) # dose_ng * 1000 = dose in pg
fe_summary %>%
group_by(group) %>%
summarise(
fe_mean = mean(fe),
fe_sd = sd(fe),
.groups = "drop"
) %>%
knitr::kable(digits = 3,
caption = "Simulated fraction excreted in urine (fe) by group; compare Table 2 fe column.")| group | fe_mean | fe_sd |
|---|---|---|
| Group 1 (normal) | 0.429 | 0.021 |
| Group 2 (mild) | 0.393 | 0.012 |
| Group 3 (moderate) | 0.291 | 0.044 |
| Group 4 (severe) | 0.162 | 0.052 |
PKNCA validation
sim_nca <- sim %>%
filter(time > 0, !is.na(Cc)) %>%
distinct(id, time, .keep_all = TRUE) %>%
select(id, time, Cc, group)
conc_obj <- PKNCA::PKNCAconc(
sim_nca, Cc ~ time | group + id,
concu = "pg/mL", timeu = "h"
)
dose_df <- events %>%
filter(evid == 1) %>%
select(id, time, amt, group)
dose_obj <- PKNCA::PKNCAdose(
dose_df, amt ~ time | group + id,
doseu = "ng"
)
intervals <- data.frame(
start = 0,
end = Inf,
cmax = TRUE,
tmax = TRUE,
aucinf.obs = TRUE,
half.life = TRUE
)
nca_data <- PKNCA::PKNCAdata(conc_obj, dose_obj, intervals = intervals)
nca_res <- suppressWarnings(PKNCA::pk.nca(nca_data))
nca_tbl <- as.data.frame(nca_res$result)
nca_summary <- nca_tbl %>%
filter(PPTESTCD %in% c("cmax", "tmax", "aucinf.obs", "half.life")) %>%
group_by(group, PPTESTCD) %>%
summarise(median = median(PPORRES, na.rm = TRUE),
.groups = "drop") %>%
pivot_wider(names_from = PPTESTCD, values_from = median)
knitr::kable(nca_summary, digits = 3,
caption = "Median simulated NCA parameters by renal-function group.")| group | aucinf.obs | cmax | half.life | tmax |
|---|---|---|---|---|
| Group 1 (normal) | NA | 113.072 | 3.732 | 0.083 |
| Group 2 (mild) | NA | 118.891 | 4.540 | 0.083 |
| Group 3 (moderate) | NA | 120.719 | 6.869 | 0.083 |
| Group 4 (severe) | NA | 115.354 | 9.750 | 0.083 |
Comparison against Table 2 (per-group means)
Total CL is computed at the published per-group mean CRCL by summing the model’s typical renal and non-renal components. Terminal half-life and fe are pulled from the PKNCA / cumulative-urine summaries above.
published <- tibble(
group = c("Group 1 (normal)", "Group 2 (mild)",
"Group 3 (moderate)", "Group 4 (severe)"),
CRCL_pub = c(103, 72, 37, 16),
CL_pub_Lh = c(10, 6.9, 4.9, 2.9),
t12_pub_h = c(3.7, 4.8, 7.2, 10.0),
fe_pub = c(0.47, 0.41, 0.26, 0.21)
)
published <- published %>%
mutate(
CL_sim_Lh = 2.41 * (1 + 0.0174 * (CRCL_pub - 60)) +
3.91 * (1 + 0.00933 * (CRCL_pub - 60))
)
t12sum <- nca_summary %>%
transmute(group, t12_sim_h = half.life)
fe_sum <- fe_summary %>%
group_by(group) %>%
summarise(fe_sim = mean(fe), .groups = "drop")
comparison <- published %>%
left_join(t12sum, by = "group") %>%
left_join(fe_sum, by = "group") %>%
mutate(
CL_ratio = CL_sim_Lh / CL_pub_Lh,
t12_ratio = t12_sim_h / t12_pub_h,
fe_ratio = fe_sim / fe_pub
)
knitr::kable(comparison, digits = 3,
caption = "Simulated vs published per-group summaries (Agerso 2004 Table 2). CL_sim is the typical-value total CL evaluated at the published per-group mean CRCL.")| group | CRCL_pub | CL_pub_Lh | t12_pub_h | fe_pub | CL_sim_Lh | t12_sim_h | fe_sim | CL_ratio | t12_ratio | fe_ratio |
|---|---|---|---|---|---|---|---|---|---|---|
| Group 1 (normal) | 103 | 10.0 | 3.7 | 0.47 | 9.692 | 3.732 | 0.429 | 0.969 | 1.009 | 0.912 |
| Group 2 (mild) | 72 | 6.9 | 4.8 | 0.41 | 7.261 | 4.540 | 0.393 | 1.052 | 0.946 | 0.958 |
| Group 3 (moderate) | 37 | 4.9 | 7.2 | 0.26 | 4.516 | 6.869 | 0.291 | 0.922 | 0.954 | 1.120 |
| Group 4 (severe) | 16 | 2.9 | 10.0 | 0.21 | 2.870 | 9.750 | 0.162 | 0.990 | 0.975 | 0.772 |
Differences > 20% would warrant investigation rather than parameter tuning. The simulation should reproduce the order-of-magnitude gradient across CRCL groups in CL, half-life, and fe (Table 2 of the paper).
Assumptions and deviations
Unit convention. The model accepts doses in ng and reports concentrations in pg/mL (numerically equal to ng/L). The 2 ug paper dose becomes 2000 ng in the event table. The urine compartment accumulates in ng (dose units); the
urineAmtoutput multiplies by 1000 to report in pg, matching the paper’s Table 1 additive-error magnitude of 4140 pg. The lint-conventions check flags this unit-magnitude mismatch as informational; the scaling is deliberate and verified above.Linear CRCL effect range. The covariate effect
(1 + e_crcl_cl_* * (CRCL - 60))is the form Agerso 2004 fitted to the observed CRCL range (10-144 mL/min/1.73 m^2). At CRCL < ~2.5 mL/min the renal-clearance multiplier becomes non-positive; downstream simulations should restrict CRCL to >= 5 mL/min/1.73 m^2 (this vignette truncates the sampled CRCL at 10 mL/min, the paper’s lowest observed value).Shared V1/V3 IIV term. Table 1 footnote ‘shared’ indicates the interindividual variability on the central and second peripheral volumes was estimated as a single 31% CV term, positively correlated (r = 0.86) with the IIV on CL_nr. The model encodes this as a paper-specific eta
etalvc_vp2applied to bothvcandvp2, declared via thepaper_specific_etasmetadata field so the convention checker does not flag the absence of separateetalvc/etalvp2terms. V2 (vp) was not reported with IIV and has no eta.IIV on residual error magnitudes (not implemented). Table 1 reports significant interindividual variability in the residual error magnitudes for both plasma (CV 43%) and urine (CV 65%). nlmixr2 does not directly support eta-on-EPS in its standard syntax; the residual errors here are population-typical values and the simulated VPC band is consequently narrower than the Agerso 2004 fit would yield. This is a documentation-only deviation from the source.
Population sex, race, regional distribution. The paper reports only age (49-68 years), BMI (23-32 kg/m^2), and height (152-184 cm); sex breakdown, race / ethnicity, and centre detail (Germany; Bayerische Landesarztekammer approval) are not summarised here. The virtual cohort samples CRCL only; no body-size scaling is applied because Agerso 2004 found no significant weight / BMI / height / age covariates beyond CRCL on either CL component.
Two excluded subjects. The published parameter estimates are based on N = 22 (24 enrolled, 2 excluded for an absorption-like phase). The model population metadata uses N = 22 to match Table 1.
CRCL definition. The paper computes CRCL from a 24-h urine collection using
(Cr_urine x UV / dt) / Cr_serum x 1.73 / BSA, with BSA from the Gehan and George formula. This is a measured, BSA-normalised creatinine clearance in mL/min/1.73 m^2, matching the canonicalCRCLdefinition ininst/references/covariate-columns.md. The per-modelcovariateData$CRCLnotes record the derivation.