+1 к @ user11852 и @ jem77bfp, это хорошие ответы. Позвольте мне подойти к этому с другой точки зрения, не потому, что я думаю, что это обязательно лучше на практике , а потому, что я думаю, что это поучительно. Вот несколько важных фактов, которые мы уже знаем:
- представляет собой наклон линии регрессиикогда оба Х и Y являютсястандартизированы, то есть N ( 0 , 1 ) , rXYN(0,1)
- доля дисперсии в Y, относящаяся к дисперсии в X , р2YИкс
(также из правил для отклонений ):
- дисперсия случайной величины, умноженная на константу, представляет собой константу в квадрате, умноженную на исходную дисперсию:
Вар [ а х] = а2Вар [ Х]
- дисперсии сложения , т. е. дисперсия суммы двух случайных величин (при условии, что они независимы) является суммой двух дисперсий:
Вар [ Х+ ε ] = Var [ X] + Var [ ε ]
Теперь мы можем объединить эти четыре факта, чтобы создать две стандартные нормальные переменные, популяции которых будут иметь заданную корреляцию (точнее, ρ ), хотя сгенерированные вами выборки будут иметь выборочные корреляции, которые различаются. Идея состоит в том, чтобы создать псевдослучайную переменную X , которая является стандартной нормалью, N ( 0 , 1 ) , а затем найти коэффициент a и дисперсию ошибки v e , такую, что Y ∼ N ( 0 , a 2 + v е ) , гдерρИксN( 0 , 1 )avеY∼ N( 0 , а2+ Vе) . (Обратите внимание, что | a | должно быть ≤ 1, чтобы это работало, и, кроме того, a = r .) Таким образом, вы начинаете с r , который хотите; это твой коэффициент, а . Затем вы вычисляете дисперсию ошибки, которая вам понадобится, это 1 - r 2 . (Если ваше программное обеспечение требует, чтобы вы использовали стандартное отклонение, возьмите квадратный корень из этого значения.) Наконец, для каждогосгенерированного вамипсевдослучайного значения x i сгенерируйте псевдослучайное значение ошибки, e ia2+ Vе= 1| а | ≤ 1а = грa1 - р2Иксяея, с соответствующей дисперсией ошибки , и вычислить коррелированную псевдослучайную переменную, y i , путем умножения и сложения. vеYя
Если вы хотите сделать это в 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 , потому что это проще и потому что вы можете генерировать много переменных с заданной матрицей корреляции населения. Тем не менее, я думаю, что стоит пройти этот процесс, чтобы увидеть, как некоторые базовые принципы реализуются простым способом.