상관 난수를 생성하는 방법 (제공된 평균, 분산 및 상관 정도)?


53

이것이 너무 기본적으로 보이지만 미안하지만 여기서 이해를 확인하려고합니다. 나는 두 단계 로이 작업을 수행해야한다는 감각을 얻었으며 상관 관계 행렬을 시작하려고 시도했지만 실제로 개입하기 시작했습니다. 상관 난수를 생성하는 훌륭하고 이상적인 빠른 방법에 대한 간결한 설명 (이상적으로 의사 코드 솔루션에 대한 힌트로)을 찾고 있습니다.

알려진 평균과 분산을 가진 두 개의 의사 난수 변수 높이와 무게, 주어진 상관 관계가 주어지면 기본적 으로이 두 번째 단계의 모양을 이해하려고 노력하고 있다고 생각합니다.

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • 상관 평균과 분산을 어떻게 계산합니까? 그러나 나는 이것이 실제로 관련된 문제임을 확인하고 싶습니다.
  • 매트릭스 조작에 의존해야합니까? 아니면이 문제에 대한 기본 접근 방식에 다른 문제가 있습니까?

1
잘 이해하고 있지만 "상관 된 평균 및 분산"을 계산할 필요는 없습니다. 변수가 이변 량 정상이라고 가정하면 개별 평균과 분산 및 상관 관계를 지정하기에 충분해야합니다. 이를 위해 사용하려는 특정 소프트웨어가 있습니까?
mark999


답변:


44

"상관 된 난수를 생성하는 우수하고 이상적인 빠른 방법"에 대한 귀하의 질문에 대답하려면 : 정의에 의해 정의 된 양의 공분산 행렬 가 주어지면 Cholesky 분해는 다음과 같습니다. = ; 은 하부 삼각 행렬입니다.C L L T LCCLLTL

이제이 행렬 을 사용 하여 상관되지 않은 임의 변수 벡터 를 투영하면 결과 투영 는 상관 된 임의 변수의 투영 이됩니다.X Y = L XLXY=LX

이런 일이 발생하는 이유 당신은 간결한 설명을 찾을 수 있습니다 여기에 .


감사! 이것은 매우 도움이되었습니다. 나는 적어도 다음에 봐야 할 것에 대한 더 나은 감각을 가지고 있다고 생각합니다.
Joseph Weissman

7
이 방법은 가우시안 분포 (질문에 지정된)에만 적용됩니까, 아니면 다른 분포를 따르는 상관 변수를 생성하는 데 사용할 수 있습니까? 그렇지 않다면, 그 경우에 사용될 수있는 방법을 알고 있습니까?
user000001

1
@ 마이클 : 예. 주어진 가 유효한 공분산 행렬 이라고 말하면서 Cholesky 분해가 가장 빠른 방법입니다. SVD를 사용하여 의 (대칭) 제곱근 행렬을 얻을 수도 있습니다 ( , 여기서 from ). 너무 비싸다. 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는 Reinstate Monic이

1
@ 마이클 : 물론입니다. 그들의 공분산은 숫자 자체가 아니라 (대략) 동일합니다.
usεr11852는

1
@Sid : 전체 실제 회선에서 지원되지 않는 연속 배포는 즉시 실패합니다. 예를 들어 균일 한 을 사용하면 "상관 된 숫자"가 에 있다고 보장 할 수 없습니다 . 마찬가지로 포아송의 경우 비 이산 숫자로 끝납니다. 또한, 분포의 합이 여전히 동일한 분포가 아닌 임의의 분포 (예. 합산 초래하지 않는다 - 분포 -distributions하면)도 실패 할 것이다. 언급 된 모든 경우에 생성 된 숫자 는 에 따라 상관 되지만 시작한 분포와 일치하지 않습니다. [ 0 , 1 ] t t CU[0,1][0,1]ttC
usεr11852는 Reinstate Monic을 말합니다

36

@ user11852와 @ jem77bfp의 +1은 좋은 답변입니다. 필자 가 실제로 더 나아 졌다고 생각하는 것이 아니라 유익하다고 생각하기 때문에 다른 관점에서 접근 해 보겠다. 다음은 우리가 이미 알고있는 몇 가지 관련 사실입니다.

  1. X Yr 은 와 가 모두 표준화 될 때 회귀선의 기울기입니다 ( 예 : . XYN(0,1)
  2. r2 의 변화의 비율 인 의 차이에 기인 한 , YX



    (또한 분산 규칙에서 ) :

  3. 랜덤 변수의 분산에 상수를 곱한 값 은 원래 분산 의 상수에 제곱을 곱한 값입니다.
    Var[aX]=a2Var[X]
  4. variances add , 즉 두 개의 임의 변수 합계의 분산 (독립이라고 가정)은 두 분산의 합입니다.
    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)과 (하지 1) 표준 편차를 가지고있다. 따라서 관측 된 평균을 빼서 평균이 정확히 이고 변수에 원하는 SD를 곱한 다음 원하는 평균을 더합니다. 관측 평균이 원하는 평균 주위에서 정상적으로 변동되도록하려면 초기 차이를 다시 추가합니다. 본질적으로 이것은 반대로 z- 점수 변환입니다. 이것은 선형 변환이므로 변환 된 변수는 이전과 다른 변수와 동일한 상관 관계를 갖습니다. 0

다시 말하지만, 이것은 가장 간단한 형태로 한 쌍 의 상관 변수 만 생성 할 수있게하며 (확장 가능하지만 추악하게 빠짐) 확실히 작업을 수행하는 가장 편리한 방법은 아닙니다. R에서는 MASS 패키지 에서 ? mvrnorm 을 사용하는 것이 더 쉽고 주어진 모집단 상관 행렬로 많은 변수를 생성 할 수 있기 때문에 둘 다 사용하려고합니다 . 그럼에도 불구하고, 나는 몇 가지 기본 원리가 간단한 방식으로 어떻게 작동하는지보기 위해이 과정을 살펴 보는 것이 가치가 있다고 생각합니다.


이 본질적으로 회귀 적 접근은 하나의 임의의 Y를 임의의 수의 기존 X "예측 자" 와 상관시켜 생성 할 수있게하는 것이 특히 좋습니다 . 그런 이해에 맞습니까?
ttnphns

원하는 변수 사이의 상관 관계 패턴 인 @ttnphns에 따라 달라집니다. 이것을 차례로 반복 할 수 있지만 지루할 것입니다. 주어진 패턴으로 많은 상관 변수를 만들려면 Cholesky 분해를 사용하는 것이 좋습니다.
gung-Monica Monica 복원

ghole, Cholesky를 사용하여 몇 개의 기존 (시뮬레이션되지 않은) X 와의 상관 관계 벡터에 따라 하나의 Y 상관 (방법에서와 같이)을 생성하는 방법을 알고 있습니까?
ttnphns

@ttnphns, 당신은 미리 지정된 모집단 상관 관계가있는 p 변수 세트가 아닌 주어진 모집단 상관 관계와 X 세트로 단일 Y를 생성하고 싶습니까? 간단한 방법은 회귀 방정식을 작성하여 X에서 단일 Y 모자를 생성 한 다음 위의 방법을 사용하여 Y 모자를 상관 관계로 Y를 생성하는 것입니다. 원하는 경우 새로운 질문을 할 수 있습니다.
gung-Monica Monica 복원

1
이것이 내가 처음 언급 한 내용의 의미입니다.이 방법은 답에서 말하는 것의 직접적인 확장입니다. 본질적으로 회귀 (Hat) 방법입니다.
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)
KevinKim

1

효율성을 포기할 준비가된다면, 버리기 알고리즘을 사용할 수 있습니다. 장점은 가우시안뿐만 아니라 모든 종류의 분포를 허용한다는 것입니다.

원하는 분포로 및 의 두 개의 상관되지 않은 난수 시퀀스를 생성하여 시작하십시오 . 상관 계수의 원하는 값으로 를 보자 . 그런 다음 다음을 수행하십시오.{xi}i=1N{yi}i=1NC

1) 계산 상관 계수cold=corr({xi},{yi})

n1n2:1n1,2N

xn1xn2

cnew=corr({xi},{yi})

|Ccnew|<|Ccold|그런 다음 스왑을 유지하십시오. 그렇지 않으면 스왑을 취소하십시오.

|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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.