Power and sample size for case-cohort design
Arguments
- n
the total number of subjects in the cohort.
- q
the sampling fraction of the subcohort.
- pD
the proportion of the failures in the full cohort.
- p1
proportions of the two groups (p2=1-p1).
- theta
log-hazard ratio for two groups.
- alpha
type I error – significant level.
- beta
type II error.
- power
if specified, the power for which sample size is calculated.
- verbose
error messages are explicitly printed out.
Details
The power of the test is according to $$\Phi\left(Z_\alpha+m^{1/2}\theta\sqrt{\frac{p_1p_2p_D}{q+(1-q)p_D}}\right)$$ where \(\alpha\) is the significance level, \(\theta\) is the log-hazard ratio for two groups, \(p_j\), j=1, 2, are the proportion of the two groups in the population. \(m\) is the total number of subjects in the subcohort, \(p_D\) is the proportion of the failures in the full cohort, and \(q\) is the sampling fraction of the subcohort.
Alternatively, the sample size required for the subcohort is $$m=nBp_D/(n-B(1-p_D))$$ where \(B=(Z_{1-\alpha}+Z_\beta)^2/(\theta^2p_1p_2p_D)\), and \(n\) is the size of cohort.
When infeaisble configurations are specified, a sample size of -999 is returned.
References
Cai J, Zeng D (2004). “Sample size/power calculation for case-cohort studies.” Biometrics, 60(4), 1015-24. doi:10.1111/j.0006-341X.2004.00257.x .
Examples
if (FALSE) { # \dontrun{
# Table 1 of Cai & Zeng (2004).
alpha <- 0.05
table1 <- rbind(
transform(
within(expand.grid(
pD = c(0.10, 0.05),
p1 = c(0.3, 0.5),
theta = c(0.5, 1.0),
q = c(0.1, 0.2)
), {
n <- 1000
power <- mapply(ccsize,
n = n, q = q, pD = pD, p1 = p1, theta = theta,
MoreArgs = list(alpha = alpha)
)
}),
power = signif(power, 3)
),
transform(
within(expand.grid(
pD = c(0.05, 0.01),
p1 = c(0.3, 0.5),
theta = c(0.5, 1.0),
q = c(0.01, 0.02)
), {
n <- 5000
power <- mapply(ccsize,
n = n, q = q, pD = pD, p1 = p1, theta = theta,
MoreArgs = list(alpha = alpha)
)
}),
power = signif(power, 3)
)
)
# ARIC study
aric <- within(
data.frame(
n = 15792,
pD = 0.03,
p1 = 0.25,
hr = c(1.35, 1.40, 1.45),
q = c(1463, 722, 468) / 15792
), {
alpha <- 0.05
beta <- 0.2
power <- mapply(ccsize,
n = n, q = q, pD = pD, p1 = p1, theta = log(hr),
MoreArgs = list(alpha = alpha)
)
ssize <- mapply(ccsize,
n = n, q = q, pD = pD, p1 = p1, theta = log(hr),
MoreArgs = list(alpha = alpha, beta = beta, power = FALSE)
)
power <- signif(power, 3)
}
)
# EPIC study
epic <- within(
expand.grid(
pD = c(0.3, 0.2, 0.1, 0.05),
p1 = seq(0.1, 0.5, by = 0.1),
hr = seq(1.1, 1.4, by = 0.1)
), {
n <- 25000
q <- 0.1
alpha <- 5e-8
beta <- 0.2
ssize <- mapply(ccsize,
n = n, q = q, pD = pD, p1 = p1, theta = log(hr),
MoreArgs = list(alpha = alpha, beta = beta, power = FALSE)
)
}
)
epic <- subset(epic, !is.na(ssize) & ssize > 0)
# exhaustive search
search <- within(
expand.grid(
pD = c(0.3, 0.2, 0.1, 0.05),
p1 = seq(0.1, 0.5, by = 0.1),
hr = seq(1.1, 1.4, by = 0.1),
q = seq(0.01, 0.5, by = 0.01)
), {
n <- 25000
alpha <- 5e-8
power <- mapply(ccsize,
n = n, q = q, pD = pD, p1 = p1, theta = log(hr),
MoreArgs = list(alpha = alpha)
)
nq <- n * q
}
)
} # }