首页 > 解决方案 > optimize() 给出不同的答案?

问题描述

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

标签: rfunctionoptimization

解决方案


因为曲线的最右边部分太平 - 所有超过 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.

一般来说,通过平方或取绝对值将求根问题转换为求最小值问题是一种脆弱的策略(我在多年前的数值食谱中读到过这个......)


推荐阅读