상관 관계를 얻기 위해 2D 데이터를 재배 열하는 방법은 무엇입니까?


9

두 개의 연속 변수가있는 다음과 같은 간단한 데이터 세트가 있습니다. 즉 :

d = data.frame(x=runif(100,0,100),y = runif(100,0,100))
plot(d$x,d$y)
abline(lm(y~x,d), col="red")
cor(d$x,d$y) # = 0.2135273

기본 분포

변수 사이의 상관 관계가 ~ 0.6이되도록 데이터를 다시 정렬해야합니다. 두 변수의 수단 및 기타 기술 통계 (sd, min, max 등)를 일정하게 유지해야합니다.

주어진 데이터와 거의 모든 상관 관계를 만드는 것이 가능하다는 것을 알고 있습니다.

d2 = with(d,data.frame(x=sort(x),y=sort(y)))
plot(d2$x,d2$y)
abline(lm(y~x,d2), col="red")
cor(d2$x,d2$y) # i.e. 0.9965585

여기에 이미지 설명을 입력하십시오

sample이 작업에 기능 을 사용하려고하면 :

cor.results = c()
for(i in 1:1000){
    set.seed(i)
    d3 = with(d,data.frame(x=sample(x),y=sample(y)))
    cor.results =  c(cor.results,cor(d3$x,d3$y))
}

나는 매우 넓은 범위의 상관 관계를 얻습니다.

> summary(cor.results)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-0.281600 -0.038330 -0.002498 -0.001506  0.034380  0.288800

그러나이 범위는 데이터 프레임의 행 수에 따라 달라지며 크기가 증가함에 따라 감소합니다.

> d = data.frame(x=runif(1000,0,100),y = runif(1000,0,100))
> cor.results = c()
> for(i in 1:1000){
+ set.seed(i)
+ d3 = with(d,data.frame(x=sample(x),y=sample(y)))
+ cor.results =  c(cor.results,cor(d3$x,d3$y))
+ }
> summary(cor.results)
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.1030000 -0.0231300 -0.0005248 -0.0005547  0.0207000  0.1095000

내 질문은 :

상관 관계를 얻기 위해 이러한 데이터 세트를 재배 열하는 방법 (예 : 0.7)? (메소드가 데이터 셋 크기에 대한 의존성을 제거한다면 좋을 것입니다)

답변:


6

추가 난수 생성을 기반으로 데이터를 재정렬하는 한 가지 방법이 있습니다.

지정된 상관 관계를 갖는 이변 량 정규 분포에서 표본을 추출합니다. 다음으로 얻은 및 값 의 순위를 계산합니다 . 이 순위는 원래 값을 주문하는 데 사용됩니다. 이 방법에서는 원래 및 값을 모두 정렬 합니다.xyxy

먼저 실제 데이터 세트를 작성합니다 (예와 같이).

set.seed(1)
d <- data.frame(x = runif(100, 0, 100), y = runif(100, 0, 100))

cor(d$x, d$y)
# [1] 0.01703215

이제 상관 행렬을 지정합니다.

corr <- 0.7  # target correlation
corr_mat <- matrix(corr, ncol = 2, nrow = 2)
diag(corr_mat) <- 1
corr_mat
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

, (두 변수 모두) 및 지정된 상관 관계를 갖는 이변 량 정규 분포에 따라 랜덤 데이터를 생성 합니다. R에서는 패키지 의 함수를 사용하여이를 수행 할 수 있습니다 . 우리 는 상관 관계가 경험적 상관 관계 (모집단 상관 관계가 아님)임을 나타내는 데 사용 합니다.μ=0σ=1mvrnormMASSempirical = TRUE

library(MASS)
mvdat <- mvrnorm(n = nrow(d), mu = c(0, 0), Sigma = corr_mat, empirical = TRUE)

cor(mvdat)
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

무작위 데이터는 지정된 상관 관계와 완벽하게 일치합니다.

다음으로 랜덤 데이터의 순위를 계산합니다.

rx <- rank(mvdat[ , 1], ties.method = "first")
ry <- rank(mvdat[ , 2], ties.method = "first")

의 원본 데이터에 순위를 사용하려면 원본 데이터 d를 정렬해야합니다.

dx_sorted <- sort(d$x)
dy_sorted <- sort(d$y)

이제 순위를 사용하여 정렬 된 데이터의 순서를 지정할 수 있습니다.

cor(dx_sorted[rx], dy_sorted[ry])
# [1] 0.6868986

얻은 상관 관계가 지정된 상관 관계와 완벽하게 일치하지는 않지만 차이는 비교적 작습니다.

여기에, dx_sorted[rx]그리고 dy_sorted[ry]원래 데이터의 버전을 다시 샘플링된다 d.


2
+1 정말 멋지다. 단계는 1) 올바른 Pearson 상관 관계로 정규 데이터를 생성하고, 2) 원래 데이터와 생성 된 데이터 일치 순위 상관을 정확하게, 3) 원래 데이터는 현재 거의 동일한 Pearson 상관 관계를 갖습니다. 왜 이것이 작동합니까? 그렇게하는 분석 결과가 있습니까? 경계가 불균형하여 다양한 상관 관계 측정 값이 잘 동작하는 분포 또는 다른 것에 대해 서로 가깝게 유지됩니까?
Bill

1
@ 나는 접근 방식을 분석적으로 설명 할 수 없다. 그것은 단지 내 마음에 온 아이디어입니다. 그러나 단계를 좋은 방법으로 요약했습니다. 감사.
Sven Hohenstein

2

지정된 상관 관계로 두 개의 균일 분포를 생성하기 위해 Ruscio & Kaczetow (2008) 알고리즘이 작동합니다. 그들은 R 코드를 제공 합니다 . 그런 다음 간단한 선형 함수로 변환하여 대상 최소, 최대, 평균 및 SD를 얻을 수 있습니다.

Ruscio & Kaczetow 알고리즘

이변 량 사례를 요약하지만 다변량 문제에서도 작동 할 수 있습니다. 상관 않은 및 는 임의의 형상 (예를 들어, 균일)으로 생성된다. 그런 다음 과 은 중간 상관 관계를 갖는 이변 량 법선으로 생성됩니다. 및 로 대체 및 순위 보존 방식으로. r ( )이 너무 낮거나 여부에 따라 중간 상관 관계를 높이거나 낮게 조정하십시오 . 및 는 새로운 중간 상관 관계에 따라 이변 량 법선으로 생성됩니다 . 반복.XoYoX1Y1X1Y1X0Y0X1,Y1X2Y2

이것은 반복적이라는 점을 제외하고 @Sven Hohenstein의 솔루션과 매우 유사하므로 중간 상관 관계는 구분할 수 없을 때까지 대상 상관 관계에 더 가깝고 가까워집니다. 또한이 알고리즘을 사용하여 더 작은 샘플을 추출 할 수있는 많은 모집단 (예 : N 백만)을 생성 할 수 있습니다. 이는 샘플링 오류가 필요한 경우에 유용합니다.

관련 게시물 : 상관 관계 및 비정규 분포

기술 통계량 보존

알고리즘이 정확히 동일한 설명을 생성한다는 보장은 없습니다. 그러나 균일 분포의 평균과 SD는 최소 및 최대로 결정되므로 모든 것을 수정하기 위해 최소 및 최대를 간단히 조정할 수 있습니다.

하자 및 Ruscio & Kaczetow 알고리즘의 마지막 반복에서 생성 된 변수 수, 및 당신이 (목표 descriptives과)가 희망하는 것이 최종 변수, 그리고 와 데이터 세트에 원래의 변수를합니다. XgYgXfYfXY

계산 Xf=(Xgmin(X))(max(X)min(x))/(max(Xg)min(Xg))

대해서도 동일하게Yf

참고:

Ruscio, J., & Kaczetow, W. (2008). 반복 알고리즘을 사용하여 다변량 비정규 데이터 시뮬레이션 다변량 행동 연구, 43, 355–381. 도 : 10.1080 / 00273170802285693


1

"리샘플링"이라고 말하면 "시뮬레이션"을 의미하는 것으로 추측됩니다. 다음은 지정된 상관 관계로 정상 이변 량 데이터를 시뮬레이션하는 가장 간단한 방법입니다. r과 n에 원하는 값을 대입하십시오.

r = .6
n = 1000
x = rnorm(n) 
z = rnorm(n) 
y = (r/(1-r^2)^.5)*x + z

cor(x,y)
plot(x,y)
abline(lm(y~x), col="red")

3
아니요, 정말 "재 샘플링"을 의미합니다. 두 변수의 평균 및 기타 기술 통계 (sd, min, max)를 일정하게 유지해야합니다. 질문을 업데이트했습니다.
Yuriy Petrovskiy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.