## ----setup, echo=FALSE, include=FALSE-----------------------------------------
library(PKNCA)

## ----setup_data---------------------------------------------------------------
library(PKNCA)
library(dplyr, quietly=TRUE)

## Load the PK concentration data
d_conc <-
  as.data.frame(datasets::Theoph) %>%
  mutate(Subject=as.numeric(as.character(Subject)))
## Generate the dosing data
d_dose <- d_conc[d_conc$Time == 0,]
d_dose$Time <- 0

## Create a concentration object specifying the concentration, time, and
## subject columns.  (Note that any number of grouping levels is
## supported; you are not restricted to just grouping by subject.)
conc_obj <-
  PKNCAconc(
    d_conc,
    conc~Time|Subject
  )
## Create a dosing object specifying the dose, time, and subject
## columns.  (Note that the grouping factors should be the same as or a
## subset of the grouping factors for concentration, and the grouping
## columns must have the same names between concentration and dose
## objects.)
dose_obj <-
  PKNCAdose(
    d_dose,
    Dose~Time|Subject
  )
## Combine the concentration and dosing information both to
## automatically define the intervals for NCA calculation and provide
## doses for calculations requiring dose.
data_obj <- PKNCAdata(conc_obj, dose_obj)

## Calculate the NCA parameters
results_obj <- pk.nca(data_obj)

## Summarize the results
summary(results_obj)

## -----------------------------------------------------------------------------
PKNCA.options()

## ----eval=FALSE---------------------------------------------------------------
# PKNCA.options(default=TRUE)

## ----eval=FALSE---------------------------------------------------------------
# PKNCA.set.summary(
#   name = "cmax",
#   description = "geometric mean and geometric coefficient of variation",
#   point = business.geomean,
#   spread = business.geocv,
#   rounding = list(signif=3)
# )

## ----eval=FALSE---------------------------------------------------------------
# PKNCA.set.summary(
#   name = "tmax",
#   description = "median and range",
#   point = business.median,
#   spread = business.range,
#   rounding = list(round=2)
# )

## ----custom_summary_fun, eval=FALSE-------------------------------------------
# median_na <- function(x) {
#   median(x, na.rm = TRUE)
# }
# quantprob_na <- function(x) {
#   quantile(x, probs = c(0.05, 0.95), na.rm=TRUE)
# }
# PKNCA.set.summary(
#   name="auclast",
#   description = "median and 5th to 95th percentile",
#   point=median_na,
#   spread=quantprob_na,
#   rounding=list(signif=3)
# )

## ----multi_summary_settings, eval=FALSE---------------------------------------
# median_na <- function(x) {
#   median(x, na.rm=TRUE)
# }
# quantprob_na <- function(x) {
#   quantile(x, probs=c(0.05, 0.95), na.rm=TRUE)
# }
# PKNCA.set.summary(
#   name=c("auclast", "cmax", "tmax", "half.life", "aucinf.pred"),
#   description = "median and 5th to 95th percentile",
#   point=median_na,
#   spread=quantprob_na,
#   rounding=list(signif=3)
# )

## ----grouping, eval=FALSE-----------------------------------------------------
# ## Generate a faux multi-study, multi-analyte dataset.
# d_conc_parent <- d_conc
# d_conc_parent$Subject <- as.numeric(as.character(d_conc_parent$Subject))
# d_conc_parent$Study <- d_conc_parent$Subject <= 6
# d_conc_parent$Analyte <- "Parent"
# d_conc_metabolite <- d_conc_parent
# d_conc_metabolite$conc <- d_conc_metabolite$conc/2
# d_conc_metabolite$Analyte <- "Metabolite"
# d_conc_both <- rbind(d_conc_parent, d_conc_metabolite)
# d_conc_both <- d_conc_both[with(d_conc_both, order(Study, Subject, Time, Analyte)),]
# d_dose_both <- d_conc_both[d_conc_both$Time == 0 & d_conc_both$Analyte %in% "Parent",
#                            c("Study", "Subject", "Dose", "Time")]
# 
# ## Create a concentration object specifying the concentration, time,
# ## study, and subject columns.  (Note that any number of grouping
# ## levels is supporting; you are not restricted to this list.)
# conc_obj <- PKNCAconc(d_conc_both,
#                       conc~Time|Study+Subject/Analyte)
# ## Create a dosing object specifying the dose, time, study, and
# ## subject columns.  (Note that the grouping factors should be a
# ## subset of the grouping factors for concentration, and the columns
# ## must have the same names between concentration and dose objects.)
# dose_obj <- PKNCAdose(d_dose_both,
#                      Dose~Time|Study+Subject)
# 
# # Perform and summarize the PK data as previously described
# data_obj <- PKNCAdata(conc_obj, dose_obj)
# results_obj <- pk.nca(data_obj)
# summary(results_obj)

## -----------------------------------------------------------------------------
intervals <-
  data.frame(
    start=0, end=c(24, Inf),
    cmax=c(FALSE, TRUE),
    tmax=c(FALSE, TRUE),
    auclast=TRUE,
    aucinf.obs=c(FALSE, TRUE)
  )

## ----asis=TRUE, echo=FALSE----------------------------------------------------
knitr::kable(PKNCA.options()$single.dose.aucs)

## -----------------------------------------------------------------------------
## find.tau can work when all doses have the same interval...
dose_times <- seq(0, 168, by=24)
print(dose_times)
PKNCA::find.tau(dose_times)

## or when the doses have mixed intervals (10 and 24 hours).
dose_times <- sort(c(seq(0, 168, by=24),
                     seq(10, 178, by=24)))
print(dose_times)
PKNCA::find.tau(dose_times)

## ----eval=FALSE---------------------------------------------------------------
# intervals_manual <-
#   data.frame(
#     start=0, end=c(24, Inf),
#     cmax=c(FALSE, TRUE),
#     tmax=c(FALSE, TRUE),
#     auclast=TRUE,
#     aucinf.obs=c(FALSE, TRUE)
#   )
# data_obj <-
#   PKNCAdata(
#     conc_obj, dose_obj,
#     intervals=intervals_manual
#   )

## ----eval=FALSE---------------------------------------------------------------
# data_obj <- PKNCAdata(conc_obj, dose_obj)
# intervals_manual <- data_obj$intervals
# intervals_manual$aucinf.obs[1] <- TRUE
# data_obj$intervals <- intervals_manual

## ----eval=FALSE---------------------------------------------------------------
# data_obj <- PKNCAdata(conc_obj, dose_obj, options = list(keep_interval_cols = "dosetype"))

## ----eval=FALSE---------------------------------------------------------------
# summary(o_nca)