No.13054 多項の超幾何分布について  【藤田】 2010/07/14(Wed) 17:56

各事象の出現確率が違うX個の集合にY個(X>Y)の正解があり,そこからZ個(Y>Z)を抜き出す時にZに含まれる正解の数に対する確率分布が知りたいです。
確率分布の計算の仕方(分布名があれば分布名),フリーのライブラリの場所等をお教えいただけないでしょうか

本件,超幾何分布の,多項への拡張と認識しています。(ここにも誤解があるかも知れませんが・・)
超幾何分布も同様にX個集合からY個の正解,Z個抜き出し時の正解数の分布ですが,各Xの出現確率が同じという理解です。

WEBを調べてみると,多項超幾何分布というものがあり,計算困難なため,MCMCで解決が一般的と書いてあるように考えています。
この認識で正しいのでしょうか,MCMCで解くとすればどのような手段があるでしょうか(プログラム?コーディングイメージ等)

よろしくお願いします。

No.13055 Re: 多項の超幾何分布について  【青木繁伸】 2010/07/14(Wed) 18:34

> 各事象の出現確率が違うX個の集合にY個(X>Y)の正解があり,そこからZ個(Y>Z)を抜き出す時にZに含まれる正解の数に

わかりにくいですね。もう少し具体的に説明できませんか?

No.13059 Re: 多項の超幾何分布について  【ひの】 2010/07/15(Thu) 01:12

 場合の数は,X個からZ個取り出す組み合わせ,xCz ですからその全てを列挙して,それぞれの場合について正解数と確率を求め集計すれば良いということになりますね。「すべての組み合わせを列挙するアルゴリズム」はアルゴリズムの教科書などに書かれていると思います。

 XやZが大きい場合は場合の数が膨大になって正確な計算が困難になりますからシミュレーションということになるのでしょう。

No.13060 Re: 多項の超幾何分布について  【藤田】 2010/07/15(Thu) 09:07

ご回答ありがとうございます。

>青木様
具体例を記載します。
X個の事象の出現確率 X1+X2+X3+X4+X5+X6=1
X1=0.1,X2=0.2,X3=0.3,X4=0.1,X5=0.16,X6=0.14
Y個の正解
X1,X2,X3が正解とする
Z個の抜き出し
3個抜き出すとする。

この場合に,Zの3個中に,Yがいくつ含まれるかという問題を考えます。
この確率分布を知りたいです
つまり,横軸に0,1,2,3の確率分布図が得られる認識です。

>ひのさま
ありがとうございます。
コードのイメージは認識合っていました。
すでに再帰呼び出しを使ってコード化を試しているのですが,なかなかうまく書けていません。(超幾何分布で検算していますが値が合わない)
ただ,アプローチが正しいということが分かり安心しました。

超幾何分布のように「一般的?」な分布(ソースがRで落ちているようなもの)は無いという理解で正しいのでしょうか

No.13062 Re: 多項の超幾何分布について  【青木繁伸】 2010/07/15(Thu) 11:00

単なる二項分布?

問題を言い換えると(シミュレーションの手順でもありますが)以下のようになりますか?
出 現比率 (0.1, 0.2, 0.3, 0.1, 0.16, 0.14) の事象を考える。それぞれの事象を数字 1 〜 6 であらわす。1 〜 6 の数字を出現比率(母比率)で含む,例えば 30000 個の数字の母集団を考える。母集団から 3 個の数字を取り出して,その数字が 1, 2, 3 であれば正解。求めたいのは,3 つの数字のうち 1, 2, 3 のいずれかである個数。
つまり,1 ~ 6 の数字のうち 1, 2, 3 の数字になる確率。1,2,3 いずれかの数字になる確率は 0.1+0.2+0.3 = 0.6。つまり,試行数 3,母比率 0.6 の二項分布。
> n <- 1600000 # シミュレーション試行回数
> p <- c(0.1, 0.2, 0.3, 0.1, 0.16, 0.14) # 母比率
> d <- matrix(sample(6, n*3, prob=p, replace=TRUE), n) # 母集団作製。n行3列。行が 1 シミュレーション(3 つの数字の組)
> head(d) # 最初の方の様子
[,1] [,2] [,3]
[1,] 3 3 1 # 正解が 3 つ
[2,] 2 3 2 # 正解が 3 つ
[3,] 2 3 1 # 正解が 3 つ
[4,] 3 5 5 # 正解が 1 つ
[5,] 4 3 3 # 正解が 2 つ
[6,] 3 4 3 # 正解が 2 つ
  : 以下略

> table(d)/(n*3) # n*3 個の数字の集計をして,n*3 で割って母比率を確認
d
1 2 3 4 5 6
0.1000371 0.1999710 0.3000129 0.1000596 0.1599306 0.1399887 # 十分な母集団

> # 何をやるかを明らかにするため,あえて for を使う
> tbl <- numeric(4) # 正解の個数の集計に使う
> for (i in 1:n) { # n 回のシミュレーションの集計
+ s <- 0 # 3 つの数字のうち 3 より小さいもの(正解)の数を数える
+ for (j in 1:3) { # 3 つの数字について
+ if (d[i,j] <= 3) s <- s+1 # 3 以下(正解)ならカウント
+ }
+ tbl[s+1] <- tbl[s+1]+1 # 正解の数によって,頻度を蓄積(集計)
+ }
> print(tbl) # 集計表を出力
[1] 101990 460538 692853 344619 # 順に,正解が 0, 1, 2, 3 となった回数

> # 本当は以下の一行でできる
> print(table(apply(d, 1, function(x) sum(x <= 3))))

0 1 2 3
101990 460538 692853 344619 # 上の集計と同じになる(あたりまえ)

> # で。二項分布ならどうなるか。
> # 二項分布
> p <- dbinom(0:3, 3, p=0.6)
> p
[1] 0.064 0.288 0.432 0.216 # 理論比
> p*n
[1] 102400 460800 691200 345600 # 理論度数

No.13063 Re: 多項の超幾何分布について  【ひの】 2010/07/15(Thu) 11:35

>つまり,1 ~ 6 の数字のうち 1, 2, 3 の数字になる確率。1,2,3 いずれかの数字になる確率は 0.1+0.2+0.3 = 0.6。つまり,試行数 3,母比率 0.6 の二項分布。

復元抽出ならこれで良いと思いますが,非復元抽出なのでは?
つまり同じものが2個以上抽出されることはないという条件だとこれじゃダメですね。
非復元抽出なら1個目を取り出したあと2個目は出現確率が変化するので「出現確率が一定」ではなくなりますね。どっちなんだろう?

No.13064 Re: 多項の超幾何分布について  【青木繁伸】 2010/07/15(Thu) 11:49

復元か非復元か?

無条件に復元抽出と思いました。

> X個の事象の出現確率 X1+X2+X3+X4+X5+X6=1
> X1=0.1,X2=0.2,X3=0.3,X4=0.1,X5=0.16,X6=0.14

ということで,無限母集団(すくなくとも,復元か非復元かが問題にならないほど大きい)を考えましたけど。。。

まあ,「超幾何分布」という言葉を使っているので,有限かも知れないけど。
有限であっても,単なる超幾何分布になるのでは?

No.13067 Re: 多項の超幾何分布について  【ひの】 2010/07/15(Thu) 12:53

非復元抽出ということで考えてみると,

>X個の事象の出現確率 X1+X2+X3+X4+X5+X6=1
>X1=0.1,X2=0.2,X3=0.3,X4=0.1,X5=0.16,X6=0.14

この確率は1個目を選ぶときのもので,2個目以降は残りのものからこの比率で選ばれるという解釈になります。するとかなりややこしい。たとえば,

X1,X2,X3の3個が選ばれる確率は,

0.1×0.2×0.3に順列の3!をかけて求める

という単純なことではすまなくなります。

X1,X2,X3 の順に選ばれる確率は,

0.1 × 0.2/(1 - 0.1) × 0.3/(1 - 0.1 - 0.2)

X1,X3,X2 の順に選ばれる確率は,

0.1 × 0.3/(1 - 0.1) × 0.2/(1 - 0.1 -0.3)

X2,X1,X3 の順に選ばれる確率は,

0.2 × 0.1/(1 - 0.2) × 0.3/(1 - 0.2 -0.1)

というように選ばれる順によって確率が変化します。
ですから,

>場合の数は,X個からZ個取り出す組み合わせ,xCz ですからその全てを列挙して,それぞれの場合について正解数と確率を求め集計すれば良いということになりますね。

この方法では,同じ組み合わせ内の確率を求めるときに順列によって異なるものをひとつずつ別個に計算して合計することになるので,かえって面倒になります。

それよりも,はじめからすべての順列を列挙して,それぞれについて正解数と確率とを集計するほうがシンプルになると思います。

挙げられた例の程度の大きさのデータなら簡単に計算できますが(6*5*4=120通り),X=100,Z=50 くらいになると 100!/50!=3*10^93通りとなって事実上計算不可能になります。

もっと簡単にやる方法がありそうな気がするのだけれど。

No.13073 Re: 多項の超幾何分布について  【ひの】 2010/07/15(Thu) 18:34

先の考え方で計算してみました。処理系は仮称10進BASIC(http://hp.vector.co.jp/authors/VA008683/)です。
DIM X(1 to 6)      ! 事象Xi の確率を保持する配列
DIM N(0 to 3) ! 正解数i個の確率を集計していく配列
LET X(1) = 0.1
LET X(2) = 0.2
LET X(3) = 0.3
LET X(4) = 0.1
LET X(5) = 0.16
LET X(6) = 0.14
LET N(0) = 0
LET N(1) = 0
LET N(2) = 0
LET N(3) = 0

for i = 1 to 6
for j = 1 to 6
for k = 1 to 6
if i<>j and j<>k and k<>i then ! 同じものが重複するケースを除外
! 確率の計算
LET P = X(i)*X(j)*X(k) / (1 - X(i)) / (1 - X(i) - X(j))
! 正解数(A)のカウント
let A = 0
if i <=3 then let A = A + 1
if j <=3 then let A = A + 1
if k <=3 then let A = A + 1
! A個の正解数の確率をを加算
let N(A) = N(A) + P
end IF
next k
next j
next i
! 各正解数の確率を表示
for i = 0 to 3
print using$("----%",i), using$("---%.##########", N(i))
next i
! 念のため確率の合計を表示
print "Total" ; using$("----------------------%.##########" , N(0)+N(1)+N(2)+N(3))
END

====================出力結果=========================

0 0.0211994474
1 0.3519786887
2 0.5490440861
3 0.0777777778
Total 1.0000000000

Download:13073k and k 13073k and k


No.13076 Re: 多項の超幾何分布について  【藤田】 2010/07/15(Thu) 20:26

ひの様,青木様

ご回答ありがとうございます
藤田です

ご指摘の通り,非復元抽出です。
ひの様のコードを確認させていただきました。
大変ありがとうございました。

私のコードについては,どうやら再帰呼び出しでやっていたことが,
逆に(さらに?)問題を難しくしていたということに気付きました。

ひのさまのコードイメージにて書きなおしを行っています。

多項超幾何分布?とはあまり関係なかったかもしれません
重ねてありがとうございました。

● 「統計学関連なんでもあり」の過去ログ--- 043 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る