中心極限定理における分布の精緻化: Edgeworth展開
これは何か
- Edgeworth展開について調べたもの
- 数学的な厳密さは気にせずに記述する
表記
- 正規分布: Normal
(\mu, \sigma^{2}) - 標準正規分布の確率密度関数:
\phi(z) - 標準正規分布の分布関数:
\Phi(z)
- 標準正規分布の確率密度関数:
- 確率変数
の特性関数:X \varphi_{X}(t) = E \left[ \exp\left( itX \right) \right] -
の\varphi_{X}(t) 階微分:k \varphi_{X}^{(k)} (t)
-
- 確率変数
のキュムラント母関数:X \psi_{X}(t) = \log \varphi_{X}(t) = \sum_{k=1}^{\infty} \frac{\kappa_{k}}{k!} (it)^{k} -
次のキュムラント:k \kappa_{k}
-
-
次のHermite多項式:k H_{k}(z) - 本記事ではWikipediaで言うところのprobabilist's Hermite polynomialsとする
問題設定
-
を, 確率密度関数X_{k} (k=1,\ldots,n) に独立に従う確率変数だとするf_{X}(x) - 平均:
\mu = E\left[ X \right] - 分散:
\sigma^{2} = E\left[ \left( X - \mu \right)^{2} \right] - 歪度:
\gamma = \frac{E\left[ \left( X - \mu \right)^{3} \right]}{\sigma^{3}} - 尖度:
\kappa = \frac{E\left[ \left( X - \mu \right)^{4} \right]}{\sigma^{4}} - 標本平均:
\bar{X} = \frac{1}{n} \sum_{k=1}^{n} X_{k}
- 平均:
-
とおくと, 中心極限定理よりZ = \frac{\sqrt{n} \left( \bar{X} - \mu \right)}{\sigma} でn \rightarrow \infty は標準正規分布に分布収束することがわかるZ - その際, 有限の
でn はどんな分布で近似できるか? という問いを考えたいZ - 標準正規分布である程度近似はできるが, そこから精度をどう高めていくか?を考えるイメージ
- この問いに関するアプローチの1つがEdgeworth展開である
Edgeworth展開
Edgeworth展開の基本的な考え方
詳細は後述するが, Hermite多項式
- "確率密度関数"[1]
を考えると, その特性関数はH_{k}(z) \phi(z) となる.\exp \left( - \frac{1}{2} t^{2} \right) \left( it \right)^{k}
この事実を用いると,
のように展開できれば,
のように表現することができることになる.
Hermite多項式
ここではHermite多項式の定義, 性質についてまとめる.
Hermite多項式の定義
本記事では6次のHermite多項式まで参照するため, 計算結果を以下に記しておく:
H_{1}(z) = z H_{2}(z) = z^{2} - 1 H_{3}(z) = z^{3} - 3 z H_{4}(z) = z^{4} - 6 z^{2} + 3 H_{5}(z) = z^{5} - 10 z^{3} + 15 z H_{6}(z) = z^{6} - 15 z^{4} + 45 z^{2} - 15
Hermite多項式の性質
前述した "確率密度関数"
まず, 確率密度関数と特性関数には対応関係があることに着目する. 確率密度関数から特性関数を計算した後, 反転公式(参考リンク)を使うことで, 元の確率密度関数に戻すことができる:
この反転公式(上記2番目の式)に着目する. 両辺を
となり, 両辺に
得られる.
つまり, 特性関数
Edgeworth展開の導出
ここで本題のEdgeworth展開の導出に入る.
基本的な考え方を再掲しておくと,
のように展開することで,
のように表現することが目標となる.
まず,
となる. ここで,
のように計算される. 1次, 2次のキュムラントは
ここで改めて
となり, あとは
のように
この特性関数の表現を反転公式で確率密度関数に戻してやることで
という式が得られる. これが
ちなみに, 分布関数のEdgeworth展開も導くことができる. Hermite多項式の性質を利用すると
となり, 両辺を
となる. これが
Edgeworth展開まとめ
式の形から,
ここで展開式に3次, 4次キュムラントが登場しているが, 歪度, 尖度を用いた表現もできる. こちらの表現についても補足情報としてつけ足しておく.
歪度, 尖度を用いた表現
3次, 4次のキュムラントは, 分散
\kappa_{3} = E \left[ \left( X - \mu \right)^{3} \right] = \gamma \sigma^{3} \kappa_{4} = E \left[ \left( X - \mu \right)^{4} \right] - 3 E \left[ \left( X - \mu \right)^{2} \right]^{2} = \left( \kappa - 3 \right) \sigma^{4}
これを用いて上記の展開式を表現すると, 以下のようになる.
(歪度, 尖度を用いた表現 終わり)
具体的な分布で確認
ベルヌーイ分布
- ベルヌーイ分布Bernoulli
の基本情報(p) - 確率関数:
P(X = x) = p^{x} (1 - p)^{1 - x} - 特性関数:
\phi_{X}(t) = 1 - p + p \exp (it) - キュムラント
\kappa_{1} = \mu = p \kappa_{2} = \sigma^{2} = p (1 - p) \kappa_{3} = p (1 - p) (1 - 2p) \kappa_{4} = p (1 - p) \left\{ 1 - 6 p (1 - p) \right\}
- 確率関数:
-
の分布関数Z = \frac{\sqrt{n} \left( \bar{X} - \mu \right)}{\sigma} - 基本的には, 二項分布の分布関数と同じ形
- 分布関数を書き下すと以下のようになる(参考):
ただし,
-
の分布関数のEdgeworth展開Z - 先ほど導出した展開式にキュムラントの値を当てはめていくと, 以下の式が得られる:
-
の分布関数のEdgeworth展開の可視化Z - 以下の4つのグラフを見比べてみる
-
の分布関数Z - 標準正規分布
-
の項までのEdgeworth展開n^{-\frac{1}{2}} -
の項までのEdgeworth展開n^{-1}
-
- 以下の4つのグラフを見比べてみる
可視化コード
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm, binom
from scipy.special import hermitenorm
def edgeworth_bernoulli_cdf(zs, n, p, approx_degree=2):
h2 = hermitenorm(2, monic=True)
h3 = hermitenorm(3, monic=True)
h5 = hermitenorm(5, monic=True)
coef = np.zeros(len(zs))
if approx_degree >= 1:
coef += (h2(zs) * (1 - 2 * p) / (6 * np.sqrt(p * (1 - p)))) / np.sqrt(n)
if approx_degree >= 2:
coef += (h3(zs) * (1 - 6 * p * (1 - p)) / (24 * p * (1 - p)) + h5(zs) * ((1 - 2 * p)**2) / (72 * p * (1 - p))) / n
return norm.cdf(zs, loc=0, scale=1) - coef * norm.pdf(zs, loc=0, scale=1)
def plot_gamma():
p = 0.2
ns = [5, 10]
zs = np.linspace(-4, 4, 1001)
_, axes = plt.subplots(1, len(ns), figsize=(12, 6))
for fig_index, n in enumerate(ns):
bernoulli_cdfs = binom.cdf(np.floor(zs * np.sqrt(n * p * (1 - p)) + n * p), n, p)
axes[fig_index].plot(zs, bernoulli_cdfs, label="Z", color="black")
axes[fig_index].plot(zs, edgeworth_bernoulli_cdf(zs, n, p, approx_degree=0), label="Normal(0, 1)", color="blue")
axes[fig_index].plot(zs, edgeworth_bernoulli_cdf(zs, n, p, approx_degree=1), label=f"Edgeworth($n^{{- 1 / 2}} $)", color="orange")
axes[fig_index].plot(zs, edgeworth_bernoulli_cdf(zs, n, p, approx_degree=2), label=f"Edgeworth($n^{{- 1}} $)", color="green")
axes[fig_index].set_title(f"Cumulative Distributions (n={n})")
axes[fig_index].legend(loc="upper left")
plt.tight_layout()
plt.show()
def main():
plot_gamma()
if __name__ == "__main__":
main()
グラフを見ると, 以下のことが読み取れる:
- Edgeworth展開の方が, 標準正規分布と比べてZのラインに近いことがわかる
- 分布関数のEdgeworth展開を有限の項で止めた場合, 必ずしもその値は0以上になるとは限らない
ガンマ分布
- ガンマ分布Gamma
の基本情報\left( \alpha, \beta \right) - 確率密度関数:
f(x) = \frac{\beta^{\alpha}}{\Gamma \left( \alpha \right)} x^{\alpha - 1} \exp \left( - \beta x \right) - 特性関数:
\phi_{X}(t) = \left( \frac{\beta}{\beta - it} \right)^{\alpha} - キュムラント
\kappa_{1} = \mu = \frac{\alpha}{\beta} \kappa_{2} = \sigma^{2} = \frac{\alpha}{\beta^{2}} \kappa_{3} = \frac{2 \alpha}{\beta^{3}} \kappa_{4} = \frac{6 \alpha}{\beta^{4}}
- 確率密度関数:
-
の確率密度関数Z = \frac{\sqrt{n} \left( \bar{X} - \mu \right)}{\sigma} - ガンマ分布Gamma
を負の方向に\left( n \alpha, \sqrt{n \alpha} \right) だけずらしたもの\sqrt{n \alpha} - 確率密度関数を書き下すと, 以下の通り(参考):
- ガンマ分布Gamma
-
の確率密度関数のEdgeworth展開Z - 先ほど導出した展開式にキュムラントの値を当てはめていくと, 以下の式が得られる:
-
の確率密度関数のEdgeworth展開の可視化Z - 以下の4つのグラフを見比べてみる
-
の確率密度関数Z - 標準正規分布
-
の項までのEdgeworth展開n^{-\frac{1}{2}} -
の項までのEdgeworth展開n^{-1}
-
- 以下の4つのグラフを見比べてみる
可視化コード
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import norm, gamma
from scipy.special import hermitenorm
def edgeworth_gamma_pdf(zs, n, alpha, approx_degree=2):
h3 = hermitenorm(3, monic=True)
h4 = hermitenorm(4, monic=True)
h6 = hermitenorm(6, monic=True)
coef = np.ones(len(zs))
if approx_degree >= 1:
coef += (h3(zs) / (3 * np.sqrt(alpha))) / np.sqrt(n)
if approx_degree >= 2:
coef += (h4(zs) / (4 * alpha) + h6(zs) / (18 * alpha)) / n
return coef * norm.pdf(zs, loc=0, scale=1)
def plot_gamma():
alpha = 1
ns = [5, 10]
zs = np.linspace(-5, 5, 1001)
_, axes = plt.subplots(1, len(ns), figsize=(12, 6))
for fig_index, n in enumerate(ns):
gamma_ps = gamma.pdf(zs, a=n * alpha, loc=-np.sqrt(n * alpha), scale=1/np.sqrt(n * alpha))
axes[fig_index].plot(zs, gamma_ps, label="Z", color="black")
axes[fig_index].plot(zs, edgeworth_gamma_pdf(zs, n, alpha, approx_degree=0), label="Normal(0, 1)", color="blue")
axes[fig_index].plot(zs, edgeworth_gamma_pdf(zs, n, alpha, approx_degree=1), label=f"Edgeworth($n^{{- 1 / 2}} $)", color="orange")
axes[fig_index].plot(zs, edgeworth_gamma_pdf(zs, n, alpha, approx_degree=2), label=f"Edgeworth($n^{{- 1}} $)", color="green")
axes[fig_index].set_title(f"Probability Densities (n={n})")
axes[fig_index].legend(loc="upper right")
plt.tight_layout()
plt.show()
def main():
plot_gamma()
if __name__ == "__main__":
main()
グラフを見ると, 以下のことが読み取れる:
- Edgeworth展開の方が, 標準正規分布と比べてZのラインに近いことがわかる
- 確率密度関数のEdgeworth展開を有限の項で止めた場合, 必ずしもその値は0以上になるとは限らない
所感
- Edgeworth展開はこの記事を書く際に読んでいた文献の中で出会ったものだが, 調べてみるとなかなか汎用性も高く面白い手法だと感じた
- 統計量の漸近的な挙動を解析するのに非常に便利
- 数学的な正しさの議論をするには今の自分の数学力では太刀打ちできないため, 気長に勉強を続けていきたい
参考資料
- Kimura, M. (2020). Edgeworth expansion and CLT (Github Pages).
- Hall, P. (2005). The Bootstrap and Edgeworth Expansion (Springer Series in Statistics).
-
引用符を付けたのは,
は実際には確率密度関数にはならないため(値は負になりえるし, 積分しても1にならない). ↩︎H_{k}(z) \phi(z)
Discussion