knitr::opts_chunk$set(echo = TRUE)

This case study (CS) builds on Case Study 4 by adding a second dose to ISA 2. For simplicity, this case study assumes both doses in ISA 2 have the same treatment effect. For ISA 2, the decision to go is based on a Go decision for either dose or the No Go decision is made if both doses are a No Go.

The R code may be found in the Examples/CaseStudy5. The main differences are found in the SimulationDesign.R file when multiple arms are added to ISA 2.

Assumptions

Trial Design Elements

If the goal at the end of the study is to make a decision of Go or No Go, then $P_U = P_L$.

In the context of this case study, patient outcomes are not expected to change over the 24 weeks for the control treatment, where as the treatment is expected to decrease the values of the patient outcomes. Thus, $\delta_C - \delta_T$ is expected to be greater than 0 for effective treatments and consequently, high values for $\rho$ indicate an effective treatment.

The function SetupTrialDesign() is located in TrialDesign.R and the function is called to build the trial object from the BuildMe.R file in this example.

Simulation Design Elements

The simulation object contains all information to specify how the trial is simulated. Specifically, it contains a list of scenarios, such as the null and alternative, details about patient accrual rates and in a multiple ISA setting information about how and when the second and subsequent ISAs are added to the trial.

For case study 5, the data for each patient is simulated from a multi-variate normal with a binary covariate. The patient covariate is specified as a responder or non-responder and the outcome value over time is simulated from a MVN with a separate mean vector specified for responders and non-responders. Based on the historical data we have the following means for responders and non-responders shown below is used to specify various scenarios in the simulation study, more detail provided below.

Table 1 - True Means

    nQtyCol   <- 7

    vMeanTrt  <- c( 3.5, 3.4, 3.0, 2.5,  2.9, 1.4, 0.9 )
    vMeanCtrl <- c( 3.5, 3.5, 3.5, 3.5,  3.5, 3.5, 3.5 )

    mVarCov   <- matrix( c( 0.5, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4,
                            0.4, 0.5, 0.4, 0.4, 0.4, 0.4, 0.4,
                            0.4, 0.4, 0.5, 0.4, 0.4, 0.4, 0.4,
                            0.4, 0.4, 0.4, 0.5, 0.4, 0.4, 0.4,
                            0.4, 0.4, 0.4, 0.4, 0.5, 0.4, 0.4,
                            0.4, 0.4, 0.4, 0.4, 0.4, 0.5, 0.4,
                            0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.5), ncol=nQtyCol )
    dfMean <- data.frame(  rbind( Nonresponders =vMeanCtrl,Responder=vMeanTrt)  )
    row.names( dfMean) <- c("Non-responders", "Responders")
    colnames(dfMean) <- c( "Baseline", paste("Week",seq(4,24,4)))
    knitr::kable( dfMean, caption="True Means", label="TrueMeans" ) 


    mVarCov   <- matrix( c( 0.5, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4,
                            0.4, 0.5, 0.4, 0.4, 0.4, 0.4, 0.4,
                            0.4, 0.4, 0.5, 0.4, 0.4, 0.4, 0.4,
                            0.4, 0.4, 0.4, 0.5, 0.4, 0.4, 0.4,
                            0.4, 0.4, 0.4, 0.4, 0.5, 0.4, 0.4,
                            0.4, 0.4, 0.4, 0.4, 0.4, 0.5, 0.4,
                            0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.5), ncol=nQtyCol )

In addition, the estimates of the variance/covariance over time is

Table 2 - Variance/Covariance Matrix

write_matrix <- function(strMatrixName, mMatrix) {
  begin <- paste( "$$", strMatrixName, " = \\begin{bmatrix}", sep="")
  end <- "\\end{bmatrix}$$"
  X <-
    apply(mMatrix, 1, function(x) {
      paste(
        paste(x, collapse = "&"),
        "\\\\"
      )
    })
  paste(c(begin, X, end), collapse = "")
}

r write_matrix( "V",mVarCov)

In general, the responders and non-responders could have different var-cov matrix but for simplicity in this case study they are assumed to be the same.

The trial recruitment is specified in terms of the number of patients accrued per month per site (patients/month/site) and the number of sites open in the platform. For simplicity, the ramp-up in the number of patients/month/site is not applied within a site and recruitment to the platform assumes a Poisson process with the rate equal to the number of patients/month/site * number of sites open.

To specify the scenarios, each treatment specifies a percent of patients that are responders and non-responders. For the control treatment, the percent of responders is 2% in all scenarios. The treatment are varies the percent of responders from 2% (the null case) to 40%.

During the simulation of a virtual trials, a patient is first simulated as a responder or non-responder and then their observed values over time from the corresponding MVN. In this case study, an effective treatment is expected to move patients from the non-responder category to the responder category.

The function SetupSimulations() is located in SimulationDesign.R and the function is called to build the simulation object for the BuildMe.R file in this example.

R Code

Begin with the BuildMe.R file. This file loads the OCTOPUS package and sources the design file.
The file TrialDesign.R contains the function necessary to set-up the design object. The file SimulationDesign.R contains the functions necessary to set-up the simulation design. In this case study, it is important to look at both the TrialDesign.R and SimulaitonDesign.R to understand how the addition of a second ISA impacts the trial design and simulation design elements.

Borrowing Control Patients

For borrowing of control patients please see Case Study 4.



kwathen/OCTOPUS documentation built on Oct. 24, 2024, 12:36 p.m.