R 你会给出不同的答案吗?

R 你会给出不同的答案吗?,r,function,optimization,R,Function,Optimization,下面,我试图为ncp求解(有一个答案)。但是我想知道为什么当我扩展optimize中的interval参数时,答案会发生巨大的变化 我可以在这里使用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 =

下面,我试图为
ncp
求解(有一个答案)。但是我想知道为什么当我扩展
optimize
中的
interval
参数时,答案会发生巨大的变化

我可以在这里使用
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

f因为曲线最右边的部分太平-超过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
一般来说,通过平方或取绝对值将寻根问题转化为最小寻源问题是一种脆弱的策略(我几年前在数字配方中读到过这一点…)

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.