Jak wygenerować macierz losowej korelacji, która ma w przybliżeniu normalnie rozmieszczone wpisy o przekątnej przy danym odchyleniu standardowym?


11

Chciałbym wygenerować losową macierz korelacji, tak aby rozkład jej elementów nie przekątnych wyglądał w przybliżeniu normalnie. Jak mogę to zrobić?

Motywacja jest taka. Dla zestawu danych szeregów czasowych rozkład korelacji często wygląda dość normalnie. Chciałbym wygenerować wiele „normalnych” macierzy korelacji w celu przedstawienia ogólnej sytuacji i użyć ich do obliczenia liczby ryzyka.n


Znam jedną metodę, ale wynikowe odchylenie standardowe (rozkładu elementów poziagonalnych) jest zbyt małe jak na mój cel: wygeneruj równych lub normalnych losowych wierszy macierzy , standaryzuj rzędy (odejmij średnią, podziel przez odchylenie standardowe), a następnie przykładowa macierz korelacji ma normalnie rozmieszczone wpisy o przekątnej [ Aktualizacja po komentarzach: odchylenie standardowe będzie ].X 1nX~n-1/21n1XXn1/2

Czy ktoś może zasugerować lepszą metodę, za pomocą której mogę kontrolować odchylenie standardowe?


1
@Richard, dzięki za pytanie. Niestety metoda opisana powyżej nie spowoduje wygenerowania pozycji, które normalnie są dystrybuowane. Przekątne wynoszą 1 z prawdopodobieństwem jeden, a przekątne są ograniczone od do . Teraz przeskalowane wpisy zbiegną się asymptotycznie do rozkładu normalnego wyśrodkowanego wokół zera. Czy możesz podać nam więcej informacji na temat problemu, który faktycznie próbujesz rozwiązać? A dlaczego chcesz „normalnie rozprowadzać” poza przekątnymi? + 11+1
kardynał

1
@Richard, co miałem na myśli, załóżmy, że i są dwoma niezależnymi wektorami, tak że wpisy każdego z nich są w normie normalne. Compute ; to jest, próbki korelacji między i . Następnie zbiega się w rozkładzie do standardowej normalnej zmiennej losowej. Przez „przeskalowane” rozumiałem mnożenie przez co jest wymagane do uzyskania nie zdegenerowanego rozkładu granicznego. T = ( Y 1 , Y 2 , ... , Y n ) ρ n = s x y / ( s x s y ) X Y n 1 / 2 ρ n n 1 / 2X=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)XYn1/2ρ^nn1/2
kardynał

1
@Richard, istotą „problemu” jest to, że poprzez wprowadzenie dwóch ograniczeń (a), że normami każdego wiersza są 1 i (b) że wpisy są generowane z losowej próbki, koniecznie wymuszasz korelacje, aby były dość small (rzędu . Powodem jest to, że nie można mieć dowolnie dużych korelacji między wierszami i nadal uzyskać normy dla każdego rzędu równe 1 w obecności tak dużej niezależności.n1/2
kardynał

1
... teraz możesz uzyskać większe korelacje pod względem wielkości, najpierw korelując rzędy między sobą przed renormalizacją. Ale zasadniczo masz tylko jeden parametr do zabawy, więc zarówno asymptotyczna średnia, jak i wariancja zostaną powiązane z tym parametrem. Więc to prawdopodobnie nie zapewni ci elastyczności, jakiej wydajesz się chcieć.
kardynał

1
Jasne, weźmy prostą sprawę. Wywołaj macierz generującą , którą przyjmiemy, że bez utraty ogólności. Teraz generowania kolumny o co IID wektory tak, że elementy każdego wektora są standardowymi normalnych zmiennych losowych, które są equicorrelated z korelacji . Teraz skorzystaj z poprzedniej procedury. Niech oznacza korelację między próbki TH p * a * rzędzie . Następnie dla ustalonego , pozwalając ,m x n x ρ ρ I j i j X m n n 1 / 2 ( ρ I J - ρ ) N ( 0 , ( 1 - ρ 2 ) 2 )Xm×nXρρ^ijijXmnn1/2(ρ^ijρ)zbiega się w rozkładzie do zmiennej losowej . N(0,(1ρ2)2)
kardynał

Odpowiedzi:


5

Najpierw udzieliłem odpowiedzi, która moim zdaniem nie jest optymalna; dlatego zredagowałem swoją odpowiedź, aby zacząć od lepszej sugestii.


Metoda winorośli

W tym wątku: Jak efektywnie generować losowe macierze korelacji dodatnich i półkolistych? - Opisałem i podałem kod dwóch wydajnych algorytmów generowania macierzy losowej korelacji. Oba pochodzą z pracy Lewandowskiego, Kurowickiej i Joe (2009).

Proszę zobaczyć moją odpowiedź tam dla wielu cyfr i kodu Matlab. Chciałbym tylko powiedzieć, że metoda winorośli pozwala na generowanie losowych macierzy korelacji z dowolnym rozkładem korelacji cząstkowych (zwróć uwagę na słowo „częściowe”) i może być stosowana do generowania macierzy korelacji o dużych wartościach nie przekątnych. Oto odpowiednia liczba z tego wątku:

Metoda winorośli

Jedyną rzeczą, która zmienia się między podplotami, jest jeden parametr, który kontroluje, w jakim stopniu rozkład korelacji cząstkowych jest skoncentrowany wokół . Ponieważ OP poprosił o mniej więcej rozkład normalny poza przekątną, oto wykres z histogramami elementów poza przekątną (dla tych samych matryc jak powyżej):±1

Elementy o przekątnej

Myślę, że te rozkłady są w miarę „normalne” i widać, jak stopniowo odchyla się standardowe. Powinienem dodać, że algorytm jest bardzo szybki. Zobacz link do wątku po szczegóły.


Moja oryginalna odpowiedź

Prosta modyfikacja metody może załatwić sprawę (w zależności od tego, jak blisko rozkładu ma być normalny). Ta odpowiedź została zainspirowana powyższymi komentarzami @ kardynała i odpowiedzią @ psarka na moje własne pytanie Jak wygenerować dużą macierz korelacji losowej pełnej rangi z obecnymi silnymi korelacjami?

Sztuczka polega na tym, aby próbki twojego skorelowane (nie funkcje, ale próbki). Oto przykład: generuję macierz losową wielkości (wszystkie elementy ze standardowej normy), a następnie dodam liczbę losową z do każdego wiersza, dla . Dla macierz korelacji (po standaryzacji funkcji) będzie miała elementy o przekątnej mniej więcej normalnie rozmieszczonej ze standardowym odchyleniem . DlaX 1000 × 100 [ - a / 2 , a / 2 ] a = 0 , 1 , 2 , 5 a = 0 XX 1 / XX1000×100[a/2,a/2]a=0,1,2,5a=0XX a>0aa=0,1,2,51/1000a>0, To obliczanie macierzy korelacji bez centrowania zmiennych (Zachowuje wstawione korelacje), a odchylenie standardowe elementów niediagonalnych rosnąć z jak to pokazano na tym rysunku (rzędy odpowiadają )aa=0,1,2,5

losowe macierze korelacji

Wszystkie te macierze są oczywiście określone pozytywnie. Oto kod 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

Dane wyjściowe tego kodu (minimalne i maksymalne wartości własne) to:

0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48

czy możesz wykreślić wartość najmniejszych wartości własnych, które uzyskasz za pomocą tej metody obok siebie?
user603,

1
Nie zmieniając liczby, mogę po prostu napisać tutaj, że najmniejsze wartości własne wynoszą odpowiednio 0,5, 0,4, 0,3 i 0,1 (dla każdego wiersza mojej figury). Największe rosną z 1,7 do 48.
ameba

ale czy są to wartości własne macierzy korelacji czy X'X ?.
user603,

Są to wartości własne mojej macierzy , która jest znormalizowana, aby mieć wartości na przekątnej, a więc macierzy korelacji. Zaktualizowałem swoją odpowiedź, abyś mógł ją zobaczyć w kodzie. Czy mogę zapytać, co sprawia, że ​​wątpisz, że jest to możliwe? Czy jest jakikolwiek powód, by sądzić, że duże macierze korelacji powinny mieć bardzo małe elementy poza przekątną? C
ameba

Nie wydaje mi się, żeby było to niemożliwe, po prostu nie widziałem tego w kodzie (w tym momencie nie korzystałem z Matlaba od lat)
603



1

To nie jest bardzo wyrafinowana odpowiedź, ale nic nie mogę poradzić, ale myślę, że to wciąż dobra odpowiedź ...

Jeśli twoją motywacją jest to, że parametry korelacji generowane przez dane szeregów czasowych wyglądają normalnie, dlaczego po prostu nie symulować danych szeregów czasowych, obliczyć parametry korelacji i użyć ich?

Być może masz dobry powód, aby tego nie robić, ale pytanie nie brzmi dla mnie jasno.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.