1popower <- function(p, odds.ratio, n, n1, n2, alpha=.05) 2{ 3 if(missing(n)) 4 n <- n1+n2 5 else { 6 n1 <- n2 <- n/2 7 } 8 9 p <- p[!is.na(p)] 10 if(abs(sum(p)-1)>.0001) 11 stop('probabilities in p do not add up to 1') 12 13 z <- qnorm(1-alpha/2) 14 A <- n2/n1 15 ps <- 1 - sum(p^3) 16 V <- n1*n2*n/3/((n+1)^2)*ps 17 power <- pnorm(abs(logb(odds.ratio))*sqrt(V) - z) 18 eff <- ps/(1-1/n/n) 19 structure(list(power=power, eff=eff), class='popower') 20} 21 22 23print.popower <- function(x, ...) 24{ 25 cat('Power:',round(x$power,3), 26 '\nEfficiency of design compared with continuous response:', 27 round(x$eff,3),'\n\n') 28 invisible() 29} 30 31 32posamsize <- function(p, odds.ratio, fraction=.5, 33 alpha=.05, power=.8) 34{ 35 p <- p[!is.na(p)] 36 if(abs(sum(p)-1)>.0001) 37 stop('probabilities in p do not add up to 1') 38 39 A <- (1-fraction)/fraction 40 log.or <- logb(odds.ratio) 41 z.alpha <- qnorm(1-alpha/2) 42 z.beta <- qnorm(power) 43 ps <- 1 - sum(p^3) 44 n <- 3*((A+1)^2)*(z.alpha+z.beta)^2/A/(log.or^2)/ps 45 eff <- ps/(1-1/n/n) 46 structure(list(n=n,eff=eff), class='posamsize') 47} 48 49 50print.posamsize <- function(x, ...) 51{ 52 cat('Total sample size:',round(x$n,1), 53 '\nEfficiency of design compared with continuous response:', 54 round(x$eff,3),'\n\n') 55 invisible() 56} 57