I have first provided what I now believe is a sub-optimal answer; therefore I edited my answer to start with a better suggestion.
Using vine method
In this thread: How to efficiently generate random positive-semidefinite correlation matrices? -- I described and provided the code for two efficient algorithms of generating random correlation matrices. Both come from a paper by Lewandowski, Kurowicka, and Joe (2009).
Please see my answer there for a lot of figures and matlab code. Here I would only like to say that the vine method allows to generate random correlation matrices with any distribution of partial correlations (note the word "partial") and can be used to generate correlation matrices with large off-diagonal values. Here is the relevant figure from that thread:
±1
Ich denke, diese Verteilungen sind einigermaßen "normal", und man kann sehen, wie die Standardabweichung allmählich zunimmt. Ich sollte hinzufügen, dass der Algorithmus sehr schnell ist. Einzelheiten finden Sie im verknüpften Thread.
Meine ursprüngliche Antwort
Eine einfache Änderung Ihrer Methode kann den Trick tun (abhängig davon, wie nahe die Verteilung an der Normalität liegen soll). Diese Antwort wurde von den obigen Kommentaren von @ cardinal und von der Antwort von @ psarka auf meine eigene Frage inspiriert Wie kann eine große zufällige Korrelationsmatrix mit vollem Rang und einigen starken Korrelationen erstellt werden?
Der Trick besteht darin, Proben von Ihnen zu machen X.korreliert (keine Merkmale, sondern Stichproben). Hier ein Beispiel: Ich generiere eine ZufallsmatrixX. von 1000 × 100 Größe (alle Elemente von Standard normal), und fügen Sie dann eine Zufallszahl von hinzu [ - a / 2 , a / 2 ] zu jeder Reihe, z a = 0 , 1 , 2 , 5. Zuma = 0 die Korrelationsmatrix X.⊤X. (nach dem Standardisieren der Merkmale) haben nicht diagonale Elemente, die ungefähr normal mit Standardabweichung verteilt sind 1 / 1000- -- -- -- -√. Zuma > 0Ich berechne die Korrelationsmatrix, ohne die Variablen zu zentrieren (dies behält die eingefügten Korrelationen bei), und die Standardabweichung der nicht diagonalen Elemente wächst mit ein wie in dieser Abbildung gezeigt (Zeilen entsprechen a = 0 , 1 , 2 , 5):
Alle diese Matrizen sind natürlich eindeutig positiv. Hier ist der Matlab-Code:
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
Die Ausgabe dieses Codes (minimale und maximale Eigenwerte) lautet:
0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48