Skip to content

calcSubjectsFunction: should clarify allocationRatioPlanned should be treated as vector instead of scalar #19

Closed
@pmahling

Description

@pmahling

You probably want to update your examples in the manual/ vignette about the custom sample size re-calculation functions: making it clear that allocationRatioPlanned is treated as a vector in the back end, not a scalar. Please see below example.

simpowerCPZ shows error message:

Error in fun(alternative = alternative, kMax = design$kMax, maxNumberOfIterations = maxNumberOfIterations, :
Evaluation error: the condition has length > 1.

simpowerCPZ2 uses allocationRatioPlanned[stage] instead and it runs fine.

library(rpact)
n1<-8 #interim sample size/arm
Nmin<-15 #min sample size/arm
Nmax<-23 #max sample size/arm

designc<-getDesignInverseNormal(sided = 1, alpha = 0.05, beta = 0.2,kMax=2,informationRates=c(n1/Nmin,1),
typeOfDesign = "noEarlyEfficacy", typeBetaSpending = "bsHSD",gammaB = -3)

custom SSR function

myCPZSampleSizeCalculationFunction <- function(..., stage,
minNumberOfSubjectsPerStage,
maxNumberOfSubjectsPerStage,
conditionalPower,
conditionalCriticalValue,
allocationRatioPlanned,
thetaH1,
stDevH1) {

function adapted from example in ?getSimulationMeans

note conditionalCriticalValue gives the critical value on the mean/proportion level of current stage data alone

instead of the overall cumulative critical Values on the z-scale (uk) at current stage

it already took care of 1. the weights based inverse normal method 2. observed data from previous stages

and gives critical values with the design

calculateStageSubjects <- function(cp) {

(1 + allocationRatioPlanned)^2/allocationRatioPlanned * 
  (max(0, conditionalCriticalValue + stats::qnorm(cp)))^2 / 
  (max(1e-12, thetaH1/stDevH1))^2

}

Calculate sample size required to reach maximum desired conditional power

cp_max (provided as argument conditionalPower)

stageSubjectsCPmax <- calculateStageSubjects(cp = conditionalPower)

Calculate sample size required to reach minimum desired conditional power

cp_min (manually set for this example to 0.7)

stageSubjectsCPmin <- calculateStageSubjects(cp = 0.7)

Define stageSubjects

stageSubjects <- ceiling(min(max(minNumberOfSubjectsPerStage[stage], stageSubjectsCPmax), maxNumberOfSubjectsPerStage[stage]))

Set stageSubjects to minimal sample size in case minimum conditional power

cannot be reached with available sample size

if (stageSubjectsCPmin > maxNumberOfSubjectsPerStage[stage]) {
stageSubjects <- minNumberOfSubjectsPerStage[stage]
}

return sample size

return(stageSubjects)
}

custom SSR function

myCPZSampleSizeCalculationFunction2 <- function(..., stage,
minNumberOfSubjectsPerStage,
maxNumberOfSubjectsPerStage,
conditionalPower,
conditionalCriticalValue,
allocationRatioPlanned,
thetaH1,
stDevH1) {

function adapted from example in ?getSimulationMeans

note conditionalCriticalValue gives the critical value on the mean/proportion level of current stage data alone

instead of the overall cumulative critical Values on the z-scale (uk) at current stage

it already took care of 1. the weights based inverse normal method 2. observed data from previous stages

and gives critical values with the design

calculateStageSubjects <- function(cp) {

  (1 + allocationRatioPlanned[stage])^2/allocationRatioPlanned[stage] *
  (max(0, conditionalCriticalValue + stats::qnorm(cp)))^2 / 
  (max(1e-12, thetaH1/stDevH1))^2

}

Calculate sample size required to reach maximum desired conditional power

cp_max (provided as argument conditionalPower)

stageSubjectsCPmax <- calculateStageSubjects(cp = conditionalPower)

Calculate sample size required to reach minimum desired conditional power

cp_min (manually set for this example to 0.7)

stageSubjectsCPmin <- calculateStageSubjects(cp = 0.7)

Define stageSubjects

stageSubjects <- ceiling(min(max(minNumberOfSubjectsPerStage[stage], stageSubjectsCPmax), maxNumberOfSubjectsPerStage[stage]))

Set stageSubjects to minimal sample size in case minimum conditional power

cannot be reached with available sample size

if (stageSubjectsCPmin > maxNumberOfSubjectsPerStage[stage]) {
stageSubjects <- minNumberOfSubjectsPerStage[stage]
}

return sample size

return(stageSubjects)
}
simpowerCPZ <- getSimulationMeans(designc,
alternative =0.65, stDev =0.7,
# cumulative overall sample size
plannedSubjects = 2 * c(n1, Nmin),
# stage-wise minimal overall sample size
minNumberOfSubjectsPerStage = 2 * c(n1, (Nmin - n1)),
# stage-wise maximal overall sample size
maxNumberOfSubjectsPerStage = 2 * c(n1, (Nmax - n1)),
conditionalPower = 0.8,
thetaH1 = 0.5, stDevH1=0.7,
maxNumberOfIterations = 1000,
seed = 12345,
calcSubjectsFunction = myCPZSampleSizeCalculationFunction)
simpowerCPZ2 <- getSimulationMeans(designc,
alternative =0.65, stDev =0.7,
# cumulative overall sample size
plannedSubjects = 2 * c(n1, Nmin),
# stage-wise minimal overall sample size
minNumberOfSubjectsPerStage = 2 * c(n1, (Nmin - n1)),
# stage-wise maximal overall sample size
maxNumberOfSubjectsPerStage = 2 * c(n1, (Nmax - n1)),
conditionalPower = 0.8,
thetaH1 = 0.5, stDevH1=0.7,
maxNumberOfIterations = 1000,
seed = 12345,
calcSubjectsFunction = myCPZSampleSizeCalculationFunction2)

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions