NCA for simulated Cp-Time
This RMarkdown file executes the selected simulation and conducts NCA on simulated Cp-Time profile. The script utilizes the gastroPlusAPI package to communicate with the GastroPlus X 10.2 service.
The output of the NCA will be copied to the clipboard.
To customize your study with this script for a different simulation / project / variables, please make changes to the “set-input-information” code-chunk.
Configure required packages
Load other necessary necessary packages(tidyverse) required to execute the data manipulation in the script
Load gastroPlusAPI package
library(tidyverse)
library(gastroPlusAPI)
Set working directory
Set working directory as the current source editor context
if (rstudioapi::isAvailable()){
current_working_directory <- dirname(rstudioapi::getSourceEditorContext()$path)
setwd(current_working_directory)
}
Start GPX Service
gpx_service <- start_service(verbose=FALSE)
✔ Configured the GastroPlus Service
gpx_service$is_alive()
[1] TRUE
Setup Input Information
Make modification to the variables in this chunk to customize your analysis.
project_path: Location of the project where NCA will be conducted on
simulation_of_interest: Name of the simulation that will be executed
new_run_name & pkplus_input_name & pkplus_run_name & new_group_name: Names of the assets and runs during the script workflow
adm_type: Administration type that will be used for PKPlus input. Accepted values are enumerated in PKPlusDoseRoute
dose_amount_mg & body_weight_kg & infusion_time_h: Details of the PKPlus input. Edit these parameters if use_observed_data_metadata is FALSE.
project_path = "../../ProjectFiles/GPX Library.gpproject"
simulation_of_interest <- "Piroxicam 20mg PO capsule"
compound_name <- "Piroxicam"
new_run_name <- "simulation_run"
pkplus_input_name <- "NCA_input"
pkplus_run_name <- "NCA_run"
new_group_name <- "DataforNCA"
new_series_name <- "CpTime"
adm_type <- PKPlusDoseRoute$Oral
dose_amount_mg <- 20
body_weight_kg <- 78
infusion_time_h <- 0
Execute the simulation
Based on the variables assigned in the previous code chunk, the NCA will be executed on simulated Cp-Time. NCA result will be copied to the clipboard
#Load the project
open_project(project_path)
#Checking user inputs if they exist
if(!(simulation_of_interest %in% get_simulations()$simulation_name)){
cli::cli_abort("The assigned simulation name is not found in the project. Please check your input!")
}
#Create run and execute simulation
create_run(run_name = new_run_name, run_type = RunType$BatchSimulation)
add_simulations_to_run(run_name = new_run_name, simulation_names = simulation_of_interest)
execute_run(run_name = new_run_name)
Simulation Predicted CpTime specified as Observed Data
This section obtains the simulated concentration plasma series and specifies it as observed exposure data in the project.
available_conc_series <- get_available_series_output(
run_name = new_run_name,
series_type = OutputSeriesType$Concentration,
simulation_name = simulation_of_interest,
simulation_iteration_key_name = NULL
)
#Check compartmental Cp-time descriptor first, if its not in the list, then look for PBPK Cp-time descriptor
plasma_concentration_series_descriptor <- paste(
compound_name,
CompartmentType$SystemicCirculation,
StateType$ConcentrationPlasma,
sep = " - "
)
venous_return_concentration_series_descriptor <- paste(
compound_name,
CompartmentType$VenousReturn,
StateType$ConcentrationPlasma,
sep = " - "
)
CpTime_descriptor <- ""
if(plasma_concentration_series_descriptor %in% available_conc_series$state_descriptor){
CpTime_descriptor <- plasma_concentration_series_descriptor
}else if(venous_return_concentration_series_descriptor %in% available_conc_series$state_descriptor) {
CpTime_descriptor <- venous_return_concentration_series_descriptor
}
series_data <- get_series_data(
run_name = new_run_name,
simulation_name = simulation_of_interest,
series_descriptor = CpTime_descriptor
)
series_df <- series_data %>% select(independent, dependent) %>% filter(independent <= 1e-10 | independent >= 1e-2) #Filter very small time points due to rounding issue in GPX observed data view, but keep time point of 0.
dependentUnit <- series_data$dependent_unit[1]
independentUnit <- series_data$independent_unit[1]
new_observed_series_data <- ObservedSeriesInformation$new(independent_unit = independentUnit,
dependent_unit = dependentUnit,
series = series_df,
series_name = new_series_name)
new_series_key <- SeriesKey$new(group_type = ObservedDataGroupType$ExposureData,
group_name = new_group_name,
series_type = ObservedDataSeriesType$UncertainConcentrationSeries,
series_name = new_series_name)
set_observed_series(new_series_key, new_observed_series_data)
Create PKPlus Run and Execute
#PKPlus Section
exposure_data_series_key <- get_experimental_data_inventory(group_type = ObservedDataGroupType$ExposureData) %>% filter(group_name == new_group_name)
dose_amount <- ScalarObservable$new(scalar_type=ScalarType$Mass, scalar_value=ScalarValue$new(value = dose_amount_mg, unit = "milligram"))
body_weight <- ScalarObservable$new(scalar_type=ScalarType$Mass, scalar_value=ScalarValue$new(value = body_weight_kg, unit = "kilogram"))
infusion_time <- ScalarObservable$new(scalar_type=ScalarType$Time, scalar_value=ScalarValue$new(value = infusion_time_h, unit = "hour"))
series_key <- SeriesKey$new(group_type = exposure_data_series_key$group_type,
group_name = exposure_data_series_key$group_name,
series_type = exposure_data_series_key$series_type,
series_name = exposure_data_series_key$series_name)
#Assigns correct PKPlus function to create input based on administration type assigned by user"
input_config <- PKPlusInputConfiguration$new(dose_route = adm_type,
exposure_series_key = series_key,
dose_amount = dose_amount,
body_weight = body_weight)
add_pkplus_input(pkplus_input_name, input_config)
run_config <- PKPlusRunConfiguration$new(kinetics_type = PKPlusEliminationModel$Linear,
model_types = c(PKPlusAnalysisMethod$NonCompartmentalAnalysis,
PKPlusAnalysisMethod$OneCompartment,
PKPlusAnalysisMethod$TwoCompartment,
PKPlusAnalysisMethod$ThreeCompartment))
add_pkplus_run(pkplus_run_name, pkplus_input_name)
configure_pkplus_run(pkplus_run_name, run_config)
execute_pkplus_run(pkplus_run_name)
Obtain PKPlus NCA Output
#Retrieve PKPlus output
pkplus_output <- get_pkplus_run_output(pkplus_run_name)
PKPlus_checkpoint <- tryCatch(
{
pkplus_output[["non_compartmental_analysis_output"]][[1]][[1]]
},
error = function(e) {
warning("PKPlus is not executed properly!", conditionMessage(e))
FALSE
}
)
if (PKPlus_checkpoint == FALSE) {
if(dose_amount_mg == 0){
cli::cli_abort("Dose amount is 0, please check!")
} else{}
if(body_weight_kg == 0){
cli::cli_abort("Body weight is 0, please check!")
}else{}
}
#Data Manipulation
NCA_data <- pkplus_output[["non_compartmental_analysis_output"]][[1]][[2]]
NCA_data_longer <- as.data.frame(NCA_data) %>%
mutate(across(everything(), as.character)) %>%
pivot_longer(
cols = everything(),
names_to = "column1",
values_to = "column2"
) %>% filter(column1 != "dose_route") #delete dose_route, unnecessary and violating data manipulation
NCA_df <- NCA_data_longer %>%
separate(
column1,
into = c("parameter", "attribute"),
sep = "\\.(?=[^.]+$)" # split at the last dot
) %>%
pivot_wider(
names_from = attribute,
values_from = column2
) %>% select(parameter, value, unit)
write.table(
NCA_df,
file = "clipboard",
sep = "\t",
row.names = FALSE
)
cli::cli_alert_info("NCA output is generated and copied to the clipboard. It can also be accessed through NCA_df in global environments!")
ℹ NCA output is generated and copied to the clipboard. It can also be accessed through NCA_df in global environments!
glimpse(NCA_df)
Rows: 13
Columns: 3
$ parameter <chr> "auc_first_moment_last", "auc_infinity", "auc_last", "body_m…
$ value <chr> "12.348", "0.157897", "0.150247", "78", "126.665", "1.623910…
$ unit <chr> "(mg/mL)*h*h", "(mg/mL)*h", "(mg/mL)*h", "kg", "mL/h", "(mL/…
Kill GPX Service
gpx_service$kill()
[1] TRUE