我对uniroot命令有疑问。我不能以合乎逻辑的方式提出我的问题,因为我不知道为什么每次在我的例子的第二个案例中结果都不同。 在第一种情况下,对于我的f函数,out out总是相同的:
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命令时,它会给你不同的结果。 有没有人对此有所了解?我可以找到一种方法来修复我的结果吗?
答案 0 :(得分:3)
该算法可能涉及一些随机性测量,以便选择一个起点。尝试:
set.seed(1)
uniroot(g,c(-10000,10000))$root
答案 1 :(得分:2)
@joran是正确的,GenzBretz
的默认pmvt
算法包含随机元素。有一种替代算法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