R中uniroot函数的有效上限值

时间:2014-07-03 14:13:03

标签: r

我正在编写一个简单的程序来计算任何概率分布的逆。例如,在下面的代码片段中,我使用了对数正态分布。

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作为我的上限值。

2 个答案:

答案 0 :(得分:0)

uniroot是内部zeroin2 C函数的一个轻量级包装器,它强制执行lowerupper参数的有限性(当你考虑它时这是有意义的 - 如何在有限的时间内优化无限区间?):

https://github.com/SurajGupta/r-source/blob/b28ec999be30efae201f548ed5fb766b5ab9fcb4/src/library/stats/src/optimize.c#L360

答案 1 :(得分:0)

这是uniroot函数的不幸缺点。您可以将upper = .Machine$double.xmax设置为无穷大上限的替代方法,这样可以防止函数返回错误,但是这样很难找到根,并且经常会最大化迭代次数而没有找到根的根。功能。除非您可以指定一个有限的间隔,否则该方法似乎很难找到函数的根。