ガンマ分布のパラメータを推定したい。しかし、最尤推定法を使おうとすると、尤度方程式に解析解がなく、数値計算が必要になる。
もっと簡単に推定できないだろうか?
モーメント法(method of moments)は、そんな場面で活躍する推定法である。「母集団のモーメント(平均や分散など)を標本から計算したモーメントで置き換える」という単純なアイデアに基づき、多くの場合、解析的に推定量を求めることができる。
直感的理解
サイコロを100回投げて、出た目の平均が 3.48 だったとする。公正なサイコロの理論的な期待値は 3.5 である。標本平均 3.48 は理論値 3.5 に近い。
この「標本から計算した値が、理論的な値に近づく」という性質を逆に利用するのがモーメント法の発想である。具体的には、次のようにする。
母集団のモーメント(期待値、分散など)をパラメータで表し、それを標本モーメント(標本平均、標本分散など)と等しいとおいて、パラメータについて解く。
たとえば、ある分布の期待値が E[X] = \theta と表されるなら、\theta = \bar{X}(標本平均)と推定する。これがモーメント法の基本である。
定義
母集団モーメント
確率変数 X の原点まわりの k 次モーメント(raw moment)は
で定義される。特に \mu'_1 = E[X] は期待値(平均)である。
中心モーメント(central moment)は、期待値からの偏差のべき乗の期待値で
と定義される。特に \mu_2 = V[X] は分散である。
標本モーメント
標本 X_1, X_2, \ldots, X_n から計算される標本モーメントは、母集団モーメントの推定量として使われる。
\hat{\mu}'_1 = \bar{X} は標本平均、\hat{\mu}_2 は標本分散(n で割る)である。
モーメント法による推定
分布のパラメータを \theta = (\theta_1, \ldots, \theta_m) とする。モーメント法では、以下の手順で推定量を求める。
Step 1: 母集団モーメント \mu'_1, \mu'_2, \ldots をパラメータ \theta の関数として表す。
Step 2: 母集団モーメントを標本モーメントと等しいとおく。
Step 3: この連立方程式を \theta について解く。
原点まわりのモーメントを使っても中心モーメントを使っても、同じ推定量が得られることが多い。状況に応じて計算しやすい方を選べばよい。
例1:正規分布
正規分布 N(\mu, \sigma^2) に従う標本 X_1, \ldots, X_n から、平均 \mu と分散 \sigma^2 をモーメント法で推定する。
母集団モーメント
正規分布の期待値と分散は
モーメント方程式
これらを標本モーメントと等しいとおく:
モーメント推定量
正規分布の場合、モーメント推定量は最尤推定量と一致する。
例2:ガンマ分布
ガンマ分布 \text{Ga}(\alpha, \beta) は形状パラメータ \alpha > 0 と尺度パラメータ \beta > 0 をもつ。確率密度関数は
この分布の最尤推定量は \alpha について解析解がなく、数値計算が必要になる。しかし、モーメント法なら簡単に求められる。
母集団モーメント
ガンマ分布の期待値と分散は
パラメータを解く
期待値と分散の式から \alpha と \beta を求める。分散を期待値で割ると
よって \beta = \dfrac{V[X]}{E[X]}。これを期待値の式に代入すると
モーメント推定量
母集団モーメントを標本モーメントで置き換えて
ここで S^2 = \dfrac{1}{n} \sum_{i=1}^{n} (X_i - \bar{X})^2 は標本分散(n で割る)である。
最尤法では数値計算が必要なガンマ分布のパラメータも、モーメント法なら標本平均と標本分散だけで簡単に推定できる。
例3:一様分布
区間 [0, \theta] 上の一様分布から標本が得られたとき、未知の上端 \theta を推定する。
母集団モーメント
一様分布 U(0, \theta) の期待値は
モーメント方程式
モーメント推定量
この推定量は不偏である(E[\hat{\theta}_{\text{MoM}}] = 2E[\bar{X}] = 2 \cdot \dfrac{\theta}{2} = \theta)。
最尤推定量との比較
一方、一様分布の最尤推定量は \hat{\theta}_{\text{MLE}} = X_{(n)}(標本の最大値)である。こちらはバイアスをもつが、分散が小さい。
下のグラフは、真の値 \theta = 10、サンプルサイズ n = 20 での両推定量のシミュレーション結果である。
モーメント推定量は真の値 \theta = 10 を中心に対称に分布するが、ばらつきが大きい。最尤推定量は常に \theta 以下だが(最大値は真の上端を超えないため)、真の値に集中している。
モーメント法の性質
一致性
大数の法則により、標本モーメントは母集団モーメントに確率収束する。したがって、モーメント推定量も真のパラメータに確率収束する。つまり、一致性をもつ。
漸近正規性
中心極限定理とデルタ法を用いて、モーメント推定量の漸近分布を導出できる。多くの場合、近似的に正規分布に従う。
効率性の比較
一般に、モーメント推定量は最尤推定量より効率が低い(分散が大きい)ことが多い。しかし、計算の簡便さとのトレードオフで選択される。
| 特性 | モーメント法 | 最尤法 |
|---|---|---|
| 計算の容易さ | ○ 簡単(連立方程式) | △ 数値計算が必要な場合あり |
| 効率性 | △ やや劣ることが多い | ○ 漸近有効 |
| 一致性 | ○ あり | ○ あり |
| 漸近正規性 | ○ あり | ○ あり |
練習問題
指数分布の期待値は E[X] = \dfrac{1}{\lambda} なので、モーメント方程式は
これを解いて
この場合、モーメント推定量と最尤推定量は一致する。
ポアソン分布では E[X] = \lambda なので
ポアソン分布でも、モーメント推定量と最尤推定量は一致する。
\mu = \bar{X}、\sigma^2 = S^2 とおく。期待値の式より
分散の式に \beta = \alpha\dfrac{1-\mu}{\mu} を代入して整理すると
これを用いて
まとめ
| 項目 | 内容 |
|---|---|
| 考え方 | 母集団モーメントを標本モーメントで置き換える |
| 原点まわりモーメント | \mu'_k = E[X^k] |
| 標本モーメント | \hat{\mu}'_k = \dfrac{1}{n}\sum X_i^k |
| 長所 | 計算が簡単、解析解が得やすい |
| 短所 | 最尤法より効率が低い場合がある |
| 分布 | パラメータ | モーメント推定量 |
|---|---|---|
| 正規分布 | \mu, \sigma^2 | \hat{\mu} = \bar{X}, \hat{\sigma}^2 = S^2 |
| ガンマ分布 | \alpha, \beta | \hat{\alpha} = \dfrac{\bar{X}^2}{S^2}, \hat{\beta} = \dfrac{S^2}{\bar{X}} |
| 一様分布 U(0,\theta) | \theta | \hat{\theta} = 2\bar{X} |
| 指数分布 | \lambda | \hat{\lambda} = \dfrac{1}{\bar{X}} |
| ポアソン分布 | \lambda | \hat{\lambda} = \bar{X} |
Pythonで実装する
ガンマ分布のパラメータをモーメント法と最尤法で推定し、結果を比較する。
import numpy as np
from scipy import stats
np.random.seed(42)
# 真のパラメータ
true_alpha = 3.0 # 形状パラメータ
true_beta = 2.0 # 尺度パラメータ
n = 100
# サンプルデータを生成
data = np.random.gamma(true_alpha, true_beta, n)
print("=== ガンマ分布のパラメータ推定 ===")
print(f"真の値: α = {true_alpha}, β = {true_beta}")
print(f"サンプルサイズ: n = {n}")
print()
# モーメント法
sample_mean = data.mean()
sample_var = data.var(ddof=0) # n で割る
alpha_mom = sample_mean**2 / sample_var
beta_mom = sample_var / sample_mean
print("【モーメント法】")
print(f"標本平均: {sample_mean:.4f}")
print(f"標本分散: {sample_var:.4f}")
print(f"α の推定量: {alpha_mom:.4f}")
print(f"β の推定量: {beta_mom:.4f}")
print()
# 最尤法(scipy.stats を使用)
alpha_mle, loc_mle, beta_mle = stats.gamma.fit(data, floc=0)
print("【最尤法】")
print(f"α の推定量: {alpha_mle:.4f}")
print(f"β の推定量: {beta_mle:.4f}")
print()
# 推定精度の比較(シミュレーション)
n_sim = 1000
alpha_mom_list, alpha_mle_list = [], []
beta_mom_list, beta_mle_list = [], []
for _ in range(n_sim):
data = np.random.gamma(true_alpha, true_beta, n)
# モーメント法
m, v = data.mean(), data.var(ddof=0)
alpha_mom_list.append(m**2 / v)
beta_mom_list.append(v / m)
# 最尤法
a, _, b = stats.gamma.fit(data, floc=0)
alpha_mle_list.append(a)
beta_mle_list.append(b)
print("=== 推定精度の比較(1000回シミュレーション)===")
print()
print("【α の推定】")
print(f" モーメント法: 平均 = {np.mean(alpha_mom_list):.3f}, "
f"標準偏差 = {np.std(alpha_mom_list):.3f}")
print(f" 最尤法: 平均 = {np.mean(alpha_mle_list):.3f}, "
f"標準偏差 = {np.std(alpha_mle_list):.3f}")
print()
print("【β の推定】")
print(f" モーメント法: 平均 = {np.mean(beta_mom_list):.3f}, "
f"標準偏差 = {np.std(beta_mom_list):.3f}")
print(f" 最尤法: 平均 = {np.mean(beta_mle_list):.3f}, "
f"標準偏差 = {np.std(beta_mle_list):.3f}")
シミュレーション結果を見ると、最尤法の方が標準偏差が小さい(効率が良い)ことがわかる。しかし、モーメント法も十分実用的な精度で推定できている。