当我运行power.t.test时,当SD低于2时我会收到错误。更糟糕的是,当我在循环中运行它时,它会使结果的其余部分为0。
有人可以解释一下问题是什么以及如何解决它?
power.t.test(#n=10,
power=.95,
sig.level=.05,
sd= 1.069045,
delta =91,
alternative = "two.sided",
strict = FALSE
)
Error in uniroot(function(n) eval(p.body) - power, c(2, 1e+07), tol = tol, :
did not succeed extending the interval endpoints for f(lower) * f(upper) <= 0
In addition: Warning message:
In qt(sig.level/tside, nu, lower.tail = FALSE) : NaNs produced
答案 0 :(得分:1)
您遇到了一些内部问题(我还没有完全诊断出来,哪些可能被视为错误,尽管也可能是&# 34;不要那么做&#34;)。问题是,您所需的样本数量太低,power.t.test
可以找到。在内部,power.t.test
使用对uniroot(..., interval=c(2,1e7))
的调用来尝试查找样本大小 - 也就是说,它会尝试n=2
和n=1e7
之间的所有值(应该{涵盖所有现实案例!)。它会尝试(如下所示)在必要时扩展搜索区域,但在极端情况下它显然无法管理。
表中其余值为零的原因是for
循环在遇到错误时停止运行。你可以试试像
for (...) {
pp <- try(power.t.test(...))
if (inherits(pp,"try-error")) {
## set stuff to NA
} else {
## set stuff to values extracted from pp
}
}
(有更复杂的方法可以使用tryCatch()
来捕获错误,但这是我通常做的...)
f <- function(sd) {
pp <- try(power.t.test(power=.95,sig.level=.05,
delta =91, sd=sd,
alternative = "two.sided",
strict = FALSE
),silent=TRUE)
if (inherits(pp,"try-error")) return(NA)
else return(pp$n)
}
f(1.4) ## 1.382
f(1.37) ## 1.38
f(1.36) ## NA
我怀疑这是否是一个实际问题(除了循环停止);如果power.t.test
以这种方式失败,那么您就知道所需的样本数量小于1.38 - 即任何实际情况都非常小。