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