代码如下:
function (n = 1, mu, Sigma, tol = 1e-06, empirical = FALSE, EISPACK = FALSE)
{
p <- length(mu)
if (!all(dim(Sigma) == c(p, p)))
stop("incompatible arguments")
if (EISPACK)
stop("'EISPACK' is no longer supported by R", domain = NA)
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)
if (empirical) {
X <- scale(X, TRUE, FALSE)
X <- X %*% svd(X, nu = 0)$v
X <- scale(X, FALSE, TRUE)
}
X <- drop(mu) + eS$vectors %*% diag(sqrt(pmax(ev, 0)), p) %*%
t(X)
nm <- names(mu)
if (is.null(nm) && !is.null(dn <- dimnames(Sigma)))
nm <- dn[[1L]]
dimnames(X) <- list(nm, NULL)
if (n == 1)
drop(X)
else t(X)
}
我好奇的问题所在是:
x <- eS$vectors %*% diag(sqrt(ev)) %*% t(x) # ignoring drop(mu)
...
t(x)
为什么会这样
X ^ T = UVZ ^ T,其中Z是标准的MVN?
我以为这是X = UVZ,其中X〜MVN(0,UV(I)(UV)^ T)= MVN(0,Sigma)?
对Siong Thye Goh的回答:
我可以看到代数,并且仅通过考虑维数就可以做到这一点,但是考虑到多元法线的属性,对所有事物进行转置的整个行为似乎很奇怪。即X = UVZ
我进行了一些检查,发现它实际上是Matrix Normal,并且仿射变换的工作方式与此类似。也就是说,X = Z(UV)^ T。
我不确定在了解这些内容时是否缺少一些愚蠢的东西,或者我是否完全遗漏了有关为什么一切都转换为Wikipedias Affine Transformation of a MVN
的图片答案 0 :(得分:0)
让我们计算协方差矩阵E [X ^ TX],看看它是否等于Sigma,其中X = UVZ ^ T和Z ^ T满足E [Z ^ TZ] = I,即恒等矩阵。
我们有
E [X ^ TX] = E [UVZ ^ TZVU ^ T] = UVE [Z ^ TZ] VU ^ T = UV ^ 2U ^ T = Sigma