如何生成具有给定标准偏差的近似正态分布的非对角项的随机相关矩阵?


11

我想生成一个随机相关矩阵,以使其非对角元素的分布看起来近似正态。我该怎么做?

动机是这样的。对于一组时间序列数据,相关分布通常看起来非常接近正态分布。我想生成许多“常规”相关矩阵来表示一般情况,并使用它们来计算风险数。n


我知道一种方法,但由此产生的标准偏差(非对角元素的分布)太小了,无法达到我的目的:生成矩阵均匀或正常随机行,标准化行(减去均值,除以标准偏差),则样本相关矩阵具有非对角线正态分布[ 注释后更新:标准偏差为 ]。X 1nXñ-1/21n1XXn1/2

谁能建议一种更好的方法来控制标准偏差?


1
@Richard,谢谢您的提问。不幸的是,您上面描述的方法将不会生成正态分布的条目。对角线是1,概率为1,非对角线的范围是和。现在,重新缩放的条目将渐近收敛到以零为中心的正态分布。您能否向我们提供有关您实际要解决的问题的更多信息?而且,为什么要对角线“正态分布”?+ 11+1
主教

1
@理查德,我的意思是,假设和是两个独立的向量,因此每个项都是同等标准正态的。计算 ; 即和之间的样本相关性。然后收敛到标准正态随机变量的分布。“重新缩放”是指与相乘,这是获得非退化极限分布所需要的。Ý = Ý 1ÿ 2... ÿ Ñρ Ñ = 小号X ý /小号X 小号ÝX ý ñ 1 / 2 ρ ñ ñ 1 / 2X=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)XYn1/2ρ^nn1/2
主教

1
@Richard,“问题”的实质是通过做出两个限制(a)每行的范数为1和(b)条目是从随机样本中生成的,您必须强迫相关性非常严格小(在顺序的原因是,你不能有行之间任意大的相关性,仍然可以得到每行的规范为1在如此多的独立存在。n1/2
红衣主教

1
...现在,你可以得到一个数值较大的相关性第一重整化前行彼此之间相互关联。但是,实际上您只需要使用一个参数,因此渐近均值和方差都将与该参数相关联。因此,这也可能不会给您带来您似乎想要的灵活性。
主教

1
当然,让我们举一个简单的例子。称生成矩阵,我们将假设它为而不会失去一般性。现在,产生了的为独立同分布的向量,使得每个向量的元素是与equicorrelated相关标准正态随机变量。现在,使用您以前的步骤。令表示第行和第行。然后对于固定,让,× Ñ X ρ ρĴĴ X Ñ →交通Ñ 1 / 2ρĴ - ρ Ñ0 1 - ρ 2 2Xm×nXρρ^ijijXmnn1/2(ρ^ijρ)在分布中收敛为随机变量。N(0,(1ρ2)2)
主教

Answers:


5

我首先提供了我现在认为是次优的答案;因此,我编辑了答案,以提出更好的建议。


使用藤蔓方法

在此线程中:如何有效地生成随机正-半有限相关矩阵?-我描述并提供了两种生成随机相关矩阵的有效算法的代码。两者均来自Lewandowski,Kurowicka和Joe(2009)的论文。

请在这里查看我的答案以获取大量数字和Matlab代码。在这里,我只想说vine方法可以生成具有任何部分相关分布(请注意单词“ partial”)的随机相关矩阵,并且可以用于生成具有较大非对角线值的相关矩阵。这是该线程的相关图形:

藤蔓法

在子图之间唯一改变的是一个参数,该参数控制偏相关的分布集中在周围。由于OP要求非对角线近似正态分布,因此这是带有非对角线元素直方图的图(对于与上述相同的矩阵):±1

非对角线元素

我认为这种分布是合理的“正态”分布,并且可以看到标准偏差是如何逐渐增加的。我应该补充一点,该算法非常快。有关详细信息,请参见链接的线程。


我的原始答案

直接修改您的方法可能会成功(取决于您希望分布与正态分布的接近程度)。这个答案的灵感来自于@cardinal的上述评论以及@psarka对我自己的问题的答案。如何生成具有某些强相关性的大型满秩随机相关矩阵?

诀窍是使样本相关(不是特征,而是样本)。下面是一个例子:我生成随机矩阵的大小(从正常标准的所有元素),然后从添加一个随机数到每一行,为。对于,相关矩阵(在对特征进行标准化之后)将具有近似正态分布且标准偏差为非对角元素。对于X 1000 × 100 [ - 一个/ 2 / 2 ] 一个= 0 1 2 5 一个= 0 XX 1 / XX1000×100[a/2,a/2]a=0,1,2,5a=0XX1/1000一个一个= 0 1 2 5a>0,我在不使变量居中的情况下计算了相关矩阵(这保留了插入的相关性),并且非对角线元素的标准偏差随着增长,如下图所示(行对应于):aa=0,1,2,5

随机相关矩阵

所有这些矩阵当然都是正定的。这是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

可以同时绘制使用此方法获得的最小特征值的值吗?
user603 2014年

1
在不更改图形的情况下,我可以在此处简单地写下最小特征值分别为0.5、0.4、0.3和0.1(对于图形的每一行)。从最大的从1.7到48成长
阿米巴说恢复莫妮卡

但是这些是相关矩阵的特征值还是X'X?的特征值。
2014年

这些是我的矩阵的特征值,将其归一化为在对角线上有-就是相关矩阵。我更新了答案,以便您可以在代码中看到它。请问是什么使您怀疑这是否可能?有没有理由认为大的相关矩阵应该具有非常小的非对角线元素?C
变形虫说恢复莫妮卡2014年

我不认为它是不可能的,我只是从代码中看不到它(目前已经多年没有使用过matlab了)
user603 2014年



1

这不是一个非常复杂的答案,但是我不禁认为这仍然是一个很好的答案...

如果您的动机是时间序列数据产生的相关参数看起来很正常,那么为什么不仅仅模拟时间序列数据,计算相关参数并使用它们呢?

您可能有充分的理由不这样做,但是从您的问题来看我还是不清楚。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.