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