특정 상관 관계로 임의의 숫자 쌍을 생성하고 싶습니다. 그러나 균일 변수의 선형 조합이 더 이상 균일하게 분포 된 변수가 아니기 때문에 두 정규 변수의 선형 조합을 사용하는 일반적인 방법은 여기서 유효하지 않습니다. 두 변수가 균일해야합니다.
주어진 상관 관계로 균일 한 변수 쌍을 생성하는 방법에 대한 아이디어가 있습니까?
특정 상관 관계로 임의의 숫자 쌍을 생성하고 싶습니다. 그러나 균일 변수의 선형 조합이 더 이상 균일하게 분포 된 변수가 아니기 때문에 두 정규 변수의 선형 조합을 사용하는 일반적인 방법은 여기서 유효하지 않습니다. 두 변수가 균일해야합니다.
주어진 상관 관계로 균일 한 변수 쌍을 생성하는 방법에 대한 아이디어가 있습니까?
답변:
주어진 한계 분포와 상관 랜덤 변수를 생성하는 보편적 인 방법을 알지 못합니다. 따라서 주어진 (피어슨) 상관 관계로 균일하게 분포 된 랜덤 변수 쌍을 생성하는 임시 방법을 제안합니다. 일반성을 잃지 않으면 서 원하는 한계 분포가 표준 균일하다고 가정합니다 (즉,지지는 ).
제안 된 방법은 다음에 의존한다 :
a) 표준 균일 랜덤 변수의 및 각 분포 함수와 및 , 우리가 들어, . 따라서 Spearman의 rho 는
따라서 Spearman의 rho와 Pearson의 상관 계수는 동일합니다 (샘플 버전은 다를 수 있음).U 2 F 1 F 2 F i ( U i ) = U i i = 1 , 2 ρ S ( U 1 , U 2 ) = c o r r ( F 1 ( U 1 ) , F 2 ( U 2 ) ) = c o r r ( U 1 , U
b) 가 연속 마진을 갖는 랜덤 변수이고 (Pearson) 상관 계수가 인 가우스 copula 인 경우 Spearman의 rho는 이를 통해 원하는 Spearman 's rho 값을 갖는 랜덤 변수를 쉽게 생성 할 수 있습니다. ρ ρ S ( X 1 , X 2 ) = 6
이 방법은 Spearman 's rho가 균일 한 랜덤 변수에 대한 원하는 상관 관계에 일치하도록 적절한 상관 계수 Gaussian copula에서 데이터를 생성 하는 것입니다.
시뮬레이션 알고리즘
하자는 상관도의 원하는 레벨을 나타내며, 쌍의 수를 생성한다. 알고리즘은 다음과 같습니다.n
예제
다음 코드는 대상 상관 관계가 이고 쌍인 R을 사용하여이 알고리즘을 구현 한 예입니다 .n = 500
## Initialization and parameters
set.seed(123)
r <- 0.6 # Target (Spearman) correlation
n <- 500 # Number of samples
## Functions
gen.gauss.cop <- function(r, n){
rho <- 2 * sin(r * pi/6) # Pearson correlation
P <- toeplitz(c(1, rho)) # Correlation matrix
d <- nrow(P) # Dimension
## Generate sample
U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
return(U)
}
## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
h <- hist(x, plot = FALSE)
rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})
아래 그림에서 대각선 도표는 변수 및 히스토그램을 보여주고 대각선 도표는 및 의 산점도를 보여줍니다 . U 2 U 1 U 2
구성에 의해 랜덤 변수는 균일 한 마진과 상관 계수 가깝습니다 . 그러나 샘플링의 효과로 인해 시뮬레이션 된 데이터의 상관 계수가 과 정확히 같지 않습니다 .r
cor(U)[1, 2]
# [1] 0.5337697
이 gen.gauss.cop
함수는 단순히 더 큰 상관 관계 행렬을 지정하여 둘 이상의 변수 에서 작동해야합니다.
시뮬레이션 연구
대상 상관 관계 대해 반복 된 다음 시뮬레이션 연구 는 표본 크기 증가함에 따라 상관 계수의 분포가 원하는 상관 관계로 수렴됨을 제안합니다 .N
## Simulation
set.seed(921)
r <- 0.6 # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n # Number of samples
S <- 1000 # Number of simulations
res <- sapply(n,
function(n, r, S){
replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
},
r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")
gen.gauss.cop
함수가 (사소한) 미세 조정으로 두 개 이상의 변수에서 작동 할 것이라고 지적하는 문장을 추가 할 자유를 얻었습니다 . 추가가 마음에 들지 않거나 다르게 넣으려면 필요에 따라 되돌 리거나 변경하십시오.