下面,我试图解决ncp
(有一个答案)。但我想知道为什么当我在interval
中扩展optimize
论证时,答案会彻底改变?
我可以在这里使用uniroot
代替optimize
吗?
f <- function(pwr, q, df1, df2, ncp){
abs(pwr - pf(q, df1, df2, ncp, lower.tail = FALSE))
}
optimize(f, interval = c(0, 1e2), pwr = .8, q = 2.5, df1 = 3, df2 = 108)[[1]]
# [1] 10.54639 !!! HERE
optimize(f, interval = c(0, 5e2), pwr = .8, q = 2.5, df1 = 3, df2 = 108)[[1]]
# [1] 499.9999 !!! HERE
答案 0 :(得分:3)
因为曲线的最右边部分太平 - 超过150的所有值都是相同的。
效用函数:
f2 <- function(x) f(x, pwr = .8, q = 2.5, df1 = 3, df2 = 108)
cc <- curve(f2(x)-0.2,from=150,to=500)
unique(cc$y)
## [1] -5.551115e-17
uniroot()
确实可以正常工作:我们必须更改函数f
以返回已签名的值。
f <- function(pwr, q, df1, df2, ncp){
pwr - pf(q, df1, df2, ncp, lower.tail = FALSE)
}
uniroot(f, interval = c(0, 5e2), pwr = .8, q = 2.5, df1 = 3, df2 = 108)
## $root
## [1] 10.54641
## $f.root
## [1] -3.806001e-08
## etc.
一般来说,通过平方或取绝对值将根发现问题转换为最小发现问题是一种脆弱的策略(我在 Numerical Recipes 多年前读过这篇文章......)