我参与了运行实验,我们希望获得足够的样本量以获得一定宽度的 CI(或等效的一定功率)。
我们目前运行几百个单位的试点,计算方差(我们忽略影响的大小),然后估计获得我们想要的 CI 宽度所需的样本。
样本是一个估计值,所以有时(~一半)CI 最终会比我们预期的要小,有时会更大。当它变大时,客户会不高兴。
建议的一种方法是保持采样直到 CI 宽度足够小。对我来说,这感觉很接近 p-hacking,但我们没有计算 p 值,而且我们(仍然)没有考虑影响的大小。
这是合法的吗?
我参与了运行实验,我们希望获得足够的样本量以获得一定宽度的 CI(或等效的一定功率)。
我们目前运行几百个单位的试点,计算方差(我们忽略影响的大小),然后估计获得我们想要的 CI 宽度所需的样本。
样本是一个估计值,所以有时(~一半)CI 最终会比我们预期的要小,有时会更大。当它变大时,客户会不高兴。
建议的一种方法是保持采样直到 CI 宽度足够小。对我来说,这感觉很接近 p-hacking,但我们没有计算 p 值,而且我们(仍然)没有考虑影响的大小。
这是合法的吗?
作为对我的问题的部分回答,我运行了一个模拟以查看它是否导致对的不当拒绝。
library(dplyr)
set.seed(1234)
start_n <- 20
increment_n <- 20
target_se <- 0.05
vec_p <- numeric()
vec_se <- numeric()
vec_n <- numeric()
vec_mean <- numeric()
# H0 true
for (i in 1:1000) {
y <- rnorm(start_n)
keep_running <- TRUE
while(keep_running == TRUE) {
se <- sd(y) / sqrt(length(y))
p <- t.test(y)$p.value
keep_running <- se > target_se
y <- c(y, rnorm(increment_n))
}
vec_se <- c(vec_se, se)
vec_p <- c(vec_p, p)
vec_n <- c(vec_n, length(y))
vec_mean <- c(vec_mean, mean(y))
}
mean(vec_p < 0.05)
table(vec_n)
这使:
Type I error rate: 0.045
vec_n
320 340 360 380 400 420 440 460 480 500 520
1 2 17 56 166 242 289 161 55 9 2
(vec_n 是在实验停止之前达到的样本大小。)
I 类错误率往往低于 0.05,@Michael Lew 的回答对此进行了解释。
采样直到获得指定的置信区间宽度在技术上类似于顺序测试,并且可能被某些人认为类似于 p-hacking,但这并不意味着您不这样做!
如果您关心的是对总体方差的准确估计,那么“CI 小于时停止”策略通常会为您提供较低的估计值,因为在降低样本标准差的观察后抽样更有可能停止而不是在增加它的观察之后。然而,这种偏差可能非常小,因此很可能没有实际问题。这将取决于样本大小,因此也取决于指定的 CI 宽度。大样本会减少,因为大样本在停止之前会有一个相对稳定的 CI 估计,而小样本 CI 会随着每个新的观察而波动更大。
如果您关心的是准确估计总体均值,那么我认为没有任何问题,因为您的停止规则不依赖于样本均值。
P-hacking 不是一种全有或全无的现象,有时可能是非法的程序在其他情况下可能是好的做法!它取决于推理目标以及实验设计考虑。请参阅此处的第 3 节:https ://link.springer.com/chapter/10.1007/164_2019_286