============================================================
Fisher's Exact Test(1997/08/31) by khori
============================================================
Delphi(3.0) のプログラミングの習作として作りました。
これは,フィッシャーの正確確率検定(厳密検定とか直接法とかいわれる)をするソフトです。検定部分は一言居士(青木繁伸)さんのawkのアルゴリズムをほぼそのまま使ってます。そのおかげで2×2だけでなく,一般のk×lの分割表まで分析できます。ただし,有効桁数(extended 1.1*10^4932)や計算時間の制限から比較的小さな分割表が分析できる程度です。

nifty 投稿版をマイナーチェンジしています。たとえば,処理終了時に音をならす。

《使用法》
(1)exact_test.exe を起動する
(2)START をクリック
(3)データファイル指定:新規の場合も指定する:最後のOKクリック
(a)新規の場合
(i)列カテゴリーの数を指定(行カテゴリーの数はデータ入力で決める):OKクリック
(ii)データ入力:頻度を入れる:OKクリック(この時点で保存)
(b)既存の場合
( i)データがグリッドにあるから確認。訂正するときはそのセルをクリックする,
  :OKとともに上書き保存(ちょっと危ないけどそういう仕様)
(4)処理結果出力
 (a)保存
(b)同じデータで分析するおときは,(2)のあと(3)で×をクリック
(c)誤差を見込んでカイ2乗値が同じと判断する範囲を決めることができます。
  すでに,1e-15 以上は必要とわかってます。epsilon

《限界》
限界はいっぱいあります。
(1)総数 1754 までしか分析できない。(これは2×2の場合で,それ以外だともっと少ない)
(青木氏のホームページはこのような制限が緩くなっている。)
(2)2×2以外の表では期待値がすべて5より大きい場合は分析しない。
(3)やたら時間がかかる場合は分析できないと思ってきりあげること。
(4)その他

《その他》
このプログラムは,Delphi のお勉強をかねてつくりました。正確確率検定部分は一言居士氏のアルゴリズムを,delphiの基本設計は村上氏のものを参考にしています。あとは,例外処理などをたくさん補足しました。村上氏のプログラムはあくまでプロトタイプなので,例外処理部分はほとんど自分でチェックしていきました。まだ,大きな取り残しがあるかもしれません。ヘルプなどはまだつけることができません。

出力をどこにだすかが悩むところです。このプログラムではmemoを使っています。出力が少ないからです。memo の場合は,32kという制約があります。コンソール出力は手軽ですが,もとに戻れません。RichEditコンポーネントがその点ではよさそうです。しかし,試していません。

 delphi での処理するかについて少しでも参考になれば幸いです。コンソールプログラムにすれば,DOSプログラムと同じですから多くの面倒はなくなります。コンソールプログラムの作り方については塚越一雄「はじめてのDelphi」技術評論社が役立ちます。

バグ等の連絡は hori@ec.kagawa-u.ac.jp まで。

《引用文献・参考文献》
青木繁伸(1995)正確確率検定-Exact test SPSS Exact test 付属
青木繁伸(1997 last modified)Exact test 正確確率検定 http://aoki2.si.gunma-u.ac.jp/exact/exact.html
一言居士(1995)Fisher の正確確率検定の拡張(AWK)nifty:SSPSS/MES/6/62
村上宣寛(1997)やさしいDelphi 日刊工業新聞社
NIFTY/FDELPHI の発言,特に謎の全知師の発言
最近 delphi-ML というメーリングリストをあることを知りました。こちらもいい情報がいっぱいあります。
http://ring.aist.go.jp/archives/public/delphi/

----------------------
下の出力例の最初の例はは上記の青木繁伸さんのマニュアルからデータをとっています。もとはu検定用です。。

出力例の2つめは比較的時間のかかる処理の例です。このデータはadult2.dat にあります。Pentium 166 で1分29秒かかっています。このデータは吉澤正・芳賀敏郎編「多変量解析事例集第2集」日科技連(1997)p111の表示8の表のうち《アダルト〜ヤング》と年代をクロスした表の部分を一部変えたものです(少しヤングとヤングを併合)。もとのクロス表を分析すると,6分半ほどかかりました。

その他付属のデータで遊んでみてください。

《出力例》
ファイル名: C:\Program Files\Borland\Delphi 3\pro\exact1\u.dat
[頻度]
2 2 0
0 1 3

[期待値]
1.00 1.50 1.50
1.00 1.50 1.50
Chi-Square = 5.333
df = 2


[Fisher's Exact test] 97/08/31 16:02:43

両側検定の p値 = 0.2286

与えられた表以上に極端な場合の数 = 128
すべての可能な場合の数 = 560
計算の基礎となる表の数 = 10
epsilon = 1.0E-012

出力終了 97/08/31 16:02:43

ファイル名: C:\Program Files\Borland\Delphi 3\pro\exact1\adult2.dat
[頻度]
42 29 16 5
12 10 8 0
2 3 8 2

[期待値]
37.61 28.20 21.49 4.70
12.26 9.20 7.01 1.53
6.13 4.60 3.50 0.77
Chi-Square = 14.801
df = 6


[Fisher's Exact test] 97/08/31 16:02:59

両側検定の p値 = 0.0216

与えられた表以上に極端な場合の数 = 8.16963114019532032E67
すべての可能な場合の数 = 3.78389284669922368E69
計算の基礎となる表の数 = 1526564
epsilon = 1.0E-012

出力終了 97/08/31 16:04:28