Sample size based on power of TOST

Calculates the necessary sample size to have at least a given power.

sampleN.TOST(alpha = 0.05, targetpower = 0.8, logscale = TRUE, 
             theta0, theta1, theta2, CV, design = "2x2", method="exact", 
             robust=FALSE, print = TRUE, details = FALSE, imax=100)

Type I error probability. Per convention mostly set to 0.05.


Power to achieve at least. Must be >0 and <1. Typical values are 0.8 or 0.9.


Should the data used on log-transformed or on original scale? TRUE or FALSE. Defaults to TRUE.


'True' or assumed bioequivalence ratio. In case of logscale=TRUE it must be given as ratio, otherwise as difference to 1. See examples. Defaults to 0.95 if logscale=TRUE or to 0.05 if logscale=FALSE.


Lower bioequivalence limit. In case of logscale=TRUE it is given as ratio, otherwise as diff. to 1. Defaults to 0.8 if logscale=TRUE or to -0.2 if logscale=FALSE.


Upper bioequivalence limit. If not given theta2 will be calculated as 1/theta1 if logscale=TRUE or as -theta1 if logscale=FALSE.


Coefficient of variation as ratio.


Character string describing the study design. See known.designs() for designs covered in this package.


Method for calculation of the power. Defaults to "exact" in which case the calculation is done based on formulas with Owen's Q. The calculation via Owen's Q can also be choosen with method="owenq". Another exact method via direct use of the bivariate non-central t-distribution may be chosen with method="mvt". This may have somewhat lower precision compared to Owen's Q and has much longer run-time. Approximate calculations can be choosen via method="noncentral" or method="nct" for the approximation using the non-central t-distribution. With method="central" or method="shifted" the relative crude approximation via 'shifted' central t-distribution is chosen. The strings for method may be abbreviated.


Defaults to FALSE. With that value the usual degrees of freedom will be used. Set to TRUE will use the degrees of freedom according to the 'robust' evaluation (aka Senn's basic estimator). These df are calculated as n-seq. See known.designs()$df2 for designs covered in this package. Has only effect for higher-order crossover designs.


If TRUE (default) the function prints its results. If FALSE only the data.frame with the results will be returned.


If TRUE the design characteristics and the steps during sample size calculations will be shown. Defaults to FALSE.


Maximum number of steps in sample size search. Defaults to 100. Adaption only in rare cases needed.


The sample size is calculated via iterative evaluation of power of the TOST procedure. Start value for the sample size search is taken from a large sample approximation according to Zhang, modified. The sample size is bound to 4 as minimum.


A data.frame with the input and results will be returned. The "Sample size" column contains the total sample size.


Of course it is highly recommended to use the default method="exact" :-)). There is no reason beside testing and comparative purposes to use an approximation if the exact method is available at no extra costs.


The function does not vectorize properly. If you need sample sizes with varying CVs f.i. use for-loops or the apply-family.


Phillips KF. Power of the Two One-Sided Tests Procedure in Bioequivalence J Pharmacokin Biopharm. 1990;18:137--44. 10.1007/BF01063556

Diletti D, Hauschke D, Steinijans VW. Sample Size Determination for Bioequivalence Assessment by Means of Confidence Intervals Int J Clin Pharmacol Ther Toxicol. 1991;29(1):1--8.

Diletti D, Hauschke D, Steinijans VW. Sample size determination: Extended tables for the multiplicative model and bioequivalence ranges of 0.9 to 1.11 and 0.7 to 1.43 Int J Clin Pharmacol Ther Toxicol. 1992;30(Suppl 1):S59--62.

Zhang P. A Simple Formula for Sample Size Calculation in Equivalence Studies J Biopharm Stat. 2003;13(3):529--538. 10.1081/BIP-120022772

See Also

power.TOST, known.designs

  • sampleN.TOST
# Exact calculation for a classical 2x2 cross-over (TR/RT),
# BE limits 80 ... 125%, assumed true BE ratio 0.95, intra-subject CV=30%,
# using all the default values
# should give n=40 power=0.815845

# Exact calculation for a parallel group design
# evaluation on the original (untransformed) scale
# BE limits 80 ... 120% = -20% ... +20% of reference,
# assumed true BE ratio 0.95% = -5% to reference mean,
# total CV=20%
# should give n=48 (total) power=0.815435
sampleN.TOST(logscale=FALSE, theta1=-0.2, theta0=-0.05, CV=0.2, design="parallel")

# A rather strange setting of theta0! Have a look at n.
# It would be better this is not the sample size but the running total
# of my bank account. But the first million is the hardest ;-).
sampleN.TOST(CV=0.2, theta0=0.8005, theta1=0.8)
# }
Documentation reproduced from package PowerTOST, version 1.4-5, License: GPL (>= 2)

Community examples

Looks like there are no examples yet.