ここで取り上げるのは,「マン・ホイットニーの U 検定の統計量の分布を求める」アルゴリズムです。
例えば,
S. Siegel: Nonparametric Statistics for the behavioral sciences.
McGraw-Hill Kogakusha, Tokyo, 1956.
訳書は,藤本 煕 監訳:ノンパラメトリック統計学, マグロウヒル, 東京, 1983.
には,n1, n2 が 8 以下の場合しか正確な確率は載っていません。
# u-statistics1.awk BEGIN { n1 = 10 n2 = 10 if (n1 > 10 && n2 > 10) { printf "死ぬほど時間がかかるかも知れません" exit } total = combination(n1+n2, n2) u(n1, n2, 0, n1*n2) printf "n1 = %i, n2 = %i のときの U 統計量の分布\n\n", n1, n2 printf "%5s%7s%12s%12s%12s\n", "U", "度数", "確率", "累積1", "累積2" cum2 = 1 for (i = 0; i <= n1*n2; i++) { cp = p[i]/total cum1 += cp printf "%5i%7i%12.7f%12.7f%12.7f\n", i, p[i], cp, cum1, cum2 cum2 -= cp } } function increment(q, s, n, i) { for (i = 0; i <= n; i++) { q[s+i]++ } } function u(n, m, begin, end) { if (n == 1 || m == 1) { increment(p, begin, end-begin) } else { u(n-1, m, begin, begin+(n-1)*m) u(n, m-1, end-n*(m-1), end) } } # n から m (n ≧ m ≧ 0 )を取り出す組合せを求める # 使用例: x = combination(10, 5) function combination(n, m, i, c) { c = 1 k = min(n, n-m) for (i = 1; i <= k; i++) { c *= (n-i+1)/i } return c } # x, y の小さい方を求める # 使用例: x = min(10, 5) function min(x, y) { return (x < y) ? x : y }