这里有很多问题。
首先,伪随机偏差是否假设为正态分布?我假设它们是,因为如果我们偏离非正态分布,任何相关矩阵的讨论都会变得令人讨厌。
接下来,给定协方差矩阵,生成伪随机正态偏差相当简单。生成标准正态(独立)偏差,然后通过乘以协方差矩阵的 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 的最小扰动,使得生成的协方差(或相关)矩阵具有所需的值特性。)