Як генерувати корельовані випадкові числа (задані засоби, відхилення та ступінь кореляції)?


53

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

З огляду на дві псевдовипадкові змінні висоти та ваги з відомими засобами та відхиленнями, і дане співвідношення, я думаю, я в основному намагаюся зрозуміти, як повинен виглядати цей другий крок:

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • Як обчислити співвідносні середнє значення та дисперсію? Але я хочу підтвердити, що це справді актуальна проблема тут.
  • Чи потрібно вдаватися до матричного маніпулювання? Або у мене є щось інше дуже неправильне в моєму базовому підході до цієї проблеми?

1
Не впевнений, що я вас правильно зрозумів, але вам не доведеться розраховувати "співвідносні середні значення та дисперсію". Якщо ви припускаєте, що змінні є величиною біваріантної норми, її має бути достатньо вказати окремі засоби та відхилення та кореляцію. Чи є якесь певне програмне забезпечення, яке ви хочете використовувати для цього?
mar999


Відповіді:


44

Щоб відповісти на ваше запитання про "хороший, ідеально швидкий спосіб генерування співвідносних випадкових чисел": Враховуючи бажану дисперсійно-коваріаційну матрицю що за визначенням є позитивно визначеною, її розклад Холеського становить: = ; є нижньою трикутною матрицею.C L L T LCCLLTL

Якщо ви тепер використовуєте цю матрицю для проектування некоррельованого випадкового вектора змінної , то отримана проекція буде співвіднесеною випадковими змінними.X Y = L XLXY=LX

Ви можете знайти стисле пояснення, чому це відбувається тут .


Дякую! Це було надзвичайно корисно. Я думаю, що я, принаймні, краще розумію, що мені потрібно дивитись далі.
Джозеф Вайсман

7
Чи застосовується цей метод лише для гауссових розподілів (як зазначено у запитанні), чи він може бути використаний для генерації корельованих змінних, що слідують за іншими розподілами? Якщо ні, то чи знаєте ви про метод, який може бути використаний у такому випадку?
user000001

1
@Michael: Так. Сказавши, що даний є дійсною матрицею коваріації, розклад Холеського є найшвидшим способом. Крім того, можна отримати (симетричний) квадратний корінь матрицю допомогою SVD (так , де з ) , але це було б більш дорого теж. X C C = X X = X X T X = U S 0,5 V T C = U S V TCXCC=XX=XXTX=US0.5VTC=USVT
usεr11852 повідомляє Відновити Моніку

1
@Michael: Звичайно. Їх коваріація буде (приблизно) однаковою, а не самі числа.
usεr11852 повідомляє Відновити Монік

1
@Sid: Будь-який безперервний дистрибутив, який не підтримується на всій реальній лінії, негайно вийде з ладу. Наприклад, якщо ми використовуємо рівномірний ми не можемо гарантувати, що "співвідносні числа" будуть в ; аналогічно для Пуассона ми закінчимо недискретні числа. Крім того, будь-який розподіл, де сума розподілів ще не є однаковою (наприклад, підсумовування -розподілу не призводить до -розподілу), також буде невдалою. У всіх згаданих випадках отримані числа будуть співвідноситись відповідно до але вони не відповідатиму розпочатому нами розподілу. [ 0 , 1 ] t t CU[0,1][0,1]ttC
usεr11852 каже Reinstate Monic

36

+1 до @ user11852 та @ jem77bfp, це хороші відповіді. Дозвольте мені підійти до цього з іншого погляду, не тому, що я думаю, що це на практиці обов'язково краще , а тому, що я вважаю, що це повчально. Ось кілька релевантних фактів, про які ми вже знаємо:

  1. X Y N ( 0 , 1 )r є нахил лінії регресії , коли обидва і є стандартизованими , тобто, , XYN(0,1)
  2. Y Xr2 - частка дисперсії в віднесена до дисперсії в , YX



    (також із правил для варіацій ):

  3. дисперсія випадкової величини, помноженої на константу, є постійною квадратом у рази початкової дисперсії:
    Var[aX]=a2Var[X]
  4. додаються відхилення , тобто дисперсія суми двох випадкових змінних (якщо припустити, що вони незалежні) - це сума двох дисперсій:
    Var[X+ε]=Var[X]+Var[ε]

Тепер ми можемо комбінувати ці чотири факти, щоб створити дві стандартні нормальні змінні, популяції яких матимуть задану кореляцію, (правильніше, ), хоча згенеровані вами вибірки матимуть вибіркові кореляції, які змінюються. Ідея полягає у створенні псевдовипадкової змінної , яка є звичайною нормальною, , а потім знайти коефіцієнт, та дисперсію помилок, , такий, що , де . (Зверніть увагу, що повинно бути щоб це працювало, і, крім того, .) Таким чином, ви починаєте зrρXN(0,1)aveYN(0,a2+ve)a2+ve=1|a| 1a=rr що ви хочете; це ваш коефіцієнт, . Потім ви з'ясуєте дисперсію помилок, яка вам знадобиться, це . (Якщо ваше програмне забезпечення вимагає використання стандартного відхилення, візьміть квадратний корінь цього значення.) Нарешті, для кожної створеної вами псевдовипадкової змінної генерують псевдовипадкової помилки, , з відповідною дисперсією помилок , і обчислити корельовану псевдовипадкову величину шляхом множення та додавання. a1r2xieiveyi

Якщо ви хочете зробити це в R, для вас може працювати наступний код:

correlatedValue = function(x, r){
  r2 = r**2
  ve = 1-r2
  SD = sqrt(ve)
  e  = rnorm(length(x), mean=0, sd=SD)
  y  = r*x + e
  return(y)
}

set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)

cor(x,y)
[1] 0.4945964

(Редагувати: я забув згадати :) Як я це описав, ця процедура дає вам дві стандартні нормальні корельовані змінні. Якщо ви не хочете стандартних нормалів, але хочете, щоб змінні мали певні засоби (не 0) та SD (не 1), ви можете їх перетворити, не впливаючи на кореляцію. Таким чином, ви віднімете спостережуване середнє значення, щоб переконатися, що середнє значення дорівнює точно , помножте змінну на потрібну SD, а потім додайте значення, яке ви хочете. Якщо ви хочете, щоб спостережуване середнє значення коливалося навколо бажаного середнього, ви додасте початкову різницю назад. По суті це перетворення z-балів у зворотному напрямку. Оскільки це лінійне перетворення, перетворена змінна матиме таку ж кореляцію з іншою змінною, як і раніше. 0

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


Цей, по суті, регресійний підхід є особливо приємним, дозволяючи генерувати один випадковий Y, співвіднесений з будь-якою кількістю існуючих X "предикторів". Я правий у такому розумінні?
ttnphns

Це залежить саме від того, яка структура кореляцій серед потрібних змінних, @ttnphns. Ви можете повторити це один за одним, але це набридне. Для створення багатьох корельованих змінних із заданим малюнком краще використовувати розклад Холеського.
gung - Відновіть Моніку

gung, ти знаєш, як використовувати Чолеського для створення одного Y корельованого (приблизно, як у твоєму методі) відповідно до вектора кореляцій із декількома існуючими (не імітованими) X?
ttnphns

@ttnphns, ви хочете генерувати єдину Y w / задану кореляцію сукупності з набором X, а не набір p змінних, які мають усі попередньо визначені кореляції сукупності? Найпростішим способом було б написати рівняння регресії, щоб генерувати єдину Y-капелюх з ваших X, а потім скористатися описаним вище методом, щоб генерувати Y як корелятор вашого Y-hat. Ви можете задати нове запитання щодо цього, якщо хочете.
gung - Відновіть Моніку

1
Це те, що я мав на увазі в своєму первинному коментарі: цей метод буде прямим продовженням того, про що ви говорите у своїй відповіді: по суті, регресійний (капелюшний) метод.
ttnphns

16

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

(X1,X2)F(x1,x2)Fx2

FX1(x1)=F(x1,x2)dx2.
FX11FX1ξ1[0,1]x^1=FX11(ξ)

F(x1,x2)x1=x^1

F(x2|X1=x^1)=F(x^1,x2)fX1(x^1),
fX1X1FX1(x1)=fX1(x1)

Потім ви знову генеруєте рівномірно розподілену змінну на (незалежно від ) і підключаєте її до інверсії . Тому ви отримуєте ; тобто задовольняє . Цей метод можна узагальнити до векторів з більшими розмірами, але його недоліком є ​​те, що вам доведеться обчислити, аналітично чи чисельно, багато функцій. Ідею можна знайти і в цій статті: http://www.econ-pol.unisi.it/dmq/pdf/DMQ_WP_34.pdf .ξ2[0,1]ξ1F(x2|X1=x^1)x^2=(F(x2|X1=x^1))1(ξ)x^2F(x^2|X1=x^1)=ξ

Якщо ви не розумієте значення включення рівномірної змінної у функцію зворотного розподілу ймовірностей, спробуйте зробити ескіз одновимірного випадку, а потім запам’ятайте, що таке геометричне тлумачення зворотної функції.


Розумна ідея! Має просту інтуїтивну привабливість. Але так здається обчислювально дорогим.
MichaelChirico

(+1) дуже хороший момент. Було б краще на початку сказати , тоді це стане більш природним спочатку генерувати один початковий розподіл, а потім умовний розподіл. Дуже чудово! fX,Y(x,y)=fX(x)fY|X(y)
КевінКім

1

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

Почніть з генерації двох некоррельованих послідовностей випадкових чисел та з будь-якими потрібними розподілами. Нехай по бажаному значенню коефіцієнта кореляції. Потім виконайте наступне:{xi}i=1N{yi}i=1NC

1) Обчислити коефіцієнт кореляціїcold=corr({xi},{yi})

2) Утворіть дві випадкові маннери іn1n2:1n1,2N

3) Міняйте числами іxn1xn2

4) Обчисліть нову кореляціюcnew=corr({xi},{yi})

5) Якщотоді тримай своп. Ще скасуйте заміну.|Ccnew|<|Ccold|

6) Якщо stop, інакше перейдіть 1)|Cc|<ϵ

Випадкові свопи не змінять граничний розподіл .xi

Удачі!


Мене трохи бентежить нотація. Чи вектор? Якщо ні, що означає ? xicorr(xi,yi)
Кліф АВ

Вибачте, я любитель статистики - я не знайомий з позначеннями. - це число, - послідовність чисел (характеризується середнім, дисперсією, розподілом ймовірності), і так є . написано недостатньо, він повинен бутиxi{xi}ycorr(xi,yi)corr({xi},{yi})=(1/N)Σi=1N(xix¯)(yyy¯)
Ф. Ятпіль

Я бачу, має ідеальний сенс. Я ігнорував " " вc o r r ( { x i } , { y i } ){}corr({xi},{yi})
Cliff AB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.