--- title: "stepwise-nca-analysis.rmd" author: "Jan Huisman" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Example Stepwise NCA Analysis} %\VignetteEncoding{UTF-8} %\VignetteEngine{knitr::knitr} editor_options: chunk_output_type: console --- ## Load libraries ```{r, results='hide'} library(dplyr) library(qpNCA) library(knitr) ``` ## Define mutate_cond and locf functions ```{r} mutate_cond <- function (.data, condition, ..., envir = parent.frame()){ condition <- eval(substitute(condition), .data, envir) if(!any(condition))return(.data) # do nothing if nothing to do .data[condition, ] <- .data[condition, ] %>% mutate(...) .data } locf <- function(x){ good <- !is.na(x) positions <- seq(length(x)) good.positions <- good * positions last.good.position <- cummax(good.positions) last.good.position[last.good.position == 0] <- NA x[last.good.position] } ``` ## Check out Theoph data and prepare data for NCA We use the internal Theoph dataset as input file, modify the data and add necessary columns Furthermore, we introduce some missing values, LOQ values and time deviations ```{r, results="markup", warnings=F} head(Theoph) %>% kable() input.data <- Theoph #we need nominal time variable for some tasks. ntad <- data.frame(rn=c(1:11),ntad=c(0,0.25,0.5,1,2,4,5,7,9,12,24)) input.data %<>% group_by(Subject) %>% mutate(subject=as.numeric(Subject), rn=row_number(), dose=Dose*Wt, bloq=ifelse(conc==0,1,0), loq=0.1, excl_th=0 ) %>% left_join(ntad) %>% ungroup %>% arrange(subject,ntad) %>% select(subject,ntad,tad=Time,conc,dose,bloq,loq,excl_th) input.data %<>% mutate_cond(condition=subject==2&ntad%in%c(24),conc=NA) %>% mutate_cond(condition=subject==4&ntad%in%c(9),conc=NA) %>% mutate_cond(condition=subject==3&ntad==9,excl_th=1) %>% mutate_cond(condition=subject==6&ntad==24,conc=0,bloq=1) %>% filter(!(subject==5&ntad==12)) ``` ## Impute LOQ values ```{r, results="markup", warnings=F} loqed.data = input.data %>% correct.loq( by = "subject", nomtimevar = "ntad", timevar = "tad", depvar = "conc", bloqvar = "bloq", loqvar = "loq", loqrule = 1 ) # Result: loqed.data %>% filter(loqrule.nr!="") %>% select(subject,ntad,conc,loqrule.nr,loqrule.txt) %>% kable() ``` ## Estimation of terminal half-life ```{r, results="markup", warnings=F} th = loqed.data %>% est.thalf( by = "subject", timevar = "tad", depvar = "conc", includeCmax = "Y", exclvar = "excl_th" ) # Result: head(th) %>% kable() ``` ## Plot individual regression plots ```{r, results="markup", warnings=F, fig.width = 7} plot_reg( loqed.data, by = "subject", th = th, bloqvar = "bloq", timevar = "tad", depvar = "conc", timelab = "Time (h)", deplab = "Conc (ng/mL)", exclvar = "excl_th", plotdir = NA ) ``` ## Calculate Cmax and Tmax ```{r, results="markup", warnings=F} ctmax = input.data %>% calc.ctmax( by = "subject", timevar="tad", depvar="conc" ) # Result: head(ctmax) %>% kable() ``` ## Correct time deviations at critical time points ```{r, results="markup", warnings=F} ct.data= loqed.data %>% correct.time( by="subject", nomtimevar="ntad", timevar="tad", depvar="conc", th=th, tau=24, tstart=4, tend=9, teval=12, reg="sd", method=1 ) # Result: ct.data %>% filter(subject<=5&(trule.nr!=""|create.nr!="")) %>% select(subject,ntad,conc,applies.to.time,trule.nr,trule.txt,create.txt) %>% kable() ``` ## Impute missing concentrations at critical time points ```{r, results="markup", warnings=F} cc.ct.data = ct.data %>% correct.conc( by ="subject", nomtimevar="ntad", tau=24, tstart=4, tend=9, teval=12, th=th, reg="sd", ss="n", route="EV", method=1 ) # Result: cc.ct.data %>% filter(crule.nr!="") %>% select(subject,ntad,conc,applies.to.conc,crule.nr,crule.txt) %>% kable() ``` ## Tabulate corrections ```{r, results="markup", warnings=F} tab_corr = cc.ct.data %>% tab.corr( by="subject", nomtimevar="ntad" ) # Result: tab_corr %>% kable() ``` ## Calculate PK parameters NOT based on lambda_z ```{r, results="markup", warnings=F} par = cc.ct.data %>% calc.par(by = 'subject', tau=24, teval=12, tstart=4, tend=9, route="EV", method=1) # Result: head(par) %>% kable() ``` ## Calculate PK parameters based on lambda_z ```{r, results="markup", warnings=F} # Create a covariates file, containing at least the dose given cov = input.data %>% distinct(subject,dose) par <- par %>% calc.par.th( by="subject", th=th , covariates=cov, dose="dose", factor=1, reg="sd", ss="n" ) # Result: head(par) %>% kable() ``` ## Combine All NCA parameters in one data frame ```{r, results="markup", warnings=F} par_all = left_join(par, ctmax) # Result: head(par_all) %>% kable() ```