Я ищу встроенную функцию R, которая вычисляет мощность одного теста гипотезы для пропорций.
Встроенная функция power.prop.test позволяет проверять гипотезы ДВА ОБРАЗЦА на пропорции.
Оригинальный вопрос: «Сколько раз вам приходится подбрасывать монету, чтобы определить, что она смещена?
p.null <- 0.5 # null hypothesis.
Мы говорим, что монета "смещена", если вероятность броска головы
больше 0,51 или меньше 0,49. В противном случае мы говорим, что это «достаточно хорошо»
delta <- 0.01
Вот функция, которая подбрасывает смещенную монету N раз и возвращает пропорцию голов:
biased.coin <- function(delta, N) {
probs <- runif(N, 0, 1)
heads <- probs[probs < 0.5+delta]
return(length(heads)/N)
}
Мы фиксируем альфа и бета на стандартных значениях. Наша цель - рассчитать N.
alpha = 0.05 # 95% confidence interval
beta = 0.8 # Correctly reject the null hypothesis 80% of time.
Первый шаг - использовать симуляцию.
Один эксперимент состоит в том, чтобы бросить монету N раз и отвергнуть нулевую гипотезу, если число головок отклоняется "слишком далеко" от ожидаемого значения N / 2
Затем мы повторим эксперимент M раз и посчитаем, сколько раз (правильно) отклоняется нулевая гипотеза.
M <- 1000
simulate.power <- function(delta, N, p.null, M, alpha) {
print(paste("Calculating power for N =", N))
reject <- c()
se <- sqrt(p.null*(1-p.null))/sqrt(N)
for (i in (1:M)) {
heads <- biased.coin(delta, N) # perform an experiment
z <- (heads - p.null)/se # z-score
p.value <- pnorm(-abs(z)) # p-value
reject[i] <- p.value < alpha/2 # Do we rejct the null?
}
return(sum(reject)/M) # proportion of time null was rejected.
}
Далее мы строим график (медленно, около 5 минут):
ns <- seq(1000, 50000, by=1000)
my.pwr <- c()
for (i in (1:length(ns))) {
my.pwr[i] <- simulate.power(delta, ns[i], p.null, M, alpha)
}
plot(ns, my.pwr)
Из графика видно, что N, которое вам нужно для мощности беты = 0,8, составляет около 20000.
Симуляция очень медленная, поэтому было бы неплохо иметь встроенную функцию.
Немного повозившись, дал мне это:
magic <- function(p.null, delta, alpha, N) {
magic <-power.prop.test(p1=p.null,
p2=p.null+delta,
sig.level=alpha,
###################################
n=2*N, # mysterious 2
###################################
alternative="two.sided",
strict=FALSE)
return(magic[["power"]])
}
Давайте построим это на основе наших смоделированных данных.
pwr.magic <- c()
for (i in (1:length(ns))) {
pwr.magic[i] <- magic(p.null, delta, alpha, ns[i])
}
points(ns, pwr.magic, pch=20)
Подгонка хорошая, но я понятия не имею, почему мне нужно умножить N на два,
для того, чтобы получить мощность одной выборки из теста пропорции двух образцов.
Было бы хорошо, если бы была встроенная функция, которая позволяла бы вам сделать один сэмпл напрямую.
Спасибо!