在函数中寻找 'x' 的最佳值:'uniroot()' 或 'optimize()'?

Finding the best value for 'x' in a function: 'uniroot()' or 'optimize()'?

我想知道如何最好地解决我下面的函数中的 x

我可以使用 uniroot()optimize() 吗?

这是我尝试过的(没有成功):

f <- function(x){ 
.8 - pt(qt(.05, df = x, lower = F)/sqrt(x + 1), df = x, ncp = .1*sqrt(x + 1), lower = F)
}

curve(f, 0, 30)

uniroot(f, c(0, 30))[[1]]

# Error in uniroot(f, c(0, 30)) : f.lower = f(lower) is NA
  In addition: Warning message:
  In qt(0.05, df = x, lower = F) : NaNs produced

(0) 一般来说,uniroot() 是正确的求根工具;正如我在之前的回答中所说,将寻根问题转换为最小化问题会使它更加脆弱。

(1) f(0)NaN,这会导致您的近端错误。

(2) uniroot(f,c(1e-8,30)) 给出

f() values at end points not of opposite sign

所以您要查找的解决方案在您查找的范围内不存在; curve().

的结果也清楚地表明了这一点

(3) uniroot(f,c(1e-8,30),extendInt="downX")("downX" 表示 uniroot 正在寻找向下交叉的根)有效,给出的值为 100.2549。如果您需要结果在 (0,30) 范围内,那您就不走运了。