Input data

There are five input data files (stored in 1_Data/) that are used by 2_Scripts/Model_Structure.R.

These are each described below.

Excel user interface

The majority of inputs for the code are made using an excel spreadsheet. This is currently populated with inputs that align with the final appraisal document (FAD) for TA964/ID6184, which is the appraisal of cabozantinib with nivolumab for untreated advanced renal cell carcinoma. Some of the inputs have been redacted in the publicly available spreadsheet as they are either academic and commercial in confidence (ACIC) or relate to the confident patient access scheme (cPAS). Hence, this version does not contain confidential company data, confidential price discounts or company individual patient data and treatment sequence data. The model does now contain UK real-world evidence (RWE) data which was redacted at the time of the appraisal at the request of the UK real-world evidence (RWE) data holders.

The data in the excel workbook will be imported to R using the sheet named ranges. In R, a nested list will be created where the Name is the reference for each item and the Cell Range is the content of the list.

To illustrate how this works, this example works through the parameter which contains a list of treatments allowed for population 1.

On the named ranges sheet, row 184 has Name List_pop1_allowed and Cell Range =Lists!$BA$11:$BA$22.

On the Lists sheet, we can see the list of allowed treatments.

Then, if we import the excel spreadsheet, we can view that same parameter within the nested list i.

# Import the functions required
source(file.path("../../3_Functions/excel/extract.R"))

# Import the excel file
excel_path <- "../../1_Data/ID6184_RCC_model inputs FAD version [UK RWE unredacted, ACIC redacted, cPAS redacted].xlsm"
i <- f_excel_extract(excel_path, verbose = FALSE)

# Tidy the imported parameters
i <- c(i,f_excel_cleanParams(i$R_table_param))

# View the parameter
i$List_pop1_allowed
 [1] "avelumab_plus_axitinib"      "axitinib"                   
 [3] "cabozantinib"                "everolimus"                 
 [5] "lenvatinib_plus_everolimus"  "cabozantinib_plus_nivolumab"
 [7] "nivolumab_monotherapy"       "pazopanib"                  
 [9] "sunitinib"                   "tivozanib"                  

Hazard ratios (HR) from the network meta-analyses (NMA)

These files contain the outputs of the proportional hazards NMA (PH NMA) and the fractional polynomial NMA (FP NMA). In the publicly available versions, time to next treatment as a surrogate for nivolumab plus ipilimumab is not available to the public as this data was marked as confidential by the data holders.

# Import the NMA results
RDS_path2 <- "../../1_Data/PH_NMA_CODA.rds"
RDS_path3 <- "../../1_Data/FPNMA_means.rds"
i$PHNMA <- readRDS(RDS_path2)
i$FPNMA$means  <- readRDS(RDS_path3)
# Preview the PH NMA results
kable(head(i$PHNMA$data))
run population line molecule endpoint referencetreatment referencetrial hr
1 0 1 4 0 7 0 0.8958580
1 0 1 1 0 7 0 0.7821468
1 0 1 8 0 7 0 1.4324613
1 0 1 2 0 7 0 0.7571763
1 0 1 5 0 7 0 0.9492596
1 0 1 3 0 7 0 0.8561836
# Preview the FP NMA results
kable(head(i$FPNMA$means))
time intervention_code reference_treatment_code line endpoint population ref_trial_code V1
0.4615385 4 7 1 1 0 0 6.0866273
0.6923077 4 7 1 1 0 0 0.7948374
0.9230769 4 7 1 1 0 0 0.6307802
1.1538462 4 7 1 1 0 0 0.6127038
1.3846154 4 7 1 1 0 0 0.6141338
1.6153846 4 7 1 1 0 0 0.6184885

In both tables, you can see that each row has a HR (hr/V1), and that these are for each combination of:

  • Population (population)
  • Line (line)
  • Treatment (molecule/intervention_code)
  • Endpoint (endpoint)
  • Reference treatment (referencetreatment/reference_treatment_code)
  • Reference trial (referencetrial/ref_trial_code)

The PH NMA results are from a Bayesian analysis and so has lots of samples for each HR (10,000). Hence, the filename is PH_NMA_CODA.rds, with CODA referring to “Convergence Diagnosis and Output Analysis”. When you run a Bayesian analysis, CODA samples are samples from the posterior distribution of your model parameters - in this case, the HRs.

max(i$PHNMA$data$run)
[1] 10000

The FP NMA results are also from a Bayesian analysis, but a mean has been taken of each sample. Hence, the filename FPNMA_means.rds. However, it does have another column time, which is present as FP NMA generates time-varying HR.

Individual patient data (IPD) from the real-world evidence (RWE)

This data represents the results from the RWE study by Challapalli et al. 2022, [1] with the patient-level data from that study shared by the owners of the dataset. In the publicly available version, data has been simulated to replaced data considered confidential by either the UK RWE dataholders or involved companies. The workbook has a sheet IPD which contains the patient-level data we want to import.

# Import data from excel
excel_path2 <- "../../1_Data/IPD_R_input_noACIC.xlsx"
wb <- f_excel_extract(excel_path2, verbose = FALSE)

# Save to `i` as a data table
# (`surv` as will use this data in survival analysis, and `pld` as it is
# patient-level data)
i$surv$pld <- as.data.table(wb$`_xlnm._FilterDatabase`)

# Preview data table
kable(head(i$surv$pld))
ID population line molecule trial endpoint timew event_censor Timeoriginalunits
6477 0 1 1 0 0 205.28572 1 205.28572
6478 0 1 1 0 0 40.00357 0 40.00357
6479 0 1 1 0 0 145.42857 0 145.42857
6480 0 1 1 0 0 108.85714 1 108.85714
6481 0 1 1 0 0 86.85714 1 86.85714
6482 0 1 1 0 0 53.42857 0 53.42857

Each row represents a patient. It states their:

  • Population, line, treatment and trial
  • Endpoint (e.g. overall survival (OS), progression-free survival (PFS))
  • At the timepoint given by timew (which is the time in weeks), whether they have experienced the event (event_censor). This can either be:
    • 1 - indicating the event occurred (e.g. patient died)
    • 0 - meaning their point is censored, so at the point when timing stopped (for whatever reason), the event had not occurred

Results from the survival analysis on the RWE IPD data

This R data file contains the results from a pre-run survival analysis on the patient-level RWE data (i.e. the output of the if statement run if i$dd_run_surv_reg == "Yes" in Model_Structure.R). In the publicly available version, time to discontinuation (TTD) and time to progression (TTP) are set equal to PFS in order to protect data considered confidential by the involved companies, and post-progression survival (PPS) is set equal to the UK RWE

The R data file is a large nested list from which you can select a:

  • Population (pop_0 to pop_2)
  • Line (line_1 to line_5)
  • Molecule (mol_0 to mol_12 and mol_990)
  • Trial (trial_0 to `trial_2)
  • Endpoint (endpoint_0 to endpoint_4)

There are then results with:

  • fs_fits
  • gof
  • st
  • plot
RDS_path <- "../../1_Data/survival_analysis_no_ipd_CompanyTTDTTPPPS_redacted.rds"
i$surv$reg <- readRDS(RDS_path)

Example with no result from survival analysis:

i$surv$reg$pop_0$line_1$mol_0$trial_0$endpoint_0
$pop
[1] "All"

$line
[1] "Previously untreated"

$mol
[1] "Nivolumab monotherapy"

$tr
[1] "CheckMate 9ER"

$endpoint
[1] "OS"

$fs_fits
NULL

$gof
NULL

$st
NULL

$plot
NULL

Example with a result - PFS on avelumab plus axitinib as a 1L treatment in a favourable risk population based on the real world evidence.

lapply(c("pop", "line", "mol", "tr", "endpoint"), function(x) i$surv$reg$pop_2$line_1$mol_4$trial_2$endpoint_1[[x]])
[[1]]
[1] "Favourable risk"

[[2]]
[1] "Previously untreated"

[[3]]
[1] "Avelumab plus axitinib"

[[4]]
[1] "Real world evidence"

[[5]]
[1] "PFS"

Various distributions were fit - for example, exponential…

i$surv$reg$pop_2$line_1$mol_4$trial_2$endpoint_1$fs_fits$exp
$coefs
[1] -5.016078

$vcov
           rate
rate 0.03846153

$fit
      AIC       BIC    logLik 
 314.8361  316.9792 -156.4180 

The goodness of fit for each distribution is described…

kable(i$surv$reg$pop_2$line_1$mol_4$trial_2$endpoint_1$gof)
AIC BIC logLik
gengamma 317.6759 324.1053 -155.8380
exp 314.8361 316.9792 -156.4180
weibull 316.2418 320.5281 -156.1209
lnorm 316.5742 320.8604 -156.2871
gamma 316.0581 320.3443 -156.0290
gompertz 316.8228 321.1090 -156.4114
llogis 315.2343 319.5206 -155.6172

And the extrapolated survival times are provided from survival analysis using each distribution…

kable(head(i$surv$reg$pop_2$line_1$mol_4$trial_2$endpoint_1$st, 10))
gengamma exp weibull lnorm gamma gompertz llogis
1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
0.9985777 0.9933915 0.9964812 0.9996291 0.9972167 0.9935903 0.9980669
0.9958140 0.9868266 0.9922259 0.9979763 0.9935048 0.9872169 0.9950622
0.9922663 0.9803051 0.9876526 0.9950948 0.9893592 0.9808795 0.9914695
0.9881616 0.9738267 0.9828687 0.9912317 0.9849185 0.9745780 0.9874457
0.9836342 0.9673911 0.9779288 0.9866047 0.9802557 0.9683123 0.9830798
0.9787752 0.9609981 0.9728668 0.9813859 0.9754168 0.9620820 0.9784315
0.9736504 0.9546473 0.9677061 0.9757088 0.9704341 0.9558872 0.9735446
0.9683099 0.9483384 0.9624641 0.9696773 0.9653318 0.9497276 0.9684535
0.9627928 0.9420713 0.9571540 0.9633732 0.9601284 0.9436030 0.9631860

References

[1]
Challapalli A, Ratnayake G, McGrane J, Frazer R, Gupta S, Parslow DS, et al. 1463P Patterns of care and outcomes of metastatic renal cell carcinoma (mRCC) patients (pts) with bone metastases (BM): A UK multicenter review. Annals of Oncology 2022;33:S1215. https://doi.org/10.1016/j.annonc.2022.07.1566.