MASS软件包中MVRNorm后面的代数

时间:2019-02-20 06:53:28

标签: r

代码如下:

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

的图片

1 个答案:

答案 0 :(得分:0)

U是Sigma的特征向量。那就是Sigma = UV ^ 2 U ^ T,其中V是对角矩阵。

让我们计算协方差矩阵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