我想生成一个随机相关矩阵,使其非对角线元素的分布看起来大致正常。我该怎么做?
动机是这样的。对于一组时间序列数据,相关分布通常看起来非常接近正态分布。我想生成许多“正常”相关矩阵来表示一般情况并使用它们来计算风险数。
我知道一种方法,但得到的标准偏差(非对角元素的分布)对于我的目的来说太小了:生成均匀或正常随机行,标准化行(减去平均值,除以标准差),则样本相关矩阵具有正态分布的非对角项 [评论后更新:标准差将为 ]。
谁能建议一种更好的方法来控制标准偏差?
我想生成一个随机相关矩阵,使其非对角线元素的分布看起来大致正常。我该怎么做?
动机是这样的。对于一组时间序列数据,相关分布通常看起来非常接近正态分布。我想生成许多“正常”相关矩阵来表示一般情况并使用它们来计算风险数。
我知道一种方法,但得到的标准偏差(非对角元素的分布)对于我的目的来说太小了:生成均匀或正常随机行,标准化行(减去平均值,除以标准差),则样本相关矩阵具有正态分布的非对角项 [评论后更新:标准差将为 ]。
谁能建议一种更好的方法来控制标准偏差?
我首先提供了我现在认为是次优的答案;因此我编辑了我的答案以提出更好的建议。
在这个线程中:如何有效地生成随机正半定相关矩阵?-- 我描述并提供了用于生成随机相关矩阵的两种有效算法的代码。两者都来自Lewandowski、Kurowicka 和 Joe (2009) 的论文。
请在此处查看我的答案以获取大量数字和 matlab 代码。在这里我只想说vine 方法允许生成具有任何偏相关分布的随机相关矩阵(注意“偏”这个词),并且可以用来生成具有大非对角线值的相关矩阵。这是该线程的相关数字:
子图之间唯一变化的是一个参数,该参数控制偏相关分布集中在周围的程度。由于 OP 要求非对角线近似正态分布,这里是带有非对角线元素直方图的图(对于与上述相同的矩阵):
我认为这种分布是合理的“正常”,可以看到标准偏差是如何逐渐增加的。我应该补充一点,该算法非常快。有关详细信息,请参阅链接线程。
直接修改您的方法可能会奏效(取决于您希望分布与正常的接近程度)。这个答案的灵感来自上面@cardinal 的评论和@psarka 对我自己的问题的回答如何生成具有一些强相关性的大型全秩随机相关矩阵?
诀窍是使您的样本相关(不是特征,而是样本)。这是一个示例:我生成大小的(所有元素均来自标准法线),然后将中的随机数添加到每一行,对于。对于,相关矩阵(在标准化特征之后)将具有近似正态分布的非对角元素,标准差为。对于,我计算相关矩阵而不使变量居中(这保留了插入的相关性),并且非对角线元素的标准偏差随增长,如图所示(行对应于):
所有这些矩阵当然都是正定的。这是matlab代码:
offsets = [0 1 2 5];
n = 1000;
p = 100;
rng(42) %// random seed
figure
for offset = 1:length(offsets)
X = randn(n,p);
for i=1:p
X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
end
C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)
%// convert to correlation
d = diag(C);
C = diag(1./sqrt(d))*C*diag(1./sqrt(d));
%// displaying C
subplot(length(offsets),3,(offset-1)*3+1)
imagesc(C, [-1 1])
%// histogram of the off-diagonal elements
subplot(length(offsets),3,(offset-1)*3+2)
offd = C(logical(ones(size(C))-eye(size(C))));
hist(offd)
xlim([-1 1])
%// QQ-plot to check the normality
subplot(length(offsets),3,(offset-1)*3+3)
qqplot(offd)
%// eigenvalues
eigv = eig(C);
display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end
此代码的输出(最小和最大特征值)是:
0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48
您可能对以下链接中的一些代码感兴趣:
如果您尝试生成随机相关矩阵,请考虑从 Wishart 分布中采样。以下问题提供了 Wishart 分布的信息以及有关如何采样的建议: 如何有效地生成随机正半定相关矩阵?
这不是一个非常复杂的答案,但我不禁认为它仍然是一个很好的答案......
如果你的动机是时间序列数据产生的相关参数看起来很正常,为什么不直接模拟时间序列数据,计算相关参数并使用它们呢?
您可能有充分的理由不这样做,但是从您的问题中我不清楚。