【问题标题】:How to calculate multivariate normal distribution function in R如何在R中计算多元正态分布函数
【发布时间】:2016-11-15 18:38:00
【问题描述】:

这是我尝试过的,使用 mvtnorm

样本数据集

library(mvtnorm)

set.seed(2357)
df <- data.frame(
  x = rnorm(1000, mean=80, sd=20),
  y = rnorm(1000, mean=0, sd=5),
  z = rnorm(1000, mean=0, sd=5)
)

head(df)
      x      y       z
1 70.38  1.307  0.2005
2 59.76  5.781 -3.5095
3 54.14 -1.313 -1.9022
4 79.91  7.754 -6.2076
5 87.07  1.389  1.1065
6 75.89  1.684  6.2979

拟合多元正态分布并检查 P(x
# Get the dimension means and correlation matrix
means <- c(x=mean(df$x), y=mean(df$y), z=mean(df$z))
corr <- cor(df)

# Check P(x <= 80)
sum(df$x <= 80)/nrow(df)  # 0.498
pmvnorm(lower=-Inf, upper=c(80, Inf, Inf), mean=means, corr=corr)  # 0.8232

为什么拟合结果是 0.82?我哪里做错了?

【问题讨论】:

    标签: r normal-distribution


    【解决方案1】:

    首先,你不需要模拟任何东西来研究pmvnorm函数:

    pmvnorm(lower=rep(-Inf, 3), upper=c(80, Inf, Inf), mean=c(80,0,0), corr=diag(rep(1,3)))
    

    结果是0.5,正如你所料。

    你的均值向量大约是(79, 0, 0),让我们试试吧:

    pmvnorm(lower=rep(-Inf, 3), upper=c(80, Inf, Inf), mean=c(79,0,0), corr=diag(rep(1,3)))
    

    现在的结果是0.8413447没有什么问题。通过仅指定相关矩阵,您告诉软件假设所有方差都是统一的。在您的模拟中,方差分别为 400、25 和25:与您在参数中指定的非常不同!

    正确的计算使用数据的协方差矩阵,而不是其相关矩阵:

    pmvnorm(lower=rep(-Inf, 3), upper=c(80, Inf, Inf), mean=means, sigma=cov(df))
    

    结果是0.5178412,和数据很吻合。

    【讨论】:

    • @Frank 感谢您的帮助编辑。我会在以后的帖子中记住这个约定!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2017-05-11
    • 1970-01-01
    • 2021-11-14
    • 2014-01-04
    • 2020-07-22
    相关资源
    最近更新 更多