正規分布の累積分布の計算
2024-01-31
カテゴリ:数学
裾の確率
標準正規分布の2.5%上側分位点が約1.96であることはどうやって計算するのかという質問を受けた. 分位点は累積分布関数の逆関数なので,まず累積分布関数 を計算し,その逆関数を求める計算になる (世の中のソフトウェアはもっと能率的な実装が取られるはずだが,それはひとまず置く).
信頼区間の計算などでは分位点の検索では裾(上側2.5%,1%,0.5%など)を調べることが多いので,まずは 裾の確率の計算を考える. \[ Q(x) = \int_x^\infty \frac{1}{2\pi} \exp\left(-x^2/2\right) dx \] は確率変数\(X\sim N(0,\sigma^2)\)が\(X > x\)を取る確率であり,例えば\(Q(1.96) \approx 2.5\%\)である ことが知られている.これを自力で計算したい.
\( t = x^2/2 \) とおくと, \[ Q(x) = \frac{1}{4\pi} \int_{x^2/2}^\infty \frac{ e^{-t} }{\sqrt{t} } dt \] なので,この問題は積分 \[ f(x) = \int_x^\infty t^{-1/2} e^{-t} dt \] の計算に帰着される.これは\(t^{-1/2}\)という\(t\to\infty\)で 0に収束する因子が掛かっているが,部分積分を繰り返すことで,さらに早い収束をする因子に書き換えられる.
\begin{eqnarray*} f(x) &=& \int_x^\infty t^{-1/2} e^{-t} dt \\ & = & \left. -e^{-t}t^{-1/2} \right|_x^\infty - \frac{1}{2} \int_x^\infty t^{-3/2} e^{-t} dt \\ & = & e^{-x}x^{-1/2} - \frac{1}{2} \int_x^\infty t^{-3/2} e^{-t} dt \\ & = & e^{-x}x^{-1/2} + \left. \frac{1}{2} e^{-t}t^{-3/2} \right|_x^\infty + \frac{1\cdot 3}{2\cdot 2} \int_x^\infty t^{-5/2} e^{-t} dt \\ & = & e^{-x}x^{-1/2} - \frac{1}{2} e^{-x}x^{-3/2} + \frac{1\cdot 3}{2\cdot 2} \int_x^\infty t^{-5/2} e^{-t} dt \\ & = & e^{-x}x^{-1/2} - \frac{1}{2} e^{-x}x^{-3/2} + e^{-x}x^{-1/2} - \left. \frac{1 \cdot 3}{2 \cdot 2} e^{-t}t^{-5/2} \right|_x^\infty - \frac{1\cdot 3 \cdot 5}{2 \cdot 2 \cdot 2 } \int_x^\infty t^{-7/2} e^{-t} dt \end{eqnarray*} この操作は無限に続けられる.整理すると \begin{eqnarray*} f(x) &=& \frac{e^{-x}}{\sqrt{x}} \left\{ 1 - \frac{1}{2x} + \frac{3}{4x^2} - \frac{15}{8 x^3} + \frac{105}{16x^4} - \cdots \right\} \\ Q(x) &=& f(x^2/2)/\sqrt{4\pi} \end{eqnarray*}
中括弧の中を3次で打ち切った近似とRによる高精度の値との比較する表を以下に示す.結果を見ると,この展開は\(x > 3\)で有効と判断できる.なお,この級数は発散するもので,\(xの値に応じて\)高次の項まで取りすぎると精度がかえって悪化する.
x | Q3 | Q |
---|---|---|
1.00 | -2.903649e+00 | 1.586553e-01 |
1.96 | 2.022755e-02 | 2.499790e-02 |
2.00 | 1.898120e-02 | 2.275013e-02 |
3.00 | 1.337458e-03 | 1.349898e-03 |
5.00 | 2.865919e-07 | 2.866516e-07 |
10.00 | 7.619846e-24 | 7.619853e-24 |
この計算には以下のRスクリプトを使った.
f4 = function(x) exp(-x)/sqrt(x)*( 1 - 1/(2*x) + 3/(4*x*x)); Q4 = function(a) f4(a*a/2)/sqrt(4*pi) ; xs = c(1,1.96,2,3,5,10) tab = cbind(xs,Q4(xs),pnorm(xs,lower.tail=FALSE))
中央の確率
反対に\(x\)がそれほど大きくないところ,すなわち中央での確率は指数関数のマクロリン展開
\[
e^t = \sum_{n=0}^\infty \frac{t^n}{n!}
\]
に\(t = -x^2/2\) に代入し,右辺を項別積分することで簡単に計算できる.結果だけ示すと
\begin{eqnarray*}
g(x) &=& \sum_{n=0}^\infty \frac{ (-1)^n x^{2n+1} }{n!(2n+1)} \\
P(x) &=& \frac{1}{2\pi} \int_0^x \exp(-x^2/2) dx = \frac{1}{\sqrt\pi} g(x/\sqrt 2)
\end{eqnarray*}
13次まで展開したところ,\(0.5 + P(1.96) = 0.9758228 \)であった.一方,Rでの高精度の
計算では,\(0.5 + P(1.96) = 0.9750021 \) である.ここでも,Rのコードを以下に示す.
g = function(x) x - x^3/3 + x^5/2/5 - x^7/6/7 + x^9/24/9 - x^11/120/11 + x^13/720/13 P = function(x) g(x/sqrt(2))/sqrt(pi) P.true = function(x) pnorm(x) - 0.5