我正在编写一个简单的程序来计算任何概率分布的逆。例如,在下面的代码片段中,我使用了对数正态分布。
cdf <- function(x){
plnorm(x, meanlog = 10, sdlog = 1.4, lower.tail = TRUE, log.p = FALSE)
}
root <- function(q){
uniroot(function(y){cdf(y)-q},lower=0,upper=Inf,extendInt="no",check.conv=FALSE,tol = .Machine$double.eps^0.25,maxiter = 1000,trace=0)
}
当我执行此代码并尝试找出概率值root(p)的倒数时,我收到错误“invalid'xmax'value”。
但是当我用upper=Inf
替换upper=100^100
代码时,代码运行正常。请让我知道为什么我不能使用Inf
作为我的上限值。
答案 0 :(得分:0)
uniroot
是内部zeroin2
C函数的一个轻量级包装器,它强制执行lower
和upper
参数的有限性(当你考虑它时这是有意义的 - 如何在有限的时间内优化无限区间?):
答案 1 :(得分:0)
这是uniroot
函数的不幸缺点。您可以将upper = .Machine$double.xmax
设置为无穷大上限的替代方法,这样可以防止函数返回错误,但是这样很难找到根,并且经常会最大化迭代次数而没有找到根的根。功能。除非您可以指定一个有限的间隔,否则该方法似乎很难找到函数的根。