Насколько я понимаю, pmvnorm в библиотеке mvtnorm - это функция для вычисления CDF по многомерному нормальному распределению. Итак, это детерминированная функция. Однако я обнаружил, что результаты меняются каждый раз, когда я запускаю эту функцию с теми же входными данными. Вот небольшой пример.
library(mvtnorm)
lower <- c( -Inf, -0.07, 0.81, -Inf, 0.89, -Inf, 1.33, 1.21, -Inf)
upper <- c( 1.00, 0.34, 0.98, -0.04, 1.07, 0.01, 1.48, 1.38, 0.09)
sigma <- matrix(c(0.03, 0.00, -0.01, 0.00, 0.00, 0.00, 0.00, 0.00, 0.02,
0.00, 1.00, 0.66, 0.64, 0.64, 0.64, 0.64, 0.64, 0.64,
-0.01, 0.66, 0.99, 0.66, 0.64, 0.64, 0.64, 0.64, 0.64,
0.00, 0.64, 0.66, 1.00, 0.66, 0.64, 0.64, 0.64, 0.64,
0.00, 0.64, 0.64, 0.66, 1.00, 0.66, 0.64, 0.64, 0.64,
0.00, 0.64, 0.64, 0.64, 0.66, 1.00, 0.66, 0.64, 0.64,
0.00, 0.64, 0.64, 0.64, 0.64, 0.66, 1.00, 0.66, 0.64,
0.00, 0.64, 0.64, 0.64, 0.64, 0.64, 0.66, 1.00, 0.66,
0.02, 0.64, 0.64, 0.64, 0.64, 0.64, 0.64, 0.66, 1.00),
byrow=TRUE,length(lower))
set.seed(1)
(try1 <- pmvnorm(lower=lower,upper=upper,sigma=sigma))
Это дает мне значения:
[1] 4.42436e-09
attr(,"error")
[1] 4.312159e-13
attr(,"msg")
[1] "Normal Completion"
Теперь я повторно оцениваю функцию с другим семенем.
set.seed(2)
(try2 <- pmvnorm(lower=lower,upper=upper,sigma=sigma))
Тогда я получаю:
[1] 4.424396e-09
attr(,"error")
[1] 4.048187e-13
attr(,"msg")
[1] "Normal Completion"
А также
try1 == try2
дает мне:
[1] FALSE
Кто-нибудь может объяснить, почему это происходит?