【问题标题】:Why is the "pmvnorm" result different when the input matrix are covariance and correlation matrix?当输入矩阵是协方差和相关矩阵时,为什么“pmvnorm”结果不同?
【发布时间】:2018-05-04 07:42:03
【问题描述】:

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

为了方便,我直接把结果写下来。

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

相关矩阵 - 命名为 coo(由 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 coo 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)

请告诉我原因。

【问题讨论】:

    标签: r


    【解决方案1】:

    根据?pmvnorm(强调我的)

    sigma:n维的协方差矩阵。 “更正”或 可以指定“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)))   
    

    【讨论】:

    • 不用担心。很高兴帮助@Skkst
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2019-04-10
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多