미리 지정된 상관 관계 행렬을 사용하여 데이터를 생성하려면 어떻게해야합니까? 를 수단으로 사용합니다.1 0.80001110.80.80.8s1s2m1m2 p =

평균 = , 분산 = , 상관 계수 = 상관 랜덤 시퀀스를 생성하려고합니다 . 아래 코드에서 & 를 표준 편차로 사용하고 & 를 수단으로 사용합니다.1 0.8

0

1

0.8

s1s2m1m2

p = 0.8 
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2

이것은 나에게 올바른주는 corrcoef()사이에 0.8 xy. 내 질문은 (동일한 상관 관계 ) 상관 z관계를 원 하지만 시리즈가 아닌 일련의 평균을 생성하는 방법 입니다 . 알아야 할 특정 공식이 있습니까? 하나를 찾았 지만 이해할 수 없었습니다.y

r=0.8

x



답변

특정 상관 행렬로 데이터를 생성하는 방법을 묻는 것 같습니다.

유용한 사실은 공분산 행렬 가있는 임의의 벡터 있으면 임의의 벡터 는 평균 및 공분산 행렬 . 따라서 평균이 0 인 데이터로 시작하면 곱해도 변경되지 않으므로 첫 번째 요구 사항이 쉽게 충족됩니다. Σ A x A E ( x ) Ω = A Σ A T A

x

Σ

Ax

AE(x)

Ω=AΣAT

A

상관 관계가없는 데이터 (즉, 공분산 행렬이 대각선 임)로 시작한다고 가정 해 봅시다. 상관 행렬에 대해 이야기하고 있기 때문에 취 . 당신은 선택하여 주어진 공분산 행렬과 데이터에이를 변환 할 수 있습니다 로 콜레 제곱근 의 다음 – 원하는 공분산 행렬 것 .A Ω A x Ω

Σ=I

A

Ω

Ax

Ω

귀하의 예에서는 다음과 같은 것을 원합니다.

Ω=(1.80.81.80.81)

불행히도이 행렬은 양의 한정이 아니므로 공분산 행렬이 될 수 없습니다. 행렬식이 음수인지 확인하여이를 확인할 수 있습니다. 아마도, 대신에

Ω=(1.8.3.81.8.3.81)    or   Ω=(12/302/312/302/31)

충분할 것입니다. matlab에서 cholesky 제곱근을 계산하는 방법을 잘 모르지만 (사용중인 것으로 보입니다) 함수를 R사용할 수 있습니다 chol().

이 예제에서 위에 나열된 두 대해 적절한 행렬 배수 (각각)는

Ω

A=(100.8.60.3.933.1972)    or   A=(1002/3.745300.8944.4472)

이것 R에 도달하는 데 사용 된 코드는 다음과 같습니다.

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136


답변

R을 사용하는 경우 정규 분포 변수를 원한다고 가정하고 MASS 패키지에서 mvrnorm 함수를 사용할 수도 있습니다. 구현은 위의 매크로 설명과 유사하지만 cholesky 분해 대신 단일 값 분해로 스케일링 (상관 옵션이 true로 설정된 경우) 대신 상관 행렬의 고유 벡터를 사용합니다.

X

Σ

γ

λ

Σ

X=γλXT

Σ

X

상관 행렬은 양의 한정이어야하지만 R의 Matrix 패키지에서 nearPD 함수로 변환하는 것이 유용합니다.


답변

Σy

x

Σx=I

Σy

Λ

V

Σy=VΛVT=(VΛ)(ΛTVT)=AAT

y=Ax


답변