Overview

This page describes the master PKPD analysis datasets used in the majority of the plots on this site. The datasets were generated using RxODE. Data specifications can be accessed on Datasets. One dataset was created for single ascending dose PK and another dataset for multiple ascending dose PK and PD. Explore the datasets in the tables below, or download from the following links:

Setup

library(dplyr)
library(RxODE)

Dataset Generation

Indirect response system

ode <- "
Concentration = centr/V2;
C3 = peri/V3;
C4 = peri2/V4;
d/dt(depot) = -KA*depot;
d/dt(centr) = KA*depot - (CL+Q+Q2)*Concentration + Q*C3 + Q2*C4;
d/dt(peri) =                    Q*Concentration - Q*C3;
d/dt(peri2) =                   Q2*Concentration - Q2*C4;
d/dt(eff) = Kin*(1+Emax*Concentration/(EC50 + Concentration)) - Kout*(1)*eff;
"

work <- tempfile("Rx_intro-")
mod1 <- RxODE(model = ode, modName = "mod1")

cat(gsub(pattern="\nConcentration",replacement="Concentration",x=gsub(pattern=";\n",replacement=" \n", x = ode)))
## Concentration = centr/V2 
## C3 = peri/V3 
## C4 = peri2/V4 
## d/dt(depot) = -KA*depot 
## d/dt(centr) = KA*depot - (CL+Q+Q2)*Concentration + Q*C3 + Q2*C4 
## d/dt(peri) =                    Q*Concentration - Q*C3 
## d/dt(peri2) =                   Q2*Concentration - Q2*C4 
## d/dt(eff) = Kin*(1+Emax*Concentration/(EC50 + Concentration)) - Kout*(1)*eff

Single Ascending Dose PK Dataset

set.seed(12345666)
ndose <- 5
nsub <- 10 # number of subproblems

SEX <- rep(c(rep("Male",ceiling(nsub/2)),rep("Female",floor(nsub/2))),ndose)
WT0 <- (SEX=="Male")*runif(length(SEX),60,110)+(SEX=="Female")*runif(length(SEX),50,100)
VCOV <- (WT0/70)*(1-0.5*(SEX=="Female"))
CLCOV <- (WT0/70)*(1-0.5*(SEX=="Female"))

CL <- 0.02*exp(rnorm(nsub*ndose,0,.4^2))*CLCOV
KA <- 0.5*exp(rnorm(nsub*ndose,0,.4^2))
V2 <- 30*exp(rnorm(nsub*ndose,0,.4^2))*VCOV
DOSE <- sort(rep(c(100,200,400,800,1600),nsub))
theta.all <- 
  cbind(KA=KA, CL=CL, V2=V2,
        Q=10*CLCOV, V3=100*VCOV, V4 = 10000*VCOV, Q2 = 10*CLCOV,
        Kin=0.5, Kout=0.05, EC50 = 1, Emax = 4)

# Set nominal times for sampling schedule
SAMPLING <- c(-0.1,0.1,0.5,1,2,4,8,12,18,23.9,36,47.9,71.9)

DOSING <- c(0)
NT <- data.frame(NT = c(SAMPLING, DOSING), label = c(rep("SAMPLING",length(SAMPLING)),rep("DOSING",length(DOSING))))
NT <- NT[order(NT$NT),]

ev.all <- list()
for(idose in 1:length(DOSE)){
  ev.all[[idose]] <- eventTable(amount.units='mg', time.units='hours')
  # ev.all[[idose]]$add.dosing(dose = DOSE[idose], nbr.doses = 1, dosing.interval = 24)
  # ev.all[[idose]]$add.sampling(c(c(-0.1,0.1,0.5,1,2,4,8,12,18,23.9,36,47.9,71.9)))
  
  # Include some noise in the sampling & dosing schedules
  temp <- NT
  temp$time <- cumsum(c(temp$NT[1] + 0.1*rnorm(1), abs(temp$NT[2:length(temp$NT)]-temp$NT[1:length(temp$NT)-1] + 0.1*rnorm(length(temp$NT)-1))))
  temp$time <- temp$time - temp$time[temp$NT==0] # center at first dose
  
  ev.all[[idose]]$add.dosing(dose = DOSE[idose], start.time = temp$time[temp$label=="DOSING"])
  ev.all[[idose]]$add.sampling(temp$time[temp$label=="SAMPLING"])
  
}

x.all.df <- NULL
ID = 0
for(i in 1:length(ev.all)){
  #   for(i in 1:nsub){
  ID = ID + 1
  theta <- theta.all[i,]
  inits <- c(depot = 0, centr = 0, peri = 0, peri2 = 0, eff=theta["Kin"]/theta["Kout"])
  x <- mod1$solve(theta, ev.all[[i]], inits = inits)
  
  x.df <- data.frame(x)
  x.df$NT <- SAMPLING
  
  temp <- data.frame(ev.all[[i]]$get.dosing())
  temp$NT <- DOSING
  
  temp[,setdiff(names(x.df),names(temp))]<- NA
  x.df[,setdiff(names(temp),names(x.df))]<- NA
  x.df <- rbind(x.df,temp)
  
  x.df$ID <- ID
  x.df$DOSE <- DOSE[i]
  x.df$WT0 <- WT0[i]
  x.df$SEX <- SEX[i]
  
  if(is.null(x.all.df)){
    x.all.df <- x.df
  }else{
    x.all.df <- rbind(x.all.df, x.df)
  }
}
## Warning: 
## with negative times, compartments initialize at first negative observed time
## with positive times, compartments initialize at time zero
## use 'rxSetIni0(FALSE)' to initialize at first observed time
## this warning is displayed once per session
x.all.df$DV <- x.all.df$Concentration*(exp(rnorm(length(x.all.df$Concentration),0,0.6^2))) + 
  0.01*rnorm(length(x.all.df$Concentration))
x.all.df$DV[x.all.df$DV<0.05]=0.05
x.all.df$DV[x.all.df$Concentration==0]=NA
x.all.df$BLQ=0
x.all.df$BLQ[x.all.df$DV==0.05]=1

my.data <- x.all.df[!is.na(x.all.df$amt),]
my.data$CMT <- 1
my.data$CMT_label <- "Dosing"

temp <- x.all.df[is.na(x.all.df$amt),]
temp$CMT <- 2
temp$CMT_label <- "PK Concentration"
my.data <- rbind(my.data,temp)

my.data$DV <- signif(my.data$DV,3)
my.data$WT0 <- signif(my.data$WT0,3)
my.data$time <- round(my.data$time,3)

my.data <- my.data[order(my.data$ID,my.data$time, my.data$CMT),]

my.data$DOSE_label <- paste(my.data$DOSE,"mg")
my.data$DOSE_label[my.data$DOSE==0] <- "Placebo"
my.data$DOSE_label <- factor(my.data$DOSE_label,levels = c("Placebo",paste(unique(my.data$DOSE[my.data$DOSE!=0]),"mg")))

Single_Ascending_Dose_Dataset <- my.data[,c("ID","time","NT","amt","DV","CMT","CMT_label","BLQ","evid","WT0","SEX","DOSE","DOSE_label")]
write.csv(Single_Ascending_Dose_Dataset,"../Data/Single_Ascending_Dose_Dataset.csv",row.names = FALSE)

Single_Ascending_Dose_Dataset2 <- Single_Ascending_Dose_Dataset
Single_Ascending_Dose_Dataset2$PROFTIME <- Single_Ascending_Dose_Dataset2$NT
Single_Ascending_Dose_Dataset2$NOMTIME <- Single_Ascending_Dose_Dataset2$NT
Single_Ascending_Dose_Dataset2$YTYPE <- Single_Ascending_Dose_Dataset2$CMT
Single_Ascending_Dose_Dataset2$amt[is.na(Single_Ascending_Dose_Dataset2$amt)] <- 0 
Single_Ascending_Dose_Dataset2 <- Single_Ascending_Dose_Dataset2[!(Single_Ascending_Dose_Dataset2$DOSE_label=="Placebo"&
                                      Single_Ascending_Dose_Dataset2$CMT==2),] 
Single_Ascending_Dose_Dataset2$BLQ[Single_Ascending_Dose_Dataset2$DOSE_label=="Placebo"&
                                       Single_Ascending_Dose_Dataset2$CMT==2] <- 1L
Single_Ascending_Dose_Dataset2$evid <- plyr::mapvalues(Single_Ascending_Dose_Dataset2$evid, c(NA,101), c(0,1))
## The following `from` values were not present in `x`: 101
Single_Ascending_Dose_Dataset2$TIMEUNIT <- "Hours"
Single_Ascending_Dose_Dataset2$EVENTU[Single_Ascending_Dose_Dataset2$CMT==1] <- "mg"
Single_Ascending_Dose_Dataset2$EVENTU[Single_Ascending_Dose_Dataset2$CMT==2] <- "ng/mL"

Single_Ascending_Dose_Dataset2 <- Single_Ascending_Dose_Dataset2[,c("ID","time","NOMTIME","TIMEUNIT","amt","DV","CMT",
                                                                        "CMT_label","EVENTU","BLQ","evid","WT0","SEX","DOSE_label",
                                                                        "DOSE")]
names(Single_Ascending_Dose_Dataset2) <- c("ID","TIME","NOMTIME","TIMEUNIT","AMT","LIDV","CMT",
                                             "NAME","EVENTU","CENS","EVID","WEIGHTB","SEX","TRTACT",
                                             "DOSE")

write.csv(Single_Ascending_Dose_Dataset2,"../Data/Single_Ascending_Dose_Dataset2.csv",row.names = FALSE)
DT::datatable(Single_Ascending_Dose_Dataset2, rownames = FALSE, options = list(autoWidth = TRUE, scrollX=TRUE)) 

Multiple Ascending Dose PK & PD Dataset

set.seed(12345666)
ndose <- 6
nsub <- 10 # number of subproblems

SEX <- rep(c(rep("Male",ceiling(nsub/2)),rep("Female",floor(nsub/2))),ndose)
WT0 <- (SEX=="Male")*runif(length(SEX),60,110)+(SEX=="Female")*runif(length(SEX),50,100)
VCOV <- (WT0/70)*(1-0.5*(SEX=="Female"))
CLCOV <- (WT0/70)*(1-0.5*(SEX=="Female"))

CL <- 0.02*exp(rnorm(nsub*ndose,0,.4^2))*CLCOV
KA <- 0.5*exp(rnorm(nsub*ndose,0,.4^2))
V2 <- 30*exp(rnorm(nsub*ndose,0,.4^2))*VCOV

Kin <- 0.1*exp(rnorm(nsub*ndose,0,0.4^2))
DOSE <- sort(rep(c(0,100,200,400,800,1600),nsub))
theta.all <- 
  cbind(KA=KA, CL=CL, V2=V2,
        Q=10*CLCOV, V3=100*VCOV, V4 = 10000*VCOV, Q2 = 10*CLCOV,
        Kin=Kin, Kout=0.01, EC50 = 1, Emax = 2+2*(SEX=="Female"))

# Nominal times for sampling schedule
SAMPLING <- c(c(-24,-0.1,0.1,0.5,1,2,4,8,12,18,23.9),23.9+seq(1,4)*24,
                                 5*24 + c(0.1,0.5,1,2,4,8,12,18,23.9,36,47.9,71.9,95.9))
DOSING <- seq(0,5*24,24)
NT <- data.frame(NT = c(SAMPLING, DOSING), label = c(rep("SAMPLING",length(SAMPLING)),rep("DOSING",length(DOSING))))
NT <- NT[order(NT$NT),]

ev.all <- list()
for(idose in 1:length(DOSE)){
  ev.all[[idose]] <- eventTable(amount.units='mg', time.units='hours')
  # ev.all[[idose]]$add.dosing(dose = DOSE[idose], nbr.doses = 6, dosing.interval = 24)
  # ev.all[[idose]]$add.sampling(c(c(-24,-0.1,0.1,0.5,1,2,4,8,12,18,23.9),23.9+seq(1,4)*24,
  #                                5*24 + c(0.1,0.5,1,2,4,8,12,18,23.9,36,47.9,71.9,95.9)))
  
  # Include some noise in the sampling & dosing schedules
  temp <- NT
  temp$time <- cumsum(c(temp$NT[1] + 0.1*rnorm(1), abs(temp$NT[2:length(temp$NT)]-temp$NT[1:length(temp$NT)-1] + 0.1*rnorm(length(temp$NT)-1))))
  temp$time <- temp$time - temp$time[temp$NT==0] # center at first dose
  
  if(DOSE[idose] > 0){
      ev.all[[idose]]$add.dosing(dose = DOSE[idose], start.time = temp$time[temp$label=="DOSING"])
  }else{
      ev.all[[idose]]$add.dosing(dose = 1e-12, start.time = temp$time[temp$label=="DOSING"])
  }

  ev.all[[idose]]$add.sampling(temp$time[temp$label=="SAMPLING"])
  
}

x.all.df <- NULL
ID = 0
for(i in 1:length(ev.all)){
  ID = ID + 1
  theta <- theta.all[i,]
  inits <- c(depot = 0, centr = 0, peri = 0, peri2 = 0, eff=theta["Kin"]/theta["Kout"])
  x <- mod1$solve(theta, ev.all[[i]], inits = inits)
  
  x.df <- data.frame(x)
  x.df$NT <- SAMPLING
    
  temp <- data.frame(ev.all[[i]]$get.dosing())
  temp$NT <- DOSING
  temp[,setdiff(names(x.df),names(temp))]<- NA
  x.df[,setdiff(names(temp),names(x.df))]<- NA
  x.df <- rbind(x.df,temp)
  
  x.df$ID <- ID
  x.df$DOSE <- DOSE[i]
  x.df$WT0 <- WT0[i]
  x.df$SEX <- SEX[i]
  
  if(is.null(x.all.df)){
    x.all.df <- x.df
  }else{
    x.all.df <- rbind(x.all.df, x.df)
  }
}
x.all.df$DV <- x.all.df$Concentration*(exp(rnorm(length(x.all.df$Concentration),0,0.6^2))) + 
  0.01*rnorm(length(x.all.df$Concentration))
x.all.df$DV[x.all.df$DV<0.05]=0.05
x.all.df$DV[x.all.df$Concentration==0]=NA
x.all.df$BLQ <- 0
x.all.df$BLQ[x.all.df$DV==0.05] <- 1

temp <- exp(rnorm(length(x.all.df$eff),0,0.4^2))
x.all.df$eff2 <- x.all.df$eff*temp + rnorm(length(x.all.df$eff),0,2) + 10*x.all.df$time/(72 + x.all.df$time)

temp <- runif(length(x.all.df$eff),0,1)
x.all.df$Response <- 0
x.all.df$Response[0.2*x.all.df$time/(72 + x.all.df$time) + exp((x.all.df$eff2-30))/(1+exp((x.all.df$eff2-30))) > temp] <- 1 


x.all.df$Severity <- 3
x.all.df$Severity[0.2*x.all.df$time/(72 + x.all.df$time) + exp((x.all.df$eff2-18))/(1+exp((x.all.df$eff2-18))) > temp] <- 2
x.all.df$Severity[0.2*x.all.df$time/(72 + x.all.df$time) + exp((x.all.df$eff2-28))/(1+exp((x.all.df$eff2-28))) > temp] <- 1
x.all.df$Severity_label <- plyr::mapvalues(x.all.df$Severity,c(1,2,3),c("mild","moderate","severe"))
x.all.df$Severity_label <- factor(x.all.df$Severity_label, levels = unique(x.all.df$Severity_label[order(x.all.df$Severity)]))

x.all.df$Count <- NA
x.all.df$Count[!is.na(x.all.df$eff2)]<-rpois(length(na.omit(x.all.df$eff2)), na.omit(10*( 0.5/(1 + x.all.df$time/24) + 0.5*exp(-((x.all.df$eff2)-28))/(1+exp(-((x.all.df$eff2)-28))))) )


my.data <- x.all.df[!is.na(x.all.df$amt),]
my.data$CMT_label <- "Dosing"
my.data$CMT <- 1

temp <- x.all.df[is.na(x.all.df$amt),]
temp$CMT <- 2
temp$CMT_label <- "PK Concentration"
my.data <- rbind(my.data,temp)

temp <- x.all.df[x.all.df$NT%in%c(-0.1,23.9,(23.9+seq(1,9)*24)),]
temp$DV <- temp$eff2
temp$CMT <- 3
temp$CMT_label <- "PD - Continuous"
my.data <- rbind(my.data,temp)

temp <- x.all.df[x.all.df$NT%in%c(-0.1,23.9,23.9+seq(1,9)*24),]
temp$DV <- temp$Count
temp$CMT <- 4
temp$CMT_label <- "PD - Count"
my.data <- rbind(my.data,temp)

temp <- x.all.df[x.all.df$NT%in%c(-24,23.9,23.9+seq(1,9)*24),]
temp$DV <- temp$Severity
temp$CMT <- 5
temp$CMT_label <- "PD - Ordinal"
my.data <- rbind(my.data,temp)

temp <- x.all.df[x.all.df$NT%in%c(-0.1,23.9,(23.9+seq(1,9)*24)),]
temp$DV <- temp$Response
temp$CMT <- 6
temp$CMT_label <- "PD - Binary"
my.data <- rbind(my.data,temp)


my.data$DV <- signif(my.data$DV,3)
my.data$WT0 <- signif(my.data$WT0,3)
my.data$time <- round(my.data$time,3)

my.data <- my.data[order(my.data$ID,my.data$time, my.data$CMT),]

my.data$DOSE_label <- paste(my.data$DOSE,"mg")
my.data$DOSE_label[my.data$DOSE==0] <- "Placebo"
my.data$DOSE_label <- factor(my.data$DOSE_label,levels = c("Placebo",paste(unique(my.data$DOSE[my.data$DOSE!=0]),"mg")))

my.data$DAY <- floor(my.data$NT/24)+1
my.data$DAY_label <- paste("Day",ceiling(my.data$DAY))
my.data$DAY_label[my.data$DAY<=0]<-"Baseline"
my.data$DAY_label <- factor(my.data$DAY_label,
                            levels = c("Baseline",paste("Day",sort(unique(ceiling(my.data$DAY))))))
my.data$CYCLE <- my.data$DAY
my.data$CYCLE[my.data$CYCLE>6] <- 6


# temp <- my.data[my.data$DAY_label=="Baseline"&my.data$CMT!=2,]
# temp$Severity0 <- temp$Severity
# temp$Response0 <- temp$Response
# temp$Count0 <- temp$Count
# temp$eff20 <- temp$eff2
# 
# cnames <- c("ID","Severity0","Response0","Count0","eff20")
# 
# my.data2 <- merge(my.data, unique(temp[,cnames]),by=c("ID"),all.x=TRUE)


Multiple_Ascending_Dose_Dataset <- my.data[,c("ID","time","NT","amt","DV","CMT","CMT_label","BLQ","evid","WT0","SEX","DOSE_label","DOSE","DAY","DAY_label","Response","Severity","Severity_label","Count","CYCLE")]

write.csv(Multiple_Ascending_Dose_Dataset,"../Data/Multiple_Ascending_Dose_Dataset.csv",row.names = FALSE)

# DT::datatable(Multiple_Ascending_Dose_Dataset[,c("time","NT","ID","CMT","DV","DOSE","DOSE_label","WT0","SEX","DAY","DAY_label","CMT_label")], rownames = FALSE, options = list(autoWidth = TRUE, scrollX=TRUE))

Multiple_Ascending_Dose_Dataset2 <- Multiple_Ascending_Dose_Dataset
Multiple_Ascending_Dose_Dataset2$PROFTIME <- Multiple_Ascending_Dose_Dataset2$NT - (Multiple_Ascending_Dose_Dataset2$CYCLE-1)*24
Multiple_Ascending_Dose_Dataset2$NOMTIME <- Multiple_Ascending_Dose_Dataset2$NT
Multiple_Ascending_Dose_Dataset2$YTYPE <- Multiple_Ascending_Dose_Dataset2$CMT
Multiple_Ascending_Dose_Dataset2$amt[is.na(Multiple_Ascending_Dose_Dataset2$amt)] <- 0 
Multiple_Ascending_Dose_Dataset2 <- Multiple_Ascending_Dose_Dataset2[!(Multiple_Ascending_Dose_Dataset2$DOSE_label=="Placebo"&
                                      Multiple_Ascending_Dose_Dataset2$CMT==2),] 
Multiple_Ascending_Dose_Dataset2$BLQ[Multiple_Ascending_Dose_Dataset2$DOSE_label=="Placebo"&
                                       Multiple_Ascending_Dose_Dataset2$CMT==2] <- 1L
Multiple_Ascending_Dose_Dataset2$evid <- plyr::mapvalues(Multiple_Ascending_Dose_Dataset2$evid, c(NA,101), c(0,1))
## The following `from` values were not present in `x`: 101
Multiple_Ascending_Dose_Dataset2$TIMEUNIT <- "Hours"
Multiple_Ascending_Dose_Dataset2$EVENTU[Multiple_Ascending_Dose_Dataset2$CMT==1] <- "mg"
Multiple_Ascending_Dose_Dataset2$EVENTU[Multiple_Ascending_Dose_Dataset2$CMT==2] <- "ng/mL"
Multiple_Ascending_Dose_Dataset2$EVENTU[Multiple_Ascending_Dose_Dataset2$CMT==3] <- "IU/L"
Multiple_Ascending_Dose_Dataset2$EVENTU[Multiple_Ascending_Dose_Dataset2$CMT==4] <- "count"
Multiple_Ascending_Dose_Dataset2$EVENTU[Multiple_Ascending_Dose_Dataset2$CMT==5] <- "severity"
Multiple_Ascending_Dose_Dataset2$EVENTU[Multiple_Ascending_Dose_Dataset2$CMT==6] <- "response"

Multiple_Ascending_Dose_Dataset2 <- Multiple_Ascending_Dose_Dataset2[,c("ID","time","NOMTIME","TIMEUNIT","amt","DV","CMT",
                                                                        "CMT_label","EVENTU","BLQ","evid","WT0","SEX","DOSE_label",
                                                                        "DOSE","DAY","PROFTIME","CYCLE")]
names(Multiple_Ascending_Dose_Dataset2) <- c("ID","TIME","NOMTIME","TIMEUNIT","AMT","LIDV","CMT",
                                             "NAME","EVENTU","CENS","EVID","WEIGHTB","SEX","TRTACT",
                                             "DOSE","PROFDAY","PROFTIME","CYCLE")

write.csv(Multiple_Ascending_Dose_Dataset2,"../Data/Multiple_Ascending_Dose_Dataset2.csv",row.names = FALSE)
DT::datatable(Multiple_Ascending_Dose_Dataset2, rownames = FALSE, options = list(autoWidth = TRUE, scrollX=TRUE) )

R Session Info

sessionInfo()
## R version 4.1.0 (2021-05-18)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Red Hat Enterprise Linux Server 7.9 (Maipo)
## 
## Matrix products: default
## BLAS/LAPACK: /CHBS/apps/EB/software/imkl/2019.1.144-gompi-2019a/compilers_and_libraries_2019.1.144/linux/mkl/lib/intel64_lin/libmkl_gf_lp64.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8   
##  [6] LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] RxODE_1.1.1     survminer_0.4.9 ggpubr_0.4.0    survival_3.4-0  knitr_1.40      broom_1.0.1     caTools_1.18.2  DT_0.26         forcats_0.5.2  
## [10] stringr_1.4.1   purrr_0.3.5     readr_2.1.3     tibble_3.1.8    tidyverse_1.3.2 xgxr_1.1.1      zoo_1.8-11      gridExtra_2.3   tidyr_1.2.1    
## [19] dplyr_1.0.10    ggplot2_3.3.6  
## 
## loaded via a namespace (and not attached):
##   [1] readxl_1.4.1        backports_1.4.1     Hmisc_4.7-0         plyr_1.8.7          splines_4.1.0       RApiSerialize_0.1.0 crosstalk_1.2.0    
##   [8] digest_0.6.30       htmltools_0.5.3     fansi_1.0.3         magrittr_2.0.3      checkmate_2.1.0     memoise_2.0.1       googlesheets4_1.0.1
##  [15] cluster_2.1.3       tzdb_0.3.0          openxlsx_4.2.4      modelr_0.1.9        RcppParallel_5.1.5  prettyunits_1.1.1   jpeg_0.1-9         
##  [22] colorspace_2.0-3    rvest_1.0.3         PreciseSums_0.5     haven_2.5.1         xfun_0.34           crayon_1.5.2        RCurl_1.98-1.4     
##  [29] jsonlite_1.8.3      Exact_2.1           stringfish_0.15.7   glue_1.6.2          gtable_0.3.1        gargle_1.2.1        car_3.0-11         
##  [36] abind_1.4-5         scales_1.2.1        mvtnorm_1.1-3       DBI_1.1.3           GGally_2.1.2        rstatix_0.7.0       Rcpp_1.0.9         
##  [43] xtable_1.8-4        progress_1.2.2      htmlTable_2.2.1     foreign_0.8-82      proxy_0.4-26        km.ci_0.5-2         Formula_1.2-4      
##  [50] dparser_1.3.1-5     htmlwidgets_1.5.4   httr_1.4.4          RColorBrewer_1.1-3  ellipsis_0.3.2      pkgconfig_2.0.3     reshape_0.8.8      
##  [57] lotri_0.4.2         farver_2.1.1        nnet_7.3-17         sass_0.4.2          dbplyr_2.2.1        binom_1.1-1         deldir_1.0-6       
##  [64] utf8_1.2.2          tidyselect_1.2.0    labeling_0.4.2      rlang_1.0.6         munsell_0.5.0       cellranger_1.1.0    tools_4.1.0        
##  [71] cachem_1.0.6        cli_3.4.1           generics_0.1.3      evaluate_0.17       fastmap_1.1.0       sys_3.4             yaml_2.3.6         
##  [78] fs_1.5.2            zip_2.2.0           pander_0.6.4        survMisc_0.5.5      rootSolve_1.8.2.2   nlme_3.1-160        xml2_1.3.3         
##  [85] compiler_4.1.0      rstudioapi_0.14     curl_4.3.3          png_0.1-7           e1071_1.7-8         ggsignif_0.6.2      reprex_2.0.2       
##  [92] bslib_0.4.0         DescTools_0.99.42   stringi_1.7.8       highr_0.9           lattice_0.20-45     Matrix_1.5-1        markdown_1.2       
##  [99] KMsurv_0.1-5        vctrs_0.5.0         pillar_1.8.1        lifecycle_1.0.3     jquerylib_0.1.4     data.table_1.14.2   bitops_1.0-7       
## [106] lmom_2.8            R6_2.5.1            latticeExtra_0.6-30 qs_0.25.3           rio_0.5.27          gld_2.6.2           codetools_0.2-18   
## [113] boot_1.3-28         MASS_7.3-58.1       assertthat_0.2.1    minpack.lm_1.2-1    withr_2.5.0         Deriv_4.1.3         mgcv_1.8-41        
## [120] expm_0.999-6        hms_1.1.2           grid_4.1.0          rpart_4.1.16        class_7.3-19        rmarkdown_2.17      carData_3.0-4      
## [127] googledrive_2.0.0   lubridate_1.8.0     base64enc_0.1-3     interp_1.1-2