如何用R的pwr包计算2:1分组比例的最优样本量?
2:1分组比例的样本量计算方案
用pwr包自带的pwr.2p2n.test函数
pwr.2p.test只适用于1:1等比例分组,不等比例的情况直接用同包的pwr.2p2n.test就行,这个函数支持指定两组不同的样本量。步骤如下:
- 先算效应量
h,和你之前的操作一致 - 通过设定两组样本量的比例(比如试验组:对照组=2:1,那n2=2*n1),用求解函数找到满足power要求的样本量
示例代码:
library(pwr) # 计算效应量h h_val <- ES.h(p1 = 0.6, p2 = 0.5) # 定义函数,输入n1(对照组样本量),返回当前power与目标0.8的差值 calc_power_diff <- function(n1) { test_result <- pwr.2p2n.test(h = h_val, n1 = n1, n2 = 2*n1, sig.level = 0.05, alternative = "greater") return(test_result$power - 0.8) } # 用uniroot求解满足条件的n1 n_control <- uniroot(calc_power_diff, interval = c(1, 1000))$root n_treatment <- 2 * n_control # 输出结果 cat(sprintf("对照组样本量:%d,试验组样本量:%d", round(n_control), round(n_treatment)))
用R基础包的power.prop.test函数
基础包自带的power.prop.test也能搞定,不需要额外装包,逻辑和上面类似:
# 定义求解函数 find_n <- function(n1) { test <- power.prop.test(p1 = 0.6, p2 = 0.5, n1 = n1, n2 = 2*n1, sig.level = 0.05, alternative = "greater") return(test$power - 0.8) } n_control <- uniroot(find_n, interval = c(1, 1000))$root n_treatment <- 2 * n_control cat(sprintf("对照组样本量:%d,试验组样本量:%d", round(n_control), round(n_treatment)))
额外提示
- 如果你不想写求解函数,也可以手动调整n1的值,看
pwr.2p2n.test返回的power是否接近0.8,不过用uniroot更精准 - 要是需要更灵活的样本量计算,也可以试试
presize包,但上面两个方法已经完全能满足你的需求
内容的提问来源于stack exchange,提问作者Ayoubinsky
相关产品推荐
相关产品推荐

