Próbuję wygenerować skorelowaną losową sekwencję ze średnią = , wariancja = , współczynnik korelacji = . W poniższym kodzie używam & jako standardowych odchyleń i & jako środków.s1
s2
m1
m2
p = 0.8
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2
To daje mi poprawkę corrcoef()
0,8 pomiędzy x
i y
. Moje pytanie brzmi: w jaki sposób mogę wygenerować szereg oznacza, że jeśli chcę z
, to jest również skorelowane y
(z tą samą korelacją ), ale nie z . Czy jest jakiś szczególny wzór, który muszę znać? Znalazłem jeden, ale nie mogłem go zrozumieć.x
Odpowiedzi:
Wygląda na to, że pytasz, jak wygenerować dane z określoną macierzą korelacji.
Przydatnym faktem jest to, że jeśli masz losowy wektor z macierzą kowariancji , to losowy wektor ma średnią i macierz kowariancji . Tak więc, jeśli zaczniesz od danych oznaczających zero, pomnożenie przez tego nie zmieni, więc twoje pierwsze wymaganie jest łatwo spełnione.x Σ Ax AE(x) Ω=AΣAT A
Powiedzmy zacząć (średnia zero) danych nieskorelowanych (tj macierz kowariancji jest przekątna) - skoro mówimy o macierzy korelacji, po prostu wziąć . Możesz przekształcić to w dane za pomocą danej macierzy kowariancji, wybierając jako cholesky pierwiastek kwadratowy z - wtedy miałby pożądaną macierz kowariancji .Σ=I A Ω Ax Ω
W twoim przykładzie wydaje się, że chcesz czegoś takiego:
Niestety, macierz ta nie jest jednoznacznie określona, więc nie może być macierzą kowariancji - można to sprawdzić, widząc, że wyznacznik jest ujemny. Być może zamiast tego
wystarczyłoby. Nie jestem pewien, jak obliczyć cholesky pierwiastek kwadratowy w Matlabie (który wydaje się być tym, którego używasz), ale
R
możesz użyć tejchol()
funkcji.W tym przykładzie dla dwóch wymienionych wyżej odpowiednimi mnożnikami macierzy byłyby odpowiednioΩ
Do tego
R
celu użyto kodu:źródło
chol
. Zauważ, że może to być dość niestabilna liczbowo, jeśli jest prawie pojedyncza. W takim przypadku zastosowanie uzyskanego symetrycznego pierwiastka kwadratowego, np. Za pomocą SVD, jest często lepszym wyborem pod względem stabilności numerycznej. :)Jeśli używasz R, możesz również użyć funkcji mvrnorm z pakietu MASS, zakładając, że chcesz normalnie rozproszonych zmiennych. Implementacja jest podobna do powyższego opisu Makra, ale wykorzystuje wektory własne macierzy korelacji zamiast chłodnego rozkładu i skalowania z rozkładem pojedynczej wartości (jeśli opcja empiryczna jest ustawiona na true).
W przypadku, gdy X”oznacza zwykle rozmieszczone macierz macierzy korelacji i środków kolumn jest taka sama jak .Σ X
Zauważ, że macierz korelacji musi być definitywnie dodatnia, ale przydatne będzie przekonwertowanie jej za pomocą funkcji nearPD z pakietu Matrix w R.
źródło
źródło