@ user11852와 @ jem77bfp의 +1은 좋은 답변입니다. 필자 가 실제로 더 나아 졌다고 생각하는 것이 아니라 유익하다고 생각하기 때문에 다른 관점에서 접근 해 보겠다. 다음은 우리가 이미 알고있는 몇 가지 관련 사실입니다.
- X Yr 은 와 가 모두 표준화 될 때 회귀선의 기울기입니다 ( 예 : . XYN(0,1)
r2 의 변화의 비율 인 의 차이에 기인 한 , YX
(또한 분산 규칙에서 ) :
- 랜덤 변수의 분산에 상수를 곱한 값 은 원래 분산 의 상수에 제곱을 곱한 값입니다.
Var[aX]=a2Var[X]
- variances add , 즉 두 개의 임의 변수 합계의 분산 (독립이라고 가정)은 두 분산의 합입니다.
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)과 (하지 1) 표준 편차를 가지고있다. 따라서 관측 된 평균을 빼서 평균이 정확히 이고 변수에 원하는 SD를 곱한 다음 원하는 평균을 더합니다. 관측 평균이 원하는 평균 주위에서 정상적으로 변동되도록하려면 초기 차이를 다시 추가합니다. 본질적으로 이것은 반대로 z- 점수 변환입니다. 이것은 선형 변환이므로 변환 된 변수는 이전과 다른 변수와 동일한 상관 관계를 갖습니다. 0
다시 말하지만, 이것은 가장 간단한 형태로 한 쌍 의 상관 변수 만 생성 할 수있게하며 (확장 가능하지만 추악하게 빠짐) 확실히 작업을 수행하는 가장 편리한 방법은 아닙니다. R에서는 MASS 패키지 에서 ? mvrnorm 을 사용하는 것이 더 쉽고 주어진 모집단 상관 행렬로 많은 변수를 생성 할 수 있기 때문에 둘 다 사용하려고합니다 . 그럼에도 불구하고, 나는 몇 가지 기본 원리가 간단한 방식으로 어떻게 작동하는지보기 위해이 과정을 살펴 보는 것이 가치가 있다고 생각합니다.