3

uniroot コマンドについて質問があります。以下の例の 2 番目のケースで結果が毎回異なる理由がわからないため、論理的な方法で質問を提起することはできません。最初のケースでは、私の 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 コマンドを適用するたびに、異なる結果が得られることがわかります。誰かがそれについて考えを持っていますか? 結果を修正する方法を見つけることはできますか?

4

2 に答える 2

3

アルゴリズムには、開始点を選択するために、おそらくある程度のランダム性が含まれます。試す:

set.seed(1) 
uniroot(g,c(-10000,10000))$root
于 2013-01-15T23:19:27.660 に答える
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
于 2013-01-16T07:56:56.953 に答える