Comparison of AUC0-24 and AUCLAST appear to have fairly large differences, with an average difference of 13.3 for AUC0-24 and 39.5 for AUCTLAST.
While not a comprehensive check on the qualification of the computation engine and validity of results, this check was done in the course of other testing and it was noticed that these results would not be acceptable relative to the reference results.
> testcase.id <- "tc071"
> p <- "./testcases/tc071_ogormanmt_20180417_005556827PM"
> params["INPUT1"] = file.path(p, "B3461056.in.csv")
> params["parameterset"] ="PARAMETERLIST"
> params["map"] = file.path(p, "tc071_mct_updated.csv")
> params["flags"] = file.path(p, "B3461056_flag_data.in.csv")
> params["OUTPUT"] ="."
> print(params)
INPUT1 parameterset
"./testcases/tc071_ogormanmt_20180417_005556827PM/B3461056.in.csv" "PARAMETERLIST"
map flags
"./testcases/tc071_ogormanmt_20180417_005556827PM/tc071_mct_updated.csv" "./testcases/tc071_ogormanmt_20180417_005556827PM/B3461056_flag_data.in.csv"
OUTPUT REFERENCERESULTS
"." "./testcases/tc071_ogormanmt_20180417_005556827PM/B3461056_pp_calc.xml.csv"
>
> mct <- read_csv(params["map"])
Parsed with column specification:
cols(
.default = col_character(),
AUCNPAIR = col_integer(),
FLGNOCMAX = col_integer(),
FLGACCEPTPREDOSECRIT = col_double(),
SPANRATIOCRIT = col_integer(),
DP.DEFAULT = col_integer(),
SF.DEFAULT = col_integer(),
OPTIMIZEKEL = col_integer(),
INCLUDEINTERPOLATION = col_integer(),
INCLUDEEXTRAPOLATION = col_integer(),
AUC.1.T1 = col_integer(),
AUC.1.T2 = col_integer(),
AUC.2.T1 = col_integer(),
AUC.2.T2 = col_integer(),
AUC.3.T1 = col_integer(),
AUC.3.T2 = col_integer()
)
See spec(...) for full column specifications.
> write_file(toJSON(mct, na="string"), path=file.path(p, "tc071_mct_updated.json"))
> params["map"] = file.path(p, "tc071_mct_updated.json")
>
> flags <- read_csv(params["flags"])
Parsed with column specification:
cols(
PKDATAROWID = col_integer(),
FLGEXSDE = col_integer(),
FLGEXKEL = col_integer(),
FLGEXAUC = col_integer(),
FLGEXST = col_integer(),
NDOSEI = col_integer(),
PKPCOM = col_character(),
MIDPNTN = col_character(),
MIDPNTA = col_character(),
MIDPNTNU = col_character(),
MIDPNTAU = col_character(),
RATEN = col_character(),
RATEA = col_character(),
RATENU = col_character(),
RATEAU = col_character()
)
> write_file(toJSON(flags, na="string"), path=file.path(p, "tc071_flags.json"))
> params["flags"] = file.path(p, "tc071_flags.json")
>
> params["REFERENCERESULTS"] = file.path(p, "B3461056_pp_calc.xml.csv")
> conc <- read.csv(file=params["INPUT1"], header=TRUE, sep=",", as.is=TRUE)
> vlist <- c("PKDATAROWID", "PKPTMS", "PKCNCN", "PERIOD", "TREATXT")
>
> # Read mct
> mct <- params["map"]
> ###mct <- read_file(mct)
> ###mct <- gsub("[\\]+", "", mct)
> mct <- fromJSON(mct)
>
> # Read flags
> flags <- params["flags"]
> ###flags <- read_file(flags)
> ###flags <- gsub("[\\]+", "", flags)
> flags <- fromJSON(flags)
>
> # ParameterSet
> if(is.na(params["parameterset"])) { params["parameterset"] <- "PARAMETERDISPLAYLIST" }
> parameterset <- params["parameterset"]
>
> # FLAGS is a subset for the specific profile, subset concentration dataframe
> # to those records by PKDATAROWID
> d <- conc[is.element(conc$PKDATAROWID, flags$PKDATAROWID),]
>
> # Add in missing required parameters for virtual compute call
> klist <- c("KEL", "KELRSQ", "KELNOPT", "THALFF")
> if(!is.element("PARAMETERDISPLAYLIST", names(mct))) { mct$PARAMETERDISPLAYLIST <- "" }
> for(i in klist) {
+ ###if(regexpr(i, mct$PARAMETERDISPLAYLIST, ignore.case=TRUE)==-1) { mct$PARAMETERDISPLAYLIST <- c(mct$PARAMETERDISPLAYLIST, i) }
+ if(regexpr(i, mct$PARAMETERDISPLAYLIST, ignore.case=TRUE)==-1) { mct$PARAMETERDISPLAYLIST <- paste(mct$PARAMETERDISPLAYLIST, i, sep=";") }
+ }
>
> # Remove any leading semi-colons ";"
> mct$PARAMETERDISPLAYLIST <- gsub("^;*", "", mct$PARAMETERDISPLAYLIST, ignore.case=TRUE, perl=TRUE)
>
> # For virtual compute call only: Subset the parameters to be calculated to those in parameterdisplaylist
> if(!is.element("PARAMETERLIST", names(mct))) { mct$PARAMETERLIST <- "" }
>
> # Check whether TIME selection has been set in MCT - default to NOMINAL
> if(!is.element("TIME", names(mct))) { mct$TIME <- "NOMINAL" }
>
> # Determine whether there are any points selected for inclusion in the terminal elimination phase via
> # FLGEXKEL (0=not excluded/included; 1=excluded/not included)
> # ***What happens if there are no flags provided?***
> n <- factor(flags$FLGEXKEL, levels=c(0,1))
> ninc <- length(n[n==0])
> nexc <- length(n[n==1])
> model_spec(mct)
[1] "openNCA: Model: M1 DosingType: SS AUCMETHOD: LINLOG"
> mct$TIME #<- "Nominal"
[1] "NOMINAL"
> mct$NOMTIME
[1] "PKPTMS"
> mct$NOMTIMEU
[1] "PKPTMU"
> mct$ACTTIME #<- "PKATPD"
[1] "PKATPD"
> mct$ACTTIMEU
[1] "PKATPDU"
>
> mct$PARAMETERLIST
[1] "AUCALL;AUCALLDN;AUCINFO;AUCINFOC;AUCINFODN;AUCINFP;AUCINFPC;AUCINFPDN;AUCLAST;AUCLASTi;AUCLASTDNi;AUCLASTCi;AUCT;AUCT1_T2;AUCTAUi;AUCTAUDNi;AUCXPCTO;AUCXPCTP;AUMCTAUi;CAVi;CLASTi;CLFO;CLFTAUi;CLFTAUWi;CLO;CLRTAUi;CMAXi;CMAXCi;CMAXDNi;CMINi;DOSECi;CTROUGHi;CTROUGHENDi;DIi;DOSEi;KEL;KELNOPT;KELRSQ;KELRSQA;KELTMHI;KELTMLO;LASTTIME;MRTEVIFOi;MRTEVIFPi;PTFi;PTRi;PTROUGHRi;PTROUGHREND;TAU;TAUi;THALF;THALFF;TLAG;TLAST;TMAXi;TMINi;TOLD;VZFP;VZFTAUi;VZFTAUWi"
> mct$PARAMETERDISPLAYLIST
[1] "SUBJID;TREATXT;PKBDFLD;PKTERM;PERIODU;PERIOD;VISITU;VISIT;DOSE;DOSEU;ACTTRT;AUCTAU;AUCLASTi;AUCXPCTP;CLFTAUi;CMAX;CMAXi;KEL;KELNOPT;KELRSQ;KELTMHI;KELTMLO;THALF;TLAST;TMAX;TMAXi;VZFP;CAV;CTROUGH;CMIN;PTR;PTF;RACC;RSS;RACCMAXi;THALFF"
>
> parameterset <- "PARAMETERDISPLAYLIST"
> parameterset <- "PARAMETERLIST"
> parameterset
[1] "PARAMETERLIST"
>
> # Parmeters for M1SS
> model_parameters("M1|M1SS")
[1] "AUCALL" "AUCALLDN" "AUCDN" "AUCINFO" "AUCINFOC" "AUCINFODN" "AUCINFOi" "AUCINFP" "AUCINFPC" "AUCINFPDN" "AUCINFPi"
[12] "AUCLAST" "AUCLASTi" "AUCLASTC" "AUCLASTCi" "AUCLASTDN" "AUCLASTDNi" "AUCT" "AUCT1_T2" "AUCTAUDNi" "AUCTAU" "AUCTAUi"
[23] "AUCTDN" "AUCXPCTO" "AUCXPCTOi" "AUCXPCTP" "AUCXPCTPi" "AUMCINFO" "AUMCINFOi" "AUMCINFP" "AUMCINFPi" "AUMCLAST" "AUMCLASTi"
[34] "AUMCTAUi" "AUMCXPTO" "AUMCXPTOi" "AUMCXPTP" "AUMCXPTPi" "CAVi" "CEST" "CLAST" "CLASTi" "CLFO" "CLFOW"
[45] "CLFP" "CLFPW" "CLFTAUi" "CLFTAUWi" "CMAX" "CMAXi" "CMAXDN" "CMAXDNi" "CMIN" "CMINi" "CMINDN"
[56] "CMINDNi" "CTROUGHi" "CTROUGHENDi" "DIi" "DOSE" "DOSEi" "DOSEC" "DOSECi" "F" "FREL" "FRELLAST"
[67] "FRELLASTi" "FTAUi" "KEL" "KELC0" "KELNOPT" "KELR" "KELRSQ" "KELRSQA" "KELTMHI" "KELTMLO" "LASTTIME"
[78] "LASTTIMEi" "MRTEVIFO" "MRTEVIFOi" "MRTEVIFP" "MRTEVIFPi" "MRTLAST" "MRTLASTi" "PTF" "PTFi" "PTR" "PTRi"
[89] "PTROUGHRi" "PTROUGHRENDi" "RACi" "RACCMAXi" "RACCMINi" "RSSi" "TAU" "TAUi" "THALF" "THALFF" "TLAG"
[100] "TLAST" "TLASTi" "TMAX" "TMAXi" "TMIN" "TMINi" "TOLD" "TOLDi" "VZFO" "VZFOW" "VZFP"
[111] "VZFPW" "VZFTAUi" "VZFTAUWi"
>
> k <- parameter_required("OUTPUTUNIT$", names(mct), simplify=FALSE)
> k <- names(k)
> mct[,k]
TIMEOUTPUTUNIT AMOUNTOUTPUTUNIT DOSEOUTPUTUNIT VOLUMEOUTPUTUNIT CONCOUTPUTUNIT KELOUTPUTUNIT CLOUTPUTUNIT AUCOUTPUTUNIT AUMCOUTPUTUNIT AUCNORMOUTPUTUNIT AUROUTPUTUNIT
1 HR NA MG L NG/ML 1/HR L/HR NG.HR/ML NG.HR.HR/ML NG.HR/ML/MG NA
CONCNORMOUTPUTUNIT RATEOUTPUTUNIT VOLUMENORMOUTPUTUNIT CLNORMOUTPUTUNIT
1 NG/ML/MG NA L/KG ML/HR/KG
>
> k <- parameter_required("^AUC.", names(mct), simplify=FALSE)
> k <- names(k)
> mct[,k]
AUCMETHOD AUCOUTPUTUNIT AUCNORMOUTPUTUNIT AUCNPAIR AUC.1.T1 AUC.1.T2 AUC.2.T1 AUC.2.T2 AUC.3.T1 AUC.3.T2
1 LINLOG NG.HR/ML NG.HR/ML/MG 0 0 12 0 26 0 24
>
> mct.saved <- mct
>
> j <- parameter_required("DOSE", names(mct), simplify=FALSE)
> mct[, names(j)]
DOSE1 DOSE1U DOSEOUTPUTUNIT DOSETIM DOSETIMESTOP FLGACCEPTPREDOSECRIT
1 DOSE DOSEUNI MG DOSETIME DOSETIMESTOP 0.05
>
> j <- parameter_required("TAU|TOLD", names(mct), simplify=FALSE)
> mct[, names(j)]
TOLD1 TOLD1U TAU1 TAU1U FLGACCEPTTAU
1 TOLD TOLDU TAU TAUU FLGACCEPTTAU
>
> #mct$OPTIMIZEKEL <- 0 # don't optimize
> #mct$OPTIMIZEKEL <- 1 # optimize
> mct$OPTIMIZEKEL
[1] 0
> mct$INCLUDEEXTRAPOLATION
[1] 1
> mct$INCLUDEINTERPOLATION
[1] 1
> #mct$FLGNOCMAX <- 0 # permit CMAX in optimal selections for KEL
> #mct$FLGNOCMAX <- 1 # do NO permit CMAX in optimal selections for KEL
> mct$FLGNOCMAX
[1] 1
>
> table(d$PKPTMS, d$TREATXT)
61 mgA Tafa free acid cap 80 mg Tafa meglumine cap
0 30 30
0.5 30 30
1 30 30
2 30 30
3 30 30
4 30 30
6 30 30
8 30 30
12 30 30
24 30 30
>
> j <- parameter_required("^AUC.[0-9]+?.", names(mct), simplify=FALSE)
> mct[, names(j)]
AUC.1.T1 AUC.1.T2 AUC.2.T1 AUC.2.T2 AUC.3.T1 AUC.3.T2
1 0 12 0 26 0 24
>
> (tclabel <- paste0("results.", testcase.id, ".", mct$MODEL, ".", mct$DOSINGTYPE, ".", mct$AUCMETHOD))
[1] "results.tc071.M1.SS.LINLOG"
> results_list <- run_computation(data=d, map=mct, flag=flags, parameterset=parameterset)
unit_conversion : Unit Class 1 (Time) time_col: TMAX1 TMIN1 TLAST TLAG KELTMLO KELTMHI THALF LASTTIME MRTEVIFO1 MRTEVIFP1 TAU1 parameters are scaled from HR to HR via scaling factor: 1
unit_conversion : Unit Class 3 (Dose) dose_col: DOSE1 parameters are scaled from MG to MG via scaling factor: 1
unit_conversion : Unit Class 4 (Volume) volume_col: VZFTAU1 parameters are scaled from ML to L via scaling factor: 0.001
unit_conversion : Unit Class 5 (Amount/Volume) conc_col: CMAX1 CMIN1 CLAST1 CTROUGH1 CTROUGHEND1 CAV1 parameters are scaled from NG/ML to NG/ML via scaling factor: 1
unit_conversion : Unit Class 6 (1/Time) kel_col: KEL parameters are scaled from 1/HR to 1/HR via scaling factor: 1
unit_conversion : Unit Class 7 (Volume/Time) cl_col: CLFTAU1 parameters are scaled from ML/HR to L/HR via scaling factor: 0.001
unit_conversion : Unit Class 8: (Amount.Time/Volume) auc_col: AUCALL AUCLAST AUCLAST1 AUCLASTC1 AUCINFO AUCINFOC AUCINFP AUCINFPC AUCTAU1 parameters are scaled from NG.HR/ML to NG.HR/ML via scaling factor: 1
unit_conversion : Unit Class 9: (Amount.Time.Time/Volume) aumc_col: AUMCTAU1 parameters are scaled from NG.HR.HR/ML to NG.HR.HR/ML via scaling factor: 1
unit_conversion : Unit Class 12: ([Amount/Volume]/Amount) concdn_col: CMAXDN1 parameters are scaled from NG/ML/MG to NG/ML/MG via scaling factor: 1
Warning messages:
1: In run_M1_SS_computation(data = merged_data, map = map_data, method = method, :
Flag 'FLGEMESIS' is not present in the dataset
2: In unit_conversion(data = data_data, map = map_data, result = computation_df, :
'AMOUNTU' #2# is not present in the dataset provided via 'map'
3: In unit_conversion(data = data_data, map = map_data, result = computation_df, :
'CONCU' and 'DOSEU' values provided via 'map' is not present in the dataset provided via 'data'
4: In unit_conversion(data = data_data, map = map_data, result = computation_df, :
'PKPTMU' and 'CONCU' #10# are not present in the dataset provided via 'map'
5: In unit_conversion(data = data_data, map = map_data, result = computation_df, :
'CONCU' and 'NORMBSU' value provided via 'map' #13# are not present in the dataset provided via 'data'
6: In unit_conversion(data = data_data, map = map_data, result = computation_df, :
'CONCU', 'PKPTMU and 'NORMBSU' #19# are not present in the dataset provided via 'map'
> r <- results_list$data_out
> e <- results_list$est_data
> f <- results_list$flag_data
> # review eNCA Results
> results_list$ref <- read.csv(file=params["REFERENCERESULTS"], header=TRUE, sep=",", as.is=TRUE)
>
> k <- match(r$SDEID, results_list$ref$SDEID)
> x <- r$AUC0_24
> y <- results_list$ref$AUC0..24[k]
> compare(y, x, tolerance=10^-16)
36/60 mismatches (average diff: 13.3)
[1] 150481 - 150481 == -9.90e-10
[2] 132118 - 132138 == -1.97e+01
[3] 136703 - 136756 == -5.28e+01
[5] 176346 - 176346 == -1.02e-09
[6] 176465 - 176465 == -9.90e-10
[8] 158495 - 158495 == -9.90e-10
[10] 158790 - 158783 == 7.65e+00
[11] 137383 - 137373 == 1.05e+01
[13] 249063 - 249063 == -9.90e-10
...
> x <- r$AUCLAST
> y <- results_list$ref$AUCLAST[k]
> compare(y, x, tolerance=10^-16)
36/60 mismatches (average diff: 39.5)
[1] 150481 - 150481 == -9.90e-10
[2] 132118 - 132138 == -1.97e+01
[3] 136703 - 136756 == -5.28e+01
[5] 176346 - 176346 == -1.02e-09
[6] 176465 - 176465 == -9.90e-10
[8] 158495 - 158495 == -9.90e-10
[10] 158790 - 158783 == 7.65e+00
[11] 137383 - 137373 == 1.05e+01
[13] 249063 - 249063 == -9.90e-10
...
...