Bazı güçlü korelasyonların mevcut olduğu büyük bir tam aşamalı rasgele korelasyon matrisi nasıl oluşturulur?


25

Rasgele bir ilişkiyi gösteren bir tablo oluşturmak istiyorum arasında boyutu, bir orta güçlü bir ilişki mevcut olduğu: n × nCn×n

  • boyutunda kare gerçek simetrik matris, örneğin ;n×nn=100
  • pozitif-kesin, yani tüm özdeğerlerle gerçek ve pozitif;
  • tam rütbe;
  • tüm diagonal elemanlar eşittir ;1
  • köşegen dışı elemanlar makul şekilde düzgün bir şekilde dağıtılmalıdır . Kesin dağılım önemli değil, ancak orta büyüklükteki bazı büyük miktarlarda (örneğin ) orta büyüklükteki değerlere sahip olmak istiyorum (örneğin mutlak değeri veya daha yüksek). Temelde ben emin olmak için, olduğu değil bütün çapraz kapatma elemanları ile adeta diyagonal .% (1,1)10%0.50C0

Bunu yapmanın basit bir yolu var mı?

Amaç, korelasyon (veya kovaryans) matrisleriyle çalışan bazı algoritmaları karşılaştırmak için bu gibi rasgele matrisleri kullanmaktır.


İşe yaramayan yöntemler

İşte bildiğim, ancak burada benim için işe yaramaz rastgele korelasyon matrisleri oluşturmak için bazı yollar:

  1. Rastgele oluşturmak ve boyutu, orta ve standart, korelasyon matrisi oluşturmak . Eğer , bu genelde hepsi çapraz kapatma korelasyon sonuçlanacaktır etrafında olmak . Eğer , bazı korelasyonların güçlü olacak, ama tam rütbe olmayacaktır.Xs×nC=1s1XXs>n0snC

  2. Aşağıdaki yollardan biriyle rasgele pozitif kesin matris oluşturun :B

    • Rastgele kare ve simetrik pozitif kesin .B = A AAB=AA

    • Rastgele kare , simetrik ve öz-ayrıştırma ve tüm negatif özdeğerlerin sıfıra ayarlanması: . Not: Bu bir sıralama eksik matris ile sonuçlanacaktır.E = A + AE = U S UB = UAE=A+AE=USUB=Umax{S,0}U

    • Rastgele ortogonal (örneğin, rastgele kare ve QR ayrıştırma işlemini yaparak veya Gram-Schmidt işlemi yoluyla) ve tüm pozitif elementlerle rastgele çapraz oluşturun; form .A D B = Q D QQADB=QDQ

    Elde edilen matris köşegen üzerindekilerin hepsine sahip olmak için kolayca normalize edilebilir: , burada aynı köşegen ile diyagonal matris . oluşturmak için yukarıda listelenen her üç yol da, dışı köşegen elemanlara sahip sonuçlanır .C = D - 1 / 2 B D - 1 / 2 D = d ı bir gBC=D1/2BD1/2B B C 0D=diagBBBC0


Güncelleme: Daha eski konular

Sorumu gönderdikten sonra, geçmişte neredeyse iki kopya buldum:

Ne yazık ki, bu konuların hiçbiri tatmin edici bir cevap içermiyordu (şimdiye kadar :)


1
QR veya Gram-Schmidt işlemleriyle rastgele ortogonal matris oluşturabilirsiniz. Bu "PCA'nın özvektörleri" olacaktır. Sütunlarına ölçek ekleyin ("yüklere" dönüşün). Kovaryans matrisini bu yüklerden alın. Bunun gibi bir şey ...
ttnphns 18:14

1
Uhm, peki .. nXkTamamen rastgele değil, istediğimiz bir yükleme matrisi W oluşturmak istediğimizi düşünün (istediğimiz, WW'+diag(noise)aradığımız cov matrisini tanımlayın. Tek iş, sütuna normalize edilmiş W'yi (yani, k) düzeltmektir. "özvektörler") dik olmaya her türlü yöntem de-korelatı için değişkenler özvektörleridir burada (değişkenleri korelasyon) muhtemelen yapacak (Bu ham bir fikir)...
ttnphns

1
Ah, @whuber, şimdi ne demek istediğini anlıyorum. Evet, haklısınız: eğer tüm köşegen dışı öğeler aynı ve eşitse , o zaman matris tam olarak tam ve pozitif-kesin ... Tabii ki aklımda olan bu değil: dağıtım istiyorum her matristeki köşegen dışı öğelerin mantıkla "yayılması", matrisler arasındaki dağılımı değil ...ρ
amip Reinstate Monica,

3
LKJ dağılımına bakmak isteyebilirsiniz
shadowtalker

2
@ ttphns: Sonunda haklı olduğunuzu anladığımı düşünüyorum: önerdiğiniz şey hedefe ulaşmanın en basit yoludur. Cevabımla ilgili olarak yukarıda yazdığınız şeyi uygulayan bir güncelleme ekledim.
amip diyor Reinstate Monica

Yanıtlar:


14

Diğer cevaplar sorunumu çeşitli şekillerde çözmek için güzel püf noktaları ile geldi. Ancak, kavramsal olarak çok net ve ayarlanması kolay olmanın büyük bir avantajı olduğunu düşündüğüm ilkeli bir yaklaşım buldum.

Bu iş parçacığında: Etkili bir şekilde rasgele pozitif-yarı-kesin korelasyon matrisleri nasıl oluşturulur? - Rasgele korelasyon matrislerinin üretilmesi için iki verimli algoritma için kodu tanımladım ve verdim. Her ikisi de Lewandowski, Kurowicka ve Joe (2009) tarafından yazılan , @ sddecontrol'ün yukarıdaki yorumlarda ifade ettiği bir yazıdır (çok teşekkürler!).

Lütfen bir sürü rakam, açıklama ve matlab kodu için cevabımı okuyunuz. "Asma" adı verilen yöntem, kısmi korelasyonların herhangi bir dağılımı ile rasgele korelasyon matrisleri oluşturmaya izin verir ve büyük diyagonal olmayan değerlerle korelasyon matrisleri üretmek için kullanılabilir. İşte o konudan örnek rakam:

Asma yöntemi

Alt noktalar arasında değişen tek şey, kısmi korelasyonların dağılımının civarında yoğunlaşmasını kontrol eden bir parametredir .±1

Bu matrisleri burada üretmek için kodumu kopyalarım, burada önerilen diğer yöntemlerden daha uzun olmadığını göstermek için. Lütfen bazı açıklamalar için bağlantılı cevabımı inceleyiniz. Değerleri betaparamyukarıdaki şekil için olduğu (ve boyut olarak ). 10050,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

Güncelleme: özdeğerler

@ psarka bu matrislerin özdeğerlerini sorar. Aşağıdaki şekilde, yukarıdaki gibi aynı altı korelasyon matrisinin özdeğer spektrumlarını çiziyorum. Yavaş yavaş azaldıklarına dikkat edin; aksine, @ psarka tarafından önerilen yöntem genellikle bir büyük özdeğer ile korelasyon matrisi ile sonuçlanır, ancak geri kalanı oldukça tekdüzedir.

yukarıdaki matrislerin öz değerleri


Güncelleştirme. Gerçekten basit bir yöntem: birkaç faktör

Yukarıdaki yorumlarda @ttnphns'ın yazdığı gibi ve cevabında @ GottfriedHelms, hedefime ulaşmak için çok basit bir yol rastgele birkaç ( ) faktör yükü oluşturmak ( boyutunda rasgele matris ) oluşturmaktır. , kovaryans matrisini (elbette tam rütbe olmayacak) oluşturun ve ona yapmak için pozitif elemanlarla rastgele bir çapraz matris ekleyin tam sırası. Elde edilen kovaryans matrisi, bir korelasyon matrisi haline gelmesi için normalleştirilebilir (sorumu açıklandığı gibi). Bu çok basit ve hile yapar. İşte için bazı örnek korelasyon matrislerik<n k × n W BD B = B B + D k = 100 , 50 , 20 , 10 , 5 , 1Wk×nWWDB=WW+Dk=100,50,20,10,5,1 :

rastgele faktörlerden rastgele korelasyon matrisleri

Tek dezavantajı, sonuçta ortaya çıkan matrisin, büyük özdeğerlere sahip olması ve daha sonra asma yönteminde gösterilen hoş bir bozulmaya karşılık olarak ani bir düşmeye sahip olmasıdır. İşte karşılık gelen spektrumlar:k

bu matrislerin öz saydamları

İşte kod:

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. Ancak, burada "faktör yöntemi" ile ilgili son bölümünüze sadece bir hatırlatma var. Kesinlikle doğru yaklaşım, sütunlarının Wdikgen olduğunu söyler (yani, aralarındaki kosinüsler 0'dır). Basitçe rastgele Woluşturmak elbette sağlamaz. Onlar dik değilse - yani faktörler (daha sonra çağrı eğik olduğu Wkadar W_) - faktör teoremi değil WW'ama W_CW_'sahip Cfaktörler arasında "korelasyon" (kosinüsler) olmak. Şimdi, C=Q'Qile Qdönme ortogonal rotasyon matrisi olan W_=inv(Q)'W(ve bu yüzden W=W_Q'). Bazıları oluşturun Q- ss = 1 sütununa sahip bir matris ve ss = matris boyutu matris.
ttnphns

... yazım hatası: W_=inv(Q)'Welbette değil W_= W inv(Q)'.
ttnphns

@ ttnphns: Söylediğiniz şey doğru, ancak rastgele korelasyon matrisleri oluşturma amaçları için önemli olduğunu sanmıyorum . Eğer rastgele üretirsem, o zaman evet, sütunları tam ortogonal olmayacak, ancak (normalizasyondan sonra tüm köşeleri çapraz almak için), bazı büyük köşegen değerleri ile tam sıra korelasyon matrisi olacak, sorunun konusu neydi. Elbette, sütunlarını önceden ortogonalize etmek çok kolaydır , bu durumda bunun neden gerekli olduğunu anlamadım. W W + D WWWW+DW
amip diyor Reinstate Monica

1
Bunu R'ye çevirmek: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, iyi nokta ve önerileriniz muhtemelen en basit olanıdır. Bunları da yapabilirsinS <- matrix(nearPD(S, corr = TRUE, keepDiag = TRUE)$mat@x,ncol(S),ncol(S))
Scott Worland

7

Basit bir şey ama belki kıyaslama amaçları için işe yarar: 2. puanınızı aldı ve başlangıç ​​matrisine bazı korelasyonlar enjekte ettiniz. Dağılımı biraz düzgün ve değişen 1 olarak yakın konsantrasyonu elde ve 1 veya 0'a yakın olabilir.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()

Biraz düzgün dağılım İmshow'un sonuçları


(+1) Teşekkürler! Cevabınızı python için prettify renklendirme şemasını eklemek ve python2 ile uyumlu hale getirmek için düzenlemiştim :) Umarım tamamdır. Dağınıklığı gidermek için yukarıdaki yorumlarımı da sildim (sizinkini de silebilirsiniz). Şimdi kodunuzun mantığını anlamaya çalışıyorum; Gerçekten crsdiziye ihtiyacınız var mı? Ne etkisi yapar mı mı? Benim her satıra arasından rastgele bir sayı ekleyebilmeniz , hayır? Bu, matris korelasyonlu örnekler ile kullanmaya benzer (özellikleri değil) ve sonra onun örnek korelasyon matrisini hesaplamaya benzer mi? [ - a , a ] Xk[a,a]X
amip diyor Reinstate Monica

Evet, tamamen haklısın! (Ah evlat, bu gerçekten aptalcaydı: D). Rastgele kısmı randn (1) * a olarak değiştirdim ve şimdi çok daha iyi.
psarka

Teşekkürler! Şimdi sadece kodun üzerindeki ifadesini kaldırmanız gerekir . Bu arada, neredeyse yinelenen eski bir soru buldum ve buraya doğrudan sizinkinden esinlenerek cevap yazdım: Burada verilen standart sapma ile normalde diyagonal olmayan girişleri dağıtan rasgele korelasyon matrisi nasıl oluşturulur? . Güzel çalışıyor gibi görünüyor! k
amip diyor Reinstate Monica

Güzel! Merak ediyorum böyle bir işlem bilinen bir dağıtım ile sonuçlanır. Farklı ve ile denemeler yaparak birkaç farklı şekil elde edebilirim. nan
psarka

Bu yöntemin bir dezavantajı, ortaya çıkan korelasyon matrisinin bir büyük özdeğere sahip olmasıdır, fakat kalanlar neredeyse tekdüzedir. Yani bu prosedür "genel" bir korelasyon matrisi vermez ... Benim sorumla belirttiğimden değil. Fakat @ssdecontrol, yukarıdaki yorumlarda, tüm korelasyon matrislerinden örnekleme yolları olduğu anlaşılıyor; Bu ilginç görünüyor ama çok daha karmaşık.
amip diyor Reinstate Monica

6

Hmm, MatMate dilinde bir örnek yaptıktan sonra, python yaygın olarak kullanıldığı için tercih edilebilecek bir python-cevabı olduğunu görüyorum. Ama hala sorularınız olduğu için, Matmatate-matrix-dilini kullanarak yaklaşımımı gösteriyorum, belki de daha kendi kendine geliyor.

Yöntem 1
(MatMate'i kullanma):

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

Buradaki sorun, aralarında çok az korelasyon bulunan yüksek korelasyonlu alt matris bloklarını tanımlamamız olabilir ve bu, programatik olarak değil, sabit birleştirme-ifadeleri ile olur. Belki bu yaklaşım pitonda daha zarif bir şekilde modellenebilir.


Metot 2 (a)
Bundan sonra, geriye kalan kovaryansı rasgele yüzde 100 oranında bir faktör-yükleme matrisinedoldurduğumuz tamamen farklı bir yaklaşım vardır. Bu Pari / GP'de yapılır:

{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~

ve üretilen korelasyon matrisi

     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

Muhtemelen bu, faktör-yükleme matrisi için kümülatif üretme kuralı nedeniyle baskın ana bileşenlerle bir korelasyon matrisi oluşturur. Ayrıca, varyansın son bölümünü benzersiz bir faktör haline getirerek pozitif kesinliği sağlamak daha iyi olabilir. Odağı genel prensipte tutmak için programda bıraktım.

100x100'lük bir korelasyon matrisi aşağıdaki korelasyon sıklıklarına sahipti (1 dec yere yuvarlandı)

    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

[güncelleştirme]. Hmm, 100x100 matrisi çok iyi şartlandırılmış; Pari / GP, özdeğerleri polrootlarla (charpoly ()) - doğru belirleyemiyor - 200 basamak hassasiyetinde bile çalışıyor. Yük matrisinde L üzerinde pca-formuna bir Jacobi dönüşü yaptım ve çoğunlukla çok küçük özdeğerler buldum, bunları 10 tabanına logaritma bastım (kabaca ondalık noktasının konumunu verir). Soldan sağa doğru oku ve sonra satır satır sırala:

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

[güncelleme 2]
Yöntem 2 (b)
İyileştirme, kalemlere özgü varyansı marjinal olmayan bir seviyeye çıkarmak ve oldukça az sayıda ortak faktöre indirgemek olabilir (örneğin, itemnumber değerinin tam kare karesi):

{  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...

Sonuç yapısı

korelasyonların dağılımında:görüntü

Benzer kalır (aynı zamanda PariGP'nin kötü bozunmazlığı), fakat yük matrisinin jacobi-rotasyonu ile bulunan özdeğerler şimdi daha iyi bir yapıya sahiptir, yeni hesaplanmış bir örnek için özdeğerler aldım.

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

Çok teşekkürler! Çok ilginç, ama hazmetmek için biraz zaman alacaktır ...
amip Reinstate Monica

Cevabınıza hala dikkatlice bakmam gerekiyor, ancak bu arada rastgele korelasyon matrislerini örnekleme hakkında bir makale okudum ve oradaki yöntemlerden biri tam olarak ihtiyacım olanı yapmak için kullanılabilir. Buraya bir cevap yazdım, bir göz atmak isteyebilirsiniz! Başka bir konuya yazdığım çok daha ayrıntılı bir cevaba bağlantı veriyor.
amip diyor Reinstate Monica

@ amoeba: sizin için iyi çalışan bir şey bulduğunuz için mutluyum! Bu ilginç bir soru, daha sonra tekrar kendime geleceğim, belki de MatMate prosedürlerini (alt programlarını) üzerinde çalıştığınız makaleye göre geliştirebilir / uyarlayabilirim.
Gottfried Helms

2

İlginç bir soru (her zaman olduğu gibi!). Arzu ettiğiniz özellikleri sergileyen bir dizi örnek matris bulmaya ve sonra dışbükey kombinasyonları almaya ne dersiniz, çünkü eğer ve pozitif kesinse, o zaman . Bir bonus olarak, işlemin iletilmesiyle, köşegenlerin yeniden ölçeklendirilmesi gerekmeyecektir. eşit şekilde dağılmış halde 0 ve 1'e doğru daha konsantre olacak şekilde ayarlayarak, örnekleri polipopun veya iç kısmın kenarlarına yoğunlaştırabilirsiniz. (Konsantrasyona karşı tekdüzelik kontrolü için bir beta / Dirichlet dağılımı kullanabilirsiniz).B λ A + ( 1 - λ ) B λABλA+(1λ)Bλ

Örneğin, bileşen simetrik olmasına ve toeplitz olmasına izin verebilirsiniz. Tabii ki, her zaman başka bir sınıf ekleyebilir ve almak öyle ki ve , vb.B C λ A A + λ B B + λ C C λ = 1 λ 0ABCλAA+λBB+λCCλ=1λ0


Öneriniz için teşekkürler, Andrew, ama elbette önceden tanımlanmış bazı ve ile başlamak zorunda kalmayan tarafsız bir yönteme sahip olmak daha güzel olurdu ... Asıl sorumun yorumunda, algoritmaları açıklayan bir makaleye atıfta bulundum. numune korelasyon (belli bir kesin anlamda) eşit matrisler, veya kimlik matrisine karşı önyargılı ama onları önyargılı örnek henüz yol bulamıyorum uzakta kimliğinden ... Ben de hemen hemen aynı soruyu soran burada eski parçacığı bir çift bulduk belki ilginizi çekecektir, güncellememe bakın. bAB
amip diyor Reinstate Monica

Ah, ancak böyle bir algoritmadan ve pozitif-kesin korelasyon matrislerinin polipopunu tanımlayan "köşelerdeki" (matrisler) uygun bir çeşitlilikten, özdeğerlerin dağılımını almak için reddetme örneklemesini kullanabilirsiniz, girişlerin tek biçimli, vb, istediğiniz. Ancak, iyi bir temeli ne olacağı bana belli değil. Benden daha yakın zamanda soyut cebir çalışmış biri için bir soru gibi geliyor.
Andrew M

Tekrar merhaba, rastgele korelasyon matrislerinin örneklenmesi hakkında bir makale okudum ve oradaki yöntemlerden biri tam olarak ihtiyacım olanı yapmak için kullanılabilir. Buraya bir cevap yazdım, bir göz atmak isteyebilirsiniz! Başka bir konuya yazdığım çok daha ayrıntılı bir cevaba bağlantı veriyor.
amip diyor Reinstate Monica

2

R, aşağıdakileri içeren metodu uygulayan bir pakete (clusterGeneration) sahiptir :

Örnek:

> (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

Ne yazık ki, bununla üniform-ish dağılımını izleyen korelasyonları simüle etmek mümkün görünmüyor. alphadÇok küçük değerlere ayarlandığında daha güçlü korelasyonlar 1/100000000000000kuruyor gibi görünmektedir , ancak bu durumda bile, korelasyon aralığı sadece yaklaşık 1.40'a çıkacaktır.

Bununla birlikte, bunun birileri için bir faydası olabileceğini umuyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.