+1 до @ user11852 та @ jem77bfp, це хороші відповіді. Дозвольте мені підійти до цього з іншого погляду, не тому, що я думаю, що це на практиці обов'язково краще , а тому, що я вважаю, що це повчально. Ось кілька релевантних фактів, про які ми вже знаємо:
- X Y N ( 0 , 1 )r є нахил лінії регресії , коли обидва і є стандартизованими , тобто, , XYN(0,1)
Y Xr2 - частка дисперсії в віднесена до дисперсії в , YX
(також із правил для варіацій ):
- дисперсія випадкової величини, помноженої на константу, є постійною квадратом у рази початкової дисперсії:
Var[aX]=a2Var[X]
- додаються відхилення , тобто дисперсія суми двох випадкових змінних (якщо припустити, що вони незалежні) - це сума двох дисперсій:
Var[X+ε]=Var[X]+Var[ε]
Тепер ми можемо комбінувати ці чотири факти, щоб створити дві стандартні нормальні змінні, популяції яких матимуть задану кореляцію, (правильніше, ), хоча згенеровані вами вибірки матимуть вибіркові кореляції, які змінюються. Ідея полягає у створенні псевдовипадкової змінної , яка є звичайною нормальною, , а потім знайти коефіцієнт, та дисперсію помилок, , такий, що , де . (Зверніть увагу, що повинно бути щоб це працювало, і, крім того, .) Таким чином, ви починаєте зrρXN(0,1)aveY∼N(0,a2+ve)a2+ve=1|a| ≤1a=rr що ви хочете; це ваш коефіцієнт, . Потім ви з'ясуєте дисперсію помилок, яка вам знадобиться, це . (Якщо ваше програмне забезпечення вимагає використання стандартного відхилення, візьміть квадратний корінь цього значення.) Нарешті, для кожної створеної вами псевдовипадкової змінної генерують псевдовипадкової помилки, , з відповідною дисперсією помилок , і обчислити корельовану псевдовипадкову величину шляхом множення та додавання. a1−r2xieiveyi
Якщо ви хочете зробити це в 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 , як тому, що це простіше, так і тому, що ви можете генерувати багато змінних за допомогою заданої матриці кореляції населення. Тим не менш, я думаю, що варто пройти цей процес, щоб побачити, як деякі основні принципи виконуються просто.