Skip to contents

Introduction

PKNCA considers two types of data grouping within data sets: the group and the interval. A group typically identifies a single subject given a single intervention type (a “treatment”) with a single analyte. An interval subsets a group by times within the group, and primary noncompartmental analysis (NCA) calculations are performed within an interval.

As a concrete example, consider the figure below shows the concentration-time profile of a study subject in a multiple-dose study. The group is all points in the figure, and the interval for the last day (144 to 168 hr) is the area with blue shading.

## Formula for concentration:
##  conc ~ time | treatment + ID
## Data are dense PK.
## With 1 subjects defined in the 'ID' column.
## Nominal time column is not specified.
## 
## First 6 rows of concentration data:
##    study treatment ID time      conc   analyte exclude
##  Study 1     Trt 1  1    0 0.0000000 Analyte 1    <NA>
##  Study 1     Trt 1  1    1 0.6140526 Analyte 1    <NA>
##  Study 1     Trt 1  1    2 0.8100022 Analyte 1    <NA>
##  Study 1     Trt 1  1    4 0.8425422 Analyte 1    <NA>
##  Study 1     Trt 1  1    6 0.7771994 Analyte 1    <NA>
##  Study 1     Trt 1  1    8 0.7052469 Analyte 1    <NA>
# Plot the concentration-time data and the interval
ggplot(d_conc_multi, aes(x=time, y=conc)) +
  geom_ribbon(data=d_conc_multi[d_conc_multi$time >= 144,],
              aes(ymax=conc, ymin=0),
              fill="skyblue") +
  geom_point() + geom_line() +
  scale_x_continuous(breaks=seq(0, 168, by=12)) +
  scale_y_continuous(limits=c(0, NA)) +
  labs(x="Time Since First Dose (hr)",
       y="Concentration\n(arbitrary units)")

intervals_manual <- data.frame(start=144, end=168, auclast=TRUE)
knitr::kable(intervals_manual)
start end auclast
144 168 TRUE
d_conc_multi_obj <- PKNCAconc(d_conc_multi, conc~time|treatment+ID)
PKNCAdata(d_conc_multi_obj, intervals=intervals_manual)
## Formula for concentration:
##  conc ~ time | treatment + ID
## Data are dense PK.
## With 1 subjects defined in the 'ID' column.
## Nominal time column is not specified.
## 
## First 6 rows of concentration data:
##  treatment ID      conc time exclude
##      Trt 1  1 0.0000000    0    <NA>
##      Trt 1  1 0.6140526    1    <NA>
##      Trt 1  1 0.8100022    2    <NA>
##      Trt 1  1 0.8425422    4    <NA>
##      Trt 1  1 0.7771994    6    <NA>
##      Trt 1  1 0.7052469    8    <NA>
## No dosing information.
## 
## With 1 rows of interval specifications.
## No options are set differently than default.

Group Matching

Group matching occurs by matching all overlapping column names between the groups and the interval data.frame. (Note that grouping columns cannot be the word start, end, or share a name with an NCA parameter.)

Selecting the Subjects for an Interval

The groups for an interval prepare for summarization. Typically the groups will take a structure similar to the preferred summarization structure with groups nested in the logical method for summary. As an example, the group structure may be: study, treatment, day, analyte, and subject. The grouping names for an interval must be the same as or a subset of the grouping names used for the concentration data.

As the matching occurs with all available columns, the grouping columns names are only required to the level of specificity for the calculations desired. As an example, if you want AUCinf,obs in subjects who received single doses and AUClast on days 1 (0 to 24 hours) and 10 (216 to 240 hours) in subjects who received multiple doses, with treatment defined as “Drug 1 Single” or “Drug 1 Multiple”, the intervals could be defined as below.

intervals_manual <-
  data.frame(
    treatment=c("Drug 1 Single", "Drug 1 Multiple", "Drug 1 Multiple"),
    start=c(0, 0, 216),
    end=c(Inf, 24, 240),
    aucinf.obs=c(TRUE, FALSE, FALSE),
    auclast=c(FALSE, TRUE, TRUE)
  )
knitr::kable(intervals_manual)
treatment start end aucinf.obs auclast
Drug 1 Single 0 Inf TRUE FALSE
Drug 1 Multiple 0 24 FALSE TRUE
Drug 1 Multiple 216 240 FALSE TRUE

Intervals

Intervals are defined by data.frames with one row per interval, zero or more columns to match the groups from the PKNCAdata object, and one or more NCA parameters to calculate. An interval may also have an impute column specifying the data imputation method(s) to apply to the interval before calculation (see the Data Imputation vignette for details). An interval may have a tau column giving the dosing interval for the multiple-dose parameters (see Multiple-Dose MRT and Vss below). Any other columns named in the keep_interval_cols PKNCA option are passed through from the intervals to the corresponding rows of the results.

Selection of points within an interval occurs by choosing any point at or after the start and at or before the end.

Automatic Selection of Intervals

When PKNCAdata() is given no intervals, it chooses them for each group from the concentration and dose times with choose.auc.intervals(). The parameters within each interval come from pknca_interval_table(), so each interval is given the parameters and the imputation that suit its context (see ?pknca_interval_table for how that table is built).

The rules are:

  • A group with no dose times gives no intervals, with a warning.
  • A single dose with any sample after it gives one interval from the dose to infinity, calculated as a single dose.
  • Between two consecutive doses with samples at both dose times and at least one sample between them, an interval is generated. It is calculated as a dosing interval when the samples run up to the next dose, and as a single-dose profile bounded by the next dose when they stop partway and leave a washout. This is what distinguishes two treatment periods recorded in one group from repeated dosing.
  • For the last dose, the dosing interval tau is found from the dose times with find.tau(). When a sample ends it, an interval one tau long is generated and calculated as a dose at steady state. It starts at the first dose of the last complete cycle, which is the last dose itself unless the regimen gives more than one dose per tau, so the interval never contains a dose that was not recorded. When samples continue beyond it, the half-life is calculated from the last dose onward.

Sample and dose times are matched within a tolerance rather than exactly, so a trough drawn at 167.5 hours still ends an interval that nominally ends at 168 hours, and a predose sample drawn at -0.05 hours still starts the interval at the dose. The width of that window is the auto.interval.tolerance option, given as a fraction of the interval’s length. The window only reaches backward: a sample drawn after a boundary belongs to what follows it, so a concentration drawn after a dose cannot stand in for the predose sample, and a trough drawn after the next dose cannot end the interval before it.

# Daily dosing with a dense profile on the first and last day
choose.auc.intervals(
  time.conc = c(0, 1, 2, 4, 8, 12, 24, 48, 72, 96, 120,
                144, 145, 146, 148, 152, 156, 168, 192, 216),
  time.dosing = seq(0, 144, by = 24)
)[, c("start", "end", "aucint.last", "cmax", "half.life", "impute")]
##   start end aucint.last  cmax half.life        impute
## 1     0  24        TRUE  TRUE      TRUE    start_cmin
## 2   144 168        TRUE  TRUE      TRUE start_predose
## 3   144 Inf       FALSE FALSE      TRUE          <NA>

Setting the auto.interval.method option to "legacy" calculates the parameter lists PKNCA used before this was added: the single.dose.aucs option for single-dose data, and AUClast, Cmax, and Tmax for each interval of multiple-dose data. The intervals themselves are found the same way either way.

PKNCA.options(auto.interval.method = "legacy")
choose.auc.intervals(
  time.conc = c(0, 1, 2, 4, 8, 24, 48),
  time.dosing = 0
)[, c("start", "end", "auclast", "aucinf.obs", "half.life")]
##   start end auclast aucinf.obs half.life
## 1     0  24    TRUE      FALSE     FALSE
## 2     0 Inf   FALSE       TRUE      TRUE
PKNCA.options(default = TRUE)

Finding the Dosing Interval

find.tau() sorts the dose times and drops the ones that repeat, then looks at the spacings between consecutive doses. If they are all the same, that spacing is tau. Otherwise each candidate interval is tested, smallest first, and the first one that the whole pattern of doses repeats over is used; the candidates are the tau.choices option’s values when it is given and every spacing between two doses when it is NA. The pattern must repeat over at least two complete intervals, so a regimen giving more than one dose per interval is found while a length that merely spans the doses is not. Only if nothing repeats is a gap read as a missed dose: if every spacing is then a whole number of the smallest spacing and the smallest spacing is seen twice in a row, the smallest spacing is tau and a warning names the longer gaps. If none of that fits, no dosing interval is reported.

Looking for a repeating pattern first is what keeps a regimen with a regular gap in it from being misread. Dosing three times a day at 0, 6, and 12 hours repeats daily; the 12 hour overnight gap is the regimen, not two doses that were never given.

# Twice-daily dosing repeats daily although no two doses are a day apart
find.tau(c(0, 10, 24, 34, 48, 58, 72, 82))
## [1] 24

To Infinity

The end of an interval may be infinity. An interval to infinity works the same as any other interval in that points are selected by being at or after the start and at or before the end of the interval. Selecting Inf or any value at or after the maximum time yields no difference in effect, but Inf is simpler when scripting to ensure that all points are selected.

## Formula for concentration:
##  conc ~ time | treatment + ID
## Data are dense PK.
## With 1 subjects defined in the 'ID' column.
## Nominal time column is not specified.
## 
## First 6 rows of concentration data:
##    study treatment ID time      conc   analyte exclude
##  Study 1     Trt 1  1    0 0.0000000 Analyte 1    <NA>
##  Study 1     Trt 1  1    1 0.6140526 Analyte 1    <NA>
##  Study 1     Trt 1  1    2 0.8100022 Analyte 1    <NA>
##  Study 1     Trt 1  1    4 0.8425422 Analyte 1    <NA>
##  Study 1     Trt 1  1    6 0.7771994 Analyte 1    <NA>
##  Study 1     Trt 1  1    8 0.7052469 Analyte 1    <NA>
# Use superposition to simulate multiple doses
ggplot(as.data.frame(d_conc)[as.data.frame(d_conc)$time <= 48,], aes(x=time, y=conc)) +
  geom_ribbon(data=as.data.frame(d_conc),
              aes(ymax=conc, ymin=0),
              fill="skyblue") +
  geom_point() + geom_line() +
  scale_x_continuous(breaks=seq(0, 72, by=12)) +
  scale_y_continuous(limits=c(0, NA)) +
  labs(x="Time Since First Dose (hr)",
       y="Concentration\n(arbitrary units)")

intervals_manual <-
  data.frame(
    start=0,
    end=Inf,
    auclast=TRUE,
    aucinf.obs=TRUE
  )
print(intervals_manual)
##   start end auclast aucinf.obs
## 1     0 Inf    TRUE       TRUE
my.data <- PKNCAdata(d_conc, intervals=intervals_manual)

Multiple Intervals

More than one interval may be specified for the same subject or group of subjects by providing more than one row of interval specifications. In the figure below, the blue and green shaded regions indicate the first and second rows of the intervals, respectively.

## Formula for concentration:
##  conc ~ time | treatment + ID
## Data are dense PK.
## With 1 subjects defined in the 'ID' column.
## Nominal time column is not specified.
## 
## First 6 rows of concentration data:
##    study treatment ID time      conc   analyte exclude
##  Study 1     Trt 1  1    0 0.0000000 Analyte 1    <NA>
##  Study 1     Trt 1  1    1 0.6140526 Analyte 1    <NA>
##  Study 1     Trt 1  1    2 0.8100022 Analyte 1    <NA>
##  Study 1     Trt 1  1    4 0.8425422 Analyte 1    <NA>
##  Study 1     Trt 1  1    6 0.7771994 Analyte 1    <NA>
##  Study 1     Trt 1  1    8 0.7052469 Analyte 1    <NA>
# Plot the concentration-time data and the interval
ggplot(d_conc_multi, aes(x=time, y=conc)) +
  geom_ribbon(data=d_conc_multi[d_conc_multi$time <= 24,],
              aes(ymax=conc, ymin=0),
              fill="skyblue") +
  geom_ribbon(data=d_conc_multi[d_conc_multi$time >= 144,],
              aes(ymax=conc, ymin=0),
              fill="lightgreen") +
  geom_point() + geom_line() +
  scale_x_continuous(breaks=seq(0, 168, by=12)) +
  scale_y_continuous(limits=c(0, NA)) +
  labs(x="Time Since First Dose (hr)",
       y="Concentration\n(arbitrary units)")

intervals_manual <-
  data.frame(
    start=c(0, 144),
    end=c(24, 168),
    auclast=TRUE
  )
knitr::kable(intervals_manual)
start end auclast
0 24 TRUE
144 168 TRUE
d_conc_multi_obj <- PKNCAconc(d_conc_multi, conc~time|treatment+ID)
my.data <- PKNCAdata(d_conc_multi_obj, intervals=intervals_manual)

Overlapping Intervals and Different Calculations by Interval

In some scenarios, multiple intervals may be needed where some intervals overlap. There is no issue with an interval specification that has two rows with overlapping times; the rows are considered separately. In the example below, the 0-24 interval is shared between both the first and second (shaded blue-green).

The example of overlapping intervals also illustrates that different calculations can be performed in different intervals. In this case, auclast is calculated in both intervals while aucinf.obs is only calculated in the 0-Inf interval.

## Formula for concentration:
##  conc ~ time | treatment + ID
## Data are dense PK.
## With 1 subjects defined in the 'ID' column.
## Nominal time column is not specified.
## 
## First 6 rows of concentration data:
##    study treatment ID time      conc   analyte exclude
##  Study 1     Trt 1  1    0 0.0000000 Analyte 1    <NA>
##  Study 1     Trt 1  1    1 0.6140526 Analyte 1    <NA>
##  Study 1     Trt 1  1    2 0.8100022 Analyte 1    <NA>
##  Study 1     Trt 1  1    4 0.8425422 Analyte 1    <NA>
##  Study 1     Trt 1  1    6 0.7771994 Analyte 1    <NA>
##  Study 1     Trt 1  1    8 0.7052469 Analyte 1    <NA>
# Use superposition to simulate multiple doses
ggplot(as.data.frame(d_conc), aes(x=time, y=conc)) +
  geom_ribbon(data=as.data.frame(d_conc),
              aes(ymax=conc, ymin=0),
              fill="lightgreen",
              alpha=0.5) +
  geom_ribbon(data=as.data.frame(d_conc)[as.data.frame(d_conc)$time <= 24,],
              aes(ymax=conc, ymin=0),
              fill="skyblue",
              alpha=0.5) +
  geom_point() + geom_line() +
  scale_x_continuous(breaks=seq(0, 168, by=12)) +
  scale_y_continuous(limits=c(0, NA)) +
  labs(x="Time Since First Dose (hr)",
       y="Concentration\n(arbitrary units)")

intervals_manual <-
  data.frame(
    start=0,
    end=c(24, Inf),
    auclast=TRUE,
    aucinf.obs=c(FALSE, TRUE)
  )
knitr::kable(intervals_manual)
start end auclast aucinf.obs
0 24 TRUE FALSE
0 Inf TRUE TRUE
my.data <- PKNCAdata(d_conc, intervals=intervals_manual)

Intervals with Duration

Some events have durations of times rather than instants in time associated with them. Two typical examples of duration data in NCA are intravenous infusions and urine or fecal sample collections. Inform PKNCA of durations with the duration argument to the PKNCAdose and PKNCAconc functions.

Duration data are selected for an interval by the event time, which is the time of the start of the duration (for example, the start of a urine collection). Like any other data point, a duration record is selected when its start time is at or after the interval start and at or before the interval end; the end of the duration is not considered. A collection that starts within the interval and ends after the interval end is therefore selected, and it contributes its full amount to calculations within the interval (the amount is not pro-rated to the portion of the duration inside the interval). For the simplest interpretation of results, align collection start and end times with the interval boundaries.

The figures below show which durations are selected for two intervals. The vertical arrows indicate the interval start and end, and each horizontal segment is a duration (for example, a urine collection) with tick marks at the collection boundaries. In the first figure, the interval is from 0 to 24, and all four durations are selected, including the duration from 24 to 48 because its start time is exactly at the interval end. In the second figure, the interval is from 0 to 16: the duration from 12 to 24 is selected because its start time is within the interval, even though the collection extends past the interval end (and its full amount contributes to the interval), while the duration from 24 to 48 is not selected.

Multiple-Dose MRT and Vss

The multiple-dose parameters mrt.md.obs, mrt.md.pred, vss.md.obs, and vss.md.pred measure MRT and Vss over a steady-state dosing interval instead of over a single dose.

These are the parameters to use when PK are nonlinear. When PK are linear, MRT and Vss can be measured from a single dose, and the single-dose parameters (mrt.obs, vss.obs, and similar) describe steady state as well. When PK are nonlinear they do not: clearance and volume at steady state differ from their values after the first dose, so MRT and Vss have to be measured over a steady-state interval.

Taking mrt.last over a dosing interval is not a substitute. AUMC divided by AUC over 0 to tau leaves out the drug still in the body at the end of the interval and underestimates MRT substantially. The multiple-dose parameters add the tau*(AUCinf - AUCtau)/AUCtau term that accounts for it.

The dosing interval comes from a tau column in the interval specification, and that column takes precedence whenever it is given:

intervals_md <-
  data.frame(
    start=0, end=24,
    tau=24,
    mrt.md.obs=TRUE, vss.md.obs=TRUE
  )

When no tau column is given, tau is detected from the dose times with find.tau(), which needs at least two doses in the dosing data. A steady-state design that records only the profiled dose has nothing that repeats, so it needs the tau column. If tau can be neither given nor detected, the parameters are NA with a warning rather than silently falling back to the single-dose equation.

Intravenous Infusions

For an IV infusion, use mrt.ivmd.obs, mrt.ivmd.pred, vss.ivmd.obs, and vss.ivmd.pred instead. They subtract half of the infusion duration, the same correction that mrt.iv.obs applies to the single-dose MRT. Without it, MRT is high by half the infusion duration and Vss is high by clearance times half the infusion duration.

Parameters Available for Calculation in an Interval

The following parameters are available in an interval. For more information about the parameter, see the documentation for the function.

Parameter Name Formula Formula Note Unit Type Parameter Description Function for Calculation
adj_tobit_residual unitless Adjusted Tobit residual SD See the parameter name: half.life
adj.r.squared radj2=1−(1−r2)n−1n−2r^2_{adj} = 1 - (1 - r^2) \frac{n-1}{n-2} unitless Adjusted R-sq of half-life fit See the parameter name: half.life
ae AE=∑iCiViAE = \sum_i C_i V_i amount Amount excreted (urine/feces) pk.calc.ae
aucabove.predose.all AUCabove,predose=∫max⁡(C(t)−Cstart,0)dtAUC_{\text{above,predose}} = \int \max(C(t) - C_{\text{start}},\; 0)\; dt auc AUC above predose, floor at 0 pk.calc.aucabove
aucabove.trough.all AUCabove,trough=∫max⁡(C(t)−Ctrough,0)dtAUC_{\text{above,trough}} = \int \max(C(t) - C_{\text{trough}},\; 0)\; dt auc AUC above trough, floor at 0 pk.calc.aucabove
aucall AUCall=∑kAUCk(Ck,Ck+1,tk,tk+1)AUC_{\text{all}} = \sum_{k} AUC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule (linear-up/log-down by default) auc AUClast plus triangle, 0 at BLQ pk.calc.auc.all
aucall.dn AUCall,dn=AUCallDoseAUC_{\text{all},dn} = \frac{AUC_{\text{all}}}{Dose} auc_dosenorm Dose normalized aucall pk.calc.dn
aucinf.obs AUC∞,obs=AUC0−last+Clast,obsλzAUC_{\infty,\text{obs}} = AUC_{0-\text{last}} + \frac{C_{\text{last,obs}}}{\lambda_z} auc AUC start to inf, obs Clast extrap pk.calc.auc.inf.obs
aucinf.obs.dn AUC∞,obs,dn=AUC∞,obsDoseAUC_{\infty,\text{obs},dn} = \frac{AUC_{\infty,\text{obs}}}{Dose} auc_dosenorm Dose normalized aucinf.obs pk.calc.dn
aucinf.pred AUC∞,pred=AUC0−last+Clast,predλzAUC_{\infty,\text{pred}} = AUC_{0-\text{last}} + \frac{C_{\text{last,pred}}}{\lambda_z} auc AUC start to inf, pred Clast extrap pk.calc.auc.inf.pred
aucinf.pred.dn AUC∞,pred,dn=AUC∞,predDoseAUC_{\infty,\text{pred},dn} = \frac{AUC_{\infty,\text{pred}}}{Dose} auc_dosenorm Dose normalized aucinf.pred pk.calc.dn
aucint.all AUCint,all=∑kAUCk(Ck,Ck+1,tk,tk+1)AUC_{\text{int,all}} = \sum_{k} AUC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries auc AUC from T1 to T2 (AUCall extrap) pk.calc.aucint.all
aucint.inf.obs AUCint,∞,obs=∑kAUCk(Ck,Ck+1,tk,tk+1)AUC_{\text{int,}\infty\text{,obs}} = \sum_{k} AUC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries auc AUC from T1 to T2 (AUCinf,obs extrap) pk.calc.aucint.inf.obs
aucint.inf.pred AUCint,∞,pred=∑kAUCk(Ck,Ck+1,tk,tk+1)AUC_{\text{int,}\infty\text{,pred}} = \sum_{k} AUC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries auc AUC from T1 to T2 (AUCinf,pred extrap) pk.calc.aucint.inf.pred
aucint.last AUCint,last=∑kAUCk(Ck,Ck+1,tk,tk+1)AUC_{\text{int,last}} = \sum_{k} AUC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries auc AUC from T1 to T2 (zero extrap) pk.calc.aucint.last
aucivall AUCiv,all=AUCall+AUC(C0,t1)−AUC(C(0),t1)AUC_{\text{iv,all}} = AUC_{\text{all}} + AUC(C_0, t_1) - AUC(C(0), t_1) auc AUCall, IV back-extrap C0 pk.calc.auciv
aucivinf.obs AUCiv,∞,obs=AUC∞,obs+AUC(C0,t1)−AUC(C(0),t1)AUC_{\text{iv,}\infty\text{,obs}} = AUC_{\infty,\text{obs}} + AUC(C_0, t_1) - AUC(C(0), t_1) auc AUCinf.obs, IV back-extrap C0 pk.calc.auciv
aucivinf.pred AUCiv,∞,pred=AUC∞,pred+AUC(C0,t1)−AUC(C(0),t1)AUC_{\text{iv,}\infty\text{,pred}} = AUC_{\infty,\text{pred}} + AUC(C_0, t_1) - AUC(C(0), t_1) auc AUCinf.pred, IV back-extrap C0 pk.calc.auciv
aucivint.all AUCiv,int,all=AUCint,all+AUC(C0,t1)−AUC(C(0),t1)AUC_{\text{iv,int,all}} = AUC_{\text{int,all}} + AUC(C_0, t_1) - AUC(C(0), t_1) auc AUCint.all, IV back-extrap C0 pk.calc.auciv
aucivint.last AUCiv,int,last=AUCint,last+AUC(C0,t1)−AUC(C(0),t1)AUC_{\text{iv,int,last}} = AUC_{\text{int,last}} + AUC(C_0, t_1) - AUC(C(0), t_1) auc AUCint.last, IV back-extrap C0 pk.calc.auciv
aucivlast AUCiv,last=AUClast+AUC(C0,t1)−AUC(C(0),t1)AUC_{\text{iv,last}} = AUC_{\text{last}} + AUC(C_0, t_1) - AUC(C(0), t_1) auc AUClast, IV back-extrap C0 pk.calc.auciv
aucivpbextall %AUCbext,all=100⋅(1−AUCallAUCiv,all)\%AUC_{\text{bext,all}} = 100 \cdot \left(1 - \frac{AUC_{\text{all}}}{AUC_{\text{iv,all}}}\right) % Back-extrap %, IV, AUCall pk.calc.auciv_pbext
aucivpbextinf.obs %AUCbext,∞,obs=100⋅(1−AUC∞,obsAUCiv,∞,obs)\%AUC_{\text{bext,}\infty\text{,obs}} = 100 \cdot \left(1 - \frac{AUC_{\infty,\text{obs}}}{AUC_{\text{iv,}\infty\text{,obs}}}\right) % Back-extrap %, IV, AUCinf.obs pk.calc.auciv_pbext
aucivpbextinf.pred %AUCbext,∞,pred=100⋅(1−AUC∞,predAUCiv,∞,pred)\%AUC_{\text{bext,}\infty\text{,pred}} = 100 \cdot \left(1 - \frac{AUC_{\infty,\text{pred}}}{AUC_{\text{iv,}\infty\text{,pred}}}\right) % Back-extrap %, IV, AUCinf.pred pk.calc.auciv_pbext
aucivpbextint.all %AUCbext,int,all=100⋅(1−AUCint,allAUCiv,int,all)\%AUC_{\text{bext,int,all}} = 100 \cdot \left(1 - \frac{AUC_{\text{int,all}}}{AUC_{\text{iv,int,all}}}\right) % Back-extrap %, IV, AUCint.all pk.calc.auciv_pbext
aucivpbextint.last %AUCbext,int,last=100⋅(1−AUCint,lastAUCiv,int,last)\%AUC_{\text{bext,int,last}} = 100 \cdot \left(1 - \frac{AUC_{\text{int,last}}}{AUC_{\text{iv,int,last}}}\right) % Back-extrap %, IV, AUCint.last pk.calc.auciv_pbext
aucivpbextlast %AUCbext,last=100⋅(1−AUClastAUCiv,last)\%AUC_{\text{bext,last}} = 100 \cdot \left(1 - \frac{AUC_{\text{last}}}{AUC_{\text{iv,last}}}\right) % Back-extrap %, IV, AUClast pk.calc.auciv_pbext
auclast AUClast=∑kAUCk(Ck,Ck+1,tk,tk+1)AUC_{\text{last}} = \sum_{k} AUC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule (linear-up/log-down by default) auc AUC start to last conc above LOQ pk.calc.auc.last
auclast_df df=(∑wi2σ̂ii/ni)2∑wi4σ̂ii2/(ni2(ni−1))df = \frac{\left(\sum w_i^2 \hat{\sigma}_{ii}/n_i\right)^2}{\sum w_i^4 \hat{\sigma}_{ii}^2 / (n_i^2(n_i-1))} Satterthwaite approximation (Nedelman et al 1995, eq. 6a) count DF for AUClast (sparse PK only) See the parameter name: auclast
auclast_se SE(AUClast)=∑i,jwiwjσ̂ij/nSE(AUC_{\text{last}}) = \sqrt{\sum_{i,j} w_i w_j \hat{\sigma}_{ij} / n} Variance from weighted covariance across subjects (Nedelman and Jia 1998, Holder 2001) auc SE of AUClast (sparse PK only) See the parameter name: auclast
auclast.dn AUClast,dn=AUClastDoseAUC_{\text{last},dn} = \frac{AUC_{\text{last}}}{Dose} auc_dosenorm Dose normalized auclast pk.calc.dn
aucpext.obs %AUCext,obs=100⋅(1−AUClastAUC∞,obs)\%AUC_{\text{ext,obs}} = 100 \cdot \left(1 - \frac{AUC_{\text{last}}}{AUC_{\infty,\text{obs}}}\right) % % AUCinf extrap after Tlast, obs pk.calc.aucpext
aucpext.pred %AUCext,pred=100⋅(1−AUClastAUC∞,pred)\%AUC_{\text{ext,pred}} = 100 \cdot \left(1 - \frac{AUC_{\text{last}}}{AUC_{\infty,\text{pred}}}\right) % % AUCinf extrap after Tlast, pred pk.calc.aucpext
aumcall AUMCall=∑kAUMCk(Ck,Ck+1,tk,tk+1)AUMC_{\text{all}} = \sum_{k} AUMC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule (linear-up/log-down by default) aumc AUMClast plus triangle moment, 0 at BLQ pk.calc.aumc.all
aumcall.dn AUMCall,dn=AUMCallDoseAUMC_{\text{all},dn} = \frac{AUMC_{\text{all}}}{Dose} aumc_dosenorm Dose normalized aumcall pk.calc.dn
aumcinf.obs AUMC∞,obs=AUMC0−last+Clast,obsTlastλz+Clast,obsλz2AUMC_{\infty,\text{obs}} = AUMC_{0-\text{last}} + \frac{C_{\text{last,obs}} T_{\text{last}}}{\lambda_z} + \frac{C_{\text{last,obs}}}{\lambda_z^2} aumc AUMC start to inf, obs Clast extrap pk.calc.aumc.inf.obs
aumcinf.obs.dn AUMC∞,obs,dn=AUMC∞,obsDoseAUMC_{\infty,\text{obs},dn} = \frac{AUMC_{\infty,\text{obs}}}{Dose} aumc_dosenorm Dose normalized aumcinf.obs pk.calc.dn
aumcinf.pred AUMC∞,pred=AUMC0−last+Clast,predTlastλz+Clast,predλz2AUMC_{\infty,\text{pred}} = AUMC_{0-\text{last}} + \frac{C_{\text{last,pred}} T_{\text{last}}}{\lambda_z} + \frac{C_{\text{last,pred}}}{\lambda_z^2} aumc AUMC start to inf, pred Clast extrap pk.calc.aumc.inf.pred
aumcinf.pred.dn AUMC∞,pred,dn=AUMC∞,predDoseAUMC_{\infty,\text{pred},dn} = \frac{AUMC_{\infty,\text{pred}}}{Dose} aumc_dosenorm Dose normalized aumcinf.pred pk.calc.dn
aumcint.all AUMCint,all=∑kAUMCk(Ck,Ck+1,tk,tk+1)AUMC_{\text{int,all}} = \sum_{k} AUMC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries aumc AUMC from T1 to T2 (AUMCall extrap) pk.calc.aumcint.all
aumcint.inf.obs AUMCint,∞,obs=∑kAUMCk(Ck,Ck+1,tk,tk+1)AUMC_{\text{int,}\infty\text{,obs}} = \sum_{k} AUMC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries aumc AUMC from T1 to T2 (AUMCinf,obs extrap) pk.calc.aumcint.inf.obs
aumcint.inf.pred AUMCint,∞,pred=∑kAUMCk(Ck,Ck+1,tk,tk+1)AUMC_{\text{int,}\infty\text{,pred}} = \sum_{k} AUMC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries aumc AUMC from T1 to T2 (AUMCinf,pred extrap) pk.calc.aumcint.inf.pred
aumcint.last AUMCint,last=∑kAUMCk(Ck,Ck+1,tk,tk+1)AUMC_{\text{int,last}} = \sum_{k} AUMC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule with interpolation at interval boundaries aumc AUMC from T1 to T2 (zero extrap) pk.calc.aumcint.last
aumcivall aumc AUMCall, IV back-extrap C0 pk.calc.aumciv
aumcivinf.obs aumc AUMCinf.obs, IV back-extrap C0 pk.calc.aumciv
aumcivinf.pred aumc AUMCinf.pred, IV back-extrap C0 pk.calc.aumciv
aumcivint.all aumc AUMCint.all, IV back-extrap C0 pk.calc.aumciv
aumcivint.last aumc AUMCint.last, IV back-extrap C0 pk.calc.aumciv
aumcivlast aumc AUMClast, IV back-extrap C0 pk.calc.aumciv
aumclast AUMClast=∑kAUMCk(Ck,Ck+1,tk,tk+1)AUMC_{\text{last}} = \sum_{k} AUMC_k(C_k, C_{k+1}, t_k, t_{k+1}) Trapezoidal rule (linear-up/log-down by default) aumc AUMC start to last conc above LOQ pk.calc.aumc.last
aumclast_df df=(∑wi2σ̂ii/ni)2∑wi4σ̂ii2/(ni2(ni−1))df = \frac{\left(\sum w_i^2 \hat{\sigma}_{ii}/n_i\right)^2}{\sum w_i^4 \hat{\sigma}_{ii}^2 / (n_i^2(n_i-1))} Satterthwaite approximation (Nedelman et al 1995, eq. 6a) count DF for AUMClast (sparse PK only) See the parameter name: aumclast
aumclast_se SE(AUMClast)=∑i,jwiwjσ̂ij/nSE(AUMC_{\text{last}}) = \sqrt{\sum_{i,j} w_i w_j \hat{\sigma}_{ij} / n} Variance from the weighted covariance of the moment curve across subjects aumc SE of AUMClast (sparse PK only) See the parameter name: aumclast
aumclast.dn AUMClast,dn=AUMClastDoseAUMC_{\text{last},dn} = \frac{AUMC_{\text{last}}}{Dose} aumc_dosenorm Dose normalized aumclast pk.calc.dn
c0 C0=if measured, Ct=0; else, C0=C1exp⁡(−ln⁡(C2)−ln⁡(C1)t2−t1(t1−tdose))C_0 = \text{if measured, } C_{t=0}; \text{ else, } C_0 = C_1 \exp\left(-\frac{\ln(C_2) - \ln(C_1)}{t_2-t_1} (t_1 - t_{\text{dose}})\right) Methods are tried in order: c0, logslope, c1, cmin, set0; the formula shows c0 and logslope conc Initial conc after IV bolus pk.calc.c0
cav Cav=AUClasttend−tstartC_{av} = \frac{AUC_{\text{last}}}{t_{end} - t_{start}} conc Avg conc in interval (AUClast) pk.calc.cav
cav.dn Cav,dn=CavDoseC_{av,dn} = \frac{C_{av}}{Dose} conc_dosenorm Dose normalized cav pk.calc.dn
cav.int.all Cav,int,all=AUCint,alltend−tstartC_{av,\text{int,all}} = \frac{AUC_{\text{int,all}}}{t_{end} - t_{start}} conc Avg conc in interval (AUCint.all) pk.calc.cav
cav.int.inf.obs Cav,int,∞,obs=AUCint,∞,obstend−tstartC_{av,\text{int,}\infty\text{,obs}} = \frac{AUC_{\text{int,}\infty\text{,obs}}}{t_{end} - t_{start}} conc Avg conc in interval (AUCint.inf.obs) pk.calc.cav
cav.int.inf.pred Cav,int,∞,pred=AUCint,∞,predtend−tstartC_{av,\text{int,}\infty\text{,pred}} = \frac{AUC_{\text{int,}\infty\text{,pred}}}{t_{end} - t_{start}} conc Avg conc in interval (AUCint.inf.pred) pk.calc.cav
cav.int.last Cav,int,last=AUCint,lasttend−tstartC_{av,\text{int,last}} = \frac{AUC_{\text{int,last}}}{t_{end} - t_{start}} conc Avg conc in interval (AUCint.last) pk.calc.cav
ceoi Ceoi=C(t=Tinf)C_{\text{eoi}} = C(t = T_{\text{inf}}) conc Concentration at the end of infusion pk.calc.ceoi
cl.all CLall=DoseAUCallCL_{\text{all}} = \frac{Dose}{AUC_{\text{all}}} clearance Clearance, AUCall pk.calc.cl
cl.int.all CLint,all=DoseAUCint,allCL_{\text{int,all}} = \frac{Dose}{AUC_{\text{int,all}}} clearance Clearance, AUCint.all pk.calc.cl
cl.int.inf.obs CLint,∞,obs=DoseAUCint,∞,obsCL_{\text{int,}\infty\text{,obs}} = \frac{Dose}{AUC_{\text{int,}\infty\text{,obs}}} clearance Clearance, AUCint.inf.obs pk.calc.cl
cl.int.inf.pred CLint,∞,pred=DoseAUCint,∞,predCL_{\text{int,}\infty\text{,pred}} = \frac{Dose}{AUC_{\text{int,}\infty\text{,pred}}} clearance Clearance, AUCint.inf.pred pk.calc.cl
cl.int.last CLint,last=DoseAUCint,lastCL_{\text{int,last}} = \frac{Dose}{AUC_{\text{int,last}}} clearance Clearance, AUCint.last pk.calc.cl
cl.iv.all CLiv,all=DoseivAUCiv,allCL_{\text{iv,all}} = \frac{Dose_{\text{iv}}}{AUC_{\text{iv,all}}} clearance IV clearance, AUCall pk.calc.cl
cl.iv.last CLiv,last=DoseivAUCiv,lastCL_{\text{iv,last}} = \frac{Dose_{\text{iv}}}{AUC_{\text{iv,last}}} clearance IV clearance, AUClast pk.calc.cl
cl.iv.obs CLiv,obs=DoseivAUCiv,∞,obsCL_{\text{iv,obs}} = \frac{Dose_{\text{iv}}}{AUC_{\text{iv,}\infty\text{,obs}}} clearance IV clearance, AUCinf.obs pk.calc.cl
cl.iv.pred CLiv,pred=DoseivAUCiv,∞,predCL_{\text{iv,pred}} = \frac{Dose_{\text{iv}}}{AUC_{\text{iv,}\infty\text{,pred}}} clearance IV clearance, AUCinf.pred pk.calc.cl
cl.ivint.all CLiv,int,all=DoseivAUCiv,int,allCL_{\text{iv,int,all}} = \frac{Dose_{\text{iv}}}{AUC_{\text{iv,int,all}}} clearance IV clearance, AUCint.all pk.calc.cl
cl.ivint.last CLiv,int,last=DoseivAUCiv,int,lastCL_{\text{iv,int,last}} = \frac{Dose_{\text{iv}}}{AUC_{\text{iv,int,last}}} clearance IV clearance, AUCint.last pk.calc.cl
cl.last CLlast=DoseAUClastCL_{\text{last}} = \frac{Dose}{AUC_{\text{last}}} clearance Clearance, AUClast pk.calc.cl
cl.obs CLobs=DoseAUC∞,obsCL_{\text{obs}} = \frac{Dose}{AUC_{\infty,\text{obs}}} clearance Clearance, observed Clast pk.calc.cl
cl.pred CLpred=DoseAUC∞,predCL_{\text{pred}} = \frac{Dose}{AUC_{\infty,\text{pred}}} clearance Clearance, predicted Clast pk.calc.cl
cl.sparse.last CLsparse,last=DoseAUCsparse,lastCL_{\text{sparse,last}} = \frac{Dose}{AUC_{\text{sparse,last}}} clearance Clearance, sparse AUClast pk.calc.cl
clast.obs Clast,obs=Ci:ti=TlastC_{\text{last,obs}} = C_{i: t_i = T_{\text{last}}} conc Last conc observed above LOQ pk.calc.clast.obs
clast.obs.dn Clast,obs,dn=Clast,obsDoseC_{\text{last,obs},dn} = \frac{C_{\text{last,obs}}}{Dose} conc_dosenorm Dose normalized clast.obs pk.calc.dn
clast.pred Clast,pred=eintercept−λz⋅tlastC_{\text{last,pred}} = e^{\text{intercept} - \lambda_z \cdot t_{\text{last}}} conc Predicted Clast from half-life See the parameter name: half.life
clast.pred.dn Clast,pred,dn=Clast,predDoseC_{\text{last,pred},dn} = \frac{C_{\text{last,pred}}}{Dose} conc_dosenorm Dose normalized clast.pred pk.calc.dn
clr.last CLR,last=AEAUClastCL_{R,\text{last}} = \frac{AE}{AUC_{\text{last}}} renal_clearance Renal clearance, AUClast pk.calc.clr
clr.last.dn CLR,last,dn=CLR,lastDoseCL_{R,\text{last},dn} = \frac{CL_{R,\text{last}}}{Dose} renal_clearance_dosenorm Dose normalized clr.last pk.calc.dn
clr.obs CLR,obs=AEAUC∞,obsCL_{R,\text{obs}} = \frac{AE}{AUC_{\infty,\text{obs}}} renal_clearance Renal clearance, AUCinf,obs pk.calc.clr
clr.obs.dn CLR,obs,dn=CLR,obsDoseCL_{R,\text{obs},dn} = \frac{CL_{R,\text{obs}}}{Dose} renal_clearance_dosenorm Dose normalized clr.obs pk.calc.dn
clr.pred CLR,pred=AEAUC∞,predCL_{R,\text{pred}} = \frac{AE}{AUC_{\infty,\text{pred}}} renal_clearance Renal clearance, AUCinf,pred pk.calc.clr
clr.pred.dn CLR,pred,dn=CLR,predDoseCL_{R,\text{pred},dn} = \frac{CL_{R,\text{pred}}}{Dose} renal_clearance_dosenorm Dose normalized clr.pred pk.calc.dn
cmax Cmax=max⁡iCiC_{\max} = \max_i C_i conc Maximum observed concentration pk.calc.cmax
cmax.dn Cmax⁡,dn=CmaxDoseC_{\max,dn} = \frac{C_{\max}}{Dose} conc_dosenorm Dose normalized cmax pk.calc.dn
cmin Cmin=min⁡iCiC_{\min} = \min_i C_i conc Minimum observed concentration pk.calc.cmin
cmin.dn Cmin⁡,dn=CminDoseC_{\min,dn} = \frac{C_{\min}}{Dose} conc_dosenorm Dose normalized cmin pk.calc.dn
count_conc nconc=∑i𝟏(Ci≠NA)n_{\text{conc}} = \sum_{i} \mathbf{1}(C_i \neq NA) count Count of non-missing conc pk.calc.count_conc
count_conc_measured nmeasured=∑i𝟏(Ci>0)n_{\text{measured}} = \sum_{i} \mathbf{1}(C_i > 0) count Count of measured, non-BLQ conc pk.calc.count_conc_measured
cstart Cstart=C(tstart)C_{\text{start}} = C(t_{\text{start}}) conc The predose concentration pk.calc.cstart
ctrough Ctrough=C(tend)C_{\text{trough}} = C(t_{\text{end}}) conc Trough (end of interval) conc pk.calc.ctrough
ctrough.dn Ctrough,dn=CtroughDoseC_{\text{trough},dn} = \frac{C_{\text{trough}}}{Dose} conc_dosenorm Dose normalized ctrough pk.calc.dn
deg.fluc DF=100⋅Cmax−CminCavDF = 100 \cdot \frac{C_{\max} - C_{\min}}{C_{av}} % Degree of fluctuation pk.calc.deg.fluc
erint ERT1→T2=AeT2−T1ER_{T_1 \rightarrow T_2} = \frac{A_e}{T_2 - T_1} Amount recovered during the interval divided by the interval duration amount_time Excretion rate from T1 to T2 pk.calc.erint
erlst ERlast=ClVldlER_{\text{last}} = \frac{C_l V_l}{d_l} The last collection with a nonzero excretion rate, ordered by collection midpoint amount_time Last measurable excretion rate pk.calc.erlst
ermax ERmax=max⁡i(CiVidi)ER_{\max} = \max_i \left( \frac{C_i V_i}{d_i} \right) amount_time Maximum excretion rate pk.calc.ermax
ertlst Tlast,ER=tmid,i:ERi>0,i=maxT_{\text{last,ER}} = t_{\text{mid},i: ER_i > 0, i = \max} time Midpoint time of last excr rate pk.calc.ertlst
ertmax Tmax⁡,ER=tmid,i:ERi=ERmaxT_{\max,ER} = t_{\text{mid},i: ER_i = ER_{\max}} time Midpoint time of max excr rate pk.calc.ertmax
f.int.all F=AUCint,all,2/Dose2AUCint,all,1/Dose1F = \frac{AUC_{int,all,2} / Dose_2}{AUC_{int,all,1} / Dose_1} fraction Bioavailability from AUCint,all pk.calc.f
f.int.last F=AUCint,last,2/Dose2AUCint,last,1/Dose1F = \frac{AUC_{int,last,2} / Dose_2}{AUC_{int,last,1} / Dose_1} fraction Bioavailability from AUCint,last pk.calc.f
f.int.obs F=AUCint,∞,obs,2/Dose2AUCint,∞,obs,1/Dose1F = \frac{AUC_{int,\infty,obs,2} / Dose_2}{AUC_{int,\infty,obs,1} / Dose_1} fraction Bioavailability from AUCint,inf,obs pk.calc.f
f.int.pred F=AUCint,∞,pred,2/Dose2AUCint,∞,pred,1/Dose1F = \frac{AUC_{int,\infty,pred,2} / Dose_2}{AUC_{int,\infty,pred,1} / Dose_1} fraction Bioavailability from AUCint,inf,pred pk.calc.f
f.last F=AUClast,2/Dose2AUClast,1/Dose1F = \frac{AUC_{last,2} / Dose_2}{AUC_{last,1} / Dose_1} fraction Bioavailability from AUClast pk.calc.f
f.obs F=AUC∞,obs,2/Dose2AUC∞,obs,1/Dose1F = \frac{AUC_{\infty,obs,2} / Dose_2}{AUC_{\infty,obs,1} / Dose_1} fraction Bioavailability from AUCinf,obs pk.calc.f
f.pred F=AUC∞,pred,2/Dose2AUC∞,pred,1/Dose1F = \frac{AUC_{\infty,pred,2} / Dose_2}{AUC_{\infty,pred,1} / Dose_1} fraction Bioavailability from AUCinf,pred pk.calc.f
fe fe=AEDosef_e = \frac{AE}{Dose} amount_dose Fraction of dose excreted pk.calc.fe
half.life t1/2=ln⁡(2)λzt_{1/2} = \frac{\ln(2)}{\lambda_z} time The (terminal) half-life pk.calc.half.life
kel.all kel,all=1MRTallk_{el,\text{all}} = \frac{1}{MRT_{\text{all}}} inverse_time Elim rate, MRTall pk.calc.kel
kel.int.all kel,int,all=1MRTint,allk_{el,\text{int,all}} = \frac{1}{MRT_{\text{int,all}}} inverse_time Elim rate, MRTint.all pk.calc.kel
kel.int.inf.obs kel,int,∞,obs=1MRTint,∞,obsk_{el,\text{int,}\infty\text{,obs}} = \frac{1}{MRT_{\text{int,}\infty\text{,obs}}} inverse_time Elim rate, MRTint.inf.obs pk.calc.kel
kel.int.inf.pred kel,int,∞,pred=1MRTint,∞,predk_{el,\text{int,}\infty\text{,pred}} = \frac{1}{MRT_{\text{int,}\infty\text{,pred}}} inverse_time Elim rate, MRTint.inf.pred pk.calc.kel
kel.int.last kel,int,last=1MRTint,lastk_{el,\text{int,last}} = \frac{1}{MRT_{\text{int,last}}} inverse_time Elim rate, MRTint.last pk.calc.kel
kel.iv.all inverse_time Elim rate, IV MRTall pk.calc.kel
kel.iv.last kel,iv,last=1MRTiv,lastk_{el,\text{iv,last}} = \frac{1}{MRT_{\text{iv,last}}} inverse_time Elim rate, IV MRTlast pk.calc.kel
kel.iv.obs kel,iv,obs=1MRTiv,obsk_{el,\text{iv,obs}} = \frac{1}{MRT_{\text{iv,obs}}} inverse_time Elim rate, IV MRTobs pk.calc.kel
kel.iv.pred kel,iv,pred=1MRTiv,predk_{el,\text{iv,pred}} = \frac{1}{MRT_{\text{iv,pred}}} inverse_time Elim rate, IV MRTpred pk.calc.kel
kel.ivint.all inverse_time Elim rate, IV MRTint.all pk.calc.kel
kel.ivint.last inverse_time Elim rate, IV MRTint.last pk.calc.kel
kel.last kel,last=1MRTlastk_{el,\text{last}} = \frac{1}{MRT_{\text{last}}} inverse_time Elim rate, MRT via AUClast pk.calc.kel
kel.obs kel,obs=1MRTobsk_{el,\text{obs}} = \frac{1}{MRT_{\text{obs}}} inverse_time Elim rate, MRT w/ obs Clast pk.calc.kel
kel.pred kel,pred=1MRTpredk_{el,\text{pred}} = \frac{1}{MRT_{\text{pred}}} inverse_time Elim rate, MRT w/ pred Clast pk.calc.kel
kel.sparse.last inverse_time Elim rate, sparse MRTlast pk.calc.kel
lambda.z λz=−slope of log⁡(C) vs t\lambda_z = -\text{slope of } \log(C) \text{ vs } t inverse_time Terminal elim rate (lambda.z) See the parameter name: half.life
lambda.z.corrxy rt,log⁡C=cor(tλz,log⁡Cλz)r_{t,\log C} = \text{cor}(t_{\lambda_z}, \log C_{\lambda_z}) unitless Corr(time,log-conc) for lambda.z See the parameter name: half.life
lambda.z.n.points $n_{\lambda_z} = \left&#124; t_{\lambda_z} \right&#124;$ count Number of points used, lambda.z See the parameter name: half.life
lambda.z.n.points_blq count BLQ points in Tobit lambda.z See the parameter name: half.life
lambda.z.time.first λztfirst=min⁡(tλz)\lambda_z t_{\text{first}} = \min\left(t_{\lambda_z}\right) time First time point for lambda.z See the parameter name: half.life
lambda.z.time.last λztlast=max⁡(tλz)\lambda_z t_{\text{last}} = \max\left(t_{\lambda_z}\right) time Last time point for lambda.z See the parameter name: half.life
mrt.all MRTall=AUMCallAUCallMRT_{\text{all}} = \frac{AUMC_{\text{all}}}{AUC_{\text{all}}} time MRT, AUCall/AUMCall pk.calc.mrt
mrt.int.all MRTint,all=AUMCint,allAUCint,allMRT_{\text{int,all}} = \frac{AUMC_{\text{int,all}}}{AUC_{\text{int,all}}} time MRT, interval AUCall/AUMCall pk.calc.mrt
mrt.int.inf.obs MRTint,∞,obs=AUMCint,∞,obsAUCint,∞,obsMRT_{\text{int,}\infty\text{,obs}} = \frac{AUMC_{\text{int,}\infty\text{,obs}}}{AUC_{\text{int,}\infty\text{,obs}}} time MRT, interval AUC/AUMCinf obs pk.calc.mrt
mrt.int.inf.pred MRTint,∞,pred=AUMCint,∞,predAUCint,∞,predMRT_{\text{int,}\infty\text{,pred}} = \frac{AUMC_{\text{int,}\infty\text{,pred}}}{AUC_{\text{int,}\infty\text{,pred}}} time MRT, interval AUC/AUMCinf pred pk.calc.mrt
mrt.int.last MRTint,last=AUMCint,lastAUCint,lastMRT_{\text{int,last}} = \frac{AUMC_{\text{int,last}}}{AUC_{\text{int,last}}} time MRT, interval AUClast/AUMClast pk.calc.mrt
mrt.iv.all time IV MRT, AUCall/AUMCall pk.calc.mrt.iv
mrt.iv.last MRTiv,last=AUMClastAUClast−Tinf2MRT_{\text{iv,last}} = \frac{AUMC_{\text{last}}}{AUC_{\text{last}}} - \frac{T_{\text{inf}}}{2} time IV MRT, AUClast/AUMClast pk.calc.mrt.iv
mrt.iv.obs MRTiv,obs=AUMC∞,obsAUC∞,obs−Tinf2MRT_{\text{iv,obs}} = \frac{AUMC_{\infty,\text{obs}}}{AUC_{\infty,\text{obs}}} - \frac{T_{\text{inf}}}{2} time IV MRT, AUCinf.obs/AUMCinf.obs pk.calc.mrt.iv
mrt.iv.pred MRTiv,pred=AUMC∞,predAUC∞,pred−Tinf2MRT_{\text{iv,pred}} = \frac{AUMC_{\infty,\text{pred}}}{AUC_{\infty,\text{pred}}} - \frac{T_{\text{inf}}}{2} time IV MRT, AUCinf.pred/AUMCinf.pred pk.calc.mrt.iv
mrt.ivint.all time IV MRT, interval AUC/AUMCall pk.calc.mrt.iv
mrt.ivint.last time IV MRT, interval AUC/AUMClast pk.calc.mrt.iv
mrt.ivmd.obs MRTivmd,obs=AUMClastAUClast+τ⋅AUC∞,obs−AUClastAUClast−Tinf2MRT_{\text{ivmd,obs}} = \frac{AUMC_{\text{last}}}{AUC_{\text{last}}} + \tau \cdot \frac{AUC_{\infty,\text{obs}} - AUC_{\text{last}}}{AUC_{\text{last}}} - \frac{T_{\text{inf}}}{2} time IV MRT, multi-dose, AUCinf.obs pk.calc.mrt.md.iv
mrt.ivmd.pred MRTivmd,pred=AUMClastAUClast+τ⋅AUC∞,pred−AUClastAUClast−Tinf2MRT_{\text{ivmd,pred}} = \frac{AUMC_{\text{last}}}{AUC_{\text{last}}} + \tau \cdot \frac{AUC_{\infty,\text{pred}} - AUC_{\text{last}}}{AUC_{\text{last}}} - \frac{T_{\text{inf}}}{2} time IV MRT, multi-dose, AUCinf.pred pk.calc.mrt.md.iv
mrt.last MRTlast=AUMClastAUClastMRT_{\text{last}} = \frac{AUMC_{\text{last}}}{AUC_{\text{last}}} time MRT, AUClast/AUMClast pk.calc.mrt
mrt.md.obs MRTmd,obs=AUMClastAUClast+τ⋅AUC∞,obs−AUClastAUClastMRT_{\text{md,obs}} = \frac{AUMC_{\text{last}}}{AUC_{\text{last}}} + \tau \cdot \frac{AUC_{\infty,\text{obs}} - AUC_{\text{last}}}{AUC_{\text{last}}} time MRT, multi-dose AUCinf.obs/AUMCinf.obs pk.calc.mrt.md
mrt.md.pred MRTmd,pred=AUMClastAUClast+τ⋅AUC∞,pred−AUClastAUClastMRT_{\text{md,pred}} = \frac{AUMC_{\text{last}}}{AUC_{\text{last}}} + \tau \cdot \frac{AUC_{\infty,\text{pred}} - AUC_{\text{last}}}{AUC_{\text{last}}} time MRT, multi-dose AUCinf.pred/AUMCinf.pred pk.calc.mrt.md
mrt.obs MRTobs=AUMC∞,obsAUC∞,obsMRT_{\text{obs}} = \frac{AUMC_{\infty,\text{obs}}}{AUC_{\infty,\text{obs}}} time MRT to inf, observed Clast pk.calc.mrt
mrt.pred MRTpred=AUMC∞,predAUC∞,predMRT_{\text{pred}} = \frac{AUMC_{\infty,\text{pred}}}{AUC_{\infty,\text{pred}}} time MRT to inf, predicted Clast pk.calc.mrt
mrt.sparse.last time MRT, sparse AUClast/AUMClast pk.calc.mrt
ptr PTR=CmaxCtroughPTR = \frac{C_{\max}}{C_{\text{trough}}} fraction Peak-to-trough ratio pk.calc.ptr
r.squared r2=1−∑i∈λz(yi−ŷi)2∑i∈λz(yi−y‾)2r^2 = 1 - \frac{\sum_{i \in \lambda_z} (y_i - \hat{y}_i)^2}{\sum_{i \in \lambda_z} (y_i - \bar{y})^2} Regression of y=log⁡Cy = \log C on time over the terminal points unitless R-squared of half-life fit See the parameter name: half.life
ratio.aucinf.obs fraction Ratio of AUCinf,obs to reference pk.calc.ratio
ratio.aucinf.pred fraction Ratio of AUCinf,pred to reference pk.calc.ratio
ratio.aucint.all fraction Ratio of AUCint,all to reference pk.calc.ratio
ratio.aucint.last fraction Ratio of AUCint,last to reference pk.calc.ratio
ratio.auclast fraction Ratio of AUClast to reference pk.calc.ratio
ratio.cmax fraction Ratio of Cmax to reference pk.calc.ratio
span.ratio span ratio=tλz,last−tλz,firstt1/2\text{span ratio} = \frac{t_{\lambda_z,\text{last}} - t_{\lambda_z,\text{first}}}{t_{1/2}} fraction Lambda z time span to half-life ratio See the parameter name: half.life
sparse_auc_df df=(∑wi2σ̂ii/ni)2∑wi4σ̂ii2/(ni2(ni−1))df = \frac{\left(\sum w_i^2 \hat{\sigma}_{ii}/n_i\right)^2}{\sum w_i^4 \hat{\sigma}_{ii}^2 / (n_i^2(n_i-1))} Satterthwaite approximation (Nedelman et al 1995, eq. 6a) count DF for sparse AUC to last conc above LOQ See the parameter name: sparse_auclast
sparse_auc_se SE(AUCsparse)=∑i,jwiwjσ̂ij/nSE(AUC_{\text{sparse}}) = \sqrt{\sum_{i,j} w_i w_j \hat{\sigma}_{ij} / n} Variance from weighted covariance across subjects (Nedelman and Jia 1998, Holder 2001) auc SE of sparse AUC to last conc above LOQ See the parameter name: sparse_auclast
sparse_auclast AUCsparse=∑kC‾k+C‾k+12ΔtkAUC_{\text{sparse}} = \sum_k \frac{\bar{C}_k + \bar{C}_{k+1}}{2} \Delta t_k Linear trapezoidal using population mean concentrations auc Sparse AUC to last conc above LOQ pk.calc.sparse_auclast
sparse_aumc_df count variance DF for sparse AUMC to Tlast See the parameter name: sparse_aumclast
sparse_aumc_se aumc SE of sparse AUMC to last conc above LOQ See the parameter name: sparse_aumclast
sparse_aumclast aumc Sparse AUMC to last conc above LOQ pk.calc.sparse_aumclast
swing Swing=100⋅Cmax−CminCminSwing = 100 \cdot \frac{C_{\max} - C_{\min}}{C_{\min}} % Swing relative to Cmin pk.calc.swing
tfirst Tfirst=ti:Ci>0,i=minT_{\text{first}} = t_{i: C_i > 0, i = \min} time Time of first conc above LOQ pk.calc.tfirst
thalf.eff.iv.last t1/2,eff,iv,last=ln⁡(2)⋅MRTiv,lastt_{1/2,\text{eff,iv,last}} = \ln(2) \cdot MRT_{\text{iv,last}} time Effective half-life, IV MRTlast pk.calc.thalf.eff
thalf.eff.iv.obs t1/2,eff,iv,obs=ln⁡(2)⋅MRTiv,obst_{1/2,\text{eff,iv,obs}} = \ln(2) \cdot MRT_{\text{iv,obs}} time Effective half-life, IV MRTobs pk.calc.thalf.eff
thalf.eff.iv.pred t1/2,eff,iv,pred=ln⁡(2)⋅MRTiv,predt_{1/2,\text{eff,iv,pred}} = \ln(2) \cdot MRT_{\text{iv,pred}} time Effective half-life, IV MRTpred pk.calc.thalf.eff
thalf.eff.last t1/2,eff,last=ln⁡(2)⋅MRTlastt_{1/2,\text{eff,last}} = \ln(2) \cdot MRT_{\text{last}} time Effective half-life, MRTlast pk.calc.thalf.eff
thalf.eff.obs t1/2,eff,obs=ln⁡(2)⋅MRTobst_{1/2,\text{eff,obs}} = \ln(2) \cdot MRT_{\text{obs}} time Effective half-life, MRTobs pk.calc.thalf.eff
thalf.eff.pred t1/2,eff,pred=ln⁡(2)⋅MRTpredt_{1/2,\text{eff,pred}} = \ln(2) \cdot MRT_{\text{pred}} time Effective half-life, MRTpred pk.calc.thalf.eff
time_above Tabove=∑Δti:Ci≥CrefT_{\text{above}} = \sum \Delta t_{i: C_i \geq C_{\text{ref}}} Crossing times interpolated using the AUC method (linear or log-linear) time Time above a given concentration pk.calc.time_above
tlag Tlag=ti:Ci+1>Ci,i=minT_{\text{lag}} = t_{i: C_{i+1} > C_i, i = \min} time Lag time pk.calc.tlag
tlast Tlast=ti:Ci>0,i=maxT_{\text{last}} = t_{i: C_i > 0, i = \max} time Time of last conc above LOQ pk.calc.tlast
tmax Tmax=ti:Ci=CmaxT_{\max} = t_{i: C_i = C_{\max}} time Time of maximum observed conc pk.calc.tmax
tmin time Time of minimum observed conc pk.calc.tmin
tobit_residual unitless Tobit fit residual SD, log-conc See the parameter name: half.life
totdose Dosetotal=∑iDoseiDose_{\text{total}} = \sum_i Dose_i dose Total dose given in interval pk.calc.totdose
volpk Vurine=∑iViV_{\text{urine}} = \sum_i V_i volume Sum of urine volumes for interval pk.calc.volpk
vss.all Vss,all=CLall⋅MRTallV_{ss,\text{all}} = CL_{\text{all}} \cdot MRT_{\text{all}} volume Vss, calc from AUCall pk.calc.vss
vss.int.all Vss,int,all=CLint,all⋅MRTint,allV_{ss,\text{int,all}} = CL_{\text{int,all}} \cdot MRT_{\text{int,all}} volume Vss, calc from interval AUCint.all pk.calc.vss
vss.int.inf.obs Vss,int,∞,obs=CLint,∞,obs⋅MRTint,∞,obsV_{ss,\text{int,}\infty\text{,obs}} = CL_{\text{int,}\infty\text{,obs}} \cdot MRT_{\text{int,}\infty\text{,obs}} volume Vss, calc from interval AUCint.inf.obs pk.calc.vss
vss.int.inf.pred Vss,int,∞,pred=CLint,∞,pred⋅MRTint,∞,predV_{ss,\text{int,}\infty\text{,pred}} = CL_{\text{int,}\infty\text{,pred}} \cdot MRT_{\text{int,}\infty\text{,pred}} volume Vss, calc from interval AUCint.inf.pred pk.calc.vss
vss.int.last Vss,int,last=CLint,last⋅MRTint,lastV_{ss,\text{int,last}} = CL_{\text{int,last}} \cdot MRT_{\text{int,last}} volume Vss, calc from interval AUCint.last pk.calc.vss
vss.iv.all volume IV Vss, calc from AUCall pk.calc.vss
vss.iv.last Vss,iv,last=CLlast⋅MRTiv,lastV_{ss,\text{iv,last}} = CL_{\text{last}} \cdot MRT_{\text{iv,last}} volume IV Vss, calc from AUClast pk.calc.vss
vss.iv.obs Vss,iv,obs=CLobs⋅MRTiv,obsV_{ss,\text{iv,obs}} = CL_{\text{obs}} \cdot MRT_{\text{iv,obs}} volume IV Vss, observed Clast pk.calc.vss
vss.iv.pred Vss,iv,pred=CLpred⋅MRTiv,predV_{ss,\text{iv,pred}} = CL_{\text{pred}} \cdot MRT_{\text{iv,pred}} volume IV Vss, predicted Clast pk.calc.vss
vss.ivint.all volume IV Vss, calc from interval AUCint.all pk.calc.vss
vss.ivint.last volume IV Vss, calc from interval AUCint.last pk.calc.vss
vss.ivmd.obs Vss,ivmd,obs=CLlast⋅MRTivmd,obsV_{ss,\text{ivmd,obs}} = CL_{\text{last}} \cdot MRT_{\text{ivmd,obs}} volume IV Vss, multi-dose, obs pk.calc.vss
vss.ivmd.pred Vss,ivmd,pred=CLlast⋅MRTivmd,predV_{ss,\text{ivmd,pred}} = CL_{\text{last}} \cdot MRT_{\text{ivmd,pred}} volume IV Vss, multi-dose, pred pk.calc.vss
vss.last Vss,last=CLlast⋅MRTlastV_{ss,\text{last}} = CL_{\text{last}} \cdot MRT_{\text{last}} volume Vss, calc’d through Tlast pk.calc.vss
vss.md.obs Vss,md,obs=CLlast⋅MRTmd,obsV_{ss,\text{md,obs}} = CL_{\text{last}} \cdot MRT_{\text{md,obs}} volume Vss, multi-dose, obs pk.calc.vss
vss.md.pred Vss,md,pred=CLlast⋅MRTmd,predV_{ss,\text{md,pred}} = CL_{\text{last}} \cdot MRT_{\text{md,pred}} volume Vss, multi-dose, pred pk.calc.vss
vss.obs Vss,obs=CLobs⋅MRTobsV_{ss,\text{obs}} = CL_{\text{obs}} \cdot MRT_{\text{obs}} volume Vss, observed Clast pk.calc.vss
vss.pred Vss,pred=CLpred⋅MRTpredV_{ss,\text{pred}} = CL_{\text{pred}} \cdot MRT_{\text{pred}} volume Vss, predicted Clast pk.calc.vss
vss.sparse.last volume Vss, calc from sparse AUClast pk.calc.vss
vz.all Vz,all=CLallλzV_{z,\text{all}} = \frac{CL_{\text{all}}}{\lambda_z} volume Vz, AUCall-based CL pk.calc.vz
vz.int.all Vz,int,all=CLint,allλzV_{z,\text{int,all}} = \frac{CL_{\text{int,all}}}{\lambda_z} volume Vz, interval AUCint.all pk.calc.vz
vz.int.inf.obs Vz,int,∞,obs=CLint,∞,obsλzV_{z,\text{int,}\infty\text{,obs}} = \frac{CL_{\text{int,}\infty\text{,obs}}}{\lambda_z} volume Vz, interval AUCint.inf.obs pk.calc.vz
vz.int.inf.pred Vz,int,∞,pred=CLint,∞,predλzV_{z,\text{int,}\infty\text{,pred}} = \frac{CL_{\text{int,}\infty\text{,pred}}}{\lambda_z} volume Vz, interval AUCint.inf.pred pk.calc.vz
vz.int.last Vz,int,last=CLint,lastλzV_{z,\text{int,last}} = \frac{CL_{\text{int,last}}}{\lambda_z} volume Vz, interval AUCint.last pk.calc.vz
vz.iv.all Vz,iv,all=CLiv,allλzV_{z,\text{iv,all}} = \frac{CL_{\text{iv,all}}}{\lambda_z} volume IV Vz, AUCall pk.calc.vz
vz.iv.last Vz,iv,last=CLiv,lastλzV_{z,\text{iv,last}} = \frac{CL_{\text{iv,last}}}{\lambda_z} volume IV Vz, AUClast pk.calc.vz
vz.iv.obs Vz,iv,obs=CLiv,obsλzV_{z,\text{iv,obs}} = \frac{CL_{\text{iv,obs}}}{\lambda_z} volume IV Vz, observed AUCinf pk.calc.vz
vz.iv.pred Vz,iv,pred=CLiv,predλzV_{z,\text{iv,pred}} = \frac{CL_{\text{iv,pred}}}{\lambda_z} volume IV Vz, predicted AUCinf pk.calc.vz
vz.ivint.all Vz,iv,int,all=CLiv,int,allλzV_{z,\text{iv,int,all}} = \frac{CL_{\text{iv,int,all}}}{\lambda_z} volume IV Vz, interval AUCint.all pk.calc.vz
vz.ivint.last Vz,iv,int,last=CLiv,int,lastλzV_{z,\text{iv,int,last}} = \frac{CL_{\text{iv,int,last}}}{\lambda_z} volume IV Vz, interval AUCint.last pk.calc.vz
vz.last Vz,last=CLlastλzV_{z,\text{last}} = \frac{CL_{\text{last}}}{\lambda_z} volume Vz, AUClast-based CL pk.calc.vz
vz.obs Vz,obs=CLobsλzV_{z,\text{obs}} = \frac{CL_{\text{obs}}}{\lambda_z} volume Vz, observed Clast pk.calc.vz
vz.pred Vz,pred=CLpredλzV_{z,\text{pred}} = \frac{CL_{\text{pred}}}{\lambda_z} volume Vz, predicted Clast pk.calc.vz
vz.sparse.last Vz,sparse,last=CLsparse,lastλzV_{z,\text{sparse,last}} = \frac{CL_{\text{sparse,last}}}{\lambda_z} volume Vz from sparse sampling pk.calc.vz