私はまず次善の答えであると私が信じるものを提供しました。したがって、私はより良い提案から始めるために私の回答を編集しました。
つる法を使用して
このスレッドでは:ランダムな正定値相関行列を効率的に生成する方法は?-ランダム相関行列を生成する2つの効率的なアルゴリズムのコードを説明して提供しました。どちらもLewandowski、Kurowicka、およびJoe(2009)による論文からのものです。
多くの図とmatlabコードについては、私の回答をご覧ください。ここでは、vineメソッドは、部分相関(「partial」という単語に注意)の分布を持つランダム相関行列を生成でき、非対角値が大きい相関行列を生成するために使用できると言いたいだけです。そのスレッドからの関連する図は次のとおりです。
サブプロット間で変化する唯一のものは、偏相関の分布が周りに集中する度合いを制御する1つのパラメーターです。OPが対角線外のほぼ正規分布を求めていたため、非対角線要素のヒストグラムを使用したプロットは次のとおりです(上記と同じ行列の場合)。±1
この分布は合理的に「正規」であり、標準偏差が次第に増加していることがわかります。アルゴリズムが非常に速いことを付け加えておきます。詳細はリンク先のスレッドをご覧ください。
私の元の答え
メソッドを直接変更することでうまくいく場合があります(ディストリビューションを正規にどれだけ近づけるかに応じて)。この回答は、上記の@cardinalのコメントと、自分の質問に対する@psarkaの回答に触発されました。強い相関が存在する大きなフルランクのランダム相関行列を生成する方法は?
トリックは、サンプルを相関させることです(機能ではなくサンプル)。ここでの例を示します。私は、ランダムマトリックスを生成するのサイズ(標準正規からすべての要素)、およびその後の乱数を追加各行に、のために。ため、相関行列(機能を標準化した後)は、約通常、標準偏差、分散、非対角要素を有することになる。以下のためのX 1000年× 100 [ - / 2 、/ 2 ] 、A = 0 、1 、2 、5 、A = 0 X ⊤ X 1 / √XX1000×100[−a/2,a/2]a=0,1,2,5a=0X⊤X、A>0、A=0、1、2、51/1000−−−−√a>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