使用mvrnorm在R中创建多维正态分布数据

3
我正在使用mvrnorm来生成具有平均值为mu <- rep(0,4)Sigma为某个正定对称矩阵的多元正态分布数据。但是,我发现我生成的向量中的最后一个元素总是0,对此有何想法?
> mvrnorm(n = 1, mu, Sigma, tol = 1e-6, empirical = FALSE, EISPACK = FALSE)
[1]  0.1813268 -0.8993918  0.7461007  0.0000000
> mvrnorm(n = 1, mu, Sigma, tol = 1e-6, empirical = FALSE, EISPACK = FALSE)
[1] 3.2539025 2.9855514 0.7313427 0.0000000
> mvrnorm(n = 1, mu, Sigma, tol = 1e-6, empirical = FALSE, EISPACK = FALSE)
[1] -0.8133201 -1.0011971 -0.3800518  0.0000000

提前感谢您!

编辑:感谢回复,是的,我已经检查了Sigma,它出现了一些问题。


1
你的 Sigma 似乎有问题。我使用 Sigma = diag(4) 这个例子可以正常工作。 - OzanStats
和Ozan147一样 - CIAndrews
1个回答

2

原因是在 tol = 1e-6 的情况下,您的 Sigma 被认为不是满秩的。然而,mvrnorm 进行秩检测的方式有点奇怪。请查看 MASS::mvrnorm 内部:

eS <- eigen(Sigma, symmetric = TRUE)
ev <- eS$values
if (!all(ev >= -tol * abs(ev[1L]))) 
    stop("'Sigma' is not positive definite")
X <- matrix(rnorm(p * n), n)
#[...omitted...]
X <- drop(mu) + eS$vectors %*% diag(sqrt(pmax(ev, 0)), p) %*% t(X)

与其

ev >= tol * abs(ev[1L])

它可以实现

ev >= -tol * abs(ev[1L])

因此,您必须拥有负特征值才能获得秩亏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接