假设我有 3 个变量,A,B和C并且我想生成数据,其中A和B相关r=x,A并且C相关r=y,并且B和C相关r=z。
- 是否有任何算法可以告诉我,给定、 和的指定值
x,如果有 , 的任何一组方差,并且会产生一个正定协方差矩阵?yzABC - 鉴于这种算法的存在,是否还有另一种算法,在可能存在正定协方差矩阵的情况下,会给我一组实现正定矩阵的方差?
假设我有 3 个变量,A,B和C并且我想生成数据,其中A和B相关r=x,A并且C相关r=y,并且B和C相关r=z。
x,如果有 , 的任何一组方差,并且会产生一个正定协方差矩阵?yzABC要跟进@cardinal 的评论:您的,, 和定义一个相关矩阵. 由于相关矩阵也是(标准化变量的)可能的协方差矩阵,因此它必须是正定的。如果所有特征值都是. 如果确实是正定的,那么所有方差向量(即数字)将把变成正定协方差矩阵,其中是制成的对角矩阵。
因此,只需从构造并检查特征值是否都。如果是这样,那么您很好,您可以将任何数据集转换为具有任意方差的相应协方差矩阵:
x <- 0.5
y <- 0.3 # changing this to -0.6 makes it not pos.def.
z <- 0.4
R <- matrix(numeric(3*3), nrow=3) # will be the correlation matrix
diag(R) <- 1 # set diagonal to 1
R[upper.tri(R)] <- c(x, y, z) # fill in x, y, z to upper right
R[lower.tri(R)] <- c(x, y, z) # fill in x, y, z to lower left
eigen(R)$values # get eigenvalues to check if pos.def.
给
[1] 1.8055810 0.7124457 0.4819732
所以我们是正定的。现在从任意方差构造相应的协方差矩阵。
vars <- c(4, 16, 9) # the variances
Sigma <- diag(sqrt(vars)) %*% R %*% diag(sqrt(vars))
生成一些数据矩阵,我们稍后将转换为具有该协方差矩阵。
library(mvtnorm) # for rmvnorm()
N <- 100 # number of simulated observations
mu <- c(1, 2, 3) # some arbitrary centroid
X <- round(rmvnorm(n=N, mean=mu, sigma=Sigma))
为此,我们首先对矩阵进行正交归一化,给出矩阵和协方差矩阵(恒等式)。
orthGS <- function(X) { # implement Gram-Schmidt algorithm
Id <- diag(nrow(X))
for(i in 2:ncol(X)) {
A <- X[ , 1:(i-1), drop=FALSE]
Q <- qr.Q(qr(A))
P <- tcrossprod(Q)
X[ , i] <- (Id-P) %*% X[ , i]
}
scale(X, center=FALSE, scale=sqrt(colSums(X^2)))
}
Xctr <- scale(X, center=TRUE, scale=FALSE) # centered version of X
Y <- orthGS(Xctr) # Y is orthonormal
变换矩阵具有协方差矩阵和质心。
编辑:这里发生了什么:做一个谱分解,其中是归一化特征向量的矩阵和是对应的特征值矩阵。现在矩阵有协方差矩阵,作为。
eig <- eigen(Sigma)
A <- eig$vectors %*% sqrt(diag(eig$values))
XX1ctr <- t(A %*% t(Y)) * sqrt(nrow(Y))
XX1 <- sweep(XX1ctr, 2, mu, "+") # move centroid to mu
检查相关矩阵是否真的是。
> all.equal(cor(XX1), R)
[1] TRUE
出于其他目的,现在的问题可能是:我如何找到一个与预先指定的非正定矩阵“非常相似”的正定矩阵。我不知道。
编辑:更正了一些平方根
如果您没有给出完整的相关集合,而只是部分集合,那么您可以构造一个半定规划可行性问题,该问题可用于确定是否存在具有指定相关性的相关矩阵。这可以通过各种 SDP 求解器解决,例如 SeDuMi 和 SDPT3。