[1] 262.0594
Nestlé rpact Training 2024, Lausanne
May 24, 2024
getPowerSurvival(alpha = 0.025, hazardRatio = 0.67,
directionUpper = FALSE,
maxNumberOfEvents = 280,
maxNumberOfSubjects = 350,
median2 = 8.5,
accrualTime = 28)$analysisTime [,1]
[1,] 40.52321
“Milestone-based” investment:
Two-stage approach with interim after 140 events
Enough power for detecting HR = 0.67
If conditional power CP for detecting HR = 0.75 falls in a “promizing zone”, an additional investment would be made that allows the trial to remain open until 420 PFS events were obtained
Conditional power based on assumed minimum clinical relevant effect HR = 0.75
Number of events for the second stage between 140 and 280
If conditional power for 280 additional events at HR = 0.75 is smaller than \(cp_{min}\), set number of additional events = 140 (non-promising case)
If conditional power for 140 additional events at HR = 0.75 exceeds \(cp_{max}\), set number of additional events = 140, otherwise calculate event number according to \[CP_{HR = 0.75} = cp_{max}\] (promising case)
This defined a promizing zone for HR within the sample size may be modified.
rpactFirst, define the design
Define the event number calculation function myEventSizeCalculationFunction()
# Define promizing zone event size function
myEventSizeCalculationFunction <- function(..., stage,
plannedEvents,
conditionalPower,
minNumberOfEventsPerStage,
maxNumberOfEventsPerStage,
conditionalCriticalValue,
estimatedTheta) {
calculateStageEvents <- function(cp) {
4 * max(0, conditionalCriticalValue + qnorm(cp))^2 /
log(max(1 + 1e-12, estimatedTheta))^2
}
# Calculate events required to reach maximum desired conditional power
# cp_max (provided as argument conditionalPower)
stageEventsCPmax <- ceiling(calculateStageEvents(cp = conditionalPower))
# Calculate events required to reach minimum desired conditional power
# cp_min (**manually set for this example to 0.8**)
stageEventsCPmin <- ceiling(calculateStageEvents(cp = 0.8))
# Define stageEvents
stageEvents <- min(max(minNumberOfEventsPerStage[stage], stageEventsCPmax),
maxNumberOfEventsPerStage[stage])
# Set stageEvents to minimal sample size in case minimum conditional power
# cannot be reached with available sample size
if (stageEventsCPmin > maxNumberOfEventsPerStage[stage]) {
stageEvents <- minNumberOfEventsPerStage[stage]
}
# return overall events for second stage
return(plannedEvents[1] + stageEvents)
}by specifying calcEventsFunction = myEventSizeCalculationFunction and a range of assumed true hazard ratios
simSurvPromZone <- getSimulationSurvival(design = myDesign,
hazardRatio = hazardRatioSeq,
directionUpper = FALSE,
plannedEvents = c(140, 280),
median2 = 8.5,
minNumberOfEventsPerStage = c(NA, 140),
maxNumberOfEventsPerStage = c(NA, 280),
thetaH1 = 0.75,
conditionalPower = 0.9,
accrualTime = 36,
calcEventsFunction = myEventSizeCalculationFunction,
maxNumberOfIterations = maxNumberOfIterations,
longTimeSimulationAllowed = TRUE,
maxNumberOfSubjects = 500) Specify calcEventsFunction = NULL
simSurvCondPower <- getSimulationSurvival(design = myDesign,
hazardRatio = hazardRatioSeq,
directionUpper = FALSE,
plannedEvents = c(140, 280),
median2 = 8.5,
minNumberOfEventsPerStage = c(NA, 140),
maxNumberOfEventsPerStage = c(NA, 280),
thetaH1 = 0.75,
conditionalPower = 0.9,
accrualTime = 36,
calcEventsFunction = NULL,
maxNumberOfIterations = maxNumberOfIterations,
longTimeSimulationAllowed = TRUE,
maxNumberOfSubjects = 500) rpact