1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
"epi.sscompc" <- function(N = NA, treat, control, sigma, n, power, r = 1, design = 1, sided.test = 2, nfractional = FALSE, conf.level = 0.95) {
alpha.new <- (1 - conf.level) / sided.test
z.alpha <- qnorm(1 - alpha.new, mean = 0, sd = 1)
if (!is.na(treat) & !is.na(control) & !is.na(n) & !is.na(power)){
stop("Error: at least one of treat, n and power must be NA.")
}
# Sample size:
if(!is.na(treat) & !is.na(control) & is.na(n) & !is.na(sigma) & !is.na(power)){
# Sample size. From Woodward p 398:
z.beta <- qnorm(power, mean = 0, sd = 1)
delta <- abs(treat - control)
n <- ((r + 1)^2 * (z.alpha + z.beta)^2 * sigma^2) / (delta^2 * r)
# Account for the design effect:
n <- n * design
n.treat <- (n / (r + 1)) * r
n.control <- (n / (r + 1)) * 1
n.total <- n.treat + n.control
p.treat <- n.treat / n.total
p.control <- n.control / n.total
# Finite population correction:
n.total <- ifelse(is.na(N), n.total, (n.total * N) / (n.total + (N - 1)))
n.treat <- ifelse(is.na(N), n.treat, p.treat * n.total)
n.control <- ifelse(is.na(N), n.control, p.control * n.total)
# Fractional:
n.treat <- ifelse(nfractional == TRUE, n.treat, ceiling(n.treat))
n.control <- ifelse(nfractional == TRUE, n.control, ceiling(n.control))
n.total <- n.treat + n.control
rval <- list(n.total = n.total, n.treat = n.treat, n.control = n.control, power = power, delta = delta)
}
# Power:
else
if(!is.na(treat) & !is.na(control) & !is.na(n) & !is.na(sigma) & is.na(power)){
# Study power. From Woodward p 401:
delta <- abs(treat - control)
# Account for the design effect:
n <- n / design
if(nfractional == TRUE){
n.crude <- n
n.treat <- (n / (r + 1)) * r
n.control <- (n / (r + 1)) * 1
n.total <- n.treat + n.control
}
if(nfractional == FALSE){
n.crude <- ceiling(n)
n.treat <- ceiling(n / (r + 1)) * r
n.control <- ceiling(n / (r + 1)) * 1
n.total <- n.treat + n.control
}
z.beta <- ((delta * sqrt(n * r)) / ((r + 1) * sigma)) - z.alpha
power <- pnorm(z.beta, mean = 0, sd = 1)
rval <- list(n.total = n.total, n.treat = n.treat, n.control = n.control, power = power, delta = delta)
}
# Delta:
else
if(is.na(treat) & is.na(control) & !is.na(n) & !is.na(sigma) & !is.na(power)){
# Maximum detectable difference. From Woodward p 401:
z.beta <- qnorm(power, mean = 0, sd = 1)
# Account for the design effect:
n <- n / design
if(nfractional == TRUE){
n.crude <- n
n.treat <- (n / (r + 1)) * r
n.control <- (n / (r + 1)) * 1
n.total <- n.treat + n.control
}
if(nfractional == FALSE){
n.crude <- ceiling(n)
n.treat <- ceiling(n / (r + 1)) * r
n.control <- ceiling(n / (r + 1)) * 1
n.total <- n.treat + n.control
}
delta <- ((r + 1) * (z.alpha + z.beta) * sigma) / (sqrt(n * r))
rval <- list(n.total = n.total, n.treat = n.treat, n.control = n.control, power = power, delta = delta)
}
rval
}
|