Làm thế nào để tạo ra một ma trận tương quan ngẫu nhiên đầy đủ thứ hạng lớn với một số tương quan mạnh hiện tại?


25

Tôi muốn tạo một ma trận tương quan ngẫu nhiên có kích thước sao cho có một số tương quan mạnh vừa phải hiện diện: n × nCn×n

  • ma trận đối xứng thực vuông có kích thước , ví dụ ;n = 100n×nn=100
  • tích cực-xác định, tức là với tất cả các giá trị bản địa thực và tích cực;
  • cấp bậc đầy đủ;
  • tất cả các yếu tố đường chéo bằng ;1
  • các phần tử nằm ngoài đường chéo phải được phân phối hợp lý trên . Phân phối chính xác không thành vấn đề, nhưng tôi muốn có một lượng lớn vừa phải (ví dụ ) các giá trị lớn vừa phải (ví dụ: với giá trị tuyệt đối hoặc cao hơn). Về cơ bản tôi muốn chắc chắn rằng là không gần đường chéo với tất cả các yếu tố off-đường chéo .10 % 0,5 C0(1,1)10%0.5C0

Có một cách đơn giản để làm điều đó?

Mục đích là sử dụng các ma trận ngẫu nhiên như vậy để đánh giá một số thuật toán làm việc với ma trận tương quan (hoặc hiệp phương sai).


Phương pháp không hiệu quả

Dưới đây là một số cách để tạo ma trận tương quan ngẫu nhiên mà tôi biết, nhưng điều đó không hiệu quả với tôi ở đây:

  1. Tạo ngẫu nhiên của kích thước, trung tâm, chuẩn hóa và hình thành mối tương quan ma trận . Nếu , điều này thường sẽ dẫn đến tất cả các tương quan ngoài đường chéo là khoảng . Nếu , một số tương quan sẽ mạnh, nhưng sẽ không được xếp hạng đầy đủ. s × n C = 1Xs×ns>n0snCC=1s1XXs>n0snC

  2. Tạo ma trận xác định dương ngẫu nhiên theo một trong các cách sau:B

    • Tạo bình phương ngẫu nhiên và tạo đối xứng dương xác định .B = A MộtAB=AA

    • Tạo bình phương ngẫu nhiên , tạo đối xứng và làm cho nó xác định dương bằng cách thực hiện phân tách eigen và đặt tất cả các giá trị riêng âm thành 0: . NB: điều này sẽ dẫn đến một ma trận thiếu thứ hạng.E = A + AE = U S UB = UAE=A+AE=USUB=Umax{S,0}U

    • Tạo ngẫu nhiên trực giao (ví dụ: bằng cách tạo bình phương ngẫu nhiên và thực hiện phân tách QR của nó, hoặc thông qua quy trình Gram-Schmidt) và đường chéo ngẫu nhiên với tất cả các yếu tố tích cực; biểu mẫu .Một D B = Q D QQADB=QDQ

    Ma trận thu được có thể dễ dàng được chuẩn hóa để có tất cả các ma trận trên đường chéo: , trong đó là ma trận đường chéo với đường chéo giống như . Tất cả ba cách được liệt kê ở trên để tạo dẫn đến có các phần tử nằm ngoài đường chéo đóng .C = D - 1 / 2 B D - 1 / 2 D = d i một gBC=D1/2BD1/2B B C 0D=diagBBBC0


Cập nhật: Chủ đề cũ hơn

Sau khi đăng câu hỏi của tôi, tôi đã tìm thấy hai bản sao gần như trùng lặp trong quá khứ:

Thật không may, không có chủ đề nào trong số này có câu trả lời thỏa đáng (cho đến bây giờ :)


1
Bạn có thể tạo ma trận trực giao ngẫu nhiên bằng các quy trình QR hoặc Gram-Schmidt. Đó sẽ là "người bản địa của PCA". Thêm tỷ lệ vào các cột của nó (biến thành "tải"). Lấy ma trận hiệp phương sai từ các tải này. Một cái gì đó như thế ...
ttnphns 18/11/14

1
Uhm, tốt .. Hãy tưởng tượng chúng ta muốn tạo một nXkma trận tải W, không hoàn toàn ngẫu nhiên mà là một ma trận mà chúng ta muốn (nó sẽ WW'+diag(noise), xác định ma trận cov mà chúng ta tìm kiếm. Nhiệm vụ duy nhất là sửa W được chuẩn hóa cột (tức là k "eigenvector") để trở thành trực giao. Bất kỳ phương pháp nào để loại bỏ các biến tương quan (ở đây các biến là các hàm riêng) có thể sẽ làm. (Đây là một ý tưởng thô.)
ttnphns 18/11/14

1
À, @whuber, bây giờ tôi hiểu ý của bạn. Vâng, bạn đã đúng: nếu tất cả các yếu tố ngoài đường chéo giống hệt và bằng , thì ma trận thực sự là thứ hạng đầy đủ và xác định dương ... Đây tất nhiên không phải là điều tôi nghĩ: Tôi muốn phân phối của các yếu tố ngoài đường chéo trong mỗi ma trận được "lan truyền" một cách hợp lý, không phải là sự phân phối trên các ma trận ...ρ
amip nói rằng Rebstate Monica

3
Bạn có thể muốn xem xét bản phân phối của
LKJ

2
@ttnphns: Tôi nghĩ rằng cuối cùng tôi đã hiểu rằng bạn đã đúng: những gì bạn đề xuất là cách đơn giản nhất để đạt được mục tiêu. Tôi đã thêm một bản cập nhật cho câu trả lời của tôi thực hiện về cơ bản những gì bạn đã viết ở trên.
amip nói rằng Phục hồi lại

Câu trả lời:


14

Các câu trả lời khác đã đưa ra các thủ thuật hay để giải quyết vấn đề của tôi theo nhiều cách khác nhau. Tuy nhiên, tôi tìm thấy một cách tiếp cận nguyên tắc mà tôi nghĩ có một lợi thế lớn là về mặt khái niệm rất rõ ràng và dễ điều chỉnh.

Trong chủ đề này: Làm thế nào để tạo hiệu quả các ma trận tương quan dương-semidefinite ngẫu nhiên? - Tôi đã mô tả và cung cấp mã cho hai thuật toán hiệu quả để tạo ma trận tương quan ngẫu nhiên. Cả hai đều đến từ một bài báo của Lewandowski, Kurowicka và Joe (2009), mà @ssdecontrol đã đề cập trong các ý kiến ​​trên (cảm ơn rất nhiều!).

Xin vui lòng xem câu trả lời của tôi ở đó cho rất nhiều số liệu, giải thích và mã MATLAB. Phương pháp được gọi là "vine" cho phép tạo ra ma trận tương quan ngẫu nhiên với bất kỳ phân phối tương quan một phần nào và có thể được sử dụng để tạo ma trận tương quan với các giá trị ngoài đường chéo lớn. Đây là ví dụ từ chủ đề đó:

Phương pháp Vine

Điều duy nhất thay đổi giữa các ô con, là một tham số kiểm soát mức độ phân phối của các mối tương quan một phần được tập trung vào khoảng .±1

Tôi cũng sao chép mã của mình để tạo các ma trận này ở đây, để cho thấy rằng nó không dài hơn các phương thức khác được đề xuất ở đây. Xin vui lòng xem câu trả lời liên kết của tôi cho một số giải thích. Các giá trị của betaparamhình trên là (và thứ nguyên là ).50,20,10,5,2,1d100

function S = vineBeta(d, betaparam)
    P = zeros(d);           %// storing partial correlations
    S = eye(d);

    for k = 1:d-1
        for i = k+1:d
            P(k,i) = betarnd(betaparam,betaparam); %// sampling from beta
            P(k,i) = (P(k,i)-0.5)*2;     %// linearly shifting to [-1, 1]
            p = P(k,i);
            for l = (k-1):-1:1 %// converting partial correlation to raw correlation
                p = p * sqrt((1-P(l,i)^2)*(1-P(l,k)^2)) + P(l,i)*P(l,k);
            end
            S(k,i) = p;
            S(i,k) = p;
        end
    end

    %// permuting the variables to make the distribution permutation-invariant
    permutation = randperm(d);
    S = S(permutation, permutation);
end

Cập nhật: giá trị bản địa

@psarka hỏi về giá trị bản địa của các ma trận này. Trên hình bên dưới, tôi vẽ sơ đồ phổ eigenvalue của sáu ma trận tương quan như trên. Lưu ý rằng chúng giảm dần; ngược lại, phương pháp được đề xuất bởi @psarka thường dẫn đến một ma trận tương quan với một giá trị riêng lớn, nhưng phần còn lại khá đồng đều.

giá trị riêng của ma trận trên


Cập nhật. Phương pháp thực sự đơn giản: một số yếu tố

Tương tự như những gì @ttnphns đã viết trong các bình luận ở trên và @GottfriedHelms trong câu trả lời của anh ấy, một cách rất đơn giản để đạt được mục tiêu của tôi là tạo ngẫu nhiên một số ( ) tải nhân tố (ma trận ngẫu nhiên có kích thước ) , tạo ma trận hiệp phương sai (tất nhiên sẽ không được xếp hạng đầy đủ) và thêm vào đó một ma trận đường chéo ngẫu nhiên với các yếu tố tích cực để tạo ra xếp hạng đầy đủ. Ma trận hiệp phương sai kết quả có thể được chuẩn hóa để trở thành ma trận tương quan (như được mô tả trong câu hỏi của tôi). Điều này rất đơn giản và thực hiện các mẹo. Dưới đây là một số ví dụ ma trận tương quan chok<nWk×nWWDB=WW+Dk=100,50,20,10,5,1 :

ma trận tương quan ngẫu nhiên từ các yếu tố ngẫu nhiên

Nhược điểm duy nhất là ma trận kết quả sẽ có giá trị riêng lớn và sau đó giảm đột ngột, trái ngược với sự phân rã tốt đẹp được hiển thị ở trên với phương pháp cây nho. Dưới đây là phổ tương ứng:k

eigenspectra của các ma trận này

Đây là mã:

d = 100;    %// number of dimensions
k = 5;      %// number of factors

W = randn(d,k);
S = W*W' + diag(rand(1,d));
S = diag(1./sqrt(diag(S))) * S * diag(1./sqrt(diag(S)));

+1. Tuy nhiên, đây chỉ là một lời nhắc đến phần cuối cùng của bạn về "phương pháp nhân tố". Cách tiếp cận đúng hoàn toàn gọi rằng các cột Wlà trực giao (tức là cosin giữa chúng là 0). Tất nhiên chỉ đơn giản là tạo ngẫu nhiên Wkhông cung cấp nó. Nếu chúng không trực giao - tức là các yếu tố là xiên (gọi Wlà as W_) - định lý nhân tố không phải WW'nhưng W_CW_'với C"tương quan" (cosin) giữa các yếu tố. Bây giờ, C=Q'Qvới Qma trận xoay vòng không đối xứng W_=inv(Q)'W(và như vậy W=W_Q'). Tạo một số Q- một ma trận với cột ss = 1 và ma trận ss = kích thước của ma trận.
ttnphns

... typo: không W_=inv(Q)'W, tất nhiên W_= W inv(Q)'.
ttnphns

@ttnphns: Những gì bạn đang nói là chính xác, nhưng tôi không nghĩ nó quan trọng cho mục đích tạo ma trận tương quan ngẫu nhiên. Nếu tôi tạo ngẫu nhiên, thì có, các cột của nó sẽ không chính xác trực giao, nhưng (sau khi chuẩn hóa để có tất cả các cột trên đường chéo) vẫn sẽ là ma trận tương quan xếp hạng đầy đủ với một số giá trị đường chéo lớn, đó là những gì câu hỏi về. Tất nhiên là rất dễ dàng để trực tiếp hóa các cột của trước đó, tôi chỉ không hiểu tại sao điều này lại cần thiết trong trường hợp này. WWWW+DW
amip nói rằng Phục hồi lại

1
Dịch cái này sang R:W = replicate(k, rnorm(d)); S = W%*%t(W) + diag(rnorm(d),nrow=d); S = diag(1/sqrt(diag(S)))%*%S%*%diag(1/sqrt(diag(S)))
Scott Worland

1
@Mihai, điểm tốt và đề xuất của bạn có thể là đơn giản nhất. Bạn cũng có thể làmS <- matrix(nearPD(S, corr = TRUE, keepDiag = TRUE)$mat@x,ncol(S),ncol(S))
Scott Worland

7

Một điều đơn giản nhưng có thể sẽ hoạt động cho mục đích điểm chuẩn: lấy 2. của bạn và đưa một số tương quan vào ma trận bắt đầu. Phân phối có phần đồng nhất và thay đổi bạn có thể nhận được sự tập trung gần 1 và -1 hoặc gần 0.a

import numpy as np
from random import choice
import matplotlib.pyplot as plt

n = 100
a = 2

A = np.matrix([np.random.randn(n) + np.random.randn(1)*a for i in range(n)])
A = A*np.transpose(A)
D_half = np.diag(np.diag(A)**(-0.5))
C = D_half*A*D_half

vals = list(np.array(C.ravel())[0])
plt.hist(vals, range=(-1,1))
plt.show()
plt.imshow(C, interpolation=None)
plt.show()

Phân phối hơi đồng đều Kết quả của imshow


(+1) Cảm ơn! Tôi đã chỉnh sửa câu trả lời của bạn để thêm lược đồ tô màu cho python và làm cho nó tương thích với python2 :) Hy vọng nó ổn. Tôi cũng đã xóa các bình luận trên của tôi để xóa lộn xộn (bạn cũng có thể xóa các bình luận của bạn). Bây giờ tôi đang cố gắng để hiểu logic của mã của bạn; Bạn có thực sự cần crsmảng? có ảnh hưởng gì? Cảm giác của tôi là bạn có thể chỉ cần thêm một số ngẫu nhiên từ vào mỗi hàng, phải không? Điều này tương tự với việc sử dụng ma trận với các mẫu tương quan (không phải tính năng) và sau đó tính toán ma trận tương quan mẫu của nó, đúng không? [ - a , a ] Xk[a,a]X
amip nói rằng Phục hồi lại

Vâng, bạn hoàn toàn đúng! (Oh boy, điều đó thực sự ngớ ngẩn: D). Tôi đã thay đổi phần ngẫu nhiên thành randn (1) * a và bây giờ nó tốt hơn nhiều.
psarka

Cảm ơn! Bây giờ bạn chỉ cần loại bỏ đề cập của bạn về ở trên mã. Trong khi đó, tôi tìm thấy một câu hỏi cũ gần như trùng lặp và đăng câu trả lời ở đó, lấy cảm hứng trực tiếp từ câu hỏi của bạn ở đây: Làm thế nào để tạo ma trận tương quan ngẫu nhiên có các mục ngoài đường chéo được phân phối bình thường với độ lệch chuẩn cho trước? . Có vẻ để làm việc tốt đẹp! k
amip nói rằng Phục hồi lại

Mát mẻ! Tôi tự hỏi nếu thủ tục như vậy dẫn đến một phân phối được biết đến. Thử nghiệm với và khác nhau Tôi có thể có được một vài hình dạng khác nhau. nan
psarka

Một nhược điểm của phương pháp này là ma trận tương quan kết quả có một giá trị riêng lớn, nhưng các ma trận còn lại gần như thống nhất. Vì vậy, quy trình này không mang lại ma trận tương quan "chung" ... Không phải tôi đã chỉ định nó trong câu hỏi của mình. Nhưng @ssdecontrol đã đề cập trong các ý kiến ​​trên rằng rõ ràng có nhiều cách để lấy mẫu từ tất cả các ma trận tương quan; Điều này có vẻ thú vị nhưng phức tạp hơn nhiều.
amip nói rằng Phục hồi lại

6

Hmm, sau khi tôi thực hiện một ví dụ bằng ngôn ngữ MatMate của mình, tôi thấy rằng đã có câu trả lời python, có thể thích hợp hơn vì python được sử dụng rộng rãi. Nhưng bởi vì bạn vẫn còn những câu hỏi mà tôi chỉ cho bạn cách tiếp cận của tôi bằng cách sử dụng ngôn ngữ ma trận Matmate, có lẽ nó có nhiều vấn đề hơn.

Phương pháp 1
(Sử dụng MatMate):

v=12         // 12 variables
f=3          // subset-correlation based on 3 common factors
vg = v / f   // variables per subsets

 // generate hidden factor-matrix
             // randomu(rows,cols ,lowbound, ubound) gives uniform random matrix 
             //    without explicite bounds the default is: randomu(rows,cols,0,100)
L = {   randomu(vg,f)     || randomu(vg,f)/100  || randomu(vg,f)/100 , _
        randomu(vg,f)/100 || randomu(vg,f)      || randomu(vg,f)/100 , _
        randomu(vg,f)/100 || randomu(vg,f)/100  || randomu(vg,f)     }

 // make sure there is itemspecific variance
 // by appending a diagonal-matrix with random positive entries
L = L || mkdiag(randomu(v,1,10,20)) 
  // make covariance and correlation matrix
cov = L *'   // L multiplied  with its transpose
cor = covtocorr(cov)
                   set ccdezweite=3 ccfeldweite=8
                   list cor
cor = 
   1.000,   0.321,   0.919,   0.489,   0.025,   0.019,   0.019,   0.030,   0.025,   0.017,   0.014,   0.014
   0.321,   1.000,   0.540,   0.923,   0.016,   0.015,   0.012,   0.030,   0.033,   0.016,   0.012,   0.015
   0.919,   0.540,   1.000,   0.679,   0.018,   0.014,   0.012,   0.029,   0.028,   0.014,   0.012,   0.012
   0.489,   0.923,   0.679,   1.000,   0.025,   0.022,   0.020,   0.040,   0.031,   0.014,   0.011,   0.014
   0.025,   0.016,   0.018,   0.025,   1.000,   0.815,   0.909,   0.758,   0.038,   0.012,   0.018,   0.014
   0.019,   0.015,   0.014,   0.022,   0.815,   1.000,   0.943,   0.884,   0.035,   0.012,   0.014,   0.012
   0.019,   0.012,   0.012,   0.020,   0.909,   0.943,   1.000,   0.831,   0.036,   0.013,   0.015,   0.010
   0.030,   0.030,   0.029,   0.040,   0.758,   0.884,   0.831,   1.000,   0.041,   0.017,   0.022,   0.020
   0.025,   0.033,   0.028,   0.031,   0.038,   0.035,   0.036,   0.041,   1.000,   0.831,   0.868,   0.780
   0.017,   0.016,   0.014,   0.014,   0.012,   0.012,   0.013,   0.017,   0.831,   1.000,   0.876,   0.848
   0.014,   0.012,   0.012,   0.011,   0.018,   0.014,   0.015,   0.022,   0.868,   0.876,   1.000,   0.904
   0.014,   0.015,   0.012,   0.014,   0.014,   0.012,   0.010,   0.020,   0.780,   0.848,   0.904,   1.000

Vấn đề ở đây có thể là, chúng tôi xác định các khối của mô hình con có tương quan cao bên trong với rất ít mối tương quan giữa và điều này không phải là lập trình mà là bởi các biểu thức nối liên tục. Có lẽ cách tiếp cận này có thể được mô hình hóa thanh lịch hơn trong trăn.


Phương pháp 2 (a)
Sau đó, có một cách tiếp cận hoàn toàn khác, trong đó chúng ta điền vào hiệp phương sai còn lại có thể bằng số lượng ngẫu nhiên 100 phần trăm vào một ma trận tải nhân tố. Điều này được thực hiện trong Pari / GP:

{L = matrix(8,8);  \\ generate an empty factor-loadings-matrix
for(r=1,8, 
   rv=1.0;    \\ remaining variance for variable is 1.0
   for(c=1,8,
        pv=if(c<8,random(100)/100.0,1.0); \\ define randomly part of remaining variance
        cv= pv * rv;  \\ compute current partial variance
        rv = rv - cv;     \\ compute the now remaining variance
        sg = (-1)^(random(100) % 2) ;  \\ also introduce randomly +- signs
        L[r,c] = sg*sqrt(cv) ;  \\ compute factor loading as signed sqrt of cv
       )
     );}

cor = L * L~

và ma trận tương quan được tạo ra là

     1.000  -0.7111  -0.08648   -0.7806   0.8394  -0.7674   0.6812    0.2765
   -0.7111    1.000   0.06073    0.7485  -0.7550   0.8052  -0.8273   0.05863
  -0.08648  0.06073     1.000    0.5146  -0.1614   0.1459  -0.4760  -0.01800
   -0.7806   0.7485    0.5146     1.000  -0.8274   0.7644  -0.9373  -0.06388
    0.8394  -0.7550   -0.1614   -0.8274    1.000  -0.5823   0.8065   -0.1929
   -0.7674   0.8052    0.1459    0.7644  -0.5823    1.000  -0.7261   -0.4822
    0.6812  -0.8273   -0.4760   -0.9373   0.8065  -0.7261    1.000   -0.1526
    0.2765  0.05863  -0.01800  -0.06388  -0.1929  -0.4822  -0.1526     1.000

Có thể điều này tạo ra một ma trận tương quan với các thành phần chính chiếm ưu thế do quy tắc tạo tích lũy cho ma trận tải nhân tố. Ngoài ra, có thể tốt hơn để đảm bảo tính dứt khoát tích cực bằng cách biến phần cuối cùng của phương sai thành một yếu tố duy nhất. Tôi để nó trong chương trình để giữ sự tập trung vào nguyên tắc chung.

Ma trận tương quan 100x100 có tần số tương quan sau (làm tròn đến 1 dec)

    e    f            e: entry(rounded) f: frequency
  -----------------------------------------------------
  -1.000, 108.000
  -0.900, 460.000
  -0.800, 582.000
  -0.700, 604.000
  -0.600, 548.000
  -0.500, 540.000
  -0.400, 506.000
  -0.300, 482.000
  -0.200, 488.000
  -0.100, 464.000
   0.000, 434.000
   0.100, 486.000
   0.200, 454.000
   0.300, 468.000
   0.400, 462.000
   0.500, 618.000
   0.600, 556.000
   0.700, 586.000
   0.800, 536.000
   0.900, 420.000
   1.000, 198.000

[cập nhật]. Hmm, ma trận 100x100 bị điều hòa kém; Pari / GP không thể xác định chính xác các giá trị riêng với hàm đa biến (charpoly ()) - ngay cả với độ chính xác 200 chữ số. Tôi đã thực hiện một phép quay Jacobi thành dạng pca trên loadingsmatrix L và tìm thấy các giá trị bản địa cực kỳ nhỏ, in chúng theo logarit đến cơ sở 10 (cung cấp gần đúng vị trí của dấu thập phân). Đọc từ trái sang phải và sau đó theo từng hàng:

log_10(eigenvalues):
   1.684,   1.444,   1.029,   0.818,   0.455,   0.241,   0.117,  -0.423,  -0.664,  -1.040
  -1.647,  -1.799,  -1.959,  -2.298,  -2.729,  -3.059,  -3.497,  -3.833,  -4.014,  -4.467
  -4.992,  -5.396,  -5.511,  -6.366,  -6.615,  -6.834,  -7.535,  -8.138,  -8.263,  -8.766
  -9.082,  -9.482,  -9.940, -10.167, -10.566, -11.110, -11.434, -11.788, -12.079, -12.722
 -13.122, -13.322, -13.444, -13.933, -14.390, -14.614, -15.070, -15.334, -15.904, -16.278
 -16.396, -16.708, -17.022, -17.746, -18.090, -18.358, -18.617, -18.903, -19.186, -19.476
 -19.661, -19.764, -20.342, -20.648, -20.805, -20.922, -21.394, -21.740, -21.991, -22.291
 -22.792, -23.184, -23.680, -24.100, -24.222, -24.631, -24.979, -25.161, -25.282, -26.211
 -27.181, -27.626, -27.861, -28.054, -28.266, -28.369, -29.074, -29.329, -29.539, -29.689
 -30.216, -30.784, -31.269, -31.760, -32.218, -32.446, -32.785, -33.003, -33.448, -34.318

[update 2]
Phương pháp 2 (b)
Một cải tiến có thể là làm tăng phương sai của vật phẩm đến một mức độ không biên và giảm xuống một số lượng nhỏ hơn các yếu tố phổ biến (ví dụ: squareroot số nguyên của vật phẩm):

{  dimr = 100;
   dimc = sqrtint(dimr);        \\ 10 common factors
   L = matrix(dimr,dimr+dimc);  \\ loadings matrix 
                                \\     with dimr itemspecific and 
                                \\          dimc common factors
   for(r=1,dim, 
         vr=1.0;                \\ complete variance per item 
         vu=0.05+random(100)/1000.0;   \\ random variance +0.05
                                       \\ for itemspecific variance
         L[r,r]=sqrt(vu);              \\ itemspecific factor loading  
         vr=vr-vu;
         for(c=1,dimc,
                cv=if(c<dimc,random(100)/100,1.0)*vr;
                vr=vr-cv;
                L[r,dimr+c]=(-1)^(random(100) % 2)*sqrt(cv)
             )
        );}

   cov=L*L~
   cp=charpoly(cov)   \\ does not work even with 200 digits precision
   pr=polroots(cp)    \\ spurious negative and complex eigenvalues...

Cấu trúc của kết quả

về mặt phân phối các mối tương quan:hình ảnh

Vẫn tương tự (cũng là khả năng không phân tách khó chịu của PariGP), nhưng các giá trị riêng, khi được tìm thấy bởi phép xoay jacobi của loadingsmatrix, giờ đây có cấu trúc tốt hơn, với một ví dụ mới được tính toán, tôi đã nhận được các giá trị riêng như

log_10(eigenvalues):
   1.677,   1.326,   1.063,   0.754,   0.415,   0.116,  -0.262,  -0.516,  -0.587,  -0.783
  -0.835,  -0.844,  -0.851,  -0.854,  -0.858,  -0.862,  -0.862,  -0.868,  -0.872,  -0.873
  -0.878,  -0.882,  -0.884,  -0.890,  -0.895,  -0.896,  -0.896,  -0.898,  -0.902,  -0.904
  -0.904,  -0.909,  -0.911,  -0.914,  -0.920,  -0.923,  -0.925,  -0.927,  -0.931,  -0.935
  -0.939,  -0.939,  -0.943,  -0.948,  -0.951,  -0.955,  -0.956,  -0.960,  -0.967,  -0.969
  -0.973,  -0.981,  -0.986,  -0.989,  -0.997,  -1.003,  -1.005,  -1.011,  -1.014,  -1.019
  -1.022,  -1.024,  -1.031,  -1.038,  -1.040,  -1.048,  -1.051,  -1.061,  -1.064,  -1.068
  -1.070,  -1.074,  -1.092,  -1.092,  -1.108,  -1.113,  -1.120,  -1.134,  -1.139,  -1.147
  -1.150,  -1.155,  -1.158,  -1.166,  -1.171,  -1.175,  -1.184,  -1.184,  -1.192,  -1.196
  -1.200,  -1.220,  -1.237,  -1.245,  -1.252,  -1.262,  -1.269,  -1.282,  -1.287,  -1.290

Cảm ơn rất nhiều! Rất thú vị, nhưng sẽ khiến tôi mất một chút thời gian để tiêu hóa ...
amip nói rằng Rebstate Monica

Tôi vẫn phải xem kỹ câu trả lời của bạn, nhưng trong lúc đó tôi đã đọc một bài viết về lấy mẫu ma trận tương quan ngẫu nhiên, và một trong những phương pháp từ đó có thể được sử dụng để làm chính xác những gì tôi cần. Tôi đã đăng một câu trả lời ở đây, bạn có thể quan tâm để xem! Nó liên kết đến một câu trả lời chi tiết hơn nhiều mà tôi đã viết trong một chủ đề khác.
amip nói rằng Phục hồi Monica

@amoeba: rất vui vì bạn đã tìm thấy thứ gì đó độc đáo làm việc cho bạn! Đó là một câu hỏi thú vị, tôi sẽ quay lại sau với bản thân mình, có lẽ cải thiện / điều chỉnh các thủ tục MatMate (và biến chúng thành chương trình con) theo bài báo mà bạn đã làm việc.
Gottfried Helms

2

Câu hỏi thú vị (như mọi khi!). Làm thế nào về việc tìm kiếm một tập hợp các ma trận ví dụ mà triển lãm các thuộc tính mà bạn mong muốn, và sau đó đi lồi kết hợp của chúng, vì nếu và là tích cực nhất định, sau đó như vậy là . Như một phần thưởng, không cần thay đổi kích thước của các đường chéo, bởi độ lồi của hoạt động. Bằng cách điều chỉnh tập trung nhiều hơn về 0 và 1 so với phân bố đồng đều, bạn có thể tập trung các mẫu vào các cạnh của đa giác hoặc bên trong. (Bạn có thể sử dụng phân phối beta / Dirichlet để kiểm soát nồng độ và tính đồng nhất).ABλA+(1λ)Bλ

Ví dụ: bạn có thể để là đối xứng thành phần và là toeplitz. Tất nhiên, bạn luôn có thể thêm một lớp và lấy sao cho và , v.v.B C λ Một Một + λ B B + λ C C Σ λ = 1 λ 0ABCλAA+λBB+λCCλ=1λ0


Cảm ơn về lời đề nghị, Andrew, nhưng tất nhiên sẽ tốt hơn nếu có một phương pháp không thiên vị mà không cần bắt đầu với một số và được xác định trước ... Trong các nhận xét cho câu hỏi ban đầu của tôi @ssdecontrol đã đề cập đến một bài báo mô tả thuật toán tương quan mẫu ma trận thống nhất (theo nghĩa chính xác nhất định), hoặc thiên về nhận dạng ma trận, nhưng tôi không thể tìm thấy một cách chưa lấy mẫu chúng thiên vị đi từ bản sắc ... tôi cũng đã tìm thấy một vài chủ đề cũ đây hỏi gần như cùng một câu hỏi , có thể bạn sẽ quan tâm, xem cập nhật của tôi. BAB
amip nói rằng Phục hồi Monica

À, nhưng từ một thuật toán như vậy, và sự đa dạng phù hợp trong các "đỉnh" (nghĩa là ma trận) xác định đa giác của bạn về ma trận tương quan xác định dương, bạn có thể sử dụng lấy mẫu từ chối để nhận bất kỳ phân phối nào về giá trị riêng, tính đồng nhất của các mục nhập, vv, mà bạn mong muốn. Tuy nhiên, tôi không rõ cơ sở tốt sẽ là gì. Nghe có vẻ như một câu hỏi cho một người đã nghiên cứu đại số trừu tượng gần đây hơn tôi
Andrew M

Xin chào lần nữa, tôi đọc một bài báo về lấy mẫu ma trận tương quan ngẫu nhiên, và một trong những phương pháp từ đó có thể được sử dụng để làm chính xác những gì tôi cần. Tôi đã đăng một câu trả lời ở đây, bạn có thể quan tâm để xem! Nó liên kết đến một câu trả lời chi tiết hơn nhiều mà tôi đã viết trong một chủ đề khác.
amip nói rằng Phục hồi Monica

2

R có một gói (clusterGeneration) thực hiện phương thức trong:

Thí dụ:

> (cormat10 = clusterGeneration::rcorrmatrix(10, alphad = 1/100000000000000))
        [,1]   [,2]    [,3]     [,4]     [,5]   [,6]   [,7]    [,8]     [,9]   [,10]
 [1,]  1.000  0.344 -0.1406 -0.65786 -0.19411  0.246  0.688 -0.6146  0.36971 -0.1052
 [2,]  0.344  1.000 -0.4256 -0.35512  0.15973  0.192  0.340 -0.4907 -0.30539 -0.6104
 [3,] -0.141 -0.426  1.0000  0.01775 -0.61507 -0.485 -0.273  0.3492 -0.30284  0.1647
 [4,] -0.658 -0.355  0.0178  1.00000  0.00528 -0.335 -0.124  0.5256 -0.00583 -0.0737
 [5,] -0.194  0.160 -0.6151  0.00528  1.00000  0.273 -0.350 -0.0785  0.08285  0.0985
 [6,]  0.246  0.192 -0.4847 -0.33531  0.27342  1.000  0.278 -0.2220 -0.11010  0.0720
 [7,]  0.688  0.340 -0.2734 -0.12363 -0.34972  0.278  1.000 -0.6409  0.40314 -0.2800
 [8,] -0.615 -0.491  0.3492  0.52557 -0.07852 -0.222 -0.641  1.0000 -0.50796  0.1461
 [9,]  0.370 -0.305 -0.3028 -0.00583  0.08285 -0.110  0.403 -0.5080  1.00000  0.3219
[10,] -0.105 -0.610  0.1647 -0.07373  0.09847  0.072 -0.280  0.1461  0.32185  1.0000
> cormat10[lower.tri(cormat10)] %>% psych::describe()
   vars  n  mean   sd median trimmed mad   min  max range skew kurtosis   se
X1    1 45 -0.07 0.35  -0.08   -0.07 0.4 -0.66 0.69  1.35 0.03       -1 0.05

Thật không may, dường như không thể mô phỏng các mối tương quan tuân theo phân phối đồng nhất với điều này. Có vẻ như tạo ra các mối tương quan mạnh mẽ hơn khi alphadđược đặt thành các giá trị rất nhỏ, nhưng ngay cả tại 1/100000000000000, phạm vi tương quan sẽ chỉ lên tới khoảng 1,40.

Tuy nhiên, tôi hy vọng điều này có thể có ích với ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.