2016-07-26 4 views
0

다음 게임을 고려하십시오. 각 평가판에서 x 빨간색으로 표시되고 y 파란색 점으로 표시됩니다. 파란색 점보다 빨간색이 더 많은지 여부를 결정해야합니다. 각 시험에서 주어진 색상의 도트의 최소 수는 10이고 최대 값은 50입니다. 빨강 및 파랑 점은 동일한 다항 분포를 따릅니다 (간단히하기 위해 10과 50 사이의 각 정수가 나타날 확률은).두 다항식 분포에서 무작위로 추출한 샘플간에 사전 상관 관계를 지정하는 방법은 무엇입니까?

300 가지 시도를하고 싶습니다. 그렇게하기 위해 각 다항 분포에서 300 개의 샘플을 그립니다. 중요한 것은, 첫 번째 배포본의 300 개 샘플과 두 번째 배포본의 300 개 샘플 간의 상관 관계를 (a priori)으로 지정하고 싶습니다. 5 쌍의 샘플 세트에서 -0.8, -0.5, 0, 0.5 및 0.8의 상관 관계를 원합니다.

바람직하게는이 세트를 샘플링하여 지정된 상관 관계가있는 각 세트 (X, Y)에서 X 샘플의 절반이 Y (x(i) > y(i))보다 커야하며 나머지 절반은 Y (x(i) < y(i))보다 작아야합니다.

파이썬, R 또는 MATLAB에서 어떻게 할 수 있습니까?

+0

_red_ 및 _blue_ 도트로 시작하면 갑자기 _green_가됩니까? – EBH

+0

좋은 지적, 엉성한 일은 유감스럽게 생각합니다. – user1363251

+0

copulas를 사용 하시겠습니까? [this] (http://stackoverflow.com/a/37515473/5540279)에 질문에 대한 답변이 있습니까? –

답변

1

은 기본적으로 당신은 프로그래밍 질문보다 더 많은 통계 그래서 어떻게 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과 같지 않으므로 첫 번째 rfinal_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이 원하는 값에 충분히 근접 할 때까지 검색을 계속합니다.

+0

@EBHT 이것은 거의 완벽합니다. 정말 고맙습니다. 두 가지 상세 검색을 요청해도됩니까? 먼저, x> y가 시행의 50 %에서, x user1363251

+0

귀중한 도움에 다시 한 번 감사드립니다. 작동하지 않는 것 같습니다. 코드 끝에 Xy = x> y; checkx = 길이 (찾기 (Xy == 1)); Yx = y> x; checky = 길이 (찾기 (Yx == 1)); 그러나 checkx와 checky는 매우 다르기 때문에 x가 재판의 50 %에서 y보다 우수하지 않음을 나타냅니다. 처음 게시물을 편집하기 전에 어떤 아이디어가 있습니까? – user1363251

+0

감사! 나는이 트릭에 대해 생각해 보았다. 콜레 스키 분해 후 datasample()을 사용하면 상관 관계가 낮아집니다. 그러나 가장 가까운 r을 찾기 위해 서브 샘플을 반복함으로써 문제를 해결할 수 있습니다. 나는 지금 나의 초기 게시물을 편집 할 것이고, 나는이 상호 작용이 다른 사람들에게 유용 할 것이라고 생각한다. – user1363251