■超幾何関数を用いた確率分布の計算(その7)

 
 日本人には,フランス人のように蝸牛(かたつむり)や食用蛙を上手に料理して美味しく食べるという習慣はありません.逆に,フランス人には日本人のように牛蒡(ごぼう)を食べる習慣はなく,フランス人に牛蒡をごちそうしたところ,木の根っこだと思われたという話があるくらいです.
 
 この書き出しと確率分布には何の関係があるだろうか?と思われたかもしれませんが,本稿では食文化・食習慣の違いについて述べようとしているのではありません.食文化・食習慣のように,決まった習慣がいったん固定化され慣習化すると,なかなか変化することは少ないという喩え話なのです.ところが,・・・
 
===================================
 
 統計検定では,つい最近まで,検定結果をp<0.05のように表すことが一般的だったのですが,いまではp=0.0314のように直接的な確率表現にするほうが大いにもてはやされています.この変化はかなりドラスティックに進行しました.
 
 確かに,p=0.0314のように数値を末位まで明記されると,いかにも正しく計算し細かく練ったかのように見えます.一方,p<0.05はほぼどれくらいかを漠然と示す概算値にしか見えません.したがって,p=0.0314のほうが高度な数学的手法に基づいていると思われるかもしれませんが,意外なことにp=0.0314の方が簡単に計算できるのです.
 
 これらは「数字の魔術」ともいうべき心理的なトリックであって,読者を煙にまくためのしたたかな方法ともいえるのです.その理由を説明しましょう.
 
===================================
 
 検定や推定を行う場合,パーセント点xに対する片側確率c
  F(x)=∫(-∞,x)f(t)dt=c   (下側)
  1-F(x)=∫(x,∞)f(t)dt=c   (上側)
や片側確率cに対するパーセント点x
  F-1(c)=x    (下側)
  F-1(1-c)=x   (上側)
を求めます.前者が累積分布関数F(x)を用いるのに対して,後者では累積分布関数F(x)の逆関数F-1(x)が必要になります.
 
 累積分布関数F(x)はしばしば分布関数とも略されますが,確率変数Xがxよりも小さい値をとる確率P{X<=x}を表す関数として表現され,密度関数f(x)を-∞からxまで積分することによって得られます.
  F(x)=P{X≦x}=∫(-∞,x)f(t)dt
 
 一方,累積分布関数F(x)の逆関数F-1(x)は,逆分布関数,分位点関数あるいは確率表現関数とも呼ばれます.指数分布,ワイブル分布,2重指数分布,コーシー分布,ロジスティック分布などでは逆分布関数が解析的に求められますが,正規分布,χ2分布,t分布,F分布などの主要な確率分布の逆分布関数は解析的には求められません.逆分布関数は一般的に明示的には書き表せないのです.
 
 したがって,
  (1)パーセント点 → 片側確率
の計算は非常に簡便で,統計量Xを分布関数F(x)に代入することによって,p=0.0314のように直接的に片側確率を求めることができるのですが,
  (2)片側確率 → パーセント点
を求めるには,統計数値表を引くか,必要な数値を計算するかいずれかです.
 
 それでは,逆分布関数を使わないでどのようにしてパーセント点を計算しているのかというと,確率計算プログラムでは,
  Fー1(1-α)=x
の計算を,非線形方程式
  F(x)=1-α
を解くことによって代替します.したがって,
  i)逆計算(2)はニュートン法を用いて解くことになりますから結構面倒ですし,計算時間も余計にかかります.
  ii)逆分布関数ではなく分布関数の計算サブルーチンを使うわけですから,有効数字の点でも,(1)より(2)の計算が若干劣ります.
 
 以上より,p<0.05のほうが計算が難易度が高いといえるのです.おわかり頂けたでしょうか?
 
===================================
 
 それでは,なぜこれまでp<0.05のような表現がなされてきたのか,その辺の事情について説明したいと思います.
 
 統計的仮説検定では標本から得られた統計量が仮説とどれくらい乖離すると,仮説を棄却しうるかという境界を設けることになりますが,その際,われわれは2種類の判定ミスを犯します.「仮説が真であるのにそれを棄却する」誤りを第1種の過誤,「仮説が偽であるのにそれを採択する」誤りを第2種の過誤といいます.たとえば,医学統計の場合では,第1種の過誤とは病気の人を健康と判断してしまうこと,第2種の過誤とは健康な人を病気と判断してしまうことに対応します.第1種の過誤確率αは状況を考えて選ばなければなりません.医療診断のように誤りが重大な結果をもたらす場合には第1種の過誤確率αは非常に小さくとる必要があります.
 
 実は,第1種と第2種の過誤のどちらが重要であるかは立場の違いによって変わってきます.生産者と消費者の例をあげてみると,第1種の過誤は生産者にとって好ましくない誤りであることから,生産者危険,また別名をあわて(αwate)者の誤りといい,第1種の過誤確率をαで表します.これに対して,第2種の誤りは製品を購入する消費者側からみて好ましくない誤りであることから消費者危険,別名ぼんやり(βonyari)者の誤りとも呼ばれ,第2種の過誤確率はβで表されます.しかも,これら2タイプの判定ミスは,競合的かつ背反的で,一方を減らすと他方が増えるというトレードオフの関係にあります.これら2つの判定ミスを同時に減少させることはできないわけですが,検定では,「危険率は小さく,検出力は大きく」が要請されます.不幸にもこの2条件は互いに矛盾することになります.
 
 さらに厄介なことに,統計検定ではあらかじめαを決めることはできても,βを決めることは不可能です.そこで,統計検定では妥協策として第1種の過誤を中心としていろいろなルールが設定されています.検定の論理は「背理法」ですから,否定したい仮説をいったん設定し,得られたデータから,確率論的に仮説の矛盾を導こうとするものです.そうでないことを示すためにわざわざ仮定する仮説を帰無仮説,矛盾と見なす確率が有意水準と呼ばれます.
 
 p<0.05のような表現は有意水準をα=0.05としてパーセント点を求め,それを統計量と比較することによって得られます.このように,有意水準を前もって指定しておき,危険率がこの水準を越えない範囲で検出力がなるべく大きくなるように棄却域を定めるようにした検定基準がネイマン・ピアソン基準といわれるものです.すなわち,一定の第1種の過誤確率(有意水準)αについて,第2種の過誤確率(見逃しの危険率)βを最小にするような棄却域の選び方がネイマン・ピアソン基準で,医学統計の問題に再び戻れば,病気の人が健康とみなされる確率(もちろんこの確率はできるだけ小さくしたい)が与えられたとき,健康な人が病気とみなされる確率を最小にする判定基準を求めることに相当します.
 
 以上のような検定論の考え方があって,有意水準αに基づいたp<0.05のような表現,あるいは,検定結果を星(*,**,***)で表現する習慣になっていたのです.「統計解析では,多くの研究者が天文学者と化す.なぜなら,彼らは星がつくつかないで一喜一憂する.」という皮肉がありますが,こうしたあまりありがたくない陰口がささやかれているのも,まんざら理由のないことではないでしょう.
 
 なお,統計的仮説検定に際して,間違った検定法を選ぶ誤りを「第3種の過誤」と呼ぶことがあります.そこには,得られたデータが有意となるような恣意・作為が働くわけで,最近では第1,2種の過誤よりも第3種の過誤の問題が大きくクローズアップされています.
 
===================================
 
  F(α,β,γ:x)=1+αβ/γx+1/2!α(α+1)β(β+1)/γ(γ+1)x^2+1/3!α(α+1)(α+2)β(β+1)(β+2)/γ(γ+1)(γ+2)x^3+・・・
はガウスの超幾何関数と呼ばれ,
  2F1(α,β;γ:x)
で表されます.ガウスの超幾何関数の収束半径は1であり,また,この級数は多くの初等関数,特殊関数(楕円積分など)を含んでいます.
 
 また,ガウスの超幾何微分方程式は3個の確定特異点をもち,それらは0,1,∞にスケール変換することができます.ここで,確定特異点1→∞として,2つの特異点を合流させると,その解として
  F(α;γ:x)=1+α/γx+1/2!α(α+1)/γ(γ+1)x^2+1/3!α(α+1)(α+2)/γ(γ+1)(γ+2)x^3+・・・
が得られます.これはクンマーの合流形超幾何関数と呼ばれ,その収束半径は∞です.合流形超幾何関数は
  1F1(α;γ:x)
と書かれることもあります.合流形超幾何関数はベッセル関数など数理物理に現れるいろいろな特殊関数を含んでいます.
 
 クンマーはガウスの超幾何関数を他の超幾何関数に移す変換,たとえば,
  F(α,β,γ:x)=(1-x)^(γ-αーβ)F(γ−α,γ−β,γ:x)
  F(α,β,γ:x)=(1-x)^(-α)F(α,γ−β,γ:x/(1−x))
などを構成しました.これがクンマーの関数等式と呼ばれるものですが,合流形超幾何関数では,次のようなクンマーの変換が知られています.
  F(α;γ:−x)=exp(−x)F(γ−α;γ:x)
 
 超幾何関数はオイラーによってすでに発見されていたのですが,ガウスはそれをもとに楕円関数論の研究を進めました.そしてクンマー,アーベル,ヤコビらの研究を発展させ代数関数論を完成させたのはリーマンです.超幾何関数論は数学的内容だけでなく,歴史的経緯も学ぶに値するものと考えられています.
 
===================================
 
 さて,このシリーズでは,超幾何関数を用いた確率計算プログラムを紹介してまいりました.片側確率には上側確率と下側確率の2つがありますが,分布によって上側確率を指すときと下側確率を指すときがあり,作る側・使う側双方にとって混乱を引き起こす原因になっていました.累積分布関数は密度関数を-∞からxまで積分することによって得られますから,累積分布関数の観点からみると,下側確率の方が望ましいといえます.そこで,今後,片側確率といえば下側確率を指すものとします.
 
 また,これまでに,
  a)正規分布・χ2分布・t分布・F分布について
      パーセント点 ←→ 片側確率
  b)非心χ2分布・非心t分布・非心F分布について
      パーセント点 ←→ 片側確率
  c)非心χ2分布・非心t分布・非心F分布について
      パーセント点,片側確率 → 非心度
の計算プログラムを書きました.a,bについては(その5)で,cについては(その6)に掲げましたが,今回はこれらを1つにまとめ,オールインワンとしてみました.
 
 以下では,下側確率をP0,正規分布,(非心)t分布,(非心)F分布,(非心)χ2分布の各パーセント点をそれぞれUUN,UUT,UUF,UUX,自由度をDF,非心度をLAMBDAで表し,サブルーチンの呼び出し方を具体的に示しますので,ぜひ参考にしてみて下さい.
 
===================================
 
【プログラム】
 
10000 '
10010 ' ** NORMAL DISTRIBUTION **
10020 '
10030 *NORMAL.PERCENT.HGF:
10040 GOSUB *NORMAL.PERCENT1:UU=UUN
10050 PROB$="N":GOSUB *NEWTON.HGF
10060 UUN=X
10070 RETURN
10080 '
10090 ' ** CHI-SQUARE DISTRIBUTION **
10100 '
10110 *CHI2.PERCENT.HGF:
10120 GOSUB *CHI2.PERCENT1:UU=UUX
10130 PROB$="X":GOSUB *NEWTON.HGF
10140 UUX=X
10150 RETURN
10160 '
10170 ' ** T-DISTRIBUTION **
10180 '
10190 *T.PERCENT.HGF:
10200 GOSUB *T.PERCENT1:UU=UUT
10210 PROB$="T":GOSUB *NEWTON.HGF
10220 UUT=X
10230 RETURN
10240 '
10250 ' ** F-DISTRIBUTION **
10260 '
10270 *F.PERCENT.HGF:
10280 GOSUB *F.PERCENT1:UU=UUF
10290 PROB$="F":GOSUB *NEWTON.HGF
10300 UUF=X
10310 RETURN
10320 '
10330 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
10340 '
10350 *NCHI2.PERCENT.HGF:
10360 GOSUB *NCHI2.PERCENT1:UU=UUX
10370 PROB$="NX":GOSUB *NEWTON.HGF
10380 UUX=X
10390 RETURN
10400 '
10410 ' ** NON-CENTRAL T-DISTRIBUTION **
10420 '
10430 *NT.PERCENT.HGF:
10440 GOSUB *NT.PERCENT1:UU=UUT
10450 PROB$="NT":GOSUB *NEWTON.HGF
10460 UUT=X
10470 RETURN
10480 '
10490 ' ** NON-CENTRAL F-DISTRIBUTION **
10500 '
10510 *NF.PERCENT.HGF:
10520 GOSUB *NF.PERCENT1:UU=UUF
10530 PROB$="NF":GOSUB *NEWTON.HGF
10540 UUF=X
10550 RETURN
10560 '
10570 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
10580 '
10590 *NCHI2.PERCENT.HGF.LAMBDA:
10600 UU=UUX:GOSUB *NCHI2.LAMBDA
10610 PROB$="LX":GOSUB *NEWTON.HGF.LAMBDA
10620 LAMBDA=X
10630 RETURN
10640 '
10650 ' ** NON-CENTRAL T-DISTRIBUTION **
10660 '
10670 *NT.PERCENT.HGF.LAMBDA:
10680 UU=UUT:GOSUB *NT.LAMBDA
10690 PROB$="LT":GOSUB *NEWTON.HGF.LAMBDA
10700 LAMBDA=X
10710 RETURN
10720 '
10730 ' ** NON-CENTRAL F-DISTRIBUTION **
10740 '
10750 *NF.PERCENT.HGF.LAMBDA:
10760 UU=UUF:GOSUB *NF.LAMBDA
10770 PROB$="LF":GOSUB *NEWTON.HGF.LAMBDA
10780 LAMBDA=X
10790 RETURN
10800 '
10810 ' *** ニュートン法 ***
10820 '
10830 *NEWTON.HGF:
10840 EPSL=1E-09
10850 IMAX=50
10860 '
10870 Q0=P0
10880 D0=UU
10890 '
10900 SW=0
10910 ICNT=0
10920 WHILE SW=0
10930  ICNT=ICNT+1:PRINT "*";
10940  IF ICNT>IMAX THEN SW=1
10950  DD=D0:GOSUB 10990:D0=DD
10960 WEND
10970 X=DD
10980 RETURN
10990 '
11000 ' ** 逐次計算 **
11010 '
11020 IF PROB$="N" THEN UUN=D0:GOSUB *NORMAL.PROB.HGF
11030 IF PROB$="X" THEN UUX=D0:GOSUB *CHI2.PROB.HGF
11040 IF PROB$="T" THEN UUT=D0:GOSUB *T.PROB.HGF
11050 IF PROB$="F" THEN UUF=D0:GOSUB *F.PROB.HGF
11060 IF PROB$="NX" THEN UUX=D0:GOSUB *NCHI2.PROB.HGF
11070 IF PROB$="NT" THEN UUT=D0:GOSUB *NT.PROB.HGF
11080 IF PROB$="NF" THEN UUF=D0:GOSUB *NF.PROB.HGF
11090 '
11100 F=P0-Q0:G=P1
11110 '
11120 F2=F:D2=D0
11130 IF F1=0 THEN 11160
11140 GOSUB *BISECTION
11150 'GOSUB *DAMPING
11160 '
11170 H=P2:DI=G*G-F*H*2
11180 IF DI<0 THEN DELTA=-F/G:GOTO 11210
11190 IF G<0 THEN DELTA=F*2/(-G+SQR(DI)) ELSE DELTA=F*2/(-G-SQR(DI))
11200 '
11210 DD=D0+DELTA
11220 '
11230 'EPSL=.00001
11240 IF ABS(DD-D0)<EPSL THEN SW=1
11250 'IF ABS((DD-D0)/D0)<EPSL THEN SW=1
11260 F1=F2:D1=D2
11270 RETURN
11280 '
11290 *BISECTION:
11300 IF SGN(F1)=SGN(F2) THEN RETURN
11310  DD=(D1+D2)/2:' bisection
11320  DD=(F1*D2-F2*D1)/(F1-F2):' regula falsi
11330 RETURN 11220
11340 '
11350 *DAMPING:
11360 IF ABS(F1)>ABS(F2) THEN RETURN
11370  DD=D0-DELTA/2:' damping
11380 RETURN 11220
11390 '
11400 ' *** ニュートン法 ***
11410 '
11420 *NEWTON.HGF.LAMBDA:
11430 EPSL=1E-09
11440 IMAX=50
11450 '
11460 Q0=P0
11470 D0=LAMBDA
11480 '
11490 SW=0
11500 ICNT=0
11510 WHILE SW=0
11520  ICNT=ICNT+1:PRINT "*";
11530  IF ICNT>IMAX THEN SW=1
11540  DD=D0:GOSUB 11580:D0=DD
11550 WEND
11560 X=DD
11570 RETURN
11580 '
11590 ' ** 逐次計算 **
11600 '
11610 IF PROB$="LX" THEN LAMBDA=D0:GOSUB *NCHI2.PROB.HGF.LAMBDA
11620 IF PROB$="LT" THEN LAMBDA=D0:GOSUB *NT.PROB.HGF.LAMBDA
11630 IF PROB$="LF" THEN LAMBDA=D0:GOSUB *NF.PROB.HGF.LAMBDA
11640 '
11650 F=L0-Q0:G=L1
11660 '
11670 F2=F:D2=D0
11680 IF F1=0 THEN 11710
11690 GOSUB *BISECTION.LAMBDA
11700 'GOSUB *DAMPING.LAMBDA
11710 '
11720 H=L2:DI=G*G-F*H*2
11730 IF DI<0 THEN DELTA=-F/G:GOTO 11760
11740 IF G<0 THEN DELTA=F*2/(-G+SQR(DI)) ELSE DELTA=F*2/(-G-SQR(DI))
11750 '
11760 DD=D0+DELTA
11770 '
11780 'EPSL=.00001
11790 IF ABS(DD-D0)<EPSL THEN SW=1
11800 'IF ABS((DD-D0)/D0)<EPSL THEN SW=1
11810 F1=F2:D1=D2
11820 RETURN
11830 '
11840 *BISECTION.LAMBDA:
11850 IF SGN(F1)=SGN(F2) THEN RETURN
11860  DD=(D1+D2)/2:' bisection
11870  DD=(F1*D2-F2*D1)/(F1-F2):' regula falsi
11880 RETURN 11770
11890 '
11900 *DAMPING.LAMBDA:
11910 IF ABS(F1)>ABS(F2) THEN RETURN
11920  DD=D0-DELTA/2:' damping
11930 RETURN 11770
11940 '
11950 ' ** NORMAL DISTRIBUTION **
11960 '
11970 *NORMAL.PROB.HGF:
11980 PI#=3.141592653589732#
11990 A0=1:C0=1.5
12000 A=A0:C=C0
12010 Z=UUN*UUN/2:GOSUB *CONFLUENT.HGF :G1#=G#
12020 P0=.5#+G1#*UUN*EXP(-UUN*UUN/2)/SQR(PI#*2)
12030 '
12040 A=A0:C=C0+1
12050 Z=UUN*UUN/2:'GOSUB *CONFLUENT.HGF :G2#=G#*(A0/C0-1)+G1#
12060 A=A0:B=B0-1:C=C0:G0#=1#
12070 G#=(G1#-G0#)*C0/Z
12080 G2#=G#*(A0/C0-1)+G1#
12090 P10=G1#*(1-UUN*UUN)+G2#*UUN*UUN
12100 P1=P10*EXP(-UUN*UUN/2)/SQR(PI#*2)
12110 '
12120 G3#=G1#*A0/Z-G2#*(C0+Z)/Z
12130 P20=-P10*UUN+G2#*UUN*(1-UUN*UUN)-G1#*UUN*2+G3#*UUN*UUN*UUN+G2#*UUN*2
12140 P2=P20*EXP(-UUN*UUN/2)/SQR(PI#*2)
12150 RETURN
12160 '
12170 ' ** CHI-SQUARE DISTRIBUTION **
12180 '
12190 *CHI2.PROB.HGF:
12200 GOSUB *CHI2.PROB.HGF.SUB
12210 RETURN
12220 '
12230 ' ** CHI-SQUARE DISTRIBUTION **
12240 '
12250 *CHI2.PROB.HGF.SUB:
12260 A0=1:C0=1+DF/2
12270 A=A0:C=C0
12280 Z=UUX/2:GOSUB *CONFLUENT.HGF :G1#=G#
12290 Z=1+DF/2:GOSUB *LOG.GAMMA:G2#=G#
12300 Z=UUX/2
12310 P0=G1#/EXP(G2#)*Z^(DF/2)*EXP(-UUX/2)
12320 '
12330 Z=UUX/2
12340 A=A0-1:C=C0:G0#=1#
12350 G#=(G1#-G0#)*C0/Z
12360 G3#=G#*(A0/C0-1)+G1#
12370 P10=Z^(DF/2)*(DF/2/Z*G1#/2-G1#/2+G3#/2)
12380 P1=P10/EXP(G2#)*EXP(-Z)
12390 '
12400 G4#=G1#*A0/Z-G3#*(C0+Z)/Z
12410 P20=-P10/2+Z^(DF/2)*((DF/2*(DF/2-1)/Z/Z-DF/2/Z)*G1#/4+(DF/2/Z-1)*G3#/4+DF/2/Z*G3#/4+G4#/4)
12420 P2=P20/EXP(G2#)*EXP(-UUX/2)
12430 RETURN
12440 '
12450 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
12460 '
12470 *NCHI2.PROB.HGF:
12480 GOSUB *CHI2.PROB.HGF.SUB
12490 GOSUB *POISSON.MIX.CHI2
12500 RETURN
12510 '
12520 ' *** ポアソン混合 ***
12530 '
12540 *POISSON.MIX.CHI2:
12550 EPSL=1E-09
12560 Z=UUX/2:P0#=P0:P1#=P1:P2#=P2:H1#=G1#
12570 P0#=EXP(-LAMBDA/2)*P0#
12580 P1#=EXP(-LAMBDA/2)*P1#
12590 P2#=EXP(-LAMBDA/2)*P2#
12600 SS#=0:S0#=P0#:S1#=P1#:S2#=P2#
12610 J=1
12620 WHILE ABS((SS#-S0#)/S0#)>EPSL
12630  A=A0:C=C0+J-1
12640  H2#=C/Z*(H1#-1#)
12650  H3#=H2#*(A/C-1)+H1#
12660  H4#=(C+1)/Z*(H2#-1#)*(A/(C+1)-1)+H2#
12670  H5#=H1#*A/Z-H3#*(C+Z)/Z
12680  H6#=H2#*A/Z-H4#*(C+Z)/Z
12690  '
12700  O#=H2#:I#=H1#
12710  P0#=P0#*LAMBDA/2/J/C*O#/I#*Z
12720  '
12730  DFO=DF+J*2:DFI=DF+(J-1)*2
12740  O#=DFO/2/Z*H2#/2-H2#/2+H4#/2
12750  I#=DFI/2/Z*H1#/2-H1#/2+H3#/2
12760  P1#=P1#*LAMBDA/2/J/C*O#/I#*Z
12770  '
12780  DFO=DF+J*2:DFI=DF+(J-1)*2
12790  O#=DFO/2/Z*H2#/2-H2#/2+H4#/2
12800  O#=-O#/2+(DFO/2*(DFO/2-1)/Z/Z-DFO/2/Z)*H2#/4+(DFO/2/Z-1)*H4#/4+DFO/2/Z*H4#/4+H6#/4
12810  I#=DFI/2/Z*H1#/2-H1#/2+H3#/2
12820  I#=-I#/2+(DFI/2*(DFI/2-1)/Z/Z-DFI/2/Z)*H1#/4+(DFI/2/Z-1)*H3#/4+DFI/2/Z*H3#/4+H5#/4
12830  P2#=P2#*LAMBDA/2/J/C*O#/I#*Z
12840  '
12850  H1#=H2#
12860  SS#=S0#
12870  S0#=S0#+P0#
12880  S1#=S1#+P1#
12890  S2#=S2#+P2#
12900  J=J+1
12910 WEND
12920 P0=S0#:P1=S1#:P2=S2#
12930 RETURN
12940 '
12950 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
12960 '
12970 *NCHI2.PROB.HGF.LAMBDA:
12980 GOSUB *CHI2.PROB.HGF.SUB
12990 GOSUB *POISSON.MIX.CHI2.LAMBDA
13000 RETURN
13010 '
13020 ' *** ポアソン混合 ***
13030 '
13040 *POISSON.MIX.CHI2.LAMBDA:
13050 EPSL=1E-09
13060 Z=UUX/2:P0#=P0:H1#=G1#
13070 L0#= EXP(-LAMBDA/2)*P0#
13080 L1#=-EXP(-LAMBDA/2)*P0#/2
13090 L2#= EXP(-LAMBDA/2)*P0#/4
13100 SS#=0:S0#=L0#:S1#=L1#:S2#=L2#
13110 J=1
13120 WHILE ABS((SS#-S0#)/S0#)>EPSL
13130  A=A0:C=C0+J-1
13140  H2#=C/Z*(H1#-1#)
13150  '
13160  O#=H2#:I#=H1#
13170  L0#=L0#*LAMBDA/2/J/C*O#/I#*Z
13180  '
13190  O#=(-.5+J/LAMBDA)*H2#
13200  I#=(-.5+(J-1)/LAMBDA)*H1#
13210  L1#=L1#*LAMBDA/2/J/C*O#/I#*Z
13220  '
13230  O#=((-.5+J/LAMBDA)^2-J/LAMBDA/LAMBDA)*H2#
13240  I#=((-.5+(J-1)/LAMBDA)^2-(J-1)/LAMBDA/LAMBDA)*H1#
13250  L2#=L2#*LAMBDA/2/J/C*O#/I#*Z
13260  '
13270  H1#=H2#
13280  SS#=S0#
13290  S0#=S0#+L0#
13300  S1#=S1#+L1#
13310  S2#=S2#+L2#
13320  J=J+1
13330 WEND
13340 L0=S0#:L1=S1#:L2=S2#
13350 RETURN
13360 '
13370 ' ** T-DISTRIBUTION **
13380 '
13390 *T.PROB.HGF:
13400 DFX=DF/2:DFY=.5:GOSUB *T.PROB.HGF.SUB
13410 P0=P0/2
13420 P0=1-P0
13430 RETURN
13440 '
13450 ' ** T-DISTRIBUTION **
13460 '
13470 *T.PROB.HGF.SUB:
13480 'DFX=DF/2:DFY=.5
13490 A0=DFX+DFY:B0=1:C0=DFX+1
13500 A=A0:B=B0:C=C0
13510 Z=DF/(DF+UUT*UUT):GOSUB *GAUSS.HGF :G1#=G#
13520 P0=G1#/DFX*Z^DFX*(1-Z)^DFY
13530 Z=DFX+DFY:GOSUB *LOG.GAMMA:G2#=G#
13540 Z=DFX  :GOSUB *LOG.GAMMA:G3#=G#
13550 Z=DFY  :GOSUB *LOG.GAMMA:G4#=G#
13560 P0=P0*EXP(G2#-G3#-G4#)
13570 'P0=P0/2
13580 'P0=1-P0
13590 '
13600 Z=DF/(DF+UUT*UUT)
13610 A=A0+1:B=B0-1:C=C0:G0#=1#
13620 G#=-(G1#*(C0-A0-1)+G0#*(B0-C0))/(A0-B0+1)/(1-Z)
13630 G5#=(G#-G1#)*A0/Z
13640 ZZ=-DF*UUT*2/(DF+UUT*UUT)^2
13650 P10=Z^DFX*(1-Z)^DFY*((DFX/Z-DFY/(1-Z))*G1#+G5#)
13660 P1=-P10*ZZ/DFX*EXP(G2#-G3#-G4#)/2
13670 '
13680 A=A0+1:B=B0-1:C=C0:G0#=1#
13690 G6#=-G#*A0*(C0-B0*2+(B0-A0-1)*Z)/Z/(1-Z)-G0#*A0*(B0-C0)/Z/(1-Z)-G5#*C0/Z
13700 ZZZ=-DF*2*(DF-UUT*UUT*3)/(DF+UUT*UUT)^3
13710 P20=P10*ZZZ+Z^DFX*(1-Z)^DFY*(((DFX*(DFX-1)/Z/Z-DFX/Z*DFY/(1-Z)-DFX/Z*DFY/(1-Z)+DFY*(DFY-1)/(1-Z)/(1-Z))*G1#+(DFX/Z-DFY/(1-Z))*G5#+G6#)*ZZ*ZZ)
13720 P2=-P20/DFX*EXP(G2#-G3#-G4#)/2
13730 RETURN
13740 '
13750 ' ** NON-CENTRAL T-DISTRIBUTION **
13760 '
13770 *NT.PROB.HGF:
13780 PI#=3.141592653589732#
13790 UUN=-LAMBDA:GOSUB *NORMAL.PROB.HGF:T00=P0
13800 UUN= LAMBDA:'GOSUB *NORMAL.PROB.HGF
13810 UUN= LAMBDA:TTT=1-P0-.5
13820 '
13830 DFX=DF/2:DFY=.5:GOSUB *T.PROB.HGF.SUB
13840 GOSUB *POISSON.MIX.T1:T10=P0:T11=P1:T12=P2
13850 '
13860 DFX=DF/2:DFY= 1:GOSUB *T.PROB.HGF.SUB
13870 GOSUB *POISSON.MIX.T2:T20=P0:T21=P1:T22=P2
13880 '
13890 IF UUT>0 THEN P0=T00+T10+T20:P1= T11+T21:P2= T12+T22
13900 IF UUT=0 THEN P0=T00  +T20:P1=   T21:P2=   T22
13910 IF UUT<0 THEN P0=T00-T10+T20:P1=-T11+T21:P2=-T12+T22
13920 RETURN
13930 '
13940 ' *** ポアソン混合 ***
13950 '
13960 *POISSON.MIX.T1:
13970 EPSL=1E-09
13980 Z=DF/(DF+UUT*UUT):P0#=P0:P1#=P1:P2#=P2:H1#=G1#
13990 LAMBDA2=LAMBDA*LAMBDA
14000 P0#=EXP(-LAMBDA2/2)*P0#/2
14010 P1#=EXP(-LAMBDA2/2)*P1#/2
14020 P2#=EXP(-LAMBDA2/2)*P2#/2
14030 SS#=0:S0#=P0#:S1#=P1#:S2#=P2#
14040 J=1
14050 WHILE ABS((SS#-S0#)/S0#)>EPSL
14060  A=A0+J-1:B=B0:C=C0
14070  H2#=-((C-A-1)*H1#+(B-C)*1#)/(A-B+1)/(1-Z)
14080  H3#=(H2#-H1#)*A/Z
14090  H4#=(-((C-A-2)*H2#+(B-C)*1#)/(A-B+2)/(1-Z)-H2#)*(A+1)/Z
14100  H5#=-H2#*A*(C-B*2+(B-A-1)*Z)/Z/(1-Z)-1#*A*(B-C)/Z/(1-Z)-H3#*C/Z
14110  H6#=((C-A-2)*H2#+(B-C)*1#)/(A-B+2)/(1-Z)*(A+1)*(C-B*2+(B-A-2)*Z)/Z/(1-Z)-1#*(A+1)*(B-C)/Z/(1-Z)-H4#*C/Z
14120  '
14130  O#=H2#:I#=H1#
14140  P0#=P0#*LAMBDA2/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
14150  '
14160  DFYO=DFY+J:DFYI=DFY+(J-1)
14170  O#=(DFX/Z-DFYO/(1-Z))*H2#+H4#
14180  I#=(DFX/Z-DFYI/(1-Z))*H1#+H3#
14190  P1#=P1#*LAMBDA2/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
14200  '
14210  DFYO=DFY+J:DFYI=DFY+(J-1)
14220  O#=(DFX/Z-DFYO/(1-Z))*H2#+H4#
14230  O#=O#*ZZZ+((DFX*(DFX-1)/Z/Z-DFX/Z*DFYO/(1-Z)-DFX/Z*DFYO/(1-Z)+DFYO*(DFYO-1)/(1-Z)/(1-Z))*H2#+(DFX/Z-DFYO/(1-Z))*H4#+H6#)*ZZ*ZZ
14240  I#=(DFX/Z-DFYI/(1-Z))*H1#+H3#
14250  I#=I#*ZZZ+((DFX*(DFX-1)/Z/Z-DFX/Z*DFYI/(1-Z)-DFX/Z*DFYI/(1-Z)+DFYI*(DFYI-1)/(1-Z)/(1-Z))*H1#+(DFX/Z-DFYI/(1-Z))*H3#+H5#)*ZZ*ZZ
14260  P2#=P2#*LAMBDA2/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
14270  '
14280  H1#=H2#
14290  SS#=S0#
14300  S0#=S0#+P0#
14310  S1#=S1#+P1#
14320  S2#=S2#+P2#
14330  J=J+1
14340 WEND
14350 P0=S0#:P0=.5-P0
14360 P1=S1#:P2=S2#
14370 RETURN
14380 '
14390 ' *** ポアソン混合 ***
14400 '
14410 *POISSON.MIX.T2:
14420 EPSL=1E-09
14430 Z=DF/(DF+UUT*UUT):P0#=P0:P1#=P1:P2#=P2:H1#=G1#
14440 LAMBDA2=LAMBDA*LAMBDA
14450 P0#=EXP(-LAMBDA2/2)*P0#*LAMBDA/SQR(PI#*2)
14460 P1#=EXP(-LAMBDA2/2)*P1#*LAMBDA/SQR(PI#*2)
14470 P2#=EXP(-LAMBDA2/2)*P2#*LAMBDA/SQR(PI#*2)
14480 SS#=0:S0#=P0#:S1#=P1#:S2#=P2#
14490 J=1
14500 WHILE ABS((SS#-S0#)/S0#)>EPSL
14510  A=A0+J-1:B=B0:C=C0
14520  H2#=-((C-A-1)*H1#+(B-C)*1#)/(A-B+1)/(1-Z)
14530  H3#=(H2#-H1#)*A/Z
14540  H4#=(-((C-A-2)*H2#+(B-C)*1#)/(A-B+2)/(1-Z)-H2#)*(A+1)/Z
14550  H5#=-H2#*A*(C-B*2+(B-A-1)*Z)/Z/(1-Z)-1#*A*(B-C)/Z/(1-Z)-H3#*C/Z
14560  H6#=((C-A-2)*H2#+(B-C)*1#)/(A-B+2)/(1-Z)*(A+1)*(C-B*2+(B-A-2)*Z)/Z/(1-Z)-1#*(A+1)*(B-C)/Z/(1-Z)-H4#*C/Z
14570  '
14580  O#=H2#:I#=H1#
14590  P0#=P0#*LAMBDA2/2/(J+.5)*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
14600  '
14610  DFYO=DFY+J:DFYI=DFY+(J-1)
14620  O#=(DFX/Z-DFYO/(1-Z))*H2#+H4#
14630  I#=(DFX/Z-DFYI/(1-Z))*H1#+H3#
14640  P1#=P1#*LAMBDA2/2/(J+.5)*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
14650  '
14660  DFYO=DFY+J:DFYI=DFY+(J-1)
14670  O#=(DFX/Z-DFYO/(1-Z))*H2#+H4#
14680  O#=O#*ZZZ+((DFX*(DFX-1)/Z/Z-DFX/Z*DFYO/(1-Z)-DFX/Z*DFYO/(1-Z)+DFYO*(DFYO-1)/(1-Z)/(1-Z))*H2#+(DFX/Z-DFYO/(1-Z))*H4#+H6#)*ZZ*ZZ
14690  I#=(DFX/Z-DFYI/(1-Z))*H1#+H3#
14700  I#=I#*ZZZ+((DFX*(DFX-1)/Z/Z-DFX/Z*DFYI/(1-Z)-DFX/Z*DFYI/(1-Z)+DFYI*(DFYI-1)/(1-Z)/(1-Z))*H1#+(DFX/Z-DFYI/(1-Z))*H3#+H5#)*ZZ*ZZ
14710  P2#=P2#*LAMBDA2/2/(J+.5)*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
14720  '
14730  H1#=H2#
14740  SS#=S0#
14750  S0#=S0#+P0#
14760  S1#=S1#+P1#
14770  S2#=S2#+P2#
14780  J=J+1
14790 WEND
14800 P0=S0#:P0=TTT-P0
14810 P1=S1#:P2=S2#
14820 RETURN
14830 '
14840 ' ** NON-CENTRAL T-DISTRIBUTION **
14850 '
14860 *NT.PROB.HGF.LAMBDA:
14870 PI#=3.141592653589732#
14880 UUN=-LAMBDA:GOSUB *NORMAL.PROB.HGF:T00=P0
14890 UUN=-LAMBDA:T01=-EXP(-UUN*UUN/2)/SQR(PI#*2)
14900 UUN=-LAMBDA:T02=-EXP(-UUN*UUN/2)/SQR(PI#*2)*UUN
14910 UUN= LAMBDA:'GOSUB *NORMAL.PROB.HGF
14920 UUN= LAMBDA:TTT=1-P0-.5
14930 '
14940 DFX=DF/2:DFY=.5:GOSUB *T.PROB.HGF.SUB
14950 GOSUB *POISSON.MIX.T1.LAMBDA:T10=L0:T11=L1:T12=L2
14960 '
14970 DFX=DF/2:DFY= 1:GOSUB *T.PROB.HGF.SUB
14980 GOSUB *POISSON.MIX.T2.LAMBDA:T20=L0:T21=L1:T22=L2
14990 '
15000 IF UUT>0 THEN L0=T00+T10+T20:L1=T01+T11+T21:L2=T02+T12+T22
15010 IF UUT=0 THEN L0=T00  +T20:L1=T01  +T21:L2=T02  +T22
15020 IF UUT<0 THEN L0=T00-T10+T20:L1=T01-T11+T21:L2=T02-T12+T22
15030 RETURN
15040 '
15050 ' *** ポアソン混合 ***
15060 '
15070 *POISSON.MIX.T1.LAMBDA:
15080 EPSL=1E-09
15090 Z=DF/(DF+UUT*UUT):P0#=P0:H1#=G1#
15100 LAMBDA2=LAMBDA*LAMBDA
15110 L0#= EXP(-LAMBDA2/2)*P0#/2
15120 L1#=-EXP(-LAMBDA2/2)*P0#/2*LAMBDA
15130 L2#= EXP(-LAMBDA2/2)*P0#/2*(LAMBDA2-1)
15140 SS#=0:S0#=L0#:S1#=L1#:S2#=L2#
15150 J=1
15160 WHILE ABS((SS#-S0#)/S0#)>EPSL
15170  A=A0+J-1:B=B0:C=C0
15180  H2#=-((C-A-1)*H1#+(B-C)*1#)/(A-B+1)/(1-Z)
15190  '
15200  O#=H2#:I#=H1#
15210  L0#=L0#*LAMBDA2/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
15220  '
15230  O#=(-LAMBDA+J*2/LAMBDA)*H2#
15240  I#=(-LAMBDA+(J-1)*2/LAMBDA)*H1#
15250  L1#=L1#*LAMBDA2/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
15260  '
15270  O#=((-LAMBDA+J*2/LAMBDA)^2-1-J*2/LAMBDA)*H2#
15280  I#=((-LAMBDA+(J-1)*2/LAMBDA)^2-1-(J-1)*2/LAMBDA/LAMBDA)*H1#
15290  L2#=L2#*LAMBDA2/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
15300  '
15310  H1#=H2#
15320  SS#=S0#
15330  S0#=S0#+L0#
15340  S1#=S1#+L1#
15350  S2#=S2#+L2#
15360  J=J+1
15370 WEND
15380 L0=S0#:L0=.5-L0
15390 L1=S1#:L1=-L1
15400 L2=S2#:L2=-L2
15410 RETURN
15420 '
15430 ' *** ポアソン混合 ***
15440 '
15450 *POISSON.MIX.T2.LAMBDA:
15460 EPSL=1E-09
15470 Z=DF/(DF+UUT*UUT):P0#=P0:H1#=G1#
15480 LAMBDA2=LAMBDA*LAMBDA
15490 L0#= EXP(-LAMBDA2/2)*P0#*LAMBDA/SQR(PI#*2)
15500 L1#=-EXP(-LAMBDA2/2)*P0#*LAMBDA/SQR(PI#*2)*LAMBDA
15510 L2#= EXP(-LAMBDA2/2)*P0#*LAMBDA/SQR(PI#*2)*(LAMBDA2-1)
15520 SS#=0:S0#=L0#:S1#=L1#:S2#=L2#
15530 J=1
15540 WHILE ABS((SS#-S0#)/S0#)>EPSL
15550  A=A0+J-1:B=B0:C=C0
15560  H2#=-((C-A-1)*H1#+(B-C)*1#)/(A-B+1)/(1-Z)
15570  '
15580  O#=H2#:I#=H1#
15590  L0#=L0#*LAMBDA2/2/(J+.5)*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
15600  '
15610  O#=(-LAMBDA+J*2/LAMBDA)*H2#
15620  I#=(-LAMBDA+(J-1)*2/LAMBDA)*H1#
15630  L1#=L1#*LAMBDA2/2/(J+.5)*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
15640  '
15650  O#=((-LAMBDA+J*2/LAMBDA)^2-1-J*2/LAMBDA/LAMBDA)*H2#
15660  I#=((-LAMBDA+(J-1)*2/LAMBDA)^2-1-(J-1)*2/LAMBDA/LAMBDA)*H1#
15670  L2#=L2#*LAMBDA2/2/(J+.5)*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
15680  '
15690  H1#=H2#
15700  SS#=S0#
15710  S0#=S0#+L0#
15720  S1#=S1#+L1#
15730  S2#=S2#+L2#
15740  J=J+1
15750 WEND
15760 L0=S0#:L0=TTT-L0
15770 L1=S1#:L1=-L1
15780 L2=S2#:L2=-L2
15790 RETURN
15800 '
15810 ' ** F-DISTRIBUTION **
15820 '
15830 *F.PROB.HGF:
15840 GOSUB *F.PROB.HGF.SUB
15850 P0=1-P0
15860 RETURN
15870 '
15880 ' ** F-DISTRIBUTION **
15890 '
15900 *F.PROB.HGF.SUB:
15910 DFX=DF2/2:DFY=DF1/2
15920 A0=DFX+DFY:B0=1:C0=DFX+1
15930 A=A0:B=B0:C=C0
15940 Z=DF2/(DF2+DF1*UUF):GOSUB *GAUSS.HGF :G1#=G#
15950 P0=G1#/DFX*Z^DFX*(1-Z)^DFY
15960 Z=DFX+DFY:GOSUB *LOG.GAMMA:G2#=G#
15970 Z=DFX  :GOSUB *LOG.GAMMA:G3#=G#
15980 Z=DFY  :GOSUB *LOG.GAMMA:G4#=G#
15990 P0=P0*EXP(G2#-G3#-G4#)
16000 'P0=1-P0
16010 '
16020 Z=DF2/(DF2+DF1*UUF)
16030 A=A0+1:B=B0-1:C=C0:G0#=1#
16040 G#=-(G1#*(C0-A0-1)+G0#*(B0-C0))/(A0-B0+1)/(1-Z)
16050 G5#=(G#-G1#)*A0/Z
16060 ZZ=-DF2*DF1/(DF2+DF1*UUF)^2
16070 P10=Z^DFX*(1-Z)^DFY*((DFX/Z-DFY/(1-Z))*G1#+G5#)
16080 P1=-P10*ZZ/DFX*EXP(G2#-G3#-G4#)
16090 '
16100 A=A0+1:B=B0-1:C=C0:G0#=1#
16110 G6#=-G#*A0*(C0-B0*2+(B0-A0-1)*Z)/Z/(1-Z)-G0#*A0*(B0-C0)/Z/(1-Z)-G5#*C0/Z
16120 ZZZ=-DF2*DF1*DF1*2/(DF2+DF1*UUF)^3
16130 P20=P10*ZZZ+Z^DFX*(1-Z)^DFY*(((DFX*(DFX-1)/Z/Z-DFX/Z*DFY/(1-Z)-DFX/Z*DFY/(1-Z)+DFY*(DFY-1)/(1-Z)/(1-Z))*G1#+(DFX/Z-DFY/(1-Z))*G5#+G6#)*ZZ*ZZ)
16140 P2=-P20/DFX*EXP(G2#-G3#-G4#)
16150 RETURN
16160 '
16170 ' ** NON-CENTRAL F-DISTRIBUTION **
16180 '
16190 *NF.PROB.HGF:
16200 GOSUB *F.PROB.HGF.SUB
16210 GOSUB *POISSON.MIX.F
16220 RETURN
16230 '
16240 ' *** ポアソン混合 ***
16250 '
16260 *POISSON.MIX.F:
16270 EPSL=1E-09
16280 Z=DF2/(DF2+DF1*UUF):P0#=P0:P1#=P1:P2#=P2:H1#=G1#
16290 P0#=EXP(-LAMBDA/2)*P0#
16300 P1#=EXP(-LAMBDA/2)*P1#
16310 P2#=EXP(-LAMBDA/2)*P2#
16320 SS#=0:S0#=P0#:S1#=P1#:S2#=P2#
16330 J=1
16340 WHILE ABS((SS#-S0#)/S0#)>EPSL
16350  A=A0+J-1:B=B0:C=C0
16360  H2#=-((C-A-1)*H1#+(B-C)*1#)/(A-B+1)/(1-Z)
16370  H3#=(H2#-H1#)*A/Z
16380  H4#=(-((C-A-2)*H2#+(B-C)*1#)/(A-B+2)/(1-Z)-H2#)*(A+1)/Z
16390  H5#=-H2#*A*(C-B*2+(B-A-1)*Z)/Z/(1-Z)-1#*A*(B-C)/Z/(1-Z)-H3#*C/Z
16400  H6#=((C-A-2)*H2#+(B-C)*1#)/(A-B+2)/(1-Z)*(A+1)*(C-B*2+(B-A-2)*Z)/Z/(1-Z)-1#*(A+1)*(B-C)/Z/(1-Z)-H4#*C/Z
16410  '
16420  O#=H2#:I#=H1#
16430  P0#=P0#*LAMBDA/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
16440  '
16450  DFYO=DFY+J:DFYI=DFY+(J-1)
16460  O#=(DFX/Z-DFYO/(1-Z))*H2#+H4#
16470  I#=(DFX/Z-DFYI/(1-Z))*H1#+H3#
16480  P1#=P1#*LAMBDA/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
16490  '
16500  DFYO=DFY+J:DFYI=DFY+(J-1)
16510  O#=(DFX/Z-DFYO/(1-Z))*H2#+H4#
16520  O#=O#*ZZZ+((DFX*(DFX-1)/Z/Z-DFX/Z*DFYO/(1-Z)-DFX/Z*DFYO/(1-Z)+DFYO*(DFYO-1)/(1-Z)/(1-Z))*H2#+(DFX/Z-DFYO/(1-Z))*H4#+H6#)*ZZ*ZZ
16530  I#=(DFX/Z-DFYI/(1-Z))*H1#+H3#
16540  I#=I#*ZZZ+((DFX*(DFX-1)/Z/Z-DFX/Z*DFYI/(1-Z)-DFX/Z*DFYI/(1-Z)+DFYI*(DFYI-1)/(1-Z)/(1-Z))*H1#+(DFX/Z-DFYI/(1-Z))*H3#+H5#)*ZZ*ZZ
16550  P2#=P2#*LAMBDA/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
16560  '
16570  H1#=H2#
16580  SS#=S0#
16590  S0#=S0#+P0#
16600  S1#=S1#+P1#
16610  S2#=S2#+P2#
16620  J=J+1
16630 WEND
16640 P0=S0#:P0=1-P0
16650 P1=S1#:P2=S2#
16660 RETURN
16670 '
16680 ' ** NON-CENTRAL F-DISTRIBUTION **
16690 '
16700 *NF.PROB.HGF.LAMBDA:
16710 GOSUB *F.PROB.HGF.SUB
16720 GOSUB *POISSON.MIX.F.LAMBDA
16730 RETURN
16740 '
16750 ' *** ポアソン混合 ***
16760 '
16770 *POISSON.MIX.F.LAMBDA:
16780 EPSL=1E-09
16790 Z=DF2/(DF2+DF1*UUF):P0#=P0:H1#=G1#
16800 L0#= EXP(-LAMBDA/2)*P0#
16810 L1#=-EXP(-LAMBDA/2)*P0#/2
16820 L2#= EXP(-LAMBDA/2)*P0#/4
16830 SS#=0:S0#=L0#:S1#=L1#:S2#=L2#
16840 J=1
16850 WHILE ABS((SS#-S0#)/S0#)>EPSL
16860  A=A0+J-1:B=B0:C=C0
16870  H2#=-((C-A-1)*H1#+(B-C)*1#)/(A-B+1)/(1-Z)
16880  '
16890  O#=H2#:I#=H1#
16900  L0#=L0#*LAMBDA/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
16910  '
16920  O#=(-.5+J/LAMBDA)*H2#
16930  I#=(-.5+(J-1)/LAMBDA)*H1#
16940  L1#=L1#*LAMBDA/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
16950  '
16960  O#=((-.5+J/LAMBDA)^2-J/LAMBDA/LAMBDA)*H2#
16970  I#=((-.5+(J-1)/LAMBDA)^2-(J-1)/LAMBDA/LAMBDA)*H1#
16980  L2#=L2#*LAMBDA/2/J*(DFX+DFY+J-1)/(DFY+J-1)*O#/I#*(1-Z)
16990  '
17000  H1#=H2#
17010  SS#=S0#
17020  S0#=S0#+L0#
17030  S1#=S1#+L1#
17040  S2#=S2#+L2#
17050  J=J+1
17060 WEND
17070 L0=S0#:L0=1-L0
17080 L1=S1#:L1=-L1
17090 L2=S2#:L2=-L2
17100 RETURN
17110 '
17120 ' *** 合流型超幾何関数 ***
17130 '
17140 *CONFLUENT.HGF:' [Kummer]
17150 EPSL=1E-09
17160 G0#=0:G#=1
17170 T#=1:K=1
17180 WHILE ABS(G0#-G#)>EPSL
17190  T#=T#*A/C*Z/K
17200  G0#=G#
17210  G#=G#+T#
17220  K=K+1
17230  A=A+1
17240  C=C+1
17250 WEND
17260 G=G#
17270 RETURN
17280 '
17290 ' *** ガウス型超幾何関数 ***
17300 '
17310 *GAUSS.HGF:
17320 EPSL=1E-09
17330 G0#=0:G#=1
17340 T#=1:K=1
17350 WHILE ABS(G0#-G#)>EPSL
17360  T#=T#*A*B/C*Z/K
17370  G0#=G#
17380  G#=G#+T#
17390  K=K+1
17400  A=A+1
17410  B=B+1
17420  C=C+1
17430 WEND
17440 G=G#
17450 RETURN
17460 '
17470 ' *** 合流型超幾何関数の連分数展開 ***
17480 '
17490 *CONFLUENT.HGF1:' 1F1(1,c,x)
17500 NZ=50
17510 G#=0
17520 FOR ID=NZ TO 1 STEP -1
17530  EVEN#=ID/(C+2*ID-1)/(C+2*ID-2)
17540  ODD#=-(C+ID-1)/(C+2*ID)/(C+2*ID-1)
17550  G#=ODD#*Z/(1+G#)
17560  G#=EVEN#*Z/(1+G#)
17570 NEXT ID
17580 G#=-Z/C/(1+G#)
17590 G#=1/(1+G#)
17600 RETURN
17610 '
17620 ' *** ガウス型超幾何関数の連分数展開 ***
17630 '
17640 *GAUSS.HGF1:' 2F1(a,1,c,x)
17650 NZ=50
17660 G#=0
17670 FOR ID=NZ TO 1 STEP -1
17680  ODD#=-(A+ID-1)*(C+ID-2)/(C+2*ID-2)/(C+2*ID-3)
17690  EVEN#=-ID*(C-A+ID-1)/(C+2*ID-1)/(C+2*ID-2)
17700  G#=EVEN#*Z/(1+G#)
17710  G#=ODD#*Z/(1+G#)
17720 NEXT ID
17730 G#=1/(1+G#)
17740 RETURN
17750 '
17760 ' *** 対数ガンマ関数 (HASTINGSの多項式近似) ***
17770 '
17780 *LOG.GAMMA:
17790 A1#=-.577191652#
17800 A2#= .988205891#
17810 A3#=-.897056937#
17820 A4#= .918206857#
17830 A5#=-.756704078#
17840 A6#= .482199394#
17850 A7#=-.193527818#
17860 A8#= .035868343#
17870 X=Z:G#=0
17880 IF X<1 THEN G#=-LOG(X):GOTO 17910
17890 WHILE X>2:X=X-1:G#=G#+LOG(X):WEND
17900 X=X-1
17910 G#=G#+LOG(1+X*(A1#+X*(A2#+X*(A3#+X*(A4#+X*(A5#+X*(A6#+X*(A7#+X*A8#))))))))
17920 L.GAMMA=G#
17930 G=G#
17940 RETURN
17950 '
17960 ' ** NORMAL DISTRIBUTION **
17970 '
17980 *NORMAL.PERCENT1:
17990 'P0=1-PP
18000 AA1=2.30753
18010 AA2=.27061
18020 AA3=.99229
18030 AA4=.04481
18040 Q0=.5-ABS(P0-.5)
18050 W=SQR(-2*LOG(Q0))
18060 W1=AA1+AA2*W
18070 W2=1+W*(AA3+W*AA4)
18080 UUN=W-W1/W2
18090 UUN=UUN*SGN(P0-.5)
18100 UU=UUN
18110 RETURN
18120 '
18130 '*NORMAL.PERCENT1:
18140 'P0=1-PP
18150 AA1#=2.515517#
18160 AA2#=.802853#
18170 AA3#=.010328#
18180 AA4#=1.432788#
18190 AA5#=.189269#
18200 AA6#=.001308#
18210 Q0=.5-ABS(P0-.5)
18220 W=SQR(-2*LOG(Q0))
18230 W1=AA1#+W*(AA2#+W*AA3#)
18240 W2=1+W*(AA4#+W*(AA5#+W*AA6#))
18250 UUN=W-W1/W2
18260 UUN=UUN*SGN(P0-.5)
18270 UU=UUN
18280 RETURN
18290 '
18300 ' ** T-DISTRIBUTION **
18310 '
18320 *T.PERCENT1:
18330 GOSUB *NORMAL.PERCENT1
18340 W=UUN*(1+2/(1+8*DF))
18350 UUT=DF*(EXP(W*W/DF)-1)
18360 UUT=SQR(UUT)
18370 UUT=UUT*SGN(P0-.5)
18380 UU=UUT
18390 RETURN
18400 '
18410 ' ** F-DISTRIBUTION **
18420 '
18430 *F.PERCENT1:
18440 IF DF2=1 THEN DF=DF2:P0=1-P0/2:GOSUB *T.PERCENT1                       :UUF=1/UUT^2:P0=(1-P0)*2:RETURN
18450 IF DF2=2 THEN UUF=2/DF1/(P0^(-2/DF1)-1):RETURN
18460 FSW=0
18470 IF P0<.5 THEN P0=1-P0:SWAP DF1,DF2:FSW=1
18480 GOSUB *NORMAL.PERCENT1
18490 IF DF2<=3 THEN U=UUN/(DF2^(3/4))                               :UUN=UUN*(1.1581-.2296*U+.0042*U*U+.0027*U*U*U)
18500 AA1=2/(9*DF1)
18510 AA2=2/(9*DF2)
18520 W=UUN*UUN
18530 W1=1+AA2*(AA2-W-2)
18540 W2=AA1+AA2-AA1*AA2-1
18550 W3=1+AA1*(AA1-W-2)
18560 W4=SQR(W2*W2-W1*W3)
18570 UUF=(W4-W2)/W1
18580 UUF=UUF^3
18590 IF FSW=1 THEN UUF=1/UUF:P0=1-P0:SWAP DF1,DF2:FSW=0
18600 UU=UUF
18610 RETURN
18620 '
18630 ' ** CHI-SQUARE DISTRIBUTION **
18640 '
18650 *CHI2.PERCENT1:
18660 GOSUB *NORMAL.PERCENT1
18670 AA1=2/(9*DF)
18680 W=1-AA1+UUN*SQR(AA1)
18690 UUX=DF*(W^3)
18700 UU=UUX
18710 RETURN
18720 '
18730 ' ** NORMAL DISTRIBUTION **
18740 '
18750 *NORMAL.PROB:
18760 AA1=.196854
18770 AA2=.115194
18780 AA3=.000344
18790 AA4=.019527
18800 W=ABS(UUN)
18810 P0=1+W*(AA1+W*(AA2+W*(AA3+W*AA4)))
18820 P0=P0^4
18830 P0=1-.5/P0
18840 P0=.5+(P0-.5)*SGN(UUN)
18850 PP=1-P0
18860 RETURN
18870 '
18880 ' ** T-DISTRIBUTION **
18890 '
18900 *T.PROB:
18910 W1=(1-2/(3+8*DF))
18920 W2=DF*LOG(UUT*UUT/DF+1)
18930 UUN=W1*SQR(W2)
18940 GOSUB *NORMAL.PROB
18950 PP=1-P0
18960 RETURN
18970 '
18980 ' ** F-DISTRIBUTION **
18990 '
19000 *F.PROB:
19010 FSW=0
19020 IF UUF=0 THEN P0=0:GOTO 19130
19030 IF UUF<1 THEN UUF=1/UUF:SWAP DF1,DF2:FSW=1
19040 AA1=2/(9*DF1)
19050 AA2=2/(9*DF2)
19060 W=UUF^(1/3)
19070 W1=W+AA1-W*AA2-1
19080 W2=AA2*W*W+AA1
19090 UUN=W1/SQR(W2)
19100 IF DF2<=3 THEN UUN=UUN*(1+.08*(UUN^4)/(DF2^3))
19110 GOSUB *NORMAL.PROB
19120 IF FSW=1 THEN P0=1-P0:SWAP DF1,DF2:FSW=0
19130 PP=1-P0
19140 RETURN
19150 '
19160 ' ** CHI-SQUARE DISTRIBUTION **
19170 '
19180 *CHI2.PROB:
19190 AA1=2/(9*DF)
19200 AA2=UUX/DF
19210 W=AA2^(1/3)
19220 W1=W+AA1-1
19230 UUN=W1/SQR(AA1)
19240 GOSUB *NORMAL.PROB
19250 PP=1-P0
19260 RETURN
19270 '
19280 ' ** NON-CENTRAL T-DISTRIBUTION **
19290 '
19300 *NT.PERCENT1:
19310 GOSUB *NORMAL.PERCENT1
19320 D=1-1/DF/4+1/DF/DF/32
19330 AA1=D*D
19340 AA2=D*D-UUN*UUN*(1-D*D)
19350 AA3=LAMBDA*SQR(AA1)+SGN(UUN)*SQR(LAMBDA*LAMBDA*AA1-(LAMBDA*LAMBDA-UUN*UUN)*AA2)
19360 UUT=AA3/AA2
19370 UU=UUT
19380 RETURN
19390 '
19400 '*NT.PERCENT1:
19410 GOSUB *NORMAL.PERCENT1
19420 AA1=1-1/DF/2
19430 AA2=1-1/DF/2-UUN*UUN/DF/2
19440 AA3=LAMBDA*SQR(AA1)+SGN(UUN)*SQR(LAMBDA*LAMBDA*AA1-(LAMBDA*LAMBDA-UUN*UUN)*AA2)
19450 UUT=AA3/AA2
19460 UU=UUT
19470 RETURN
19480 '
19490 ' ** NON-CENTRAL F-DISTRIBUTION **
19500 '
19510 *NF.PERCENT1:
19520 DF0=DF1
19530 DF1=DF0+LAMBDA*LAMBDA/(DF0+LAMBDA*2)
19540 C=1+LAMBDA/DF0
19550 '
19560 GOSUB *F.PERCENT1
19570 UUF=C*UUF
19580 UU=UUF:DF1=DF0
19590 RETURN
19600 '
19610 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
19620 '
19630 *NCHI2.PERCENT1:
19640 DF0=DF
19650 DF=DF0+LAMBDA*LAMBDA/(DF0+LAMBDA*2)
19660 '
19670 GOSUB *NORMAL.PERCENT1
19680 AA1=2/(9*DF)
19690 W=1-AA1+UUN*SQR(AA1)
19700 UUX=(DF0+LAMBDA)*(W^3)
19710 UU=UUX:DF=DF0
19720 RETURN
19730 '
19740 '*NCHI2.PERCENT1:
19750 DF0=DF
19760 DF=DF0+LAMBDA*LAMBDA/(DF0+LAMBDA*2)
19770 C=1+LAMBDA/(DF0+LAMBDA)
19780 '
19790 GOSUB *CHI2.PERCENT1
19800 AA1=LAMBDA*LAMBDA/(DF0+LAMBDA*2)^2/(DF+2)/(DF+4)*DF/3
19810 AA2=AA1*(DF+4)*2
19820 AA3=AA1*(DF+2)*(DF+4)
19830 UUX=C*UUX*(1-UUX*UUX*AA1+UUX*AA2-AA3)
19840 UU=UUX:DF=DF0
19850 RETURN
19860 '
19870 ' ** NON-CENTRAL T-DISTRIBUTION **
19880 '
19890 *NT.PROB:
19900 D=1-1/DF/4+1/DF/DF/32
19910 AA1=LAMBDA-UUT*D
19920 AA2=SQR(1+UUT*UUT*(1-D*D))
19930 UUN=AA1/AA2
19940 GOSUB *NORMAL.PROB
19950 P0=1-P0
19960 RETURN
19970 '
19980 '*NT.PROB:
19990 AA1=LAMBDA-UUT*SQR(1-1/DF/2)
20000 AA2=SQR(1+UUT*UUT/DF/2)
20010 UUN=AA1/AA2
20020 GOSUB *NORMAL.PROB
20030 P0=1-P0
20040 RETURN
20050 '
20060 ' ** NON-CENTRAL F-DISTRIBUTION **
20070 '
20080 *NF.PROB:
20090 AA1=DF1*(UUF-1)-LAMBDA+1
20100 AA2=SQR((DF1*UUF*(1+DF1/DF2*UUF)+LAMBDA)*2)
20110 UUN=AA1/AA2
20120 GOSUB *NORMAL.PROB
20130 RETURN
20140 '
20150 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
20160 '
20170 *NCHI2.PROB:
20180 AA1=UUX-LAMBDA-DF+1
20190 AA2=SQR((UUX+LAMBDA)*2)
20200 UUN=AA1/AA2
20210 GOSUB *NORMAL.PROB
20220 RETURN
20230 '
20240 ' ** NON-CENTRAL T-DISTRIBUTION **
20250 '
20260 *NT.LAMBDA:
20270 GOSUB *NORMAL.PERCENT1
20280 D=1-1/DF/4+1/DF/DF/32
20290 AA2=SQR(1+UUT*UUT*(1-D*D))
20300 LAMBDA=-AA2*UUN+UUT*D
20310 RETURN
20320 '
20330 ' ** NON-CENTRAL F-DISTRIBUTION **
20340 '
20350 *NF.LAMBDA:
20360 GOSUB *NORMAL.PERCENT1
20370 AA1=DF1*(UUF-1)+1+UUN*UUN
20380 AA2=(DF1*(UUF-1)+1)^2-DF1*UUF*(1+DF1/DF2*UUF)*UUN*UUN*2
20390 DI=AA1*AA1-AA2
20400 LAMBDA=AA1-SGN(UUN)*SQR(DI)
20410 RETURN
20420 '
20430 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
20440 '
20450 *NCHI2.LAMBDA:
20460 GOSUB *NORMAL.PERCENT1
20470 AA1=UUX-DF+1+UUN*UUN
20480 AA2=(UUX-DF+1)^2-UUX*UUN*UUN*2
20490 DI=AA1*AA1-AA2
20500 LAMBDA=AA1-SGN(UUN)*SQR(DI)
20510 RETURN
 
 このプログラムは超幾何関数のベキ級数展開版として設定してあります.しかし,連分数展開のほうがよいとする意見もありますから,連分数展開版として使いたい場合は,
  a)gosub *confluent.hgf → gosub *confluent.hgf1
  b)gosub *gauss.hgf → gosub *gauss.hgf1
と変更してみて下さい.
 
===================================
 
【計算例】
 
(1)正規分布の上側確率の計算精度
 
100 FOR I=1 TO 8
110 UUN=.5*I:PRINT UUN;
120 GOSUB *NORMAL.PROB  :PRINT 1-P0;
130 GOSUB *NORMAL.PROB.HGF:PRINT 1-P0
140 NEXT I
 
%点      近似値       計算値       数値表
.5      .308305      .308538       .30854
1       .158876      .158655       .15866
1.5      .0667298      .0668072      .066807
2       .022563      .0227501      .022750
2.5      6.33812E-03    6.20961E-03     6.2097E-3
3       1.57917E-03    1.34981E-03     1.3499E-3
3.5      3.74436E-04    2.32518E-04     2.3263E-4
4       8.92282E-05    3.15905E-05     3.1671E-5
 
(2)正規分布の%点の計算精度
 
100 FOR I=0 TO 7
110 P0=.6+.05*I:PRINT 1-P0;
120 GOSUB *NORMAL.PERCENT1  :PRINT UUN;
130 GOSUB *NORMAL.PERCENT.HGF:PRINT UUN
140 NEXT I
 
上側確率    近似値       計算値       数値表
.4      .251292      .253347       .25335
.35      .382773      .385321       .38532
.3      .521632      .524401       .52440
.25      .671731      .67449       .67449
.2      .839084      .841621       .84162
.15      1.03433      1.03643       1.03643
.1      1.28013      1.28155       1.28155
.05      1.64449      1.64485       1.64485
 
(3)χ2分布の上側5%点の計算精度(小数自由度)
 
100 P0=.95
110 FOR I=0 TO 9
120 DF=.5+.5*I:PRINT DF;
130 GOSUB *CHI2.PERCENT1  :PRINT UUX;
140 GOSUB *CHI2.PERCENT.HGF:PRINT UUX
150 NEXT I
 
自由度     近似値       計算値       数値表
.5      2.25376      2.42024       2.420
1       3.74553      3.84146       3.841
1.5      4.91033      4.98018       4.980
2       5.93538      5.99146       5.991
2.5      6.88066      6.92808
3       7.77333      7.81473       7.815
3.5      8.6282       8.66512
4       9.45426      9.48775       9.488
4.5      10.2575      10.2882
5       11.042       11.0705       11.07
 
(4)t分布の上側5%点の計算精度(小数自由度)
 
100 P0=.95
110 FOR I=0 TO 9
120 DF=.5+.5*I:PRINT DF;
130 GOSUB *T.PERCENT1  :PRINT UUT;
140 GOSUB *T.PERCENT.HGF:PRINT UUT
150 NEXT I
 
自由度     近似値       計算値       数値表
.5      141.733      41.1359       41.136
1       7.47108      6.31375       6.314
1.5      3.87814      3.70518       3.705
2       2.97131      2.91998       2.920
2.5      2.579       2.55822
3       2.36335      2.35336       2.353
3.5      2.22775      2.22243
4       2.13485      2.13185       2.132
4.5      2.06732      2.06558
5       2.01606      2.01505       2.015
 
 ウェルチのt検定や広津の累積χ2検定等では,小数付き自由度での片側確率・パーセント点を求める必要がありますが,このプログラムは高精度でしかも小数付き自由度でも使えることがわかります.
 
(5)F分布の上側5%点の計算精度
 
100 P0=.95:DF1=1
110 FOR I=1 TO 10
120 DF2=I:PRINT DF2;
130 GOSUB *F.PERCENT1  :PRINT UUF;
140 GOSUB *F.PERCENT.HGF:PRINT UUF
150 NEXT I
 
自由度     近似値       計算値       数値表
1,1      173.465      161.447       161.448
1,2      18.5128      18.5128       18.513
1,3      10.3612      10.128       10.128
1,4      7.73857      7.70864       7.709
1,5      6.56025      6.60788       6.608
1,6      5.91347      5.98737       5.987
1,7      5.50648      5.59144       5.591
1,8      5.22734      5.31765       5.318
1,9      5.02419      5.11735       5.117
1,10     4.86983      4.9646       4.965
 
(6)非心χ2分布の上側5%点の計算精度
 
100 P0=.95:DF=2:LAMBDA=1 :GOSUB *NCHI2.P
110 P0=.95:DF=2:LAMBDA=4 :GOSUB *NCHI2.P
120 P0=.95:DF=2:LAMBMA=16:GOSUB *NCHI2.P
130 P0=.95:DF=4:LAMBDA=1 :GOSUB *NCHI2.P
140 P0=.95:DF=4:LAMBDA=4 :GOSUB *NCHI2.P
150 P0=.95:DF=4:LAMBDA=16:GOSUB *NCHI2.P
160 P0=.95:DF=7:LAMBDA=1 :GOSUB *NCHI2.P
170 P0=.95:DF=7:LAMBDA=4 :GOSUB *NCHI2.P
180 P0=.95:DF=7:LAMBDA=16:GOSUB *NCHI2.P
 
900 *NCHI2.P:
910 PRINT DF;LAMBDA;
920 GOSUB *NCHI2.PERCENT1  :PRINT UUX;
930 GOSUB *NCHI2.PERCENT.HGF:PRINT UUX
940 RETURN
 
ν,λ     近似値       収束値       数値表
 
2,1      8.5545       8.6422       8.642
2,4      14.6591      14.6402       14.641
2,16     33.3167      33.0541       33.054
4,1      11.6691      11.7072       11.707
4,4      17.3343      17.3093       17.309
4,16     35.6571      35.427       35.427
7,1      15.9824      16.0039       16.003
7,4      21.248       21.2281       21.228
7,16     39.1613      38.9701       38.970
 
(7)非心χ2分布の上側5%点における非心度の計算精度
 
100 P0=.95:DF=2:UUX=8.642 :GOSUB *NCHI2.L
110 P0=.95:DF=2:UUX=14.641:GOSUB *NCHI2.L
120 P0=.95:DF=2:UUX=33.054:GOSUB *NCHI2.L
130 P0=.95:DF=4:UUX=11.707:GOSUB *NCHI2.L
140 P0=.95:DF=4:UUX=17.309:GOSUB *NCHI2.L
150 P0=.95:DF=4:UUX=35.427:GOSUB *NCHI2.L
160 P0=.95:DF=7:UUX=16.003:GOSUB *NCHI2.L
170 P0=.95:DF=7:UUX=21.228:GOSUB *NCHI2.L
180 P0=.95:DF=7:UUX=38.97 :GOSUB *NCHI2.L
 
900 *NCHI2.L:
910 PRINT DF;UUX;
920 GOSUB *NCHI2.LAMBDA      :PRINT LAMBDA;
930 GOSUB *NCHI2.PERCENT.HGF.LAMBDA:PRINT LAMBDA
940 RETURN
 
ν,x     近似値       収束値       数値表
2,8.642    .579627      .999915       1
2,14.641   3.68508      4.00045       4
2,33.054   15.7988      15.9998       16
4,11.707   .561153      .999903       1
4,17.309   3.65947      3.99982       4
4,35.427   15.7841      16         16
7,16.003   .542962      .999557       1
7,21.228   3.63223      4.00003       4
7,38.97    15.7641      16         16
 
 非心分布の分布関数をF(x,ν,λ)とすると,Fはもちろんxの増加関数ですが,xを固定したとき,分布関数Fは非心度λの減少関数になります.ところが,非心度を求める(7)の計算は異常値に収束したり,発散したりで惨憺たる結果となりました.初期値を求めるサブルーチンに難があることがわかったので,今回のプログラムではその部分を修正してあります.いまもなお未発見のバグがあるかと思われますが,今後の課題としておきます.
 
===================================