【データ解析のための統計モデリング入門】9章 GLMのベイズモデル化と事後分布の推定

データ解析のための統計モデリング入門を読んでいる。
その読書メモ。

GLMのベイズモデル化

個体{i}の種子数{y_i}のばらつきを平均{\lambda_i}ポアソン分布{p(y_i | \lambda_i)}にしたがうとする。 線形予測子と対数リンク関数を使って、その平均を{\lambda_i = exp(\beta_1 + \beta_2 x_i)}とする。

このモデルの尤度関数は {} $$ L(\beta_1, \beta_2) = \prod_i p(y_i | \lambda_i) = \prod_i p(y_i | \beta_1, \beta_2, x_i) $$

ベイズモデルの事後分布は(尤度)×(事前分布)に比例する。

なぜベイズモデル化するのか?

現実のデータでは、複数のランダム効果がある状況や、隠れた状態を扱わなければならない状況や、空間構造や時系列構造を扱わなければならない状況がある。 そういった複雑な状況に対処するためにベイズ統計モデルが使われるようになってきた。

ベイズ統計モデルの事後分布推定では、

  • GLMの問題を、ベイズモデル化する
  • MCMCサンプリングする
  • 事後分布のサンプルデータを得る
  • サンプルデータから各パラメータの事後分布を推定する

まとめ

  • 全個体に共通するパラメータの事前分布として、「どのような値でもかまわない」ことを表現する無情報事前分布を指定する
  • MCMCアルゴリズムはさまざまなものがあり、特にギブスサンプリングは効率の良い方法のひとつである。

yusuke-ujitoko.hatenablog.com

【データ解析のための統計モデリング入門】8章 マルコフ連鎖モンテカルロ(MCMC)法とベイズ統計モデル

データ解析のための統計モデリング入門を読んでいる。
その読書メモ。

現実のデータ解析では、第7章よりも複雑な、例えば個体差だけでなく場所差なども同時に考慮した統計モデルが必要になる。
統計モデルに組み込まれたランダム効果の発生源の種類が増えるにつれ、パラメータの推定は困難になる。
発生源の種類がK個のときは、K回の多重積分が必要となる。

このような複雑な統計モデルのあてはめで威力を発揮するのが、マルコフ連鎖モンテカルロ法(MCMC method)。

例題:種子の生存確率(個体差なし)

ふらふら試行錯誤による最尤推定

MCMCアルゴリズムのひとつ:メトロポリス

メトロポリス法では、尤度を勾配にしたがって最大にしていくのだが、 ランダムに説明変数を動かして、尤度を計算する。
現在よりも尤度が大きくなる場合、そのまま説明変数を動かす。
現在よりも尤度が小さくなる場合、尤度比(=動かした先の尤度/動かす前の現在の尤度)を確率として、尤度が小さくなる方向へすすめる。

ひとつのステップの中で前の状態に基づいて新しい状態を作り出しているので、マルコフ連鎖(Markov chain)になっている。
また一般に、乱数を利用した計算アルゴリズムモンテカルロ法と呼ばれる。

メトロポリス法などMCMCアルゴリズムの目的は、何か特定の値の探索ではない。
ステップ数とともに変化するパラメータ値の生成にある。

定常分布は何を表すのか?

メトロポリス法で生成されたパラメータ値の分布を定常分布と呼んでいる。
この例題では、定常分布は尤度に比例する確率分布となる。

メトロポリス法と定常分布の関係

まとめ

  • 最尤推定法は尤度最大になるパラメータを探索する最適化である
  • これに対して、MCMCアルゴリズムは定常分布からのランダムサンプリングが目的である。
  • 今扱っている統計モデルがベイズ統計モデルだとすると、定常分布は事後分布であるとみなせる。

yusuke-ujitoko.hatenablog.com

【データ解析のための統計モデリング入門】7章 一般化線形混合モデル(GLMM)

データ解析のための統計モデリング入門を読んでいる。
その読書メモ。

一般化線形モデル(GLM)は確率分布・リンク関数・線形予測子を組み合わせて、応答変数{y_i}と説明変数{x_i}を関連付けるシステム。
でも現実のデータ解析には応用しづらい。
その理由は、実際の実験や調査で得たカウントデータのばらつきは、ポアソン分布や二項分布だけではうまく説明できないこと。
現実の世界では「説明変数以外はすべて均質」という条件は満たされない。

問題はデータにばらつきをもたらす「個体間の差異」を定量化できないところ。
でも「なんか分からないが個体差がある」ことを統計モデルで表現することはできる。

この章ではこのような人間が測定できない、測定しなかった個体差を組み込んだGLMである一般化線形混合モデル(Generalized Linear Mixed Model:GLMM)を扱う。
このGLMMは

  • データのばらつきは二項分布やポアソン分布で表す
  • 個体間のばらつきは正規分布で表す

というモデル。

個体間のばらつきとして「各個体のなにかに起因しているように見える差」を定量化・特定することはどうやっても不可能。
したがって、原因不明のままこれらの及ぼす影響をうまく取り込んだ統計モデルが必要となる。

一般化線形混合モデル

種子の生存確率{q_i}として、個体{i}の個体差を表すパラメータ{r_i}を考慮してみる。 {} $$ logit(q_i) = \beta1 + \beta_2 x_i + r_i $$

GLMMの特徴は、個体差を表すパラメータ{r_i}が何かの確率分布に従っていると仮定するところ。
とりあえず平均ゼロで標準偏差{s}正規分布に従うと仮定する。

なぜ「混合」モデルと呼ばれるか。 統計モデルに線形予測子が含まれる場合、その構成要素は伝統的に固定効果(fixed effects)とランダム効果(random effects)に分類されてきた。 線形予測子に、固定効果とランダム効果の表す項をもっているので、そのようなGLMは混合(mixed)モデルと呼ばれる。

一般化線形混合モデルの最尤推定

GLMMに含まれている個体差{r_i}最尤推定できない。
なぜなら、例えば100個のデータ{y_i}を説明するために、100個の{r_i}を使っているから。
100個しかデータがないのに、100個の{r_i}とその他のパラメータを推定するのは無理。

個体差{r_i}最尤推定できないにもかかわらず、{\beta_1, \beta_2}最尤推定したいときにはどうするか。
このような時の対処法の一つとしては、個体ごとの尤度{L_i}の式の中で、{r_i}積分する。
{} $$ L_i = \int_{-∞}^{∞} p(y_i | \beta_1, \beta_2, r_i)p(r_i|s)dr_i $$

このようにすると尤度から{r_i}が消える。
このように無限個の二項分布を混ぜることで、平均よりも分散の大きい過分散な確率分布を作れる。

確率分布を混ぜて新しい確率分布を作るというのは、統計モデルづくりの基本的な技法の一つ。

現実のデータ解析にはGLMMが必要

GLMMのような考え方が必要になるかどうかの判断のポイントは、「同じ個体、場所などから何度もサンプリングしているか」あるいは「個体差や場所さが識別できてしまうようなデータのとり方をしているか」といったところにある。

まとめ

  • 現実のデータではGLMをうまくあてはめられない場合がある
  • GLMでは「説明変数が同じならどの個体も均質」と仮定していたが、観測されていない個体差があるので、集団全体の生存種子数の分布は二項分布で期待されるより過分散なものになる
  • このような状況に対応しているGLMMとは、線形予測子に個体差のばらつきを表すパラメータ{r_i}を追加し、全個体のパラメータ{r_i}がある確率分布に従うと仮定した統計モデルである
  • 積分によって{r_i}を消去した尤度を最大化することで、GLMMの切片・傾きそして{r_i}のばらつきといった、大域的なパラメータを最尤推定できる
  • 一つの個体から複数のデータをとったり、一つの場所に多数の調査対象がいるような状況は擬似反復と呼ばれ、このような構造のデータに統計モデルを当てはめるときには、個体差、場所さなどを組み込んだGLMMが必要である
  • データのばらつきを表す確率分布の種類がどのようなものであっても、個体差・場所さなどに影響されるデータの部分集合があれば、これらの効果をランダム効果として組み込んだ統計モデルで推定しなければならない。

yusuke-ujitoko.hatenablog.com

【データ解析のための統計モデリング入門】6章 GLMの応用範囲をひろげる

データ解析のための統計モデリング入門を読んでいる。
その読書メモ。

この章ではさまざまなGLMに触れる。

さまざまな種類のデータで応用できるGLM

GLMの特徴は、確率分布・リンク関数・線形予測子の組み合わせを指定することによってさまざまなタイプのデータを表現できること。

例題:上限のあるカウントデータ

二項分布を使ったGLMについて見ていく。
ポアソン分布は上限のないカウントデータを表現するのに使ったが、二項分布は上限のあるカウントデータに対して使う。
たとえば、「N個体の実験対象に同じ処理をしたら、y個体で反応が陽性、N-y個体で陰性だった」という構造のデータは二項分布で説明を試みる。

ちなみにポアソン分布は、応答変数が「0以上だけど上限がどこにあるのかわからないカウントデータ」を扱う。

二項分布の確率分布は、 {} $$ p(y | N, q) = \begin{pmatrix} N \\ y \end{pmatrix} q^{y} (1-q)^{N-y} $$

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv("data4a.csv")
df.describe()
N y x
count 100.0 100.000000 100.000000
mean 8.0 5.080000 9.967200
std 0.0 2.743882 1.088954
min 8.0 0.000000 7.660000
25% 8.0 3.000000 9.337500
50% 8.0 6.000000 9.965000
75% 8.0 8.000000 10.770000
max 8.0 8.000000 12.440000
df_c = df[df.f == 'C']
df_t = df[df.f == 'T']

plt.scatter(df_c['x'], df_c['y'], label='C')
plt.scatter(df_c['x'], df_t['y'], label='T')

plt.legend()
plt.savefig("survive.png")

f:id:yusuke_ujitoko:20170313215716p:plain

二項分布を図示してみる。

f:id:yusuke_ujitoko:20170313215710p:plain

ロジスティック回帰とロジットリンク関数

GLMは確率分布・リンク関数・線形予測子を指定する統計モデルであり、 ロジスティック回帰では確率分布は二項分布、そしてリンク関数はロジットリンク関数を指定する。

二項分布では事象が生起する確率をパラメータとして指定する必要がある。 ロジスティック関数の関数形は、 {} $$ q_i = logistic(z_i) = \frac{1}{1 + exp(-z_i)} $$

であり変数{z_i}は線形予測子{z_i = \beta_1 + \beta_2 x_i + \cdots}
ロジスティック関数を変形すると、以下のようになる。 {} $$ logit(q_i) = log \frac{q_i}{1-q_i} $$

GLM

import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf

fit = smf.glm(formula='y + I(N -y) ~ x + f', data=df, family=sm.families.Binomial())
res_fit = fit.fit()

res_fit.summary()
Generalized Linear Model Regression Results
Dep. Variable: ['y', 'I(N - y)'] No. Observations: 100
Model: GLM Df Residuals: 97
Model Family: Binomial Df Model: 2
Link Function: logit Scale: 1.0
Method: IRLS Log-Likelihood: -133.11
Date: Tue, 14 Mar 2017 Deviance: 123.03
Time: 07:09:30 Pearson chi2: 109.
No. Iterations: 8


coef std err z P>|z| [95.0% Conf. Int.]
Intercept -19.5361 1.414 -13.818 0.000 -22.307 -16.765
f[T.T] 2.0215 0.231 8.740 0.000 1.568 2.475
x 1.9524 0.139 14.059 0.000 1.680 2.225

交互作用項の入った線形予測子

ここまで使ってきた線形予測子 {\beta_1 + \beta_2 x_i + \beta_3 f_i }を更に複雑化して交互作用項を追加してみる。つまり積の効果を追加する。 交互作用項を加えた線形予測子は

{} $$ logit(q_i) = \beta_1 + \beta_2 x_i + \beta_3 f_i + \beta_4 x_i f_i $$

となる。

fit = smf.glm(formula='y + I(N - y) ~ x * f', data=df, family=sm.families.Binomial())
res_fit = fit.fit()

res_fit.summary()
Generalized Linear Model Regression Results
Dep. Variable: ['y', 'I(N - y)'] No. Observations: 100
Model: GLM Df Residuals: 96
Model Family: Binomial Df Model: 3
Link Function: logit Scale: 1.0
Method: IRLS Log-Likelihood: -132.81
Date: Tue, 14 Mar 2017 Deviance: 122.43
Time: 07:28:17 Pearson chi2: 109.
No. Iterations: 8


coef std err z P>|z| [95.0% Conf. Int.]
Intercept -18.5233 1.886 -9.821 0.000 -22.220 -14.827
f[T.T] -0.0638 2.704 -0.024 0.981 -5.363 5.235
x 1.8525 0.186 9.983 0.000 1.489 2.216
x:f[T.T] 0.2163 0.280 0.772 0.440 -0.333 0.765

この例では交互作用項を増やしたモデルでは予測は悪くなっている。 交互作用項を使うときに注意すべきことは、むやみに交互作用項を入れないということ。 説明変数が多い場合には交互作用項の個数が組み合わせ論的爆発で増加してパラメータ推定が困難になる。

割算値の統計モデリングはやめよう

二項分布とロジットリンク関数を使ったロジスティック回帰を使う利点のひとつは、「種子が生存している確率」「処理に応答する確率」といった何かの世紀確率を推定するときに、(観測データ)/(観測データ)の割算値を作り出す必要がなくなること。

観測データどうしの割算によって生じる問題としては、以下のようなものがある。

  • 情報が失われる
    • 1000打数300安打の打者と10打数3安打の打者が同様に確からしい「三割打者」と扱われてしまう。
  • 変換された値の分布はどうなる?
    • 分子、分母にそれぞれ誤差の入った数量同士を割算して作られた割算地はどんな確率分布に従う?

割算をしないためのテクニック

例として面積が{A_i}である調査地{i}における人口密度を変数としたくなった際に、 {} $$ \lambda_i = A_i \times (人口密度) = A_i exp(\beta_1 + \beta_2 x_i) $$

とモデル化する。 これを変形すると、 {} $$ \lambda_i = exp(\beta_1 + \beta_2 x_i + log A_i) $$ となり、 {z_i = \beta_1 + \beta_2 x_i + log A_i}を線形予測子とする対数リンク関数、ポアソン分布のGLMになる。

確率密度と確率

正規分布など、連続値の確率分布では、確率密度を積分した値が確率と定義されている。

from scipy import stats

y = np.arange(-5, 5, 0.1)

plt.plot(pd.Series(stats.norm.pdf(y, loc=0, scale=1), index=y), label=r'$\mu=0, \sigma=1$')
plt.plot(pd.Series(stats.norm.pdf(y, loc=0, scale=3), index=y), label=r'$\mu=0, \sigma=3$')
plt.plot(pd.Series(stats.norm.pdf(y, loc=2, scale=1), index=y), label=r'$\mu=2, \sigma=1$')

plt.legend()
plt.savefig("Gaussian.png")

f:id:yusuke_ujitoko:20170313230357p:plain

まとめ

  • GLMでは応答変数のばらつきを表現する確率分布は正規分布だけでなく、ポアソン分布・二項分布・ガンマ分布などが選択できる
  • 「N個の観察対象のうちk個で反応が見られた」というタイプのデータに見られるばらつきを表すために二項分布が使える
  • 生起確率と線形予測子を結びつけるロジットリンク関数を使ったGLMのあてはめは、ロジスティック回帰と呼ばれる
  • 線形予測子の構成要素として、複数の説明変数の積の効果をみる交互作用項が使える
  • データ解析でしばしばみられる観測値同士の割算値作成や、応答変数の変数変換の問題点をあげ、ロジスティック回帰やオフセット項の工夫をすれば、情報消失の原因となる「データの加工」は不要になる
  • 連続値の確率変数のばらつきを表現する確率分布としては、正規分布・ガンマ分布などがあり、これらを統計モデルの部品として使うときには、離散値の確率分布との違いに注意しなければならない

yusuke-ujitoko.hatenablog.com

【データ解析のための統計モデリング入門】5章 GLMの尤度比検定と検定の非対称性

データ解析のための統計モデリング入門を読んでいる。
その読書メモ。

この章では、どのような統計モデルでも利用可能な尤度比検定(likelihood ratio test)について説明する。
これは前のモデル選択の章に登場した逸脱度の差に注目する考え方。

パラメトリックとノンパラメトリック

全パラメータを最尤推定できる統計モデルは、パラメトリックな統計モデルと総称できる。
ここでいうパラメトリックとは、比較的少数のパラメータをもつという意味。

ノンパラメトリックは、順序統計量を使った、という意味や、多数のパラメータを使って自由自在な構造をもつ、といった意味にも使われる。

統計学的な検定の枠組み

尤度比検定の例題:逸脱度の差を調べる

今回の例題では以前扱った、単純モデル・複雑モデルをそれぞれ帰無仮説・対立仮説とする。
尤度比検定では最大尤度の比を扱う。
{} $$ \frac{L_1}{L_2} = \frac{一定モデルの最大尤度}{xモデルの最大尤度} $$

しかしこれをそのまま検定統計量として使うわけではない。
尤度比検定では、尤度比の対数を取り、-2をかける。
つまり逸脱度の差に変換して検定統計量として使う。
{} $$ ΔD_{1,2} = −2 \times (Log L_{1} – Log L_{2}) $$

例題では逸脱度の差は4.5程度だった。
尤度比検定では、逸脱度の差がこの4.5程度で改善されているとみなすのかを調べる。

検定全体のステップとしては以下のようになる。

  • まずは帰無仮説である一定モデルが正しいものだと仮定する
  • 観測データに一定モデルを当てはめると、{\beta_1 = 2.06}となったので、これは真のモデルとほぼ同じと考えよう
  • この真のモデルからデータを何度も生成し、そのたびに {\beta_2 = 0}{\beta_2 ≠ 0}のモデルを当てはめれば、沢山の{⊿D_{1,2}}が得られるから、{⊿D_{1,2}}の分布がわかるだろう。
  • そうすれば、一定モデルとxモデルの逸脱度の差が{⊿D_{1,2} > 4.5}となる確率Pが評価できるだろう。

汎用性のあるパラメトリックブートストラップ法

パラメトリックブートストラップ法は、データを何度も生成する過程を乱数発生のシミュレーションによって実施する方法。

まず一定モデルとxモデルの逸脱度の差を計算する。

import statsmodels.api as sm
import statsmodels.formula.api as smf

fit1 = smf.glm(formula='y ~ 1', data=df, family=sm.families.Poisson())
fit2 = smf.glm(formula='y ~ x', data=df, family=sm.families.Poisson())

# 逸脱度の差
print(fit1.fit().deviance - fit2.fit().deviance)

4.51394107885

一定モデルを真のモデルとして、ここから100個新たにデータを生成し、一定モデルとxモデルをこの新データに当てはめる。

df['y_rnd'] = np.random.poisson(df.y.mean(), 100)

fit1 = smf.glm(formula='y_rnd ~ 1', data=df, family=sm.families.Poisson())
fit2 = smf.glm(formula='y_rnd ~ x', data=df, family=sm.families.Poisson())

# 逸脱度の差
print(fit1.fit().deviance - fit2.fit().deviance)

0.00103719102299

こうして一定モデルを真のモデルと仮定したもとでの逸脱度を繰り返し貯めていく。

def get_dd(df):
    df['y_rnd'] = np.random.poisson(df.y.mean(), 100)

    fit1 = smf.glm(formula='y_rnd ~ 1', data=df, family=sm.families.Poisson())
    fit2 = smf.glm(formula='y_rnd ~ x', data=df, family=sm.families.Poisson())

    # 逸脱度の差
    return (fit1.fit().deviance - fit2.fit().deviance)

def pb(df, n_bootstrap):
    return pd.Series([get_dd(df) for i in range(n_bootstrap)])

dd12 = pb(df, 1000)
print(dd12.describe())

こうして得た逸脱度を視覚化する。

plt.hist(dd12, 100)
plt.xlim(0, 14)
plt.axvline(x=4.5, linestyle='--')

plt.savefig("hst.png")

f:id:yusuke_ujitoko:20170312184317p:plain

この逸脱度の集合のうち、4.5より右にある数は

print(sum(dd12 >= 4.5))

37個となった。
つまりp=37/1000=0.037ということになる。
よってP値が0.037だったので、これは有意水準0.05よりも小さいので有意差ありと判断され、帰無仮説は棄却される。

χ二乗分布を使った近似計算法

逸脱度の差の確率分布は、自由度1の[tex:{\chi2}]分布で近似できる場合がある。

まとめ

  • Neyman-Pearsonの統計学的検定の枠組みでは、パラメータ数の少ないモデルを帰無仮説と位置づけ、帰無仮説が棄却できるかの確率評価に専念する
  • 尤度比検定の検定統計量はふたつの統計モデルの逸脱度差である
  • 検定における過誤は2種類あるが、Neyman-Pearsonの検定の枠組みでは帰無仮説の誤棄却を重視する
  • 帰無仮説を棄却する有意水準αの大きさは解析者が任意に決めるものである。
  • Neyman-Pearsonの検定の枠組みでは、第一種の過誤の大きさを正確に評価できるが、一方で帰無仮説が棄却できない場合の結論は何もいえない。判断を保留する。
  • 検定やモデル選択の結果だけに注目するのではなく、推定された統計モデルが対象となる現象の挙動を、どのように予測しているのかも確認するべきだ。

yusuke-ujitoko.hatenablog.com