optimize()给出不同的答案?

时间:2018-06-16 14:38:08

标签: r function optimization

下面,我试图解决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

1 个答案:

答案 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 多年前读过这篇文章......)