【问题标题】:Why "Uniroot" command gives the different results为什么“Uniroot”命令给出不同的结果
【发布时间】:2013-01-15 22:53:15
【问题描述】:

我对 uniroot 命令有疑问。我无法以合乎逻辑的方式提出我的问题,因为我不知道为什么在下面示例的第二种情况下每次结果都不同。 在第一种情况下,我的 f 函数的结果总是相同的:

library(mvtnorm)
f <- function(y1_upr,y2_upr = -0.05453663,target = 25e-4,df=3) {
    pmvt(upper = c(y1_upr,y2_upr),df = df) - target
}
uniroot(f,c(-10000,10000))$root

但我不知道为什么当我在同一个函数中添加另一个参数时,结果每次都会改变(见下文):

g <- function(y1_upr,
              y2_upr = -0.05453663,
              y3_upr = -0.06236616,
              target = 25e-4,
              df = 3) {
    pmvt(upper = c(y1_upr,y2_upr,y3_upr),df = df) - target
} 
uniroot(g,c(-10000,10000))$root

您会看到,每次使用 g 函数应用 uniroot 命令时,都会得到不同的结果。 有人对此有想法吗?我可以找到解决结果的方法吗?

【问题讨论】:

  • pmvt的功能是什么?
  • 累积概率。多t分布函数

标签: r


【解决方案1】:

该算法可能涉及某种随机性度量以选择起点。试试:

set.seed(1) 
uniroot(g,c(-10000,10000))$root

【讨论】:

  • +1 帮助页面详细信息:该方法基于随机准蒙特卡罗方法,并在 Genz 和 Bretz (1999, 2002) 中进行了描述。
【解决方案2】:

@joran 是正确的,因为 pmvt 的默认 GenzBretz 算法涉及随机元素。还有一种替代算法,TVPACK,它给出了一致的结果,但可能不太普遍:

replicate(10,pmvt(upper=c(0,-0.05453663,-0.06236616),df=3))
 [1] 0.1145384 0.1145367 0.1145365 0.1145336 0.1145381 0.1145354 0.1145385
 [8] 0.1145369 0.1145384 0.1145385
replicate(10,pmvt(upper=c(0,-0.05453663,-0.06236616),df=3,algorithm=TVPACK()))
 [1] 0.1145364 0.1145364 0.1145364 0.1145364 0.1145364 0.1145364 0.1145364
 [8] 0.1145364 0.1145364 0.1145364

【讨论】:

  • 不错。你能解释为什么结果对于 2D 案例是确定性的吗?它只是更高的精度,还是算法的改变?
  • @BenBolker 我不确定。看起来它可能是更高的精度。对于一系列参数值,在 2D 情况下,错误似乎大致为 .Machine$double.eps 的顺序
猜你喜欢
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多