我正在寻找一个内置的R函数,它可以计算一个样本假设检验的比例。
内置函数power.prop.test只对比例进行两次SAMPLE假设检验。
最初的问题是:“你有多少次投掷硬币以确定它有偏见?
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)
}
我们在标准值范围内修正了alpha和beta。我们的目标是计算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)
从图中可以看出,β= 0.8的幂所需的N约为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乘以2, 为了从两个样本比例测试中获得一个样本功率。
如果有一个内置函数可以让你直接做一个样本,那就太好了。
谢谢!
答案 0 :(得分:1)
你可以尝试
library(pwr)
h <- ES.h(0.51, 0.5) # Compute effect size h for two proportions
pwr.p.test(h = h, n = NULL, sig.level = 0.05, power = 0.8, alternative = "two.sided")
# proportion power calculation for binomial distribution (arcsine transformation)
# h = 0.02000133
# n = 19619.53
# sig.level = 0.05
# power = 0.8
# alternative = two.sided
另外,显着加快模拟速度的一种方法是使用rbinom
代替runif
:
biased.coin2 <- function(delta, N) {
rbinom(1, N, 0.5 + delta) / N
}