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

【はじめに】
 
 統計解析では,特定の確率分布において,確率変数がある値以上または以下の値をとる確率(片側確率)と逆に片側確率を与えたときに対応する確率変数の値(パーセント点)を計算する必要が生じます.
 
 一昔前までは,これらの値を求めるのに統計数値表をひくことが必要になり,検定や推定は大変手間のかかる作業でしたし,数表が利用できないときはまったくお手上げ状態でした.現在では,統計プログラムがこの作業を肩代わりしてくれるので,検定・推定は大変身近なものになっています.
 
 ところで,統計プログラムでは,統計数値表をパソコンに記憶させておいて,片側確率やパーセント点を求めているわけではありません.統計数値表をパソコンに記憶させておいて使う方法は非常に多くの数値をデータとして格納しなければならず,メモリを占有するだけでなくプログラムが大きくなりすぎて実用的ではないからです.
 
 正規分布・t分布・F分布・χ2分布では,片側確率やそのパーセント点を計算する簡便さと適当な精度をもつ近似関数が Hastings, Wallace, Paulson, Wilson-Hilferty などにより求められています.これらの近似関数を利用して計算に必要な数値はすべてプログラム内部で求めるようにできればわざわざ数表を引く必要がなくなり大変便利ですし,手間もかからず効率的に片側確率とパーセント点の値を得ることができます.近似式とはいっても,相対誤差は%オーダーですから,実用的には十分な有効数字があります.実際,これらの近似式は有意性の判定等に利用されていて,多くの場合,近似式で所期の目的を十分に達成することができます.
 
 ところが,近似式を使って必要な数値を計算する方法には欠点があります.t分布・F分布・χ2分布では,任意の自由度の全範囲にわたってよい精度を保証してくれる近似式はないのです.多くの統計計算パッケージでは,パーセント点の計算に関して,近似式を採用していますが,一般的にいって,近似式では,自由度νの小さいところでt(ν,α),自由度ν2の小さいところでF(ν1,ν2,α)の誤差がかなり大きいのですが,たとえば,後述する Wallace のアルゴリズムは4よりも小さい自由度に関しては信頼できません.統計解析ではあまり使わないところですから,実用上ほとんど問題ないといって妥協したくはありません.
 
 一方,片側確率の計算に関しては,部分積分によって求められた展開式に基づいて正確な値が得られるアルゴリズムを,多くの統計計算パッケージが採用しています.厳密な級数を足し上げる方法ですから,誤差は演算誤差だけになります.それらは,計算精度のみならず計算速度の点でも満足のゆくものですが,今度は逆に整数自由度でないと使えないという欠点が生じます.
 
 ウェルチのt検定や広津の累積χ2検定等では小数付き自由度での片側確率・パーセント点を求める必要がありますが,その場合,整数自由度で求めた2つの片側確率・パーセント点より,補間で求めることが必要になり,結構面倒ですし,なによりせっかくの精度が台なしです.そのため,小生は,精度よりも小数付き自由度でも使えるという条件を優先させて,これまで近似式のほうを好んで用いてきました.
 
 小数付き自由度の有意点について,自由度が大きければ Hastings, Wallace, Paulson, Wilson-Hilferty などの近似式で求めればよいのですが,自由度が小さい場合,正確な値が得られません.そこで,今回のコラムでは,整数・小数任意の自由度で,かつ,正確な値を保証してくれる超幾何関数を用いた確率分布の計算プログラムを取り上げてみることにします.
 
===================================
【確率分布の近似】
 
 答えを正確に求めることが可能ならばそれはすばらしいことですが,しかし,ときには近似のほうが適切な場合があり,その答えについてある程度のことが知りたいとき,完全なものにこだわる必要はありません.
 
 そこで,まず,近似式を使って,片側確率からそのパーセント点を求めるプログラムとその逆関数,すなわち,パーセント点を与えて片側確率を求めるプログラムを紹介します.以下では,下側確率をP0,上側確率をPP,正規分布,t分布,F分布,χ2分布の各パーセント点をそれぞれUUN,UUT,UUF,UUX,自由度をDFで表しています.
 
(1)正規分布の片側確率
 
a)ラプラスやシェントンによる連分数展開式
 正規分布の確率密度関数の指数部分ををテイラー展開して積分すると片側確率の漸近展開式が得られますが,収束が遅く,計算式としてはあまり実用的ではありません.その点,ラプラスやシェントンによる連分数展開式は収束が速くかつ精度も高い式といえましょう.
 
1000 '
1010 ' ** NORMAL DISTRIBUTION **
1020 '
1030 *NORMAL.PROB1:
1040 PI=3.14159
1050 AZ=ABS(UUN)
1060 ZZ=AZ*AZ
1070 PZ=EXP(-ZZ/2)/SQR(PI*2)
1080 NZ=7:ID=NZ:SN=1
1090 IF AZ<2 THEN GOSUB *SHENTON ELSE GOSUB *LAPLACE
1100 IF UUN<0 THEN PP=1-PP
1110 RETURN
1120 '
1130 *SHENTON:
1140 PP=0
1150 FOR IZ=1 TO NZ
1160  PP=ID*ZZ/(2*ID+1+SN*PP)
1170  SN=-SN:ID=ID-1
1180 NEXT IZ
1190 PP=.5-PZ*AZ/(1-PP)
1200 RETURN
1210 '
1220 *LAPLACE:
1230 PP=0
1240 FOR IZ=1 TO NZ
1250  PP=ID/(AZ+PP)
1260  ID=ID-1
1270 NEXT IZ
1280 PP=PZ/(AZ+PP)
1290 RETURN
 
 シェントンの連分数展開式はuunの小さいところで収束がよく,ラプラスの連分数展開式はuunの大きいところで収束がよいので,両式を使い分ける境界値はuun=2としています(1090行).
 
b)ヘイスティングスの近似式(1)
 正規分布の片側確率を求めるための近似式は多数提案されていますが,なかでもヘイスティングスの近似式はよく知られています.
 
1300 '
1310 ' ** NORMAL DISTRIBUTION **
1320 '
1330 *NORMAL.PROB:
1340 AA1=.196854
1350 AA2=.115194
1360 AA3=.000344
1370 AA4=.019527
1380 W=ABS(UUN)
1390 P0=1+W*(AA1+W*(AA2+W*(AA3+W*AA4)))
1400 P0=P0^4
1410 P0=1-.5/P0
1420 P0=.5+(P0-.5)*SGN(UUN)
1430 PP=1-P0
1440 RETURN
 
c)ヘイスティングスの近似式(2)
 ヘイスティングスの近似式と呼ばれるものには,もっと精度の良い関数近似もあります.
 
1450 '
1460 ' ** NORMAL DISTRIBUTION **
1470 '
1480 *NORMAL.PROB2:
1490 AA1=.049867347#
1500 AA2=.0211410061#
1510 AA3=.0032776263#
1520 AA4=3.80036E-05
1530 AA5=4.88906E-05
1540 AA6=5.383E-06
1550 W=ABS(UUN)
1560 P0=1+W*(AA1+W*(AA2+W*(AA3+W*(AA4+W*(AA5+W*AA6)))))
1570 P0=P0^16
1580 P0=1-.5/P0
1590 P0=.5+(P0-.5)*SGN(UUN)
1600 PP=1-P0
1610 RETURN
 
(2)正規分布のパーセント点
 
a)ヘイスティングスの近似式(1)
 
1620 '
1630 ' ** NORMAL DISTRIBUTION **
1640 '
1650 *NORMAL.PERCENT1:
1660 'P0=1-PP
1670 AA1=2.30753
1680 AA2=.27061
1690 AA3=.99229
1700 AA4=.04481
1710 Q0=.5-ABS(P0-.5)
1720 W=SQR(-2*LOG(Q0))
1730 W1=AA1+AA2*W
1740 W2=1+W*(AA3+W*AA4)
1750 UUN=W-W1/W2
1760 UUN=UUN*SGN(P0-.5)
1770 UU=UUN
1780 RETURN
 
b)ヘイスティングスの近似式(2)
 
1790 '
1800 ' ** NORMAL DISTRIBUTION **
1810 '
1820 '*NORMAL.PERCENT1:
1830 'P0=1-PP
1840 AA1#=2.515517#
1850 AA2#=.802853#
1860 AA3#=.010328#
1870 AA4#=1.432788#
1880 AA5#=.189269#
1890 AA6#=.001308#
1900 Q0=.5-ABS(P0-.5)
1910 W=SQR(-2*LOG(Q0))
1920 W1=AA1#+W*(AA2#+W*AA3#)
1930 W2=1+W*(AA4#+W*(AA5#+W*AA6#))
1940 UUN=W-W1/W2
1950 UUN=UUN*SGN(P0-.5)
1960 UU=UUN
1970 RETURN
 
c)山内(二郎)の近似式
 
1980 '
1990 ' ** NORMAL DISTRIBUTION **
2000 '
2010 *NORMAL.PERCENT:
2020 XXX=-LOG(4*PP*(1-PP))
2030 UUN=SQR(XXX*(2.0611786#-5.7262204#/(XXX+11.640595#)))
2040 IF PP>.5 THEN UUN=-UUN
2050 RETURN
 
d)戸田(英雄)の近似式
 
2060 '
2070 ' ** NORMAL DISTRIBUTION **
2080 '
2090 *NORMAL.PERCENT2:
2100 AA1=1.570796288#
2110 AA2=.03706987906#
2120 AA3=-.0008364353589#
2130 AA4=-.0002250947176#
2140 AA5=.000006841218299#
2150 AA6=.000005824238515#
2160 AA7=-.00000104527497#
2170 AA8=.00000008360937017#
2180 AA9=-3.231081277D-09
2190 W=-LOG(4*PP*(1-PP))
2200 W=W*(AA1+W*(AA2+W*(AA3+W*(AA4+W*(AA5+W*(AA6+W*(AA7+W*(AA8+W*AA9))))))))
2210 UUN=SQR(W)
2220 IF PP>.5 THEN UUN=-UUN
2230 RETURN
 
(3)χ2分布(任意自由度)の片側確率
 χ2分布の密度関数はガンマ関数を,分布関数は不完全ガンマ関数を含んでいます.ガンマ関数は階乗に密接な関係があり,引数が整数や半整数ならば,近似解ではなくて,解析的な解を得ることができますが,任意の自由度では,部分積分による正確なアルゴリズムは使えません.
 
 自由度νをもったχ2について,Wilson-Hilferty は(χ2/ν)^(1/3)が,平均値(1-2/9ν),分散2/9νの正規分布で近似できることを示しました.この近似はF分布についての近似値を導くのにも応用されますが,ここでは,Wilson-Hilferty 近似に基づくアルゴリズムを紹介します.
 
a)Wilson-Hilferty の近似式
 
3000 '
3010 ' ** CHI-SQUARE DISTRIBUTION **
3020 '
3030 *CHI2.PROB:
3040 AA1=2/(9*DF)
3050 AA2=UUX/DF
3060 W=AA2^(1/3)
3070 W1=W+AA1-1
3080 UUN=W1/SQR(AA1)
3090 GOSUB *NORMAL.PROB
3100 PP=1-P0
3110 RETURN
 
(4)χ2分布(任意自由度)のパーセント点
 
a)Wilson-Hilfertyの近似式(1)
 
3120 '
3130 ' ** CHI-SQUARE DISTRIBUTION **
3140 '
3150 *CHI2.PERCENT1:
3160 GOSUB *NORMAL.PERCENT1
3170 AA1=2/(9*DF)
3180 W=1-AA1+UUN*SQR(AA1)
3190 UUX=DF*(W^3)
3200 UU=UUX
3210 RETURN
 
b)Wilson-Hilfertyの近似式(2)
 自由度1のときは,
  χ2(1,α)={u(α/2)}^2
 自由度2のときは,
  χ2(2,α)=−2logα
で求められるので,次のプログラムでは,自由度が3以上のときにのみ Wilson-Hilferty 近似しています.
 
3220 '
3230 ' ** CHI-SQUARE DISTRIBUTION **
3240 '
3250 *CHI2.PERCENT:
3260 IF DF=1 THEN PP=PP/2:GOSUB *NORMAL.PERCENT                    :UUX=UUN*UUN:PP=PP*2:RETURN
3270 IF DF=2 THEN UUX=-2*LOG(PP):RETURN
3280 GOSUB *NORMAL.PERCENT
3290 UUN=ABS(UUN)
3300 UUX=2/(9*DF)
3310 UUX=1-UUX+UUN*SQR(UUX)
3320 UUX=UUX^3*DF
3330 RETURN
 
(5)t分布(任意自由度)の片側確率
 t分布の場合も,正確な片側確率を求めるアルゴリズムは部分積分から作成できるのですが,小数付き自由度では使えないという欠点があります.そこで,Wallace は任意自由度で使える次の変換と逆変換を提案しました.このように,厳密に正規分布ではないもののそれに近い分布に対しては正規分布を用いて確率の近似計算を行なうことができます.
 
a)Wallaceの近似式
 
4000 '
4010 ' ** T-DISTRIBUTION **
4020 '
4030 *T.PROB:
4040 W1=(1-2/(3+8*DF))
4050 W2=DF*LOG(UUT*UUT/DF+1)
4060 UUN=W1*SQR(W2)
4070 GOSUB *NORMAL.PROB
4080 PP=1-P0
4090 RETURN
 
(6)t分布(任意自由度)のパーセント点
 
a)Wallaceの近似式
 
4100 '
4110 ' ** T-DISTRIBUTION **
4120 '
4130 *T.PERCENT1:
4140 GOSUB *NORMAL.PERCENT1
4150 W=UUN*(1+2/(1+8*DF))
4160 UUT=DF*(EXP(W*W/DF)-1)
4170 UUT=SQR(UUT)
4180 UU=UUT
4190 RETURN
 
ただし,このアルゴリズムは4よりも小さい自由度に関して信頼できません.
 
b)山内の近似式
 
4200 '
4210 ' ** T-DISTRIBUTION **
4220 '
4230 *T.PERCENT:
4240 GOSUB *NORMAL.PERCENT
4250 UUN=ABS(UUN)
4260 UU2=UUN*UUN
4270 AA1=(UU2+1)/DF/4
4280 AA2=((5*UU2+16)*UU2+3)/96/DF/DF
4290 AA3=(((3*UU2+19)*UU2+17)*UU2-15)/384/DF/DF/DF
4300 AA4=((((79*UU2+776)*UU2+1482)*UU2-1920)*W-945)/92460!/DF/DF/DF/DF
4310 AA5=(((((27*UU2+339)*UU2+930)*UU2-1782)*W-765)*W+17955)/368640!/DF/DF/DF/DF/DF
4320 UUT=UUN*(1+AA1+AA2+AA3+AA4+AA5)
4330 IF PP>.5 THEN UUT=-UUT
4340 RETURN
 
(7)F分布(任意自由度)の片側確率
 t分布やF分布は不完全ベータ関数と密接に関係しています.不完全ベータ関数の部分積分に基づくF分布の正確な確率計算アルゴリズムは,厳密な級数を足し上げる方法ですが,小数付き自由度では使えませんから,χ2 分布の Wilson-Hilferty 近似に基づいた Paulson の結果を利用します.
 
a)Paulson・竹内の近似式
 
5000 '
5010 ' ** F-DISTRIBUTION **
5020 '
5030 *F.PROB:
5040 FSW=0
5050 IF UUF=0 THEN P0=0:GOTO 5160
5060 IF UUF<1 THEN UUF=1/UUF:SWAP DF1,DF2:FSW=1
5070 AA1=2/(9*DF1)
5080 AA2=2/(9*DF2)
5090 W=UUF^(1/3)
5100 W1=W+AA1-W*AA2-1
5110 W2=AA2*W*W+AA1
5120 UUN=W1/SQR(W2)
5130 IF DF2<=3 THEN UUN=UUN*(1+.08*(UUN^4)/(DF2^3))
5140 GOSUB *NORMAL.PROB
5150 IF FSW=1 THEN P0=1-P0:SWAP DF1,DF2:FSW=0
5160 PP=1-P0
5170 RETURN
 
 5130行では,ν2が3以下の場合,精度をよくするための補正を行っています.この補正によって,自由度の全範囲にわたって数%の相対誤差という精度で計算してくれます.
 
(8)F分布(任意自由度)のパーセント点
 
a)Paulson・竹内の近似式(1)
 
5180 '
5190 ' ** F-DISTRIBUTION **
5200 '
5210 *F.PERCENT1:
5220 FSW=0
5230 IF P0<.5 THEN P0=1-P0:SWAP DF1,DF2:FSW=1
5240 GOSUB *NORMAL.PERCENT1
5250 IF DF2<=3 THEN U=UUN/(DF2^(3/4))                    :UUN=UUN*(1.1581-.2296*U+.0042*U*U+.0027*U*U*U)
5260 AA1=2/(9*DF1)
5270 AA2=2/(9*DF2)
5280 W=UUN*UUN
5290 W1=1+AA2*(AA2-W-2)
5300 W2=AA1+AA2-AA1*AA2-1
5310 W3=1+AA1*(AA1-W-2)
5320 W4=SQR(W2*W2-W1*W3)
5330 UUF=(W4-W2)/W1
5340 UUF=UUF^3
5350 IF FSW=1 THEN UUF=1/UUF
5360 UU=UUF
5370 RETURN
 
 5250行でν2≦3についての改良をしています.
 
b)Paulson・竹内の近似式(2)
 次のプログラムでは,ν1>2,ν2>2のとき,Paulson・竹内の近似式に準拠しています.また,5420行・5430行では,F(1,ν,α)の値を
  t(ν,α/2)=√F(1,ν,α)
  F(1,ν,α)=1/F(ν,1,1−α)
に基づき計算しています.
 
5380 '
5390 ' ** F-DISTRIBUTION **
5400 '
5410 *F.PERCENT:
5420 IF DF1=1 THEN DF=DF2:PP=PP/2:GOSUB *T.PERCENT                   :UUF=UUT^2:PP=PP*2:RETURN
5430 IF DF2=1 THEN DF=DF2:PP=(1-PP)/2:GOSUB *T.PERCENT                 :UUF=1/UUT^2:PP=1-PP*2:RETURN
5440 IF DF1=2 THEN UUF=DF2/2*(PP^(-2/DF2)-1):RETURN
5450 IF DF2=2 THEN UUF=2/DF1/((1-PP)^(-2/DF1)-1):RETURN
5460 AA=2/9/DF1:BB=2/9/DF2:CC=1-AA:DD=1-BB
5470 GOSUB *NORMAL.PERCENT
5480 UUF=CC*DD+UUN*SQR(CC*CC*BB+DD*DD*AA-AA*BB*UUN*UUN)
5490 UUF=(UUF/(DD*DD-BB*UUN*UUN))^3
5500 RETURN
 
 以上,小数付き自由度の場合でも使える確率分布の近似計算プログラムを掲載してきました.各々のサブルーチンは非常にコンパクトにまとまっています.それに対して,整数自由度の場合の厳密な級数和の計算プログラムは,自由度が偶数の場合と奇数の場合に分けて計算する必要がでてきますから,プログラムは意外に長くなります.補間プログラムまで含めるとさらに長くなるので,割愛することにしました.要するに,整数自由度の場合にしか使えない片側確率の計算プログラムはダサイと感じられるのです.
 
===================================
【超幾何関数と確率分布】
 
 これらの近似式では,自由度νの小さいところでt(ν,α),自由度ν2の小さいところでF(ν1,ν2,α)の誤差がかなり大きいのですが,統計解析ではあまり使わないところであるから,実用上ほとんど問題ないといって済ませるわけにはゆきません.たとえば,広津の累積χ2検定では小さい自由度でかつ小数付き自由度に対するχ2値が必要になるからです.
 
 そこで,いよいよ佳境《超幾何関数を用いた確率分布の計算》に入ることにしましょう.
 
 ガウスは,1812年に超幾何級数
  F(α,β,γ:x)=1+αβ/γx+1/2!α(α+1)β(β+1)/γ(γ+1)x^2+1/3!α(α+1)(α+2)β(β+1)(β+2)/γ(γ+1)(γ+2)x^3+・・・
について非常に詳細な研究を行っていたことで知られています.この形の超幾何関数はガウスの超幾何関数と呼ばれ,
  2F1(α,β;γ:x)
で表されます.
 
 この級数が重要なのは,多くの既知の関数がこの級数で表されるという事実で,たとえば,
  log(1+x)=x2F1(1,1;2:−x)
  (1+x)^n=2F1(-n,β;β:x)
があげられます.
 
 また,
  F(α;γ:x)=1+α/γx+1/2!α(α+1)/γ(γ+1)x^2+1/3!α(α+1)(α+2)/γ(γ+1)(γ+2)x^3+・・・
の場合を合流形超幾何関数(またはクンマーの超幾何関数)と呼び,
  1F1(α;γ:x)
で表されます.
 
 一般に,F(x)=Σanxnとおくと,a0=1で連続する2項の係数比
  an+1/an
が定数となる関数を超幾何関数と呼びます.
 
 超幾何関数はもっと一般化することが可能で,p個の上部パラメータとq個の下部パラメータを有する超幾何関数は
  pFq(a1,a2,・・・,ap;b1,b2,・・・,bq;x)と表されます.
 
 an+1xn+1/anxn=(n+a1)(n+a2)・・・(n+ap)/(n+b1)(n+b2)・・・(n+bq)x/(n+1)
すなわち,超幾何関数は,項比が有理関数
  an+1xn+1/anxn=p(n)/q(n)x/(n+1)
であるような級数にほかなりません.指数関数,対数関数,三角関数,2項関数,ベッセル関数,直交多項式列,不完全ガンマ関数,指数積分,ガウスの誤差関数なども超幾何級数であって,超幾何関数は一般に収束半径1をもちます.
 
 正規分布は誤差関数と,χ2分布は不完全ガンマ関数,t分布やF分布は不完全ベータ関数と密接に関係していて,正規分布,χ2分布,ベータ分布の分布関数はそれぞれ以下のように表現されます.
  Φ(x)=1/2+1/√2πx1F1(1/2,3/2,-x^2/2)
  F(x)=(x/2)^(ν/2)1F1(ν/2,1+ν/2,-x/2)/Γ(1+ν/2)
  F(x)=1/px^p2F1(p,1-q,p+1,x)/Β(p,q)
 t分布とF分布は引数xの値が異なるだけで,いずれも
  F(x)=1/px^p2F1(p,1-q,p+1,x)/Β(p,q)
で表されます.
 
 このことさえ知っておけば,正規分布・χ2 分布・t分布・F分布の片側確率が計算できます.以下に掲げるプログラムは,前述の近似式よりは長くなりますが,小数自由度にも対応していて,しかも,整数自由度の場合の計算プログラムよりも短く済んでいます.
 
a)片側確率
 
1000 '
1010 ' ** NORMAL DISTRIBUTION **
1020 '
1030 *NORMAL.PROB.HGF:
1040 PI=3.14159
1050 A0=.5:C0=1.5
1060 A=A0:C=C0
1070 Z=-UUN*UUN/2:GOSUB *CONFLUENT.HGF:G1=G
1080 P0=.5+G1*UUN/SQR(PI*2)
1090 '
1100 A=A0+1:C=C0+1
1110 Z=-UUN*UUN/2:GOSUB *CONFLUENT.HGF:G2=G*A0/C0
1120 P1=(G1-G2*UUN*UUN)/SQR(PI*2)
1130 RETURN
1140 '
1150 ' ** CHI-SQUARE DISTRIBUTION **
1160 '
1170 *CHI2.PROB.HGF:
1180 A0=DF/2:C0=1+DF/2
1190 A=A0:C=C0
1200 Z=-UUX/2:GOSUB *CONFLUENT.HGF:G1=G
1210 Z=1+DF/2:GOSUB *LOG.GAMMA:G2=G
1220 P0=G1/G2*(UUX/2)^(DF/2)
1230 '
1240 A=A0+1:C=C0+1
1250 Z=-UUX/2:GOSUB *CONFLUENT.HGF:G3=G*A0/C0
1260 P1=(DF/2*(UUX/2)^(DF/2-1)*G1/2-(UUX/2)^(DF/2)*G3/2)/G2
1270 RETURN
1280 '
1290 ' ** T-DISTRIBUTION **
1300 '
1310 *T.PROB.HGF:
1320 DFX=DF/2:DFY=.5
1330 A0=DFX:B0=1-DFY:C0=DFX+1
1340 A=A0:B=B0:C=C0
1350 Z=DF/(DF+UUT*UUT):GOSUB *GAUSS.HGF:G1=G
1360 P0=G1/DFX*Z^DFX
1370 Z=DFX+DFY:GOSUB *LOG.GAMMA:G1=G
1380 Z=DFX  :GOSUB *LOG.GAMMA:G2=G
1390 Z=DFY  :GOSUB *LOG.GAMMA:G3=G
1400 P0=P0*G1/G2/G3
1410 P0=P0/2
1420 P0=1-P0
1430 '
1440 A=A0+1:B=B0+1:C=C0+1
1450 Z=DF/(DF+UUT*UUT):GOSUB *GAUSS.HGF:G4=G*A0*B0/C0
1460 ZZ=-DF*UUT*2/(DF+UUT*UUT)^2
1470 P1=-(DFX*Z^(DFX-1)*ZZ*G1+Z^DFX*G4*ZZ)/DFX*G1/G2/G3/2
1480 RETURN
1490 '
1500 ' ** F-DISTRIBUTION **
1510 '
1520 *F.PROB.HGF:
1530 DFX=DF2/2:DFY=DF1/2
1540 A0=DFX:B0=1-DFY:C0=DFX+1
1550 A=A0:B=B0:C=C0
1560 Z=DF2/(DF2+DF1*UUF):GOSUB *GAUSS.HGF:G1=G
1570 P0=G1/DFX*Z^DFX
1580 Z=DFX+DFY:GOSUB *LOG.GAMMA:G1=G
1590 Z=DFX  :GOSUB *LOG.GAMMA:G2=G
1600 Z=DFY  :GOSUB *LOG.GAMMA:G3=G
1610 P0=P0*G1/G2/G3
1620 P0=1-P0
1630 '
1640 A=A0+1:B=B0+1:C=C0+1
1650 Z=DF2/(DF2+DF1*UUF):GOSUB *GAUSS.HGF:G4=G*A0*B0/C0
1660 ZZ=-DF2*DF1/(DF2+DF1*UUF)^2
1670 P1=-(DFX*Z^(DFX-1)*ZZ*G1+Z^DFX*G4*ZZ)/DFX*G1/G2/G3
1680 RETURN
1690 '
1700 ' *** 合流型超幾何関数 ***
1710 '
1720 *CONFLUENT.HGF:' [Kummer]
1730 EPSL=1E-09
1740 G0=0:G=1
1750 T=1:K=1
1760 WHILE ABS(G0-G)>EPSL
1770  T=T*A/C*Z/K
1780  G0=G
1790  G=G+T
1800  K=K+1
1810  A=A+1
1820  C=C+1
1830 WEND
1840 RETURN
1850 '
1860 ' *** ガウス型超幾何関数 ***
1870 '
1880 *GAUSS.HGF:
1890 EPSL=1E-09
1900 G0=0:G=1
1910 T=1:K=1
1920 WHILE ABS(G0-G)>EPSL
1930  T=T*A*B/C*Z/K
1940  G0=G
1950  G=G+T
1960  K=K+1
1970  A=A+1
1980  B=B+1
1990  C=C+1
2000 WEND
2010 RETURN
2020 '
2030 ' *** 対数ガンマ関数 (HASTINGSの多項式近似) ***
2040 '
2050 *LOG.GAMMA:
2060 A1#=-.577191652#
2070 A2#= .988205891#
2080 A3#=-.897056937#
2090 A4#= .918206857#
2100 A5#=-.756704078#
2110 A6#= .482199394#
2120 A7#=-.193527818#
2130 A8#= .035868343#
2140 X=Z:G#=0
2150 IF X<1 THEN G#=-LOG(X):GOTO 2180
2160 WHILE X>2:X=X-1:G#=G#+LOG(X):WEND
2170 X=X-1
2180 G#=G#+LOG(1+X*(A1#+X*(A2#+X*(A3#+X*(A4#+X*(A5#+X*(A6#+X*(A7#+X*A8#))))))))
2190 L.GAMMA=G#
2200 G=EXP(G#)
2210 RETURN
 
 1690行〜2010行が超幾何関数の級数和を求めるサブルーチンです.PC-9801の場合,単精度計算は10進法で7桁の精度で格納され,6桁までの桁数で印刷されます(倍精度計算は格納・表示とも16桁).そこでプログラムでは,要求する精度が1E-9以下になったら反復を終了させるようにしています(1730行・1890行).このように,超幾何関数を用いれば,確率計算を任意の精度で行うことができるという精度管理上のメリットが得られます.また,必要な精度があらかじめ定まっている場合には,その精度に見合った値を選んで使うことになります.
 
 このプログラムの1210行ではガンマ関数値,1370行〜1390行,1580行〜1600行ではベータ関数値の計算をしています.2020行から2210行がガンマ関数のサブルーチンです.
 
  Γ(x)=∫(0,∞)t^(x-1)e^-tdt   x>0
この無限積分をxの関数とみてガンマ関数Γ(x)といいます.
  Γ(1)=∫(0,∞)e^-tdt=1
  Γ(1/2)=∫(0,∞)t^(-1/2)e^-tdt
ここで,t=u2とおくと∫(0,∞)e^-u2/2du=√π/2(ガウス積分)より
  Γ(1/2)=√π
が得られます.
  Γ(1)=1,Γ(1/2)=√π
であることを知っていればたいてい間に合いますが,ガンマ関数は結構いろいろなところで出てきますから,ぜひ計算ルーチンを用意しておきたいものです.
 
 ガンマ関数Γ(x)には,
  Γ(x+1)=xΓ(x)
の関係があり,次のような漸化式が成り立ちます.
  Γ(x+1)=xΓ(x)=x(x-1)Γ(x-1)=・・・・
したがって,xが正の整数nのときには,Γ(n+1)=n!が成り立ち,ガンマ関数は階乗の一般形となっていることがわかります.階乗の解析的補間をしている関数がガンマ関数なのです.
 
 また,引数の値が半整数のときには,
  Γ(n+1/2)=√π・(2n)!/2^(2n)n!
です.引数の値が整数(n+1)でも半整数(n+1/2)でもないガンマ関数に対する正確な計算は複雑ですが,物理・化学・工学などの諸分野の問題の解を求めるときには,どうしてもそれらの解を数値を用いて表す必要がでてきます.現在では膨大な数表を用いることは稀であって,コンピュータが広く使用されていますから,必要に応じて計算する方法がとられています.
 
 ガンマ関数Γ(x)の値を求めるために,ここでは,ヘイスティングスの8次多項式近似
  Γ(x+1)≒1-0.577191652x+0.988205891x^2-0.897056937x^3+0.918206857x^4-0.756704078x^5+0.482199394x^6-0.193527818x^7+0.035868343x^8
 (岩波全書「数学公式V」森口,宇田川,一松著)
を用いています.この近似式は有効範囲が0≦x≦1に限られていますが,ガンマ関数にはΓ(x+1)=xΓ(x)の関係があり,この漸化式を繰り返し適用して,0≦x≦1の範囲になるように再帰的な方法を用いればx≧1にも拡張することができます.また,ガンマ関数Γ(x)はxが大きくなるとすぐにオーバーフローエラーを起こしてしまいますので,プログラムではln(Γ(x))=ln(Γ(x+1))−ln(x)によってその対数ln(Γ(x))を求めて飽和現象を回避しています.プログラムの2180行目では,いわゆるホーナーの方法によって8次多項式の値は求めています.ホーナーの方法は計算回数を少なくし,計算誤差の点からも有効な方法です.なお,ガンマ関数Γ(x)はx>0について微分可能で,x=1.4616321449・・・で最小となります.
 
 一方,ベータ関数は,
  Β(a,b)=∫(0,1)t^(a-1)(1-t)^(b-1)dt
によって定義されます.ここで,積分変数をtからu=(1-t)/tによってuに変えると,
  Β(a,b)=∫(0,∞)u^(a-1)/(1+u)^(a+b)du
が得られます.
 
 ガンマ関数は,Γ(n+1)=n!より,階乗の補間関数であり,初等的でない関数の中で最も簡単かつ重要な数学的関数といえましたが,ベータ関数とガンマ関数との間には
  Β(a,b)=Γ(a)Γ(b)/Γ(a+b)
の関係がありますから,ベータ関数はガンマ関数の兄弟分にあたります.
 
b)パーセント点
 1100行〜1130行,1240行〜1270行,1440行〜1470行,1640行〜1670行では,超幾何関数の微分を行っていますが,超幾何関数には微分・積分してもふたたび超幾何関数になるという特性があります.
  d/dx1F1(a,c,x)=a/c1F1(a+1,c+1,x)
  d/dx2F1(a,b,c,x)=ab/c2F1(a+1,b+1,c+1,x)
 
 以下に掲げるパーセント点を求めるアルゴリズムでは,この性質をうまく利用しています.近似式で求まるパーセント点を初期値として,これを3320行〜3610行の1次の微分まで用いたニュートン法によって補正すると,精度の良いパーセント点が得られます.
 
3000 '
3010 ' ** NORMAL DISTRIBUTION **
3020 '
3030 *NORMAL.PERCENT.HGF:
3040 PP=1-P0:GOSUB *NORMAL.PERCENT:UU=UUN
3050 PROB$="N":GOSUB *NEWTON.HGF
3060 UUN=X
3070 RETURN
3080 '
3090 ' ** CHI-SQUARE DISTRIBUTION **
3100 '
3110 *CHI2.PERCENT.HGF:
3120 PP=1-P0:GOSUB *CHI2.PERCENT:UU=UUX
3130 PROB$="X":GOSUB *NEWTON.HGF
3140 UUX=X
3150 RETURN
3160 '
3170 ' ** T-DISTRIBUTION **
3180 '
3190 *T.PERCENT.HGF:
3200 PP=1-P0:GOSUB *T.PERCENT:UU=UUT
3210 PROB$="T":GOSUB *NEWTON.HGF
3220 UUT=X
3230 RETURN
3240 '
3250 ' ** F-DISTRIBUTION **
3260 '
3270 *F.PERCENT.HGF:
3280 PP=1-P0:GOSUB *F.PERCENT:UU=UUF
3290 PROB$="F":GOSUB *NEWTON.HGF
3300 UUF=X
3310 RETURN
3320 '
3330 ' *** ニュートン法 ***
3340 '
3350 *NEWTON.HGF:
3360 EPSL=1E-09
3370 IMAX=50
3380 '
3390 Q0=P0
3400 D0=UU
3410 '
3420 SW=0
3430 ICNT=0
3440 WHILE SW=0
3450  ICNT=ICNT+1
3460  IF ICNT>IMAX THEN SW=1
3470  DD=D0:GOSUB 3510:D0=DD
3480 WEND
3490 X=DD
3500 RETURN
3510 '
3520 ' ** 逐次計算 **
3530 '
3540 IF PROB$="N" THEN UUN=D0:GOSUB *NORMAL.PROB.HGF
3550 IF PROB$="X" THEN UUX=D0:GOSUB *CHI2.PROB.HGF
3560 IF PROB$="T" THEN UUT=D0:GOSUB *T.PROB.HGF
3570 IF PROB$="F" THEN UUF=D0:GOSUB *F.PROB.HGF
3580 F=P0-Q0:G=P1
3590 DD=D0-F/G
3600 IF ABS(DD-D0)<EPSL THEN SW=1
3610 RETURN
 
 ニュートン法の幾何学的な意味は「初期値x0における関数の勾配を求めて接線とx軸との交点を求める.この点において同様の作業を反復させて行なうと,xは順次根に近づいてゆく.」と解釈されます.そして,xの変化があらかじめ与えた許容誤差以内になったとき,そのxをもって根と判定します.
 また,プログラムでは,最高50回まで反復し,要求する精度が1E-9以下になったら反復を終了させるようにしています.
 
===================================
【精度向上のために】
 
 超幾何関数の利点を活かした確率分布の計算法を紹介しました.このアルゴリズムから導かれた値と真値を比較した結果は示しませんでしたが,単精度の範囲で数値表の値とよく一致し,非常に精確な値が得られました.小数付き自由度を含む任意の自由度についての片側確率とパーセント点が簡便に求められるうえに,精度が高く,その実用上の意味は大きいと考えられました.
 
 さて,超幾何関数の値を求める場合,級数を収束するまで加えればよいのですが,引数が負のときは交代級数ですから,桁落ちが起こるという問題があります.
  Φ(x)=1/2+1/√2πx1F1(1/2,3/2,-x^2/2)
  F(x)=(x/2)^(ν/2)1F1(ν/2,1+ν/2,-x/2)/Γ(1+ν/2)
 
 この場合,クンマーの変換
  1F1(a,c,-x)=exp(-x)1F1(c-a,c,x)
により
  Φ(x)=1/2+1/√2πxexp(-x^2/2)1F1(1,3/2,x^2/2)
  F(x)=(x/2)^(ν/2)exp(-x/2)1F1(1,1+ν/2,x/2)
とすれば,桁落ちが避けられます.
 
 また,せっかく超幾何関数の高精度計算をしたわけですから,次の課題として,ガンマ関数を高精度で計算するサブルーチンを用意したいところです.ガンマ関数Γ(x)の値を求めるには,いろいろな近似式,例えば,ヘイスティングス,コリンジ,ハートらによる多項式近似やスターリングの漸近展開式などがあります.
 
 とくに,前述したヘイスティングスの近似多項式は,べき級数であるところから,ガンマ関数の対数微分であるジガンマ関数
  φ(x)=d/dxln(Γ(x))=Γ’(x)/Γ(x)
およびその逐次導関数φ’(x),φ”(x),・・・,φ(k)(x)(トリガンマ関数,テトラガンマ関数,ペンタガンマ関数など,総称してポリガンマ関数と呼ぶ)の値を求めるときにも応用可能で,有理式であるハートの近似式と比べても大変便利な近似式になっています.
 
a)コリンジの近似式
 ヘイスティングスの近似式がΓ(x)の1≦x≦2の範囲の近似式であったのに対し,コリンジの近似式はΓ(x)の2≦x≦3の範囲の近似式です.ヘイスティングスの近似式と同様の再帰的な方法で,x<2,x>3にも拡張できます.
 
1000 '
1010 ' *** 対数ガンマ関数 ***
1020 '
1030 *LOG.GAMMA1:
1040 A1#= .9999999758#
1050 A2#= .4227874605#
1060 A3#= .4117741955#
1070 A4#= .0821117404#
1080 A5#= .0721101567#
1090 A6#= .00445114#
1100 A7#= .0051589951#
1110 A8#= .0016063118#
1120 X=Z:G#=0
1130 WHILE X<2:G#=G#-LOG(X):X=X+1:WEND
1140 WHILE X>3:X=X-1:G#=G#+LOG(X):WEND
1150 X=X-2
1160 G#=G#+LOG(A1#+X*(A2#+X*(A3#+X*(A4#+X*(A5#+X*(A6#+X*(A7#+X*A8#)))))))
1170 L.GAMMA=G#
1180 G=EXP(G#)
1190 RETURN
 
b)チェビシェフ補間に基づく近似式
 1/Γ(x)を区間1.5≦x≦2.5内でチェビシェフ補間して得られた近似式で,引数を倍精度にすればガンマ関数を倍精度で計算してくれるサブルーチンです.
 
2000 '
2010 ' *** 対数ガンマ関数 ***
2020 '
2030 *LOG.GAMMA2:
2040 A1#=-.4227843350984668#
2050 A2#=-.2330937364217829#
2060 A3#= .1910911013876387#
2070 A4#=-.0245524900056413#
2080 A5#=-.0176452445478514#
2090 A6#= .008023273027855#
2100 A7#=-.000804329819256#
2110 A8#=-.00036083787665#
2120 A9#= .00014559656862#
2130 A10#=-.0000175455394#
2140 A11#=-.00000259122537#
2150 A12#=.0000013377674#
2160 A13#=-.0000001995428#
2170 X=Z:G#=0
2180 WHILE X<1.5:G#=G#-LOG(X):X=X+1:WEND
2190 WHILE X>2.5:X=X-1:G#=G#+LOG(X):WEND
2200 X=X-2
2210 G#=G#-LOG(1+X*(A1#+X*(A2#+X*(A3#+X*(A4#+X*(A5#+X*(A6#+X*(A7#+X*(A8#+X*(A9#+X*(A10#+X*(A11#+X*(A12#+X*A13#)))))))))))))
2220 L.GAMMA=G#
2230 G=EXP(G#)
2240 RETURN
 
c)ハートの近似式
 
3000 '
3010 ' *** 対数ガンマ関数 ***
3020 '
3030 *LOG.GAMMA3:
3040 A1#= 13572.65011103686#
3050 A2#= 4954.768972677267#
3060 A3#= 1817.799191156434#
3070 A4#= 261.0284950616458#
3080 A5#= 45.30104765151624#
3090 B1#= 13572.65011103691#
3100 B2#=-783.5348800559552#
3110 B3#=-3440.699241346454#
3120 B4#= 931.1785045593485#
3130 B5#= 124.7947256227383#
3140 B6#=-93.7769173224393#
3150 B7#= 16.16160629773462#
3160 B8#=-1#
3170 X=Z:G#=0
3180 G#=G#-LOG(X*(X+1))
3190 X=X-1
3200 WHILE X>=0:G#=G#+LOG(X+2):X=X-1:WEND
3210 X=Z-INT(Z)
3220 G#=G#+LOG(A1#+X*(A2#+X*(A3#+X*(A4#+X*A5#))))
3230 G#=G#-LOG(B1#+X*(B2#+X*(B3#+X*(B4#+X*(B5#+X*(B6#+X*(B7#+X*B8#)))))))
3240 L.GAMMA=G#
3250 G=EXP(G#)
3260 RETURN
 
 ハートの近似式は有理式である点が,ヘイスティングスやコリンジの近似式との違いです.この近似式も単精度の範囲で数値表の値とよく一致しています.
 
 一方,大きなxに対しては,ガンマ関数の漸近展開式
  Γ(x) 〜 x^xexp(-x)(2π/x)^(1/2)[1+1/12x+1/288x^2+・・・]
が成り立ちます.これがスターリングの公式と呼ばれる漸近展開式です.この式は,ベルヌーイ数を明示的に含む漸近展開式に書き換えることができます.
  logΓ(x) 〜 xlogx-x+1/2log(2π/x)+Σ(-1)^(n-1)Bn/(2n)(2n-1)x^(2n-1)
 
d)スターリングの近似式
 
4000 '
4010 ' *** 対数ガンマ関数 (STIRLINGの漸近展開式) ***
4020 '
4030 *LOG.GAMMA4:
4040 PI#=3.141592653589732#
4050 A1#=1#/12#
4060 A2#=1#/30#
4070 A3#=53#/210#
4080 A4#=195#/371#
4090 A5#=22999#/22737#
4100 A6#=29944523#/19733142#
4110 A7#=109535241009#/48264275462#
4120 NZ=7
4130 X=Z:G#=0
4140 WHILE X<NZ:G#=G#-LOG(X):X=X+1:WEND
4150 G#=G#+(X-.5)*LOG(X)+.5*LOG(2*PI#)-X+(A1#/(X+A2#/(X+A3#/(X+A4#/(X+A5#/(X+A6#/(X+A7#/X)))))))
4160 L.GAMMA=G#
4170 G=EXP(G#)
4180 RETURN
 
 このサブルーチンでは4150行で連分数展開を用いています.スターリングの近似式はxが大きいほど精確なので,xがある値(変数名nz)より小さいときは漸化式
  logΓ(x+1)=logΓ(x)+logx
を逆に使って,x≧nzのところにもっていっています.4140行のnzを大きくするほど結果は精確になり,小さなxに対しても信頼性が増します.
 
===================================
【非心χ分布と超幾何関数】
 
 超幾何関数が統計計算に現れることは少なく,多くのひとにとって超幾何関数は馴染みの薄い関数であることは間違いありません.ここでは,小生がこのアイディアをどのようにして得たのかについて,簡単に紹介したいと思います.
 
 非心χ2分布の平方根分布が非心χ分布で,その確率密度関数は
  f(x)=1/σ2exp(-μ2/σ2)1/μ^(n/2-1)(x)^(n/2)exp(-x2/σ2)I(n/2-1,√μx/σ2)
で表されます.ここでI(ν,x)は第1種の変形ベッセル関数です.
 
 この分布の積率は超幾何関数で表現されます.
mean=√2*σexp(-μ2/2σ2)Γ((n+1)/2)/Γ(n/2)1F1((n+1)/2,n/2,μ2/2σ2)
variance=nσ2exp(-μ2/2σ2)1F1(n/2+1,n/2,μ2/2σ2)
 
 このように,超幾何関数は非心χ分布の積率と関係しています.非心χ分布の積率計算では必然的に超幾何関数を用いることになりますが,そのような中から超幾何関数による確率計算を着想したというわけです.
 
 なお,χ分布を拡張する方向としては,ひとつには自由度を増すこと,もうひとつは非心パラメータをつけることが考えられます.χ分布の自由度を増すと,半正規分布→レイリー分布→マクスウェル分布→・・・となりますが,非心χ分布の自由度を増すと,折り重ね正規分布→ライス分布→・・・が得られます.すなわち,非心χ分布において,自由度1の場合が折り重ねられた正規分布(folded normal distribution)で,期待値が0でない正規分布をy軸(x=0)で折り返して得られた分布になっています.また,自由度2の非心χ分布はライス分布です.
 
 通信では電波が互いに干渉しあって,うねりのような強弱がついて非常に聴取しづらい現象が起こります.受信点では様々な伝搬経路を通ってきた多数の電波が合成されるからであり,この干渉をフェージング(fading)といいます.地表波と空間波の干渉を近距離フェージング,また,経路の異なる空間波どうしの干渉によるものを遠距離フェージングといいます.
 
 フェージングはその強度が等しいとき最も激しく起こりますが,合成された電波の位相ならびに振幅が不規則に変化するので,そのデータはランダムな性格を有し,明確な数式で記述されるよりは確率的記述と統計的平均値で表されなければなりません.その際必要とされるのがライス分布です.ライス分布はマーカムのQ関数と関連していて,電気通信分野ではn分布の名で通っています.ライス分布において,μ=0ならばレイリー分布に一致します.また,μ→∞のときの極限は正規分布になります.
 
 ライス分布は第2次大戦中,米国ベル研のライスと本邦の仲上稔教授によって独立に研究されたものですが,とくに,仲上氏のフェージングの研究は戦時中のおそらく実験設備も十分でない環境にもかかわらず,先進国米国の研究に先立つオリジナルな成果として発表されています.しかし,originally made in Japan であるにもかかわらず,本邦ではその重要性が認められませんでした.ライス分布と名づけられていますが,この機会に仲上・ライス分布として紹介したいと考えています.
 
===================================
【おまけ】
 
 非心分布は,元来,検定の検出力を調べるために導入されたものですが,ここまで読んで頂いた方への特別付録として,非心t・F・χ2分布の片側確率とパーセント点を近似計算するプログラムを掲載します.
 
 以下では,非心パラメータをlambda,下側確率をP0,上側確率をPP,非心t分布,F分布,χ2分布の各パーセント点をそれぞれUUTN,UUFN,UUXNで表しています.
 
a)パーセント点
 
1000 '
1010 ' ** NON-CENTRAL T-DISTRIBUTION **
1020 '
1030 *NT.PERCENT1:
1040 GOSUB *NORMAL.PERCENT1
1050 AA1=1-1/DF/2
1060 AA2=1-1/DF/2-UUN*UUN/DF/2
1070 AA3=LAMBDA*SQR(AA1)+SQR(LAMBDA*LAMBDA*AA1-(LAMBDA*LAMBDA-UUN*UUN)*AA2)
1080 UUTN=AA3/AA2
1090 UU=UUTN
1100 RETURN
1110 '
1120 ' ** NON-CENTRAL F-DISTRIBUTION **
1130 '
1140 *NF.PERCENT1:
1150 DF0=DF1
1160 DF1=DF0+LAMBDA*LAMBDA/(DF0+LAMBDA*2)
1170 C=1+LAMBDA/DF0
1180 '
1190 GOSUB *F.PERCENT1
1200 UUFN=C*UUF
1210 UU=UUFN
1220 RETURN
1230 '
1240 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
1250 '
1260 *CHI2N.PERCENT1:
1270 DF0=DF
1280 DF=DF0+LAMBDA*LAMBDA/(DF0+LAMBDA*2)
1290 '
1300 GOSUB *NORMAL.PERCENT1
1310 AA1=2/(9*DF)
1320 W=1-AA1+UUN*SQR(AA1)
1330 UUXN=(DF0+LAMBDA)*(W^3)
1340 UU=UUXN
1350 RETURN
1360 '
1370 '*CHI2N.PERCENT1:
1380 DF0=DF
1390 DF=DF0+LAMBDA*LAMBDA/(DF0+LAMBDA*2)
1400 C=1+LAMBDA/(DF0+LAMBDA)
1410 '
1420 GOSUB *CHI2.PERCENT1
1430 AA1=LAMBDA*LAMBDA/(DF0+LAMBDA*2)^2/(DF+2)/(DF+4)*DF/3
1440 AA2=AA1*(DF+4)*2
1450 AA3=AA1*(DF+2)*(DF+4)
1460 UUXN=C*UUX*(1-UUX*UUX*AA1+UUX*AA2-AA3)
1470 UU=UUXN
1480 RETURN
 
b)片側確率
 
1490 '
1500 ' ** NON-CENTRAL T-DISTRIBUTION **
1510 '
1520 *NT.PROB:
1530 AA1=LAMBDA-UUTN*SQR(1-1/DF/2)
1540 AA2=SQR(1+UUTN*UUTN/DF/2)
1550 UUN=AA1/AA2
1560 GOSUB *NORMAL.PROB1
1570 P0=1-PP
1580 RETURN
1590 '
1600 ' ** NON-CENTRAL F-DISTRIBUTION **
1610 '
1620 *NF.PROB:
1630 AA1=DF1*(UUFN-1)-LAMBDA+1
1640 AA2=SQR((DF1*UUFN*(1+DF1/DF2*UUFN)+LAMBDA)*2)
1650 UUN=AA1/AA2
1660 GOSUB *NORMAL.PROB1
1670 P0=1-PP
1680 RETURN
1690 '
1700 ' ** NON-CENTRAL CHI-SQUARE DISTRIBUTION **
1710 '
1720 *CHI2N.PROB:
1730 AA1=UUXN-LAMBDA-DF+1
1740 AA2=SQR((UUXN+LAMBDA)*2)
1750 UUN=AA1/AA2
1760 GOSUB *NORMAL.PROB1
1770 P0=1-PP
1780 RETURN
 
===================================