Possible Duplicate:
how to generate pseudo-random positive definite matrix with constraints on the off-diagonal elements?
用户想要对 var/covar 矩阵中每对变量之间的相关性施加唯一的、非平凡的、上限/下限。
例如:我想要一个方差矩阵,其中所有变量都具有 0.9 > |rho(x_i,x_j)| > 0.6
,rho(x_i,x_j)
是变量 x_i
和 x_j
之间的相关性。
谢谢。
这里有很多问题。
首先,伪随机偏差是否假设为正态分布?我假设它们是,因为如果我们偏离非正态分布,任何关于相关矩阵的讨论都会变得令人讨厌。
接下来,在给定协方差矩阵的情况下,生成伪随机正态偏差相当简单。生成标准正态(独立)偏差,然后乘以协方差矩阵的 Cholesky 因子进行变换。如果均值不为零,则在末尾添加均值。
而且,在给定相关矩阵的情况下,协方差矩阵的生成也相当简单。只需将相关矩阵前后乘以由标准差组成的对角矩阵即可。这会将相关矩阵缩放为协方差矩阵。
我仍然不确定这个问题的问题出在哪里,因为生成“随机”相关矩阵似乎很容易,元素均匀分布在所需范围内。
因此,按照任何合理的标准,以上所有内容都是微不足道的,并且有许多工具可以根据上述信息生成伪随机正态偏差。
也许问题是用户坚持认为生成的随机偏差矩阵必须在指定范围内具有相关性。您必须认识到,一组随机数只会在渐近意义上具有所需的分布参数。因此,随着样本量趋于无穷大,您应该期望看到指定的分布参数。但是任何小样本集都不一定具有所需的参数,在所需的范围内。
例如,(在 MATLAB 中)这是一个简单的正定 3x3 矩阵。因此,它构成了一个非常好的协方差矩阵。
S = randn(3);
S = S'*S
S =
0.78863 0.01123 -0.27879
0.01123 4.9316 3.5732
-0.27879 3.5732 2.7872
我会将 S 转换为相关矩阵。
s = sqrt(diag(S));
C = diag(1./s)*S*diag(1./s)
C =
1 0.0056945 -0.18804
0.0056945 1 0.96377
-0.18804 0.96377 1
现在,我可以使用统计工具箱从正态分布中采样(mvnrnd 应该可以做到这一点。)使用 Cholesky 因子同样简单。
L = chol(S)
L =
0.88805 0.012646 -0.31394
0 2.2207 1.6108
0 0 0.30643
现在,生成伪随机偏差,然后根据需要对其进行变换。
X = randn(20,3)*L;
cov(X)
ans =
0.79069 -0.14297 -0.45032
-0.14297 6.0607 4.5459
-0.45032 4.5459 3.6549
corr(X)
ans =
1 -0.06531 -0.2649
-0.06531 1 0.96587
-0.2649 0.96587 1
如果您希望相关性必须始终大于 -0.188,那么这种抽样技术就失败了,因为数字是伪随机的。事实上,除非您的样本量足够大,否则这个目标将很难实现。
您可以采用简单的拒绝方案,即进行抽样,然后重复重复抽样,直到样本具有所需的属性,并且相关性在所需的范围内。这可能会很累。
一种可能有效的方法(但我目前还没有完全想到)是使用上述标准方案来生成随机样本。计算相关性。如果它们未能位于适当的范围内,则确定需要对数据的实际(测量)协方差矩阵进行的扰动,以便相关性达到预期。现在,为您的采样数据找到一个零均值随机扰动,它将使样本协方差矩阵向所需方向移动。
这可能有效,但除非我知道这实际上是手头的问题,否则我不会费心去深入研究它。 (编辑:我对这个问题想了更多,它似乎是一个二次规划问题,具有二次约束,找到对矩阵 X 的最小扰动,使得得到的协方差(或相关)矩阵具有所需的属性。)