当输入矩阵是协方差和相关矩阵时,为什么“pmvnorm”结果不同?

时间:2017-11-20 23:45:05

标签: r

使用方差矩阵和相关矩阵时,结果不同。为什么会这样?

为方便起见,我会直接写下结果。

方差矩阵 - 命名为co
0.1234 0.125
0.1250 0.245

相关矩阵 - 命名为co(由cov2cor函数制作)
1.0000 0.7189
0.7189 1.0000

结果
pmvnorm(mean = c(1,1),sigma = co,lower = rep(-Inf,2),upper = c(0.7,4)
0.1965493

pmvnorm(mean = c(1,1),corr = coo,lower = rep(-Inf,2),upper = c(0.7,4)
0.3820885

我制作了一个协方差矩阵,我们得到了一个使用协方差矩阵的相关矩阵。并且实施了这两个值,结果不同。

是代码。

  

install.packages( “mvtnorm”)
  库(mvtnorm)
  co < - 矩阵(c(0.1234,0.125,0.125,0.245),2,2)
  coo&lt; - cov2cor(co)
  pmvnorm(mean = c(1,1),sigma = co,lower = rep(-Inf,2),upper = c(0.7,4)
  pmvnorm(mean = c(1,1),corr = coo,lower = rep(-Inf,2),upper = c(0.7,4)

请让我知道原因。

1 个答案:

答案 0 :(得分:0)

根据?pmvnorm(强调我的)

   sigma:维数n的协方差矩阵。 'corr'或者             'sigma'可以指定。 如果给出'sigma',问题是             标准化。如果没有'corr'或'sigma',那么             单位矩阵用于'sigma'。

因此,为了使两个计算保持一致,您需要在给出相关矩阵时给出标准化上限

# Using covariance matrix sigma
cov <- matrix(c(0.1234,0.125,0.125,0.245), 2, 2);
x1 <- pmvnorm(mean = c(1, 1), sigma = cov, lower = -Inf, upper = c(0.7, 4));
x1;
#[1] 0.1965493
#attr(,"error")
#[1] 1e-15
#attr(,"msg")
#[1] "Normal Completion"

# Using correlation matrix corr
# Note: Need to scale the upper limits
cor <- cov2cor(cov);
x2 <- pmvnorm(mean = c(0, 0), corr = cor, lower = -Inf, upper = (c(0.7, 4) - c(1, 1)) / sqrt(diag(cov)));
x2;
#[1] 0.1965493
#attr(,"error")
#[1] 1e-15
#attr(,"msg")
#[1] "Normal Completion"

PS。它有点隐藏,但?pmvnorm包含了两种方法互补性的简单例子。

 # Correlation and Covariance

 a <- pmvnorm(lower=-Inf, upper=c(2,2), sigma = diag(2)*2)
 b <- pmvnorm(lower=-Inf, upper=c(2,2)/sqrt(2), corr=diag(2))
 stopifnot(all.equal(round(a,5) , round(b, 5)))