Question. Which parameters of a full target-mediated
drug disposition (TMDD) model are determined by the public
nimoData observations (nlmixr2data; source: Rodriguez-Vera
et al. 2015), and which added measurement would determine the rest?
The model fit and the likelihood profiles take about half an hour, so
this vignette shows their code without running it and reads the stored
results (inst/extdata), produced by
case-studies/nimotuzumab-tmdd.R in the source repository.
The structural analysis runs here.
nimoData has 12 patients at 50–400 mg, each with ten
infusions and 321 free-drug observations in total. DV is the log
concentration; its unit is not documented, so the volume is in dose
units per concentration unit. The full TMDD model has drug amount
A, free target R (at its baseline
r0 before the first dose) and complex P:
With free drug observed alone, all seven parameters are locally identifiable:
m_free <- m
m_free$outputs <- m$outputs["cp"]
structural_identifiability(m_free)
#> <pkident structural identifiability>
#> Decision is LOCAL (Lie derivatives at the known initial state up to order 6, checked by output sensitivities; 5 random points).
#> Methods agree at 5 of 5 points.
#> cl identifiable
#> kdeg identifiable
#> kint identifiable
#> koff identifiable
#> kon identifiable
#> r0 identifiable
#> v identifiableThe model was fitted with nlmixr2 (FOCEi; between-subject variability
on cl and v; additive error on the log
scale):
fit <- nlmixr2est::nlmixr2(tmdd, nimoData, est = "focei")
prof <- classify_profiles(fit, structural = structural_identifiability(m_free),
map = c(lcl = "cl", lv = "v", lkon = "kon", lkoff = "koff",
lkdeg = "kdeg", lr0 = "r0", lkint = "kint"))fit <- extdata("nimotuzumab-fit.csv")
knitr::kable(fit[, c("parameter", "Estimate", "SE", "Back-transformed")], digits = 4)| parameter | Estimate | SE | Back-transformed |
|---|---|---|---|
| lcl | -5.4445 | 0.3051 | 0.0043 |
| lv | 0.3026 | 0.0483 | 1.3534 |
| lkon | -6.0733 | 0.3464 | 0.0023 |
| lkoff | -8.3638 | 0.4090 | 0.0002 |
| lkdeg | -1.2888 | 0.1941 | 0.2756 |
| lr0 | 1.0068 | 0.1670 | 2.7369 |
| lkint | -12.2548 | 0.4754 | 0.0000 |
| add.sd | 0.6683 | 0.0766 | 0.6683 |
prof <- extdata("nimotuzumab-profiles.csv")
knitr::kable(prof[, c("parameter", "estimate", "status", "shape", "lower", "upper", "interpretation")],
digits = 2)| parameter | estimate | status | shape | lower | upper | interpretation |
|---|---|---|---|---|---|---|
| lcl | -5.44 | identifiable | bounded | -6.91 | -4.88 | determined by these data |
| lv | 0.30 | identifiable | bounded | -0.04 | 0.66 | determined by these data |
| lkon | -6.07 | non_identifiable | flat | NA | NA | structurally identifiable but not determined by these data |
| lkoff | -8.36 | identifiable | bounded | -9.08 | -7.26 | determined by these data |
| lkdeg | -1.29 | non_identifiable | flat | NA | NA | structurally identifiable but not determined by these data |
| lr0 | 1.01 | non_identifiable | flat | NA | NA | structurally identifiable but not determined by these data |
| lkint | -12.25 | non_identifiable | flat | NA | NA | structurally identifiable but not determined by these data |
Clearance, volume and koff are bounded.
kon, kdeg, r0 and
kint are flat over a factor of 7.4 in each direction:
structurally identifiable, but not determined by these data. The
standard errors from nlmixr2’s covariance step (0.17–0.48 on the log
scale for these four) do not describe this.
pts <- extdata("nimotuzumab-profile-points.csv")
op <- par(mfrow = c(2, 4), mar = c(4, 4, 2, 1))
for (p in unique(pts$parameter)) {
d <- pts[pts$parameter == p, ]
plot(d$value, d$dofv_from_minimum, type = "b", pch = 19, xlab = p, ylab = "dOFV",
ylim = c(0, max(8, d$dofv_from_minimum)), main = p)
abline(h = 3.84, lty = 2)
}
par(op)Expected RSEs at the fitted values for the actual design (each patient’s own infusions and sampling times) and for candidates with an added measurement at the same times, or with an added 10 mg group. Target assays are assumed to have an error of 0.2 on the log scale.
cmp <- compare_designs(
m,
candidates = list(current = current, `+ total target` = with_output("rtot"),
`+ free target` = with_output("R"), `+ complex` = with_output("P"),
`+ 10 mg group` = c(current, low_dose)),
values = values,
error = list(cp = residual_error(exp = 0.668), rtot = residual_error(exp = 0.2),
R = residual_error(exp = 0.2), P = residual_error(exp = 0.2))
)p <- extdata("nimotuzumab-designs-parameters.csv")
tab <- reshape(p[, c("candidate", "parameter", "rse_percent")], idvar = "parameter",
timevar = "candidate", direction = "wide")
names(tab) <- sub("rse_percent.", "", names(tab), fixed = TRUE)
knitr::kable(tab, digits = 1, row.names = FALSE, caption = "Expected RSE (%)")| parameter | current | + total target | + free target | + complex | + 10 mg group |
|---|---|---|---|---|---|
| cl | 35.1 | 7.9 | 9.5 | 7.6 | 29.4 |
| kdeg | 2848.5 | 7.6 | 16.0 | 78.0 | 2584.2 |
| kint | 44217.2 | 1054.5 | 16912.2 | 1055.5 | 31796.2 |
| koff | 241.6 | 22.9 | 89.0 | 21.8 | 173.4 |
| kon | 2837.6 | 9.4 | 12.7 | 78.5 | 2574.1 |
| r0 | 2829.5 | 5.7 | 1.9 | 76.9 | 2568.3 |
| v | 9.0 | 5.4 | 5.9 | 5.4 | 7.7 |
s <- extdata("nimotuzumab-designs-summary.csv")
knitr::kable(s[, c("candidate", "outputs", "observations", "n_identifiable", "n_parameters")])| candidate | outputs | observations | n_identifiable | n_parameters |
|---|---|---|---|---|
| current | cp | 321 | 1 | 7 |
| + total target | cp, rtot | 642 | 6 | 7 |
| + free target | cp, R | 642 | 5 | 7 |
| + complex | cp, P | 642 | 3 | 7 |
| + 10 mg group | cp | 403 | 2 | 7 |
Answer. Measuring total target at the same times
would determine kon, kdeg and r0
as well (six of seven parameters with RSE ≤ 30%); free target determines
five; a lower dose group does not help. No candidate determines
kint: at the estimate, internalisation of the complex
barely affects any output.
The expected RSEs (fixed effects of a typical patient, local
approximation) and the profiles (the actual mixed-effects fit) agree on
which parameters are determined; they differ in degree, for example for
koff.