은 기본적으로 당신은 프로그래밍 질문보다 더 많은 통계 그래서 어떻게 create 2 vectors with a specified correlation 물어 있지만 다음과 같은 방법으로 수행 할 수 있습니다
1 단계 - 원하는 상관
r = 0.75; % r is the desired correlation
M = rand(10000,2); % two vectors from uniform distribution between 0 to 1
R = [1 r; r 1];
L = chol(R); % this is Cholesky decomposition of R
M = M*L; % when multiplied by M it gives the wanted correlation
M = (M+abs(min(M(:)))); % shift the vector to only positive values
M = M./max(M(:)); % normalize the vector...
M = round(40*M)+10; % ...to values between 10 to 50
disp([min(M(:)) max(M(:))])
first_r = corr(M(:,1), M(:,2)); % and check the resulted correlation
두 벡터를 생성
rand
함수는 randi
또는 randn
과 같이 임의의 생성 된 숫자 함수로 변경할 수 있으며 특정 분포가 필요한 경우 using the it's cdf을 얻을 수 있습니다.
2 단계 - 샘플들의 두 세트, x> y를 하나 및 Y 하나> X
x = M(:,1);
y = M(:,2);
Xy = x>y; % logical index for all x > y
Yx = y>x; % logical index for all y > x
xy1 = datasample([x(Xy) y(Xy)],150,'Replace',false); % make a 1/2 sample like Xy
xy2 = datasample([x(Yx) y(Yx)],150,'Replace',false); % make a 1/2 sample like Yx
x = [xy1(:,1);xy2(:,1)]; % concat the smaples back to x
y = [xy1(:,2);xy2(:,2)]; % concat the smaples back to y
checkx = sum(x>y) % how many times x is bigger than y
checky = sum(y>x) % how many times y is bigger than x
final_r = corr(x,y) % and check the new correlation
단계에서 이러한 벡터를 샘플링 3 - 당신 같이 상관
보정 final_r
은 원하는 r
과 같지 않으므로 첫 번째 r
을 final_r
에서 멀리 이동해야합니다. 다음은 그 예이다 - 먼저 출력 할 때 r = 0.75
:
10 50
checkx =
150
checky =
150
final_r =
0.67511
우리가 final_r
이 0.074886에 의해 아래로 이동 볼, 그래서 우리는 우리의 final_r
올바른을 얻기 위해이 값에 의해 원래의 r
을 이동하려는. 우리가 r = 0.75+0.074886
다시 실행한다면, 우리는 얻을 : 원하는 r
에 상당히 가까운
10 50
checkx =
150
checky =
150
final_r =
0.76379
합니다. 예를 들어 1000 번 반복하는 과정에서 루프를 실행하여 원하는 값에 가장 근접한 r
을 찾거나 간단히 검색 할 임계 값을 설정하여 final_r
이 원하는 값에 충분히 근접 할 때까지 검색을 계속합니다.
_red_ 및 _blue_ 도트로 시작하면 갑자기 _green_가됩니까? – EBH
좋은 지적, 엉성한 일은 유감스럽게 생각합니다. – user1363251
copulas를 사용 하시겠습니까? [this] (http://stackoverflow.com/a/37515473/5540279)에 질문에 대한 답변이 있습니까? –