2016-07-26 6 views
0

次のゲームを考えてみましょう:各試行では、x赤とyの青い点で表示されます。青い点よりも赤い点が多いかどうかを判断する必要があります。試行ごとに、与えられた色の最小ドット数は10、最大値は50です。赤と青のドットは、同じ多項分布に従います(簡単にするため、10と50の間の各整数の出現確率は似ています)。2つの多項分布から無作為に抽出されたサンプル間の事前相関を指定する方法はありますか?

私は300回の試行をしたいと思います。これを行うために、各多項分布から300サンプルを引きます。重要なことに、第1の分布からの300サンプルと第2の分布からの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))より小さくする必要があります。

Python、RまたはMATLABでどうすればいいですか?

+0

_red_と_blue_ dotsで始まり、突然_green_になりますか? – EBH

+0

良い点、申し訳ありません。 – user1363251

+0

コピュラを使用しますか? [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 
を持つ2つのベクトルを作成します

rand関数は、randiまたはrandnのような任意の生成された数値関数に変更できます。特定の分布が望ましい場合は、using the it's cdfを取得できます。

ステップ2 - サンプルの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これはほぼ完璧です、本当にありがとうございます。私は2つの洗練を求めることができますか?まず、試行の50%でx> y、残りの試行でx user1363251

+0

貴重な助けをもう一度感謝します。うまくいかないようです。コードの最後に、次のように追加しました。Xy = x> y; checkx = length(find(Xy == 1)); Yx = y> x; checky = length(find(Yx == 1)); checkxとcheckyは非常に異なっており、xが試行の50%でyよりも優れていないことを示しています。私の最初の投稿を編集する前に、任意のアイデア? – user1363251

+0

ありがとう!私はこのトリックについて考えました。コレスキー分解後にdatasample()を使用すると、相関が低くなります。しかし、問題は、最も近いrを見つけるためにサブサンプルをループすることで解決できます。最初の投稿を編集する予定です。このインタラクションは他の人に役立つと思います。 – user1363251

関連する問題