我想生成两个具有指定相关性的随机向量。第二个向量的每个元素必须与第一个向量的对应元素相关,并且独立于其他元素。
我怎么能在 MATLAB 中做到这一点?
顺便说一下,第一个向量的元素没有相同的分布,我的意思是第一个向量的每个元素应该有不同的方差。(向量由 7 个具有不同方差的变量组成。
我想生成两个具有指定相关性的随机向量。第二个向量的每个元素必须与第一个向量的对应元素相关,并且独立于其他元素。
我怎么能在 MATLAB 中做到这一点?
顺便说一下,第一个向量的元素没有相同的分布,我的意思是第一个向量的每个元素应该有不同的方差。(向量由 7 个具有不同方差的变量组成。
如这篇 Mathworks 文章中所述,您可以执行以下操作:
生成两个随机向量(即具有两列的随机矩阵)。假设您希望矩阵中每个元素的分布为均值和单位方差为零的高斯分布:
N = 1000; %// Number of samples in each vector
M = randn(N, 2);
您显然可以根据自己的喜好使用任何发行版。
现在的诀窍:将矩阵与通过所需相关矩阵的 Cholesky 分解获得的上三角矩阵相乘R
:
R = [1 0.75; 0.75 1]; %// Our correlation matrix, taken from the article
M = M * chol(R);
从修改后的矩阵中提取随机向量M
:
x = M(:, 1);
y = M(:, 2);
如果存在具有相同相关性的变量,则 cholasky 分解可能会失败。所以使用SVD。我这样做。mu 是具有正态分布的目标随机变量均值的向量。Sigma 是所需的协方差矩阵。n 是所需随机变量的长度,d 是随机变量的数量
mu=mu(:)';
[U S V]=svd(Sigma);
S=round(S*1e6)/1e6;
S=sqrt(S);
s=randn(n, d) * S * U'+mu(ones(n,1),:);