Як я можу генерувати дані заздалегідь визначеною кореляційною матрицею?


19

Я намагаюся генерувати корельовану випадкову послідовність із середнім = , дисперсією = , коефіцієнтом кореляції = . У наведеному нижче коді я використовую & як стандартні відхилення, і & як засіб.1 0,8010.8s1s2m1m2

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

Це дає мені правильність corrcoef()0,8 між xта y. Моє запитання полягає в тому, як я можу генерувати серію, якщо я хочу, zщоб вона також була співвіднесена y(з тією ж кореляцією ), але не з . Чи є певна формула, яку я повинен знати? Я знайшов його, але не зміг його зрозуміти.r=0.8x


Відповіді:


21

Здається, ви запитуєте, як генерувати дані за допомогою певної кореляційної матриці.

Корисний факт полягає в тому, що якщо у вас є випадковий вектор з коваріаційною матрицею , то випадковий вектор має значення і матрицю коваріації . Отже, якщо ви почнете з даних, що мають середній нуль, множення на це не змінить, тому ваша перша вимога буде легко виконана. Σ A x A E ( x ) Ω = A Σ A T AxΣAxAE(x)Ω=AΣATA

Припустимо, ви починаєте з (середнє нуль) некоррелірованних даних (тобто ковариационная матриця є діагональною) - так як ми говоримо про кореляційної матриці, давайте просто взяти . Ви можете перетворити це в даних із заданою ковариационной матрицею, вибираючи , щоб бути Cholesky квадратний корінь з - тоді матиме бажаний ковариационная матриця .A Ω A x ΩΣ=IAΩAxΩ

У вашому прикладі вам здається, що ви хочете чогось подібного:

Ω=(1.80.81.80.81)

На жаль, матриця не є позитивно визначеною, тому вона не може бути коваріаційною матрицею - ви можете перевірити це, побачивши, що визначник є від'ємним. Можливо, замість цього

Ω=(1.8.3.81.8.3.81)    or   Ω=(12/302/312/302/31)

вистачило б Я не впевнений, як обчислити квадрат холеського кореня в matlab (який, здається, є тим, що ви використовуєте), але в ньому Rви можете використовувати chol()функцію.

У цьому прикладі для двох s, перелічених вище, було б відповідне кратне матричне число (відповідно)Ω

A=(100.8.60.3.933.1972)    or   A=(1002/3.745300.8944.4472)

RКод , який використовується , щоб прибути на це:

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136

1
Функція MATLAB також називається chol. Зауважте, що це може бути досить нестабільно, якщо майже єдиний. У цьому випадку використання симетричного квадратного кореня, отриманого, наприклад, через SVD, часто є кращим вибором з точки зору стабільності числення. :)Ω
кардинал

1
Звичайно, це правильно @cardinal - багато теоретично обґрунтованих речей виходять поганими, коли ви намагаєтеся робити речі чисельно майже з єдиними матрицями. Я (зручно) уявляв ситуацію, коли цільова матриця кореляції не була в царині, де це було проблемою. Добре, що ви вказали на це - дякую (і дякую за редагування до моєї іншої відповіді)
Макрос

1
Основна причина, по якій я думав про це, була пов'язана з вашим пильним поглядом на визнання того, що перша пропозиція ОП навіть не була позитивно визначеною. І, сподіваємось, редагування іншого питання не було зайвим; Мені подобаються обидві ці відповіді.
кардинал

7

Якщо ви використовуєте R, ви також можете використовувати функцію mvrnorm з пакету MASS, припускаючи, що ви хочете нормально розподілити змінні. Реалізація схожа на описаний вище Макрос, але використовує власні вектори матриці кореляції замість холеського розкладання та масштабування з розкладанням сингулярного значення (якщо емпіричний параметр встановлено на істинне).

XΣγλΣ

X=γλXT

ΣX

Зауважте, що матриця кореляції має бути позитивно визначеною, але перетворення її за допомогою функції NearPD з пакету Matrix в R буде корисним.


1

ΣyxΣx=IΣyΛV

Σy=VΛVT=(VΛ)(ΛTVT)=AAT

y=Ax

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.