Как я могу сгенерировать данные с помощью заранее определенной матрицы корреляции?

19

Я пытаюсь сгенерировать коррелированную случайную последовательность со средним значением = , дисперсией = , коэффициентом корреляции = . В приведенном ниже коде я использую & как стандартные отклонения, а & как средство.010.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

Похоже, что вы спрашиваете, как генерировать данные с определенной корреляционной матрицей.

Полезным в том, что если у вас есть случайный вектор с ковариационной матрицей Σ , то случайный вектор х имеет среднее Е ( х ) и ковариационная матрица Ω = Σ T . Таким образом, если вы начнете с данных, у которых среднее значение равно нулю, умножение на A не изменит этого, поэтому ваше первое требование легко будет выполнено. xΣAxAE(x)Ω=AΣATA

Допустим, вы начинаете с (среднее ноль) некоррелированных данных (т.е. ковариационная матрица является диагональной) - так как мы говорим о корреляционной матрицы, давайте просто взять . Вы можете превратить это в данных с заданной ковариационной матрицей, выбирая А быть Cholesky корень квадратный из Q , - то х будет иметь желаемый ковариационная матрица Ω .Σ=IAΩAxΩ

В вашем примере вы хотите что-то вроде этого:

Ω=(1.80.81.80.81)

К сожалению, эта матрица не является положительно определенной, поэтому она не может быть ковариационной матрицей - вы можете проверить это, увидев, что определитель отрицателен. Возможно, вместо

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

было бы достаточно. Я не уверен, как рассчитать квадратный корень cholesky в Matlab (который, кажется, то, что вы используете), но Rвы можете использовать chol()функцию.

В этом примере для двух перечисленных выше соответствующие коэффициенты матрицы (соответственно) будутΩ

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
cholΩ
1
Конечно, верно @cardinal - многие теоретически обоснованные вещи идут плохо, когда вы пытаетесь делать вещи численно с почти единичными матрицами. Я (удобно) представлял ситуацию, когда целевой корреляционной матрицы не было в той области, где это было проблемой. Хорошо, что вы указали на это - спасибо (и спасибо за редактирование моего другого ответа)
Макрос
1
Основная причина, по которой я думал об этом, заключалась в том, что вы внимательно следили за тем, чтобы признать, что первое предложение ОП не было даже положительно определенным. И, надеюсь, редактирование другого вопроса не было слишком усердным; Мне нравятся оба этих ответа.
кардинал
7

Если вы используете R, вы также можете использовать функцию mvrnorm из пакета MASS, предполагая, что вам нужны нормально распределенные переменные. Реализация аналогична описанной выше макрокоманде, но использует собственные векторы корреляционной матрицы вместо разложения Холецкого и масштабирования с разложением по сингулярному значению (если для эмпирической опции задано значение true).

XΣγλΣ

X=γλXT

ΣX

Обратите внимание, что корреляционная матрица должна быть положительно определенной, но ее преобразование с помощью функции nearPD из пакета Matrix в R будет полезным.

zzk
источник
1

ΣyxΣx=IΣyΛV

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

Yзнак равноAИкс

Марио Сансоне
источник