nSurv()
is used to calculate the sample size for a clinical trial with a time-to-event endpoint and an assumption of proportional hazards.
This set of routines is new with version 2.7 and will continue to be modified and refined to improve input error checking and output format with subsequent versions.
It allows both the Lachin and Foulkes (1986) method (fixed trial duration) as well as the Kim and Tsiatis(1990) method (fixed enrollment rates and either fixed enrollment duration or fixed minimum follow-up).
Piecewise exponential survival is supported as well as piecewise constant enrollment and dropout rates.
The methods are for a 2-arm trial with treatment groups referred to as experimental and control.
A stratified population is allowed as in Lachin and Foulkes (1986); this method has been extended to derive non-inferiority as well as superiority trials.
Stratification also allows power calculation for meta-analyses.
gsSurv()
combines nSurv()
with gsDesign()
to derive a group sequential design for a study with a time-to-event endpoint.
print()
, xtable()
and summary()
methods are provided to operate on the returned value from gsSurv()
, an object of class gsSurv
. print()
is also extended to nSurv
objects.
The functions gsBoundSummary
(data frame for tabular output), xprint
(application of xtable
for tabular output) and summary.gsSurv
(textual summary of gsDesign
or gsSurv
object) may be preferred summary functions; see example in vignettes.
See also gsDesign print, summary and table summary functions for output of tabular summaries of bounds for designs produced by gsSurv()
.
Both nEventsIA
and tEventsIA
require a group sequential design for a time-to-event endpoing of class gsSurv
as input.
nEventsIA
calculates the expected number of events under the alternate hypothesis at a given interim time.
tEventsIA
calculates the time that the expected number of events under the alternate hypothesis is a given proportion of the total events planned for the final analysis.nSurv(lambdaC=log(2)/6, hr=.6, hr0=1, eta = 0, etaE=NULL,
gamma=1, R=12, S=NULL, T=NULL, minfup = NULL, ratio = 1,
alpha = 0.025, beta = 0.10, sided = 1, tol = .Machine$double.eps^0.25)
## S3 method for class 'nSurv':
print(x,digits=4,...)
gsSurv(k=3, test.type=4, alpha=0.025, sided=1,
beta=0.1, astar=0, timing=1, sfu=sfHSD, sfupar=-4,
sfl=sfHSD, sflpar=-2, r=18,
lambdaC=log(2)/6, hr=.6, hr0=1, eta=0, etaE=NULL,
gamma=1, R=12, S=NULL, T=NULL, minfup=NULL, ratio=1,
tol = .Machine$double.eps^0.25)
## S3 method for class 'gsSurv':
print(x,digits=2,...)
## S3 method for class 'gsSurv':
xtable(x, caption=NULL, label=NULL, align=NULL, digits=NULL,
display=NULL, footnote=NULL, fnwid="9cm", timename="months",...)
tEventsIA(x, timing=.25, tol = .Machine$double.eps^0.25)
nEventsIA(tIA=5, x=NULL, target=0, simple=TRUE)
nSurv
or gsSurv
. print.nSurv()
is used for an object of class nSurv
which will generally be output from nSurv()
. For print.gsSurv()
is used for an object of cprint.gsSurv.
); also a pass through to generic xtable()
from xtable.gsSurv()
.eta
; if NULL, this is set equal to eta
.gamma
. Length is the same as number of rows in gamma
. Note that when variable enrollment duration is specified (input T=NULL
)lambda
, eta
and etaE
; this is NULL if there is a single event rate per stratum (exponential failure) or length of the number of rT
is input as NULL
, this will be computed on output; see details.minfup
is input as NULL
, this will be computed on output; see details.T
or minfup
values are derived through root finding (T
or minfup
input as NULL
), tol
provides the level of error input to the uniroot()
root-finding 1=
one-sided
2=
two-sided symmetric
3=
two-sided, asymmetric, beta-spending with binding lower bound
4=
two-sided, asymmetric, beta-spending with non-binding lower bound
5=
two-sided, asymmettest.type=5
or 6
, astar
specifies the total
probability of crossing a lower bound at all analyses combined.
This will be changed to $1 -$alpha
when default value of 0 is ugsSurv
. Default of 1 produces equally spaced analyses.
Otherwise, this is a vector of length k
or k-1
.
The values should satisfy 0 < timing[1] < timing[2] < ...
sfupar
specifies any parameterstest.type = 3
,
4
, 5
, or 6
).
Unlike the upper bound, only spending functionsr
will not be changed by the y$T
.nEventsIA()
.xtable()
.xtable()
.xtable()
.xtable()
.nSurv()
returns an object of type nSurv
with the following components:beta
or computed if output beta
is computed.NULL
: T
, minfup
, beta
; otherwise, this is a constant times the input value required to power the trial given the other input variables.T
was NULL
on input.NULL
.
This and the remaining output below are not printed by the print()
extension for the nSurv
class.beta=NULL
was input.gsSurv()
returns much of the above plus an object of class gsDesign
in a variable named gs
; see gsDesign
for general documentation on what is returned in gs
.
The value of gs$n.I
represents the number of endpoints required at each analysis to adequately power the trial.
Other items returned by gsSurv()
are:gsDesign
) object.NULL
: T
, minfup
, beta
; otherwise, this is a constant times the input value required to power the trial given the other input variables.T
was NULL
on input.NULL
.
This and the remaining output below are not printed by the print()
extension for the nSurv
class.beta=NULL
was input.nEventsIA()
returns the expected proportion of the final planned events observed at the input analysis time minus target
when simple=TRUE
. When simple=FALSE
, nEventsIA
returns a list with following components:tIA
.T
.T
.T
.T
.tEventsIA()
returnsnSurv()
produces an object of class nSurv
with the number of subjects and events for a set of pre-specified trial parameters, such as accrual duration and follow-up period. The underlying power calculation is based on Lachin and Foulkes (1986) method for proportional hazards assuming a fixed underlying hazard ratio between 2 treatment groups. The method has been extended here to enable designs to test non-inferiority. Piecewise constant enrollment and failure rates are assumed and a stratified population is allowed. See also nSurvival
for other Lachin and Foulkes (1986) methods assuming a constant hazard difference or exponential enrollment rate.
When study duration (T
) and follow-up duration (minfup
) are fixed, nSurv
applies exactly the Lachin and Foulkes (1986) method of computing sample size under the proportional hazards assumption when
For this computation, enrollment rates are altered proportionately to those input in gamma
to achieve the power of interest.
Given the specified enrollment rate(s) input in gamma
, nSurv
may also be used to derive enrollment duration required for a trial to have defined power if T
is input as NULL
; in this case, both R
(enrollment duration for each specified enrollment rate) and T
(study duration) will be computed on output.
Alternatively and also using the fixed enrollment rate(s) in gamma
, if minimum follow-up minfup
is specified as NULL
, then the enrollment duration(s) specified in R
are considered fixed and minfup
and T
are computed to derive the desired power.
This method will fail if the specified enrollment rates and durations either over-powers the trial with no additional follow-up or underpowers the trial with infinite follow-up. This method produces a corresponding error message in such cases.
The input to gsSurv
is a combination of the input to nSurv()
and gsDesign()
.
While this routine may change in the future, it is likely to be backwards compatible with the current version.
nEventsIA()
is provided to compute the expected number of events at a given point in time given enrollment, event and censoring rates.
The routine is used with a root finding routine to approximate the approximate timing of an interim analysis. It is also used to extend enrollment or follow-up of a fixed design to obtain a sufficient number of events to power a group sequential design.gsBoundSummary
, xprint
,gsDesign package overview, Plots for group sequential designs, gsDesign
, gsHR
, nSurvival
# vary accrual rate to obtain power
nSurv(lambdaC=log(2)/6, hr=.5, eta=log(2)/40,gamma=1, T=36, minfup = 12)
# vary accrual duration to obtain power
nSurv(lambdaC=log(2)/6, hr=.5, eta=log(2)/40, gamma=6, minfup = 12)
# vary follow-up duration to obtain power
nSurv(lambdaC=log(2)/6, hr=.5, eta=log(2)/40, gamma=6, R=25)
# piecewise constant enrollment rates (vary accrual duration)
nSurv(lambdaC=log(2)/6, hr=.5, eta=log(2)/40, gamma=c(1,3,6),
R=c(3,6,9), minfup=12)
# stratified population (vary accrual duration)
nSurv(lambdaC=matrix(log(2)/c(6,12),ncol=2), hr=.5, eta=log(2)/40,
gamma=matrix(c(2,4),ncol=2), minfup=12)
# piecewise exponential failure rates (vary accrual duration)
nSurv(lambdaC=log(2)/c(6,12), hr=.5, eta=log(2)/40, S=3, gamma=6, minfup = 12)
# combine it all: 2 strata, 2 failure rate periods
nSurv(lambdaC=matrix(log(2)/c(6,12,18,24),ncol=2), hr=.5,
eta=matrix(log(2)/c(40,50,45,55),ncol=2), S=3,
gamma=matrix(c(3,6,5,7),ncol=2), R=c(5,10), minfup = 12)
# group sequential design (vary accrual rate to obtain power)
x<-gsSurv(k=4,sfl=sfPower,sflpar=.5,lambdaC=log(2)/6, hr=.5,
eta=log(2)/40,gamma=1, T=36, minfup = 12)
x
print(xtable(x,footnote="This is a footnote; note that it can be wide.",
caption="Caption example."))
# find expected number of events at time 12 in the above trial
nEventsIA(x=x,tIA=10)
# find time at which 1/4 of events are expected
tEventsIA(x=x,timing=.25)
Run the code above in your browser using DataLab