평균 = , 분산 = , 상관 계수 = 상관 랜덤 시퀀스를 생성하려고합니다 . 아래 코드에서 & 를 표준 편차로 사용하고 & 를 수단으로 사용합니다.1 0.8
s1
s2
m1
m2
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 x
및 y
. 내 질문은 (동일한 상관 관계 ) 상관 z
관계를 원 하지만 시리즈가 아닌 일련의 평균을 생성하는 방법 입니다 . 알아야 할 특정 공식이 있습니까? 하나를 찾았 지만 이해할 수 없었습니다.y
답변
특정 상관 행렬로 데이터를 생성하는 방법을 묻는 것 같습니다.
유용한 사실은 공분산 행렬 가있는 임의의 벡터 있으면 임의의 벡터 는 평균 및 공분산 행렬 . 따라서 평균이 0 인 데이터로 시작하면 곱해도 변경되지 않으므로 첫 번째 요구 사항이 쉽게 충족됩니다. Σ A x A E ( x ) Ω = A Σ A T A
상관 관계가없는 데이터 (즉, 공분산 행렬이 대각선 임)로 시작한다고 가정 해 봅시다. 상관 행렬에 대해 이야기하고 있기 때문에 취 . 당신은 선택하여 주어진 공분산 행렬과 데이터에이를 변환 할 수 있습니다 로 콜레 제곱근 의 다음 – 원하는 공분산 행렬 것 .A Ω A x Ω
귀하의 예에서는 다음과 같은 것을 원합니다.
불행히도이 행렬은 양의 한정이 아니므로 공분산 행렬이 될 수 없습니다. 행렬식이 음수인지 확인하여이를 확인할 수 있습니다. 아마도, 대신에
충분할 것입니다. matlab에서 cholesky 제곱근을 계산하는 방법을 잘 모르지만 (사용중인 것으로 보입니다) 함수를 R
사용할 수 있습니다 chol()
.
이 예제에서 위에 나열된 두 대해 적절한 행렬 배수 (각각)는
이것 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로 설정된 경우) 대신 상관 행렬의 고유 벡터를 사용합니다.
상관 행렬은 양의 한정이어야하지만 R의 Matrix 패키지에서 nearPD 함수로 변환하는 것이 유용합니다.
답변