確率・統計

(18) 一般化線形モデル (Generalized Linear Model)

自然科学には様々な法則や関係式が存在します。例えば、バネの復元力はバネの伸び(または縮み)に比例し(「フックの法則 (Hooke's Law)」)、電圧は電流に比例します(「オームの法則 (Ohm's Law)」)。従って、その比例定数がわかっていれば、バネにものをぶら下げた時にどの程度バネが伸びるか、またどの程度の電圧にすれば必要な電流が得られるか、といったことを求めることができます。この比例定数は、あらかじめ実験で得られた測定値を元に求めたり、理論から計算することができます。自然科学だけではなく社会学・経済学・心理学などにおいても経験則などから得られた様々な関係式があり、それを元に値の推測などを行うことができます。
測定値を元に式を求める場合、測定誤差などにより完全に正しい結果を得ることはできません。その誤差はコントロールができないので、ある確率分布に従うと仮定して式を定義し、さらに得られた結果がどれだけ信頼できるのかを推定するための指標として利用します。このように定義した式の中で、値を求めるために使われる変数は「説明変数(独立変数)」といい、式から得られた値を「目的変数(従属変数)」といいます。独立変数に対する係数(比例定数)が従属変数に対する線形式で表され、誤差成分が正規分布に従うとした時の式は「線形重回帰モデル (Linear Multiple Regression Model)」と呼ばれ、その係数は最尤推定量として求めることができます。

今までに紹介したデータ分析法の中の「分散分析 (ANOVA)」や「共分散分析 (ANCOVA)」は、ダミー変数を利用した線形重回帰モデルの一種でした。このように、線形重回帰モデルは広く使われた手法ですが、これをさらに一般化した考え方として「一般化線形モデル (Generalized Linear Model)」が利用されるようになりました。今回は、この「一般化線形モデル」について紹介したいと思います。

(注) 数式などの記法について (ドキュメントの中で使用している数式の表現方法に関する注意点です)

1) 一般化線形モデル (Generalized Linear Model)

線形重回帰モデルは、次のような特徴を持っていました。

  1. 従属変数 yi は、独立変数 xi に対する係数 α の線形式で表される
  2. 従属変数 yi は、期待値 μi、分散 σ2 の正規分布 N( μi, σ2 ) に従う

ここで xiα はベクトルであり、その要素数は独立変数の数を表します。また、i は独立変数ベクトル xi そのものの番号を表しています。xi = ( xi1, xi2, ... xip )、α = ( α1, α2, ... αp ) とし、α0 を定数項とすれば、

yi = α0 + α1xi1 + ... + αpxip + εi

と表され、εi は正規分布 N( 0, σ2 ) に従うと考えれば、yi の期待値 μi = E[yi] は

μi = E[yi] = α0 + α1xi1 + ... + αpxip

となります。xi0 = 1 として xiα に定数項も追加すれば、

μi = E[yi] = ( xi, α ) = xiTα

と非常にシンプルな形で表現することができるようになり、このとき yi は正規分布 N( μi, σ2 ) に従います。

独立変数ベクトルが N 個あれば、上記のような線形式も N 個作ることができます。これらを縦に並べると、

E[y1]=x1Tα
E[y2]=x2Tα
:
E[yN]=xNTα

となり、μ = E[y] = ( E[y1], E[y2], ... E[yN] )TX = ( x1T, x2T, ... xNT )T とすれば

μ = E[y] =

と表すことができます。X は N 行 p + 1 列の行列であり、μ は N 個、α は p + 1 個の要素数を持つベクトルです。「重回帰分析」「分散分析」「共分散分析」におけるモデル式は、全てこの式から表すことができるのでした。

測定などの誤差成分は線形式を使って表すことができないため、線形重回帰モデルでは正規分布に従うランダムな値としています。このとき、従属変数も正規分布に従うのは前述した通りです。しかし、一般的に全てのパラメータが正規分布に従うわけではなく、その他の確率密度関数を利用して推定した方がより精度の良い結果が得られる場合も充分に考えられます。また、従属変数と独立変数が線形関係だけで成り立つとは限らないので、さらに一般的なモデル式を採用することによって表現の幅を広げることを検討します。そこで、まずは上記線形モデル式の右辺にあたる線形式が単純に従属変数と一致するのではなく、単調増加(または短調減少)で微分可能なある関数 g(y) によって関連付けられると考え、

g(μi) = g( E[yi] ) = xiTα

という形に拡張します。この関数 g(y) は「連結関数 (Link Function)」といい、g( μi ) = μi (恒等関数) ならば線形重回帰モデルと一致します。また、yi が従う確率密度関数も正規分布から拡張して「指数型分布族 (Exponential Family of Distributions)」というより一般化したものが扱えるようにします。詳しくは後述しますが、正規分布は指数型分布族に含まれる確率分布になります。


2) 指数型分布族 (Exponential Family of Distributions)

確率密度関数が以下のような式で表現可能ならば、その確率分布は「(一母数)指数型分布族 (Single-parameter Exponential Family of Distributions)」に属するといいます。

f( y | θ ) = h(y)・exp( η(θ)T(y) - A(θ) )

h(y), T(y) は確率変数 y を変数とし、スカラー値を返す関数で、η(θ), A(θ) は確率密度関数が持つパラメータ θ を変数とし、スカラー値を返す関数です。g(θ) = e-A(θ) とすれば、上式は

f( y | θ ) = h(y)g(θ)・exp( η(θ)T(y) )

となり、逆に h(y) = eB(y) とすれば

f( y | θ ) = exp( η(θ)T(y) - A(θ) + B(y) )

になります。各関数がスカラーを返す限り、y, θ はスカラーだけでなくベクトルであっても問題ありません。η(θ) は「自然パラメータ (Natural Parameter)」と呼ばれ、A(θ) を変数変換により A(η) で表すことが可能であれば、次のように記述することができます。

f( y | η ) = h(y)・exp( ηT(y) - A(η) )

y がスカラーで T(y) = y のとき、f( y | η ) は「正準形 (Canonical Form)」であるといいます。多くのよく知られた確率分布は、正準形の指数型分布族に属しています。

パラメータ η が複数ある場合、その関数を η(θ) = ( η1(θ), η2(θ), ... ηk(θ) ) で表し、η(θ) と同数の y を変数とする関数を T(y) = ( T1(y), T2(y), ... Tk(y) ) とすれば

f( y | η )=h(y)・exp( Σi{1→k}( ηi(θ)Ti(y) ) - A(η) )
=h(y)・exp( ηT(θ)T(y) - A(η) )

と表すことができます。これは「k-母数指数型分布族 (k-parameter Exponential Family of Distributions)」といいます。


前述の通り、正規分布は指数型分布族に属します。正規分布は

N( y | μ, σ2 )=[ 1 / ( 2πσ2 )1/2 ] exp( -( y - μ )2 / 2σ2 )
=exp( -( y - μ )2 / 2σ2 - ( 1 / 2 ) log( 2πσ2 ) )
=exp( -( 1 / 2σ2 )y2 + ( μ / σ2 )y - μ2 / 2σ2 - ( 1 / 2 ) log( 2πσ2 ) )

より、η1 = μ / σ2, η2 = -1 / 2σ2 とすれば

μ2 / 2σ2=( μ / σ2 )2・2σ2 / 4
=- η12 / 4η2
- ( 1 / 2 ) log( 2πσ2 )=( 1 / 2 ) log( ( 1 / π )・( 1 / 2σ2 ) )
=( 1 / 2 ) log( -η2 / π )

となるので

N( y | η ) = exp( η2y2 + η1y + η12 / 4η2 + ( 1 / 2 ) log( -η2 / 2π ) )

より、h(y) = 1、η = ( μ / σ2, -1 / 2σ2 )、T(y) = ( y, y2 )、A(η) = -η12 / 4η2 - log( -η2 / 2π ) / 2 としたとき、正規分布は 2-母数指数型分布族ということになります。しかし、通常はパラメータは一つとすることが多く、その他のパラメータは「局外パラメータ(Nuisance Parameter)」として既知の定数とみなします。正規分布の場合も、σ2 を局外パラメータとすれば、

N( y | μ )=exp( ( μ / σ2 )y - ( 1 / 2σ2 )y2 - μ2 / 2σ2 - ( 1 / 2 ) log( 2πσ2 ) )
=exp( -y2 / 2σ2 )・exp( ( μ / σ2 )y - μ2 / 2σ2 - ( 1 / 2 ) log( 2πσ2 ) )

において η = μ / σ2 としたとき、μ2 / 2σ2 = ( ησ )2 / 2 より

N( y | η ) = exp( -y2 / 2σ2 )・exp( ηy - ( ησ )2 / 2 - ( 1 / 2 ) log( 2πσ2 ) )

となって、h(y) = exp( -y2 / 2σ2 )、η = μ / σ2、T(y) = y、A(η) = ( ησ )2 / 2 + ( 1 / 2 ) log( 2πσ2 ) の一母数指数型分布族として扱うことができます。


二項分布は下式で表される離散確率密度関数です。

BN( r | π ) = NCrπr( 1 - π )N-r

π は一回の試行において成功する確率を表し、0 から 1 までの値をとるのでした。BN( r | π ) は、N 回の試行で r 回成功する確率を示します。この式は以下のように変形することができます。

BN( r | π )=NCrexp( logπr + log( 1 - π )N-r )
=NCrexp( rlogπ - rlog( 1 - π ) + Nlog( 1 - π ) )
=NCrexp( rlog( π / ( 1 - π ) ) + Nlog( 1 - π ) )

η = log( π / ( 1 - π ) ) のとき、π / ( 1 - π ) = eη より

1 - π = 1 / ( eη + 1 )

なので、二項分布は h(r) = NCr、T(r) = r、A(η) = Nlog( eη + 1 ) の一母数指数型分布族です。


ポアソン分布は下式で表される離散確率密度関数です。

P( r | λ ) = λre / r!

平均 λ 回発生する事象が r 回発生する確率はポアソン分布に従うと考えることができるのでした。この式を変形すると

P( r | λ )=( 1 / r! )exp( log( λr ) - λ )
=( 1 / r! )exp( rlogλ - λ )

なので、η = logλ とすれば λ = eη となって、h(r) = 1 / r!、T(r) = r、A(η) = eη の一母数指数型分布族であることが分かります。


指数分布は下式で表される連続確率密度関数です。

P( y | λ ) = λe-λy

時間 y の間に発生した事象の回数がポアソン分布に従うとして、一回も発生しない確率を考えると指数分布になります。この式は

P( y | λ ) = exp( -λy + logλ )

となるので、h(y) = 1、η = -λ、T(y) = y、A(η) = -log( -η ) の一母数指数型分布族となります。


次に、( 一母数 η、一確率変数 y の ) 指数型分布族が持つ性質を調べてみたいと思います。

∫{y∈Ω} f( y | θ ) dy = ∫{y∈Ω} exp( η(θ)T(y) - A(θ) + B(y) ) dy = 1

に対して、左辺の θ に対する導関数を計算すると

( ∂ / ∂θ ) ∫{y∈Ω} f( y | θ ) dy=( ∂/∂θ ) ∫{y∈Ω} exp( η(θ)T(y) - A(θ) + B(y) ) dy
=∫{y∈Ω} ( ∂ / ∂θ ) exp( η(θ)T(y) - A(θ) + B(y) ) dy
=∫{y∈Ω} [ η'(θ)T(y) - A'(θ) ]・exp( η(θ)T(y) - A(θ) + B(y) ) dy
=∫{y∈Ω} [ η'(θ)T(y) - A'(θ) ]・f( y | θ ) dy
=η'(θ)∫{y∈Ω} T(y)・f( y | θ ) dy - A'(θ)∫{y∈Ω} f( y | θ ) dy
=η'(θ)E[T(y)] - A'(θ)

になります。但し、微分と積分の式が入れ替え可能であることを前提としています。右辺はゼロになるので、η'(θ)E[T(y)] - A'(θ) = 0 より

E[T(y)] = A'(θ) / η'(θ)

となり、T(y) の期待値を求める公式が得られます。特に正準形の場合は

E[y] = A'(θ) / η'(θ)

とすることができます。A(θ) の変数を η に変数変換して A(η) とした場合は

( ∂ / ∂η ) ∫{y∈Ω} f( y | η ) dy=( ∂ / ∂η ) ∫{y∈Ω} exp( ηT(y) - A(η) + B(y) ) dy
=∫{y∈Ω} ( ∂ / ∂η ) exp( ηT(y) - A(η) + B(y) ) dy
=∫{y∈Ω} [ T(y) - A'(η) ]・exp( ηT(y) - A(η) + B(y) ) dy
=∫{y∈Ω} [ T(y) - A'(η) ]・f( y | η ) dy
=E[T(y)] - A'(η)

となるので、

E[T(y)] = A'(η)

と、非常に単純な式になります。次に、f(y|θ) の二階導関数を求めると、

f(2)( y | θ )=( ∂ / ∂θ ) { [ η'(θ)T(y) - A'(θ) ]・f(y|θ) }
=[ η(2)(θ)T(y)・f( y | θ ) + η'(θ)T(y)・f'( y | θ ) ] - [ A(2)(θ)・f( y | θ ) + A'(θ)・f'( y | θ ) ]
=[ η(2)(θ)T(y) - A(2)(θ) ]・f( y | θ ) + [ η'(θ)T(y) - A'(θ) ]・f'( y | θ )
=[ η(2)(θ)T(y) - A(2)(θ) ]・f( y | θ ) + [ η'(θ)T(y) - A'(θ) ]2・f( y | θ )

と求めることができて、E[T(y)] = A'(θ) / η'(θ) より

A'(θ) = η'(θ)E[T(y)]

を代入すると

f(2)(y|θ)=[ η(2)(θ)T(y) - A(2)(θ) ]・f( y | θ ) + [ η'(θ)T(y) - η'(θ)E[T(y)] ]2・f( y | θ )
=[ η(2)(θ)T(y) - A(2)(θ) ]・f( y | θ ) + η'(θ)2[ T(y) - E[T(y)] ]2・f( y | θ )

となります。従って、

( ∂2 / ∂θ2 ) ∫{y∈Ω} f( y | θ ) dy=∫{y∈Ω} ( ∂2 / ∂θ2 ) f( y | θ ) dy
=∫{y∈Ω} [ η(2)(θ)T(y) - A(2)(θ) ]・f( y | θ ) + η'(θ)2[ T(y) - E[T(y)] ]2・f( y | θ ) dy
=η(2)(θ)E[T(y)] - A(2)(θ) + η'(θ)2V[T(y)]
=η(2)(θ)A'(θ) / η'(θ) - A(2)(θ) + η'(θ)2V[T(y)]

より、( ∂2 / ∂θ2 ) ∫{y∈Ω} f( y | θ ) dy = 0 であることから

V[T(y)]=[ A(2)(θ) - η(2)(θ)A'(θ) / η'(θ) ] / η'(θ)2
=[ A(2)(θ)η'(θ) - η(2)(θ)A'(θ) ] / η'(θ)3

となって、T(y) の分散を求める公式が得られます。これも A(θ) の変数を η に変数変換して A(η) とした場合、二階導関数は

f(2)( y | η )=( ∂ / ∂η ) { [ T(y) - A'(η) ]・f( y | η ) }
=T(y)・f'(y|η) - [ A(2)(η)・f(y|η) + A'(η)・f'(y|η) ]
=-A(2)(η)・f(y|η) + [ T(y) - A'(η) ]・f'(y|η)
=-A(2)(η)・f(y|η) + [ T(y) - A'(η) ]2・f(y|η)

になるので、E[T(y)] = A'(η) であることを利用して y による積分を求めると

V[T(y)] = A(2)(η)

という結果になります。これらの式を使い、指数型分布族に属する確率分布の期待値と分散を求めると次のようになります。

表 2-1. 指数型分布族とその期待値・分散
確率分布A(η)A'(η)A(2)(η)ηE[T(y)] ( = E[y] )V[T(y)] ( = V[y] )
正規分布( ησ )2 / 2 + ( 1 / 2 ) log( 2πσ2 )σ2ησ2μ / σ2μσ2
二項分布Nlog( eη + 1 )Neη / ( eη + 1 )Neη / ( eη + 1 )2log( π / ( 1 - π ) )Nπ(1-π)
ポアソン分布eηeηeηlogλλλ
指数分布-log( -η )-1 / η1 / η21 / λ1 / λ2

このように、指数型分布族は、A と η の二つの関数によって T(y) の (特に正準形なら y の) 期待値と分散を求めることができるという特徴があります。


3) スコア統計量 (Score Statistic)

互いに独立な確率変数 y = ( y1, y2, ... yN ) が、同じ型の指数型分布族に従い、さらに確率分布のパラメータはそれぞれの yi について異なるものとします。すなわち、

p(yii) = exp( η(θi)T(yi) - A(θi) + B(yi) )

p(yii) = exp( ηiT(yi) - A(ηi) + B(yi) )

が成り立つとした時、y に対する尤度は、

L(θ|y) = Πi{1→N}( exp( η(θi)T(yi) - A(θi) + B(yi) ) )

L(η|y) = Πi{1→N}( exp( ηiT(yi) - A(ηi) + B(yi) ) )

になります。但し、θ = ( θ1, θ2, ... θN )、η = ( η1, η2, ... ηN ) で、θi, ηi が yi に対するパラメータとなります。N 個の確率変数に対してパラメータの数も同数の N 個あるようなモデルは「飽和モデル(Satuated Model)」「最大モデル(Maximal Model)」「フルモデル(Full Model)」などとよばれます。この尤度の対数関数は

l(θ|y) ≡ log L(θ|y) = Σi{1→N}( η(θi)T(yi) - A(θi) + B(yi) )

l(η|y) ≡ log L(η|y) = Σi{1→N}( ηiT(yi) - A(ηi) + B(yi) )

なので、∂l(θ|y) / ∂θi, ∂l(η|y) / ∂ηi

∂l(θ|y) / ∂θi=( ∂ / ∂θii{1→N}( η(θi)T(yi) - A(θi) + B(yi) )
=η'(θi)T(yi) - A'(θi)
∂l(η|y) / ∂ηi=T(yi) - A'(ηi)

となります。この式を「スコア統計量(Score Statistic)」と呼び U ( = U(θi) または U(ηi) ) で表します。U は確率変数 yi に依存しているのでやはり確率変数であり、その期待値は

E[U]=η'(θi)・E[T(yi)] - A'(θi)
=η'(θi)[ A'(θi) / η'(θi) ] - A'(θi)
=A'(θi) - A'(θi) = 0

となります。但し、E[T(yi)] = A'(θi) / η'(θi) であることを利用しています。分散 V[U] は、確率変数の一次結合に対する分散の公式から

V[U(θi)]=η'(θi)2・V[T(yi)]
=η'(θi)2{ [ A(2)i)η'(θi) - η(2)i)A'(θi) ] / η'(θi)3 }
=[ A(2)i)η'(θi) - η(2)i)A'(θi) ] / η'(θi)
V[U(ηi)]=V[T(yi)] = A(2)i)

となります。これを「フィッシャー情報量(Fisher Information)」といいます。

分散と期待値の関係式から

V[U] = E[U2] - E[U]2

であり、E[U] = 0 なので

V[U] = E[U2]

が成り立ちます。また、

∂U(θi) / ∂θi=( ∂ / ∂θi )[ η'(θi)T(yi) - A'(θi) ]
=η(2)i)T(yi) - A(2)i)
∂U(ηi) / ∂ηi=( ∂ / ∂ηi )[ T(yi) - A'(ηi) ]
=-A(2)i)

より

E[U'(θi)]=η(2)i)・E[T(yi)] - A(2)i)
=η(2)i)[ A'(θi) / η'(θi) ] - A(2)i)
=[ η(2)i)A'(θi) - A(2)i)η'(θi) ] / η'(θi)
=-V[U(θi)]
E[U'(ηi)]=-A(2)i) = -V[U(ηi)]

となるので、最終的に

V[U] = E[U2] = -E[U']

という結果が得られます。つまり、フィッシャー情報量はスコア統計量の二乗の期待値に等しく、またスコア統計量をパラメータで微分した値の期待値の符号を逆転した値とも等しいということになります。

飽和モデルの場合、U は対数尤度関数の導関数そのものなので、U = 0 となるときの θi, ηi が最尤推定量であり、その値は、yi が正準形の指数型分布族に従うと仮定した時

η'(θi)yi - A'(θi) = 0 より A'(θi) / η'(θi) = yi

yi - A'(ηi) = 0 より A'(ηi) = yi

を満たす θi, ηi を求めることで得られます。しかし通常の場合、確率変数 yi の期待値 μi = E[yi] が連結関数 g(μi) によって

ξi ≡ g(μi) = xiTα

の形のモデル式で表されることを想定して θi や ηi ではなくパラメータ α の推定を行います。ここで、xi, α の要素数を p としたとき p < N であり、飽和モデルのときより少数のパラメータで μi を表すわけです。uj ≡ ∂l(θ|y) / ∂αj は、li = η(θi)yi - A(θi) + B(yi) とすると li は θi を変数とする関数であり、μi = A'(θi) / η'(θi)、g(μi) = xiTα より μi は θi, α を変数とする関数なので、

uj = Σi{1→N}( ∂li / ∂αj ) = Σi{1→N}( ( ∂li / ∂θi )( ∂θi / ∂μi )( ∂μi / ∂αj ) )

と表すことができて、個々の偏微分を求めると、

∂li / ∂θi=η'(θi)yi - A'(θi)
∂θi / ∂μi=1 / ( ∂μi / ∂θi )
=1 / [ ( ∂ / ∂θi )( A'(θi) / η'(θi) ) ]
=1 / { [ A(2)i)η'(θi) - A'(θi(2)i) ] / η'(θi)2 }
=1 / V[yi]η'(θi)
∂μi / ∂αj=( ∂μi / ∂ξi )( ∂ξi / ∂αj )
=( ∂μi / ∂ξi )[ ( ∂ / ∂αj )xiTα ]
=xij / ( ∂ξi / ∂μi )
=xij / g'(μi)

となり、これらを代入して

uj=Σi{1→N}( [ η'(θi)yi - A'(θi) ][ 1 / V[yi]η'(θi) ][ xij / g'(μi) ] )
=Σi{1→N}( [ yi - A'(θi) / η'(θi) ]xij / V[yi]g'(μi) )
=Σi{1→N}( ( yi - μi )xij / V[yi]g'(μi) )

という結果が得られます。この結果からも uj の期待値 E[uj] は明らかにゼロであり、uj と uk の共分散は E[ujuk] から求められ

E[ujuk]=E[ Σi{1→N}( ( yi - μi )xij / V[yi]g'(μi) )Σl{1→N}( ( yl - μl )xlk / V[yl]g'(μl) ) ]
=Σi{1→N}( Σl{1→N}( E[( yi - μi )( yl - μl )]xijxlk / V[yi]g'(μi)V[yl]g'(μl) ) )

となります。ここで、yi が互いに独立なら E[( yi - μi )( yl - μl )] = 0 ( i ≠ l ) であることから、

E[ujuk]=Σi{1→N}( E[( yi - μi )2]xijxik / V[yi]2g'(μi)2 )
=Σi{1→N}( V[yi]xijxik / V[yi]2g'(μi)2 )
=Σi{1→N}( xijxik / V[yi]g'(μi)2 )

という結果が得られ、これは xi ( i = 1, 2, ... N ) の j 番目と k 番目の積の和の形になっているので、

E[ujuk] = ( x1j, x2j, ... xNj )・( x1k / V[y1]g'(μ1)2, x2k / V[y2]g'(μ2)2, ... xNk / V[yN]g'(μN)2 )T

と表すことができます。

|x1k / V[y1]g'(μ1)2|=|1 / V[y1]g'(μ1)2,0,...0||x1k|
|x2k / V[y2]g'(μ2)2||0,1 / V[y2]g'(μ2)2...0||x2k|
|:||::...:||:|
|xNk / V[yN]g'(μN)2||0,0,...1 / V[yN]g'(μN)2||xNk|

より、この対角行列を W で表し、j 番目のパラメータ αj を係数とする独立変数からなるベクトルを ( x1j, x2j, ... xNj )T = x'j とすれば、上式は

E[ujuk] = x'jTWx'k

と表されます。よって、これが j 行 k 列目の要素となるような行列を Φ としたとき

Φ = XTWX

となります。ここで、Φ は p 行 p 列の正方行列で「フィッシャー情報行列 (Fisher information matrix ; FIM)」、XxiT を i 行目 ( x'j を j 列目 ) とする N 行 p 列の行列で「デザイン行列 (Design Matrix)」と呼ばれます。この最も単純な例は、パラメータ α の要素がただ一つのみで、g(μi) = μi = α0 (定数) の場合で、このとき xi = 1、W は 1 / V[yi] を i 番目の対角成分とする対角行列で、X は全要素が 1 の N 次元ベクトルになります。スコア統計量は

u = Σi{1→N}( ( yi - α0 ) / V[yi] )

と求められるので、u = 0 のときの α0 (すなわち最尤推定量) a^0

a^0 = Σi{1→N}( yi / V[yi] ) / Σi{1→N}( 1 / V[yi] )

となり、

Φ = Σi{1→N}( 1 / V[yi] )

が u の分散を表します。

uj は、yi の線形結合の形で表されるので、yi が正規分布に従うならば uj も正確に正規分布に従います。yi が正規分布以外の確率分布に従う場合はそうはなりませんが、yi - μi は測定値と母集団平均の差分を表しており、uj はその和の形となっていることから、中心極限定理より、N が十分に大きければ uj は漸近的に正規分布に従います。uj の平均はゼロで、uj と uk の共分散 E[ujuk] からなる共分散行列はフィッシャー情報行列 Φ そのものなので、u = ( u1, u2, ... up )T としたとき、u は多変量正規分布 N( 0, Φ ) に漸近的に従うことになります。このことから、uTΦ-1u が自由度 p の χ2-分布に漸近的に従うことになり(補足 1)、その値を使ってモデル式の適合性を検定することができます。


μi は μi = A'(θi) / η'(θi) = A'(ηi) より θi や ηi に依存すると同時に g(μi) = xiTα より αj にも依存します。また、V[yi] も V[yi] = [ A(2)i)η'(θi) - A'(θi(2)i) ] / η'(θi)3 = A(2)i) より θi や ηi に依存することから μi と関連性があり、さらに αj に依存することになります。従って、Xy が与えられた時、y が互いに独立に一母数指数型分布族に従うなら ujΦ は N 個の変数 θ, η の関数になり、期待値の連結関数が p 個の係数 α によって の形に表せるなら p 個の変数 α の関数になります。例えば、g(μi) = μi (恒等関数) で、yi がそれぞれ独立に正規分布 N( μi, σ2 ) に従うとした時の飽和モデル式は、

ηi = μi / σ2

A'(ηi) = σ2ηi = μi

より

U(μi) = yi - A'(ηi) = yi - μi

となるので、U(μi) = 0 となるときの μi (つまり μi の最尤推定量 m^i ) は yi と等しくなります。ここで、μi = α0 (定数) というもっとも単純なモデルを考えると、yi は正規分布 N( α0, σ2 ) に従い、x は全ての要素が 1 のベクトルなので、

u0=Σi{1→N}( ( yi - μi )xi0 / V[yi]g'(μi) )
=Σi{1→N}( ( yi - α0 ) / σ2 )
=N( my - α0 ) / σ2

より、α0 の最尤推定量 a^0 は my になります。但し、my は yi の標本平均を表します。u0 の期待値 E[u0] は、E[my] = α0 からゼロであり、分散 V[u0] は

V[u0]=E[u02]
=E[ { Σi{1→N}( yi - α0 ) }2 ] / σ4
=Σi{1→N}( Σl{1→N}( E[( yi - α0 )( yl - α0 )] ) ) / σ4
=Σi{1→N}( E[( yi - α0 )2] ) / σ4
=2 / σ4 = N / σ2

という結果になります。但し、yi は互いに独立としているので、E[( yi - α0 )( yl - α0 )] = 0 ( i ≠ l ) であることを利用しています。u0 は正規分布に従う確率変数 yi の線形結合であり、やはり正規分布に従うことから、u0 は N( 0, N / σ2 ) に従うという結果が得られます。従って、

z = u0 / ( N / σ2 )1/2 = ( my - α0 ) / ( σ2 / N )1/2

とすれば、z は標準正規分布 N( 0, 1 ) に従い、これを使った平均値の推定を行うことができます。これは、母集団の分散 σ2 が既知の場合の平均値推定と全く同じ内容です (*3-1)。

μi = α0 + α1xi1 というモデル式に対しては、xi = ( xi0, xi1 )T = ( 1, xi1 )T なので、

u0=Σi{1→N}( ( yi - μi )xi0 / V[yi]g'(μi) )
=Σi{1→N}( ( yi - α0 - α1xi1 ) / σ2 )
=N( my - α0 - α1mx ) / σ2
u1=Σi{1→N}( ( yi - μi )xi1 / V[yi]g'(μi) )
=Σi{1→N}( ( yi - α0 - α1xi1 )xi1 / σ2 )
=N( mxy - α0mx - α1mxx ) / σ2

となるので、u0 = u1 = 0 を満たす時の解 α0, α1 は連立方程式

α0 + α1mx = my

α0mx + α1mxx = mxy

を解くことによって求めることができます。但し、mx, my はそれぞれ xi1, yi の標本平均、mxx, mxy はそれぞれ xi12, xi1yi の標本平均を表しています。これは、単回帰式の係数に対する最尤推定量を求めるときの方程式と全く同じものであり (*3-2)、その解は

α1 = sxy / Vx

α0 = my - mxsxy / Vx

になります。但し、sxy は xi1, yi の標本共分散、Vx は xi1 の標本分散をそれぞれ表します。

独立変数を増やして μi = xiTα とします。但し、xi の第一番目の要素は 1 とし、定数項を表します。このときも V[yi] = σ2、g'(μi) = 1 なので W = ( 1 / σ2 )E ( E は単位行列 ) となって、フィッシャー情報行列は

Φ = XTX / σ2

と非常に単純な形になります。また、uj

uj = Σi{1→N}( ( yi - μi )xij ) / σ2

となり、uj = 0 となるときの α が最尤推定量になります。この式は、「線形重回帰モデル」で得られた正規方程式と全く同じ形になり (*3-3)、

XT = XTy

という結果が得られます。この正規方程式は、定数項となる一番目の要素を消去して式を一つ減らすと、(定数項を除いた場合の) X の標本共分散行列を Vxi の j 番目の要素からなる N 次元ベクトル x'jy の標本共分散を要素とするベクトルを sy としたとき

= sy

と表されるのでした。従って、V が逆行列を持てば、α の最尤推定量は

α = V-1sy

を解くことで求められます。正規分布のように、V[yi] を定数として扱うことができるのであれば、線形重回帰モデルで得られるような形の正規方程式を解くことによって解析的に α を得ることができます。しかし、V[yi] が yi や θi、ηi によって変化すると式は複雑になり、さらに連結関数が恒等関数でない場合は線形式とはならず、簡単には解が得られなくなります。

*3-1)確率・統計 (8) 推定」の「4-1) 母集団の平均値の区間推定」に関する説明を参照

*3-2)確率・統計 (11) 二標本の解析 -1-」の「2) 相関係数と回帰曲線」に関する説明を参照

*3-3)確率・統計 (13) 回帰分析法」の「1) 線形重回帰モデル(Linear Multiple Regression Model)」に関する説明を参照


4) スコア法 (Method of Scoring)

一般に、αj の最尤推定量 a^j を求めるためには、p 個の正規方程式

Σi{1→N}( ( yi - m^i )xij / V[yi]g'(m^i) ) = 0

を解く必要があります。ここで、m^i は、a^ = ( a^1, a^2, ... a^p ) として

g( m^i ) = xiTa^

を満たす N 個の変数であるため、未知数は p 個の a^j であり、その値は一意に決めることができます。しかし、前節で述べたように、g( m^i ) が恒等関数でないかぎり正規方程式は単純な線形式にはなりません。例えば、g( m^i ) = log( m^i ) ならば

m^i = exp( xiTa^ )

g'( m^i ) = 1 / m^i = 1 / ( xiTa^ )

より正規方程式は

Σi{1→N}( [ yi - exp( xiTa^ ) ]・xiTa^・xij / V[yi] ) = 0

となって、簡単に解を得ることはできなくなります。そこで、解析的に解くのではなく、数値計算アルゴリズムを使って数値解を求める方法を利用することになります。

「ニュートン - ラフソン法 (Newton-Raphson Method)」は、以下のような漸化式を使って f(x) = 0 となる x を求める手法でした (*4-1)。

x(n+1) = x(n) - f(x(n)) / f'(x(n))

但し、f(x) は微分可能で、その導関数が既知である必要があります。スコア統計量にこの漸化式を適用すると、

θ(n+1) = θ(n) - U(θ(n)) / U'(θ(n))

η(n+1) = η(n) - U(η(n)) / U'(η(n))

となります。例えば、ri ( i = 1, 2, ... N ) が互いに独立で、同一のパラメータを持つポアソン分布

P( ri | η ) = ( 1 / ri! )exp( ηri - eη )

に従う場合、対数尤度関数は

l( η | ri ) = Σi{1→N}( riη - eη - log( ri! ) ) = ηΣi{1→N}( ri ) - Neη - Σi{1→N}( log( ri! ) )

なので、スコア統計量 U(η) は

U(η) = Σi{1→N}( ri ) - Neη

であり、その導関数 U'(η) は

U'(η) = -Neη

になります。よって、mr = Σi{1→N}( ri ) / N とすれば、漸化式は

η(n+1) = η(n) + mr・exp( -η(n) ) - 1

になります。

スコア統計量 U と情報量 V[U] の間には、

V[U] = -E[U']

の関係があるのでした。近似的に U' ≈ E[U'] = -V[U] が成り立つと仮定すれば、漸化式を

θ(n+1) = θ(n) + U(θ(n)) / V[U(θ(n))]

η(n+1) = η(n) + U(η(n)) / V[U(η(n))]

とすることができます。この方法を「スコア法 (Method of Scoring)」といいます。先ほどのポアソン分布の例では、

V[U(η)] = E[U(η)2] = E[ { Σi{1→N}( ri - eη ) }2]

であり、E[ri] = V[ri] = eη であることと、ri が互いに独立であることを利用すると、

V[U(η)] = Σi{1→N}( E[( ri - eη )2] ) = Neη

と求められるので、漸化式は変化はありません ( U'(η) = -Neη だったので、U' には確率変数 yi がなく、E[U'] = U' は正確に成り立ち、計算をしなくても U' = -V[U] は成り立っていることがわかります )。

以下の表は、スコア法を使ってパラメータを求めた結果を示したものです。

表 4-1. スコア法によるポアソン分布のパラメータ推定
mr3510
η計算結果前回との差分計算結果前回との差分計算結果前回との差分
1.500-2.500-5.000-
1.1690.3311.9100.5904.0670.933
1.1010.0681.6510.2603.2390.829
1.0990.0021.6100.0402.6310.608
1.0990.0001.6090.0012.3510.280
1.0990.0001.6090.0002.3040.047
1.0990.0001.6090.0002.3030.001
1.0990.0001.6090.0002.3030.000

mr は標本平均を表し、その 1 / 2 を η の初期値として漸化式に代入して計算を行なっています。求めた値はやがて収束し、前回との差分は無視できるほど小さくなります。その結果は、mr = 3 のとき η = 1.099、mr = 5 のとき η = 1.609、そして mr = 10 のとき η = 2.303 になります。ポアソン分布は、

P( ri | λ ) = λre / r!

とも表されるのでした (というよりもこちらの方が一般的な表し方です)。λ = eη だったので、上記結果を元に λ を求めると、mr = 3 のとき λ = 3.00、mr = 5 のとき λ = 5.00、mr = 10 のとき λ = 10.00 になり、λ は mr と等しくなります。

パラメータが一つだけならば、正規方程式も一つのみであり、スコア法を使わなくても通常は簡単に U(η) = 0 の解を得ることができます。上記の例では

U(η) = Σi{1→N}( ri ) - Neη = 0 より

η = log mr ( eη = mr )

となって、スコア法での結果と一致します。スコア法が効果を発揮するのは、パラメータが複数になったときです。


ニュートン - ラフソン法は次のように考えることもできます。テイラー - マクローリン展開から、x が b に非常に近いときは

f(x) ≈ f(b) + f'(b)( x - b )

と近似することができます。f(x) = 0 のとき、両辺を f'(b) で割って

f(b) / f'(b) + ( x - b ) = 0

より

x = b - f(b) / f'(b)

となって、ニュートン - ラフソン法での漸化式と一致します。同様に、多変量のテイラー - マクローリン展開 (補足 2) から、x = ( x1, x2, ... xp )Tb = ( b1, b2, ... bp )T に非常に近いときは、p 変数を持つ関数 fj(x) は

fj(x)fj(b) + [ ∂fj(b) / ∂b1 ]( x1 - b1 ) + [ ∂fj(b) / ∂b2 ]( x2 - b2 ) + ... + [ ∂fj(b) / ∂bp ]( xp - bp )
=fj(b) + ( ∂fj(b) / ∂b1, ∂fj(b) / ∂b2, ... ∂fj(b) / ∂bp )( x1 - b1, x2 - b2, ... xp - bp )T
=fj(b) + ∇fj(b)T( x - b )

と近似することができます。ここで、∇fj(b) は ∂fj(b) / ∂bk ( k = 1, 2, ... p ) を要素とする p 次元のベクトルとします。

fj(x) = 0 を満たす x の値はこの式だけで一意に決まるとは限りません。例えば二変数の場合、fj(x) が xy-平面と交差すれば、交差した部分の曲線が fj(x) = 0 を満たす x の軌跡となります。特に、上記近似式は一次式なので、交差した部分は ( b の近傍では ) 直線になります。もし、一点だけで接していれば ( b の近傍で xy-平面と重なれば ) 解は一意に決まり、全く接していない場合は ( b の近傍で xy-平面と平行な状態で ) 解が存在しないことになります。同様な式が p 個存在すれば、それらを使った連立方程式を解くことで、fj(x) = 0 ( j = 1, 2, ... p ) を満たす解 x を得ることができます。この連立方程式は、

f1(x)f1(b) + ∇f1(b)T( x - b )
f2(x)f2(b) + ∇f2(b)T( x - b )
::
fp(x)fp(b) + ∇fp(b)T( x - b )

となるので、fj(x), fj(b) ( j = 1, 2, ... p ) を要素とする p 次元のベクトルをそれぞれ f(x), f(b)、j 行 k 列番目の要素を ∂fj(b) / ∂bk とする行列を H で表せば、上式は

f(x) ≈ f(b) + H( x - b )

になります。f(x) = 0 のとき、両辺に左側から H-1 を掛ければ

0 = H-1f(b) + ( x - b ) より

x = b - H-1f(b)

という結果が得られ、これが多変量関数に対するニュートン - ラフソン法の漸化式になります。xα = ( α1, α2, ... αp )、f(x) を u(α) = ( u1, u2, ... up )、と置き換えれば、前に求めた α の値 α(m-1) を使って

α(m) = α(m-1) - H-1(m-1)u(α(m-1))

の漸化式から α(m) を求めることができます。ここで、H(m-1) の j 行 k 列目の要素は ∂uj / ∂αk = ∂2l / ∂αj∂αk になるので、これを計算すると

∂uj / ∂αk=( ∂ / ∂αki{1→N}( ( yi - μi )xij / V[yi]g'(μi) )
=Σi{1→N}( ( ∂ / ∂μi )[ ( yi - μi )xij / V[yi]g'(μi) ]( ∂μi / ∂αk ) )
=Σi{1→N}( xij{ -1 / V[yi]g'(μi) - ( yi - μi )[ ∂V[yi] / ∂μi ] / V[yi]2g'(μi) - ( yi - μi )g(2)i) / V[yi]g'(μi)2 }[ xik / g'(μi) ] )
=Σi{1→N}( -xijxik{ 1 + ( yi - μi )[ ∂V[yi] / ∂μi ] / V[yi] + ( yi - μi )g(2)i) / g'(μi) } / V[yi]g'(μi)2 )

という結果が得られますが、∂uj / ∂αk ≈ E[∂uj / ∂αk] が成り立つと仮定すると、

E[∂uj / ∂αk]=E[ Σi{1→N}( -xijxik{ 1 + ( yi - μi )[ ∂V[yi] / ∂μi ] / V[yi] + ( yi - μi )g(2)i) / g'(μi) } / V[yi]g'(μi)2 ) ]
=Σi{1→N}( -xijxik[ 1 + E[ yi - μi ][ ∂V[yi] / ∂μi ] / V[yi] + E[ yi - μi ]g(2)i) / g'(μi) ] / V[yi]g'(μi)2 )
=Σi{1→N}( -xijxik / V[yi]g'(μi)2 )
=-E[ujuk]

となって、フィッシャー情報行列の符号を反転した の j 行 k 列目の要素と等しくなります。従って、漸化式は

α(m) = α(m-1) + Φ-1(m-1)u(α(m-1))

と近似され、これが複数のパラメータを持つ場合のスコア法の漸化式となります。両辺に左側から Φ(m-1) を掛けると

Φ(m-1)α(m) = Φ(m-1)α(m-1) + u(α(m-1))

となります。Φ は、xij を i 行 j 列目 の要素とする N 行 p 列の行列を X、wi = 1 / V[yi]g'(μi)2 を対角要素とする対角行列を W とした時

Φ = XTWX

と表すことができたので、右辺は

Φ(m-1)α(m-1) + u(α(m-1)) = XTW(m-1)(m-1) + u(α(m-1))

であり、XTW(m-1)X の j 行 k 列目の要素は、j 番目のパラメータ αj を係数とする独立変数からなるベクトルを x'j = ( x1j, x2j, ... xNj )T として

x'jTW(m-1)x'k=( w1(m-1)x1j, w2(m-1)x2j, ... wN(m-1)xNj )x'k
=Σi{1→N}( wi(m-1)xijxik )

だったので、XTW(m-1)(m-1) の j 番目の要素は

XTW(m-1)(m-1) = Σk{1→p}( Σi{1→N}( wi(m-1)xijxikk(m-1) )

となって、右辺の j 番目の要素は

Σk{1→p}( Σi{1→N}( wi(m-1)xijxikk(m-1) ) + Σi{1→N}( ( yi - μi(m-1) )xij / V[yi](m-1)g'(μi)(m-1) ) )
=Σi{1→N}( Σk{1→p}( wi(m-1)xijxikαk(m-1) ) + ( yi - μi(m-1) )xijwi(m-1)g'(μi)(m-1) )
=Σi{1→N}( xijwi(m-1)[ Σk{1→p}( xikαk(m-1) ) + ( yi - μi(m-1) )g'(μi)(m-1) ] )
=Σi{1→N}( xijwi(m-1)[ g(μi)(m-1) + ( yi - μi(m-1) )g'(μi)(m-1) ] )

で求められます。

zi(m-1) = g(μi)(m-1) + ( yi - μi(m-1) )g'(μi)(m-1)

z(m-1) = ( z1(m-1), z2(m-1), ... zN(m-1) )

とすれば

Σi{1→N}( xijwi(m-1)zi(m-1) )
=( x1j, x2j, ... xNj )・( w1(m-1)z1(m-1), w2(m-1)z2(m-1), ... wN(m-1)zN(m-1) )T
=x'jTW(m-1)z(m-1)

となって、漸化式は最終的に

XTW(m-1)(m) = XTW(m-1)z(m-1)

となります。


テーラー - マクローリン展開を利用して、スコア統計量は以下の形に近似することができるのでした。

u(α) ≈ u(a) + H( α - a )

但し、a = ( a1, a2, ... ap ) は α に非常に近い値をとるものとし、H は j 行 k 列番目の要素を ∂uj(α) / ∂αk とする行列です。∂uj(α) / ∂αk ≈ E[∂uj(α) / ∂αk] のとき、H はフィッシャー情報行列の各要素の符号を反転した を使って

u(α) ≈ u(a) - Φ( α - a )

になります。ここで、aα の最尤推定量である (よって、aα である) と仮定すると、a は尤度を最大にする推定量なので、その対数の導関数である u(a) は 0 であり、上式は

u(α) ≈ -Φ( α - a ) より

a - αΦ-1u(α)

と変形することができます。この結果より、Φ-1 が定数なら、u(α) が漸近的に正規分布に従うことから a も正規分布に従うことになります。右辺の a - α の期待値 E[a - α] は

E[Φ-1u(α)] = Φ-1E[u(α)] = 0

なので、

E[a - α] = 0 より

E[a] = α

となって、aα の不偏推定量になります。また、a の共分散行列 E[( a - α )( a - α )T] は

E[( a - α )( a - α )T] ≈ E[Φ-1u(α)( Φ-1u(α) )T] = Φ-1E[u(α)u(α)T](Φ-1)T

と計算できますが、u(α)u(α)T の j 行 k 列目の要素は ujuk なので E[u(α)u(α)T] = Φ であり、さらに Φ-1 は対称行列なので (Φ-1)T = Φ-1 となって、

E[( a - α )( a - α )T] ≈ Φ-1

という結果が得られます。よって、a は多変量正規分布 N( α, Φ-1 ) に漸近的に従い、

( a - α )TΦ( a - α )

は自由度 p の χ2-分布に漸近的に従うことになります (補足 1)。

α の最尤推定量はスコア法を使って求めることができます。その値は多変量正規分布に漸近的に従う確率変数とみなすことができるので、それを利用して推定や検定を行うことができます。線形重回帰モデルでは、W の対角成分が全て従属変数 yi の分散 σ2 の逆数に等しいことから、フィッシャー情報行列は

Φ = XTX / σ2

であり、α の最尤推定量を求めるための漸化式は、xiα(m-1) = μi(m-1) であることを利用すると、z(m-1) の第 i 成分が

zi(m-1) = xiTα(m-1) + ( yi - μi(m-1) ) = yi

となることから

XT(m) / σ2 = XTy / σ2

XT(m) = XTy

と求められ、線形重回帰モデルにおける正規方程式と一致します。

( a - α )TΦ( a - α ) = ( a - α )TXTX( a - α ) / σ2 = [ X( a - α ) ]TX( a - α ) / σ2

であり、定数項を j = 0 として係数 α = ( α0, α1, ... αp ), a = ( a0, a1, ... ap ) としたとき、

X( a - α ) = ( Σj{0→p}( ( aj - αj )x1,j ), Σj{0→p}( ( aj - αj )x2,j ), ... Σj{0→p}( ( aj - αj )xN,j ) )T

なので、

( a - α )TΦ( a - α ) = Σi{1→N}( [ Σj{0→p}( ( aj - αj )xi,j ) ]2 ) / σ2

という結果が得られます。但し、j = 0 の項は定数なので、xi,0 は全て 1 とします。この式の中で、Σj{0→p}( ( aj - αj )xi,j ) の部分は

Σj{0→p}( ( aj - αj )xi,j )=Σj{0→p}( ajxi,j - αjxi,j )
=Σj{0→p}( ajxi,j ) - Σj{0→p}( αjxi,j )
y^i - μi

と変形できるので、最終的に

( a - α )TΦ( a - α ) = Σi{1→N}( [ ( y^i - μi ) / σ ]2 )

という結果になります。ここで、y^iα の最尤推定量を使って求めた yi の予測値で、μi は yi の期待値であり、真の値ともいうべきものになります。よって、線形重回帰モデルの場合、予測値と期待値の差の二乗和を分散で割った値は自由度 p + 1 の χ2-分布に従うという結果が得られます。特に、p = 0 のときは係数は α0 のみであり、この値が yi の期待値 μ になります。その最尤推定量は従属変数 yi の標本平均 my に等しくなるので、上式は

Σi{1→N}( [ ( my - μ ) / σ ]2 ) = ( my - μ )2 / ( σ2 / N )

となって、yi が、同一の正規分布 N( μ, σ2 ) から抽出した N 個の標本のとき、上式は自由度 1 の χ2-分布に従うので、先ほどの結果とも一致します(*4-2)。


今度は、スコア法を具体的に算出する手順を確認していきます。

XTW(m-1)(m) = XTW(m-1)z(m-1)

において、両辺はともにパラメータ数 p を要素数とするベクトルで表されます。以下、一部を除いて添字の (m) や (m-1) は省略するので、左辺にある α だけが新たに得られる結果であり、その他は全て前回求めた α から算出されることに注意して下さい。上式の j 番目の要素は、左辺の場合 XTWX = Φ であり、その j 行 k 列目の要素が x'jTWx'k だったので、

(左辺)=Σk{1→p}( x'jTWx'kαk )
=Σk{1→p}( αkΣi{1→N}( xijxik / V[yi]g'(μi)2 ) )

となり、右辺の j 番目の要素は

(右辺)=Σi{1→N}( xijwi[ g(μi) + ( yi - μi )g'(μi) ] )
=Σi{1→N}( xij[ g(μi) + ( yi - μi )g'(μi) ] / V[yi]g'(μi)2 )

となります。従って、左辺の αk の係数 Σi{1→N}( xijxik / V[yi]g'(μi)2 ) を計算して係数行列を求め、右辺の値を計算して最終的に得られる連立方程式を解く操作を、得られた未知数 αk が収束するまで繰り返すことによって解が得られます。

ここで問題になるのが V[yi] と g'(μi) の値の計算方法です。前回求めた未知数 αk(m-1) を使い、μi

g(μi) = Σj{1→p}( xijαj(m-1) ) = xiTα(m-1) ≡ ξi

の関係式から求められます。しかし、μi は g(μi) の逆関数 g-1i) から求める必要があるので、この逆関数が既知である必要があります。もしそうでないなら、

f(μi) = g(μi) - ξi

として、f(μi) = 0 となるときの μi を「二分法 (Bisection Method)」 (*4-3) や「ニュートン - ラフソン法 (Newton-Raphson method)」 (*4-1) で数値解として求める必要があります。μi が得られれば、この値を使って g'(μi) も求めることができます。但し、g(μi) の導関数が既知でない場合は、「差分法 (Finite Difference Method)」などを利用して近似解を計算することになります。V[yi] と μi = E[yi] はどちらも θi や ηi の関数なので、μi を元に θi や ηi を求め、それを代入して V[yi] を求めます。ηi を例にとれば、μi = A'(ηi) だったので、A'(ηi) の逆関数が既知でなければ数値解法が必要になります。さらに、A'(ηi) が既知ではないときは、計算に差分法などを用いることになります。V[yi] = A(2)i) であり、今度は二階導関数が必要になるので、これも既知でなければ数値解法で求めることになります。


スコア法を使って回帰係数を求めるためのサンプル・プログラムを以下に示します。

/*
  DiffMethod : 差分法による導関数計算用関数

  F* f : 関数 f(x)
  double x : x の値
  double h : x の近傍を決めるための微小量

  計算には中心差分を使う

  f'(x) = [ f( x + h ) - f( x - h ) ] / 2h

  戻り値 : f'(x) の値
*/
template<class F>
double DiffMethod( F* f, double x, double h = DEFAULT_THRESHOLD )
{
  return( ( (*f)( x + h ) - (*f)( x - h ) ) / ( h * 2 ) );
}

/*
  Newton : ニュートン-ラフソン法により f(x) = y を満たす x を求める

  double y : y の値
  F* f( double ) : 関数 f(x)
  DF* df( double ) : 導関数 f'(x)
  double xInit : x の初期値
  double threshold : しきい値

  戻り値 : f(x) = y となる x の値 ( 計算ができなくなった場合は NaN を返す )
*/
template<class F, class DF>
double Newton( double y, F* f, DF* df, double xInit = 1, unsigned int maxCount = DEFAULT_MAX_COUNT, double threshold = DEFAULT_THRESHOLD )
{
  double x = xInit;

  for ( unsigned int i = 0 ; i < maxCount ; ++i ) {
    double curY = (*f)( x ) - y;
    double curDY = (*df)( x );
    if ( isnan( curY ) || isnan( curDY ) ) return( NAN );
    if ( curY == 0 ) return( x );
    if ( curDY == 0 ) return( NAN );

    double diff = curY / curDY;
    x -= diff;
    if ( fabs( diff ) < threshold )
      return( x );
  }

  return( NAN );
}

/*
  MemFunc : メンバ関数を変数 x のみを引数とする関数オブジェクトとして扱う

  Res : 関数の戻り値の型
  T : メンバ関数を実行する対象のインスタンス
  Arg : 引数の型
*/
template<class Res, class T, class Arg>
class MemFunc
{
  const T& t_; // 対象のインスタンス
  Res ( T::*f_ )( Arg ) const; // メンバ関数へのポインタ

public:

  /*
    コンストラクタ

    const T& t : 対象のインスタンス
    Res ( T::*f )( arg ) const : 対象のメンバ関数ポインタ
  */
  MemFunc( const T& t, Res ( T::*f )( Arg ) const )
    : t_( t ), f_( f ) {}

  /*
    operator() : 関数の実行

    Arg x : 対象の引数
  */
  Res operator()( Arg x )
  { return( ( t_.*f_ )( x ) ); }
};

/*
  ExpFamily_IF : 一母数指数型分布族用 I/F
*/
struct ExpFamily_IF
{
  virtual double a( double eta ) const = 0; // A(η)

  // A(η) の導関数 = 期待値 ( E[T(y)] = A'(η) )
  virtual double average( double eta ) const = 0;

  // A(η) の導関数の逆関数 ( η = A'^(-1)(E[T(y)]) )
  virtual double aveInv( double mu ) const = 0;

  // A(η) の二階導関数 = 分散 ( V[T(y)] = A''(η) )
  virtual double variance( double eta ) const = 0;

  // 属性を表す文字列
  virtual string ident() const = 0;
};

/*
  ExpFamily_Generic : 汎用一母数指数型分布族

  導関数・二階導関数の算出に DiffMethod を使用する
*/
class ExpFamily_Generic : public ExpFamily_IF
{
  static const double DEFAULT_H_ = 1E-6; // DiffMethod用の極少量Default値
  double h_; // DiffMethod用の極少量

public:

  ExpFamily_Generic( double h = DEFAULT_H_ ) : h_( h )
  {
    if ( h_ <= 0 ) {
      cerr << "Specified h [" << h_ << "] must be greater than zero.";
      cerr << " Changed to default value [" << DEFAULT_H_ << "]" << endl;
      h_ = DEFAULT_H_;
    }
  }

  // A(η) の導関数 = 期待値 ( E[T(y)] = A'(η) )
  virtual double average( double eta ) const
  {
    MemFunc<double,ExpFamily_IF,double> memFunc( *this, &ExpFamily_IF::a );
    return( DiffMethod( &memFunc, eta, h_ ) );
  }

  // A(η) の導関数の逆関数 ( η = A'^(-1)(E[T(y)]) )
  virtual double aveInv( double mu ) const
  {
    MemFunc<double,ExpFamily_IF,double> pdfExp( *this, &ExpFamily_IF::average );
    MemFunc<double,ExpFamily_IF,double> pdfVar( *this, &ExpFamily_IF::variance );
    return( Newton( mu, &pdfExp, &pdfVar ) );
  }

  // A(η) の二階導関数 = 分散 ( V[T(y)] = A''(η) )
  virtual double variance( double eta ) const
  {
    MemFunc<double,ExpFamily_IF,double> memFunc( *this, &ExpFamily_IF::average );
    return( DiffMethod( &memFunc, eta, h_ ) );
  }
};

/*
  ExpFamily_NormDist : 一母数指数型分布族(正規分布)
*/
class ExpFamily_NormDist : public ExpFamily_IF
{
  double var_; // 分散 σ^2

public:

  // A(η)
  virtual double a( double eta ) const
  { return( ( pow( eta, 2 ) * var_ + log( 2 * M_PI * var_ ) ) / 2 ); }

  // コンストラクタ
  // double sigma : 標準偏差(分散ではないことに注意)
  ExpFamily_NormDist( double sigma ) : var_( pow( sigma, 2 ) ) {}

  // A(η) の導関数 = 期待値 ( E[y] = A'(η) )
  virtual double average( double eta ) const
  { return( eta * var_ ); }

  // A(η) の導関数の逆関数 ( η = A'^(-1)(y) )
  virtual double aveInv( double mu ) const
  { return( mu / var_ ); }

  // A(η) の二階導関数 = 分散 ( V[y] = A''(η) )
  virtual double variance( double eta ) const
  { return( var_ ); }

  // 属性を表す文字列
  virtual string ident() const
  {
    const size_t VAR_SIZE = 9;
    char var[VAR_SIZE + 1];
    snprintf( var, sizeof( var ) / sizeof( var[0] ), "%8.3e", var_ );
    string s = var;
    return( "Normal Distribution (var = " + s + ")" );
  }
};

/*
  ExpFamily_Poisson : 一母数指数型分布族(ポアソン分布)
*/
struct ExpFamily_Poisson : public ExpFamily_IF
{
  // A(η)
  virtual double a( double eta ) const
  { return( exp( eta ) ); }

  // A(η) の導関数 = 期待値 ( E[y] = A'(η) )
  virtual double average( double eta ) const
  { return( exp( eta ) ); }

  // A(η) の導関数の逆関数 ( η = A'^(-1)(y) )
  virtual double aveInv( double mu ) const
  { return( log( mu ) ); }

  // A(η) の二階導関数 = 分散 ( V[y] = A''(η) )
  virtual double variance( double eta ) const
  { return( exp( eta ) ); }

  // 属性を表す文字列
  virtual string ident() const
  { return( "Poisson Distribution" ); }
};

/*
  LinkFunction_IF : 連結関数用 I/F
*/
class LinkFunction_IF
{
public:

  // 連結関数 g(x)
  virtual double operator()( double x ) const = 0;

  // 導関数 g'(x)
  virtual double df( double x ) const = 0;

  // 逆関数 g^-1(y)
  virtual double invf( double y ) const = 0;

  // 属性を表す文字列
  virtual string ident() const = 0;
};

/*
  LinkFunction_Generic : 汎用連結関数

  導関数・二階導関数の算出に DiffMethod を使用する
  逆関数の計算に Newton を使用する
*/
class LinkFunction_Generic : public LinkFunction_IF
{
  static const double DEFAULT_XINIT_ = 1; // xInit_ Default値
  static const unsigned int DEFAULT_MAX_COUNT_ = 1000; // maxCount_ Default値
  static const double DEFAULT_H_ = 1E-6; // h_ Default値
  static const double DEFAULT_THRESHOLD_ = 1E-6; // threshold_ Default値

  double xInit_; // Newton法での x の初期値
  unsigned int maxCount_; // Newton法での反復回数最大値
  double threshold_; // Newton法での収束判定しきい値
  double h_; // DiffMethod用の極少量

public:

  // コンストラクタ
  LinkFunction_Generic( double xInit = DEFAULT_XINIT_, unsigned int maxCount = DEFAULT_MAX_COUNT_,
                        double threshold = DEFAULT_THRESHOLD_, double h = DEFAULT_H_ )
    : xInit_( xInit ), maxCount_( maxCount ), threshold_( threshold ), h_( h )
  {
    if ( h_ <= 0 ) {
      cerr << "Specified h [" << h_ << "] must be greater than zero.";
      cerr << " Changed to default value [" << DEFAULT_H_ << "]" << endl;
      h_ = DEFAULT_H_;
    }
    if ( threshold_ <= 0 ) {
      cerr << "Specified threshold [" << threshold_ << "] must be greater than zero.";
      cerr << " Changed to default value [" << DEFAULT_THRESHOLD_ << "]" << endl;
      threshold_ = DEFAULT_THRESHOLD_;
    }
  }

  // 導関数 g'(x)
  virtual double df( double x ) const
  {
    MemFunc<double,LinkFunction_IF,double> memFunc( *this, &LinkFunction_IF::operator() );
    return( DiffMethod( &memFunc, x, h_ ) );
  }

  // 逆関数 g^-1(y)
  virtual double invf( double y ) const
  {
    MemFunc<double,LinkFunction_IF,double> memFunc( *this, &LinkFunction_IF::operator() );
    MemFunc<double,LinkFunction_IF,double> memDFunc( *this, &LinkFunction_IF::df );
    return( Newton( y, &memFunc, &memDFunc, xInit_, maxCount_, threshold_ ) );
  }
};

struct IFunc : public LinkFunction_IF
{
  // 連結関数 g(x)
  virtual double operator()( double x ) const
  { return( x ); }

  // 導関数 g'(x)
  virtual double df( double x ) const
  { return( 1 ); }

  // 逆関数 g^-1(y)
  virtual double invf( double y ) const
  { return( y ); }

  // 属性を表す文字列
  virtual string ident() const
  { return( "Identity Function" ); }
};

struct LogFunc : public LinkFunction_IF
{
  // 連結関数 g(x)
  virtual double operator()( double x ) const
  { return( log( x ) ); }

  // 導関数 g'(x)
  virtual double df( double x ) const
  { return( 1 / x ); }

  // 逆関数 g^-1(y)
  virtual double invf( double y ) const
  { return( exp( y ) ); }

  // 属性を表す文字列
  virtual string ident() const
  { return( "Logarithm Function" ); }
};

/*
  PrintVector : 可変長配列の要素表示

  const string& header : 最初に出力する文字列
  const vector<double>& vec : 出力対象の配列
*/
void PrintVector( const string& header, const vector<double>& vec )
{
  cout << header << "( ";
  vector<double>::size_type sz = vec.size();
  for ( vector<double>::size_type i = 1 ; i < sz ; ++i )
    cout << vec[i - 1] << ", ";
  cout << vec[sz - 1] << " )" << endl;
}

/*
  PrintMatrix : 二次元可変長配列(行列)の要素表示

  const string& header : 最初に出力する文字列
  const vector<double>& mat : 出力対象の行列
*/
void PrintMatrix( const string& header, const vector< vector<double> >& mat )
{
  vector< vector<double> >::size_type sz = mat.size();
  if ( sz == 0 ) return;
  PrintVector( header, mat[0] );

  string tab( header.length(), ' ' );
  for ( vector< vector<double> >::size_type i = 1 ; i < mat.size() ; ++i )
    PrintVector( tab, mat[i] );
}

/*
  PrintEquation : 方程式の表示

  a を係数とした方程式を表示する

  const string& header : 最初に出力する文字列
  const vector<double>& a : 係数
*/
void PrintEquation( const string& header, const vector<double>& a )
{
  vector<double>::size_type sz = a.size();

  cout << header;
  for ( vector<double>::size_type i = 1 ; i < sz ; ++i )
    cout << a[i - 1] << "x" << i - 1 << " + ";
  if ( sz > 0 )
    cout << a[sz - 1] << "x" << sz - 1 << endl;
}

/*
  ScoringMethod : スコア法による係数の推定

  const vector< vector<double> >& x : 独立変数(p個のパラメータのベクトルからなるn個のベクトル)
  const vector<double>& y : 従属変数
  vector<double>& a : 求めた係数
  const ExpFamily_IF& pdf : 指数型分布族
  const LinkFunction_IF& g : 連結関数
  bool verbose : 冗長モード(ON/OFF)
  unsigned int maxCount : 反復処理の最大回数
  double threshold : 収束条件(全係数が threshold 以下なら処理終了)

  戻り値 : 係数が得られた ... true ; データ異常・反復処理回数が最大値を超えた ... false
*/
bool ScoringMethod( const vector< vector<double> >& x, const vector<double>& y, vector<double>& a,
                    const ExpFamily_IF& pdf, const LinkFunction_IF& g,
                    bool verbose, unsigned int maxCount, double threshold )
{
  cout << "*** Scoring Method ***" << endl << endl;

  if ( &pdf == 0 ) {
    cerr << "Exponential family of distribution not defined." << endl;
    return( false );
  }
  cout << "Exponential Family of Distribution : " << pdf.ident() << endl;

  if ( &g == 0 ) {
    cerr << "Link function not defined." << endl;
    return( false );
  }
  cout << "Link Function : " << g.ident() << endl << endl;

  if ( &x == 0 ) {
    cerr << "x not defined." << endl;
    return( false );
  }
  if ( &y == 0 ) {
    cerr << "y not defined." << endl;
    return( false );
  }
  if ( &a == 0 ) {
    cerr << "Can't get coefficient. a is NULL." << endl;
    return( false );
  }

  unsigned int n = x.size(); // 独立変数ベクトル xi の数
  if ( n == 0 ) {
    cerr << "x has no data." << endl;
    return( false );
  }
  if ( y.size() != n ) {
    cerr << "x size (" << n << ") and y size (" << y.size() << ") not matched." << endl;
    return( false );
  }

  unsigned int p = x[0].size(); // 独立変数ベクトルの要素数
  for ( unsigned int i = 1 ; i < n ; ++i ) {
    if ( x[i].size() != p ) {
      cerr << "x[" << i << "] has different size data (" << x[i].size() << ")." << endl;
      return( false );
    }
  }

  cout << "N = " << n << "; p = " << p << endl << endl;

  if ( verbose ) {
    PrintMatrix( "x = ", x );
    cout << endl;
    PrintVector( "y = ", y );
    cout << endl;
  }

  vector<double> mu( y );  // y の期待値 (yで初期化)
  vector<double> dxi( n ); // g'(mu)
  vector<double> w( n );   // 対角行列の要素
  vector<double> ri( n );  // 右辺の x に掛ける係数

  a.assign( p, 0 ); // 係数の初期化

  LinearEquationSystem<double> s( p ); // 連立方程式計算用インスタンス

  bool isMatched;   // 収束したか
  unsigned int cnt; // 計算回数
  for ( cnt = 0 ; cnt < maxCount ; ++cnt ) {

    if ( verbose ) {
      cout << "----- cnt = " << cnt << " -----" << endl << endl;
      PrintVector( "mu = ", mu );
    }

    // g'(mu) と対角行列の計算
    for ( unsigned int i = 0 ; i < n ; ++i ) {
      dxi[i] = g.df( mu[i] );
      double eta = pdf.aveInv( mu[i] );
      w[i] = pdfVar( eta ) * pow( dxi[i], 2 );
    }
    if ( verbose ) {
      PrintVector( "g'(mu) = ", dxi );
      PrintVector( "w = ", w );
      cout << endl;
    }

    // 係数行列の計算
    for ( unsigned int j = 0 ; j < p ; ++j ) {
      for ( unsigned int k = j ; k < p ; ++k ) {
        s[j][k] = x[0][j] * x[0][k] / w[0];
        for ( unsigned int i = 1 ; i < n ; ++i )
          s[j][k] += x[i][j] * x[i][k] / w[i];
        s[k][j] = s[j][k];
      }
    }

    // 右辺の計算
    for ( unsigned int i = 0 ; i < n ; ++i )
      ri[i] = ( g( mu[i] ) + ( y[i] - mu[i] ) * dxi[i] ) / w[i];
    for ( unsigned int j = 0 ; j < p ; ++j ) {
      s.ans( j ) = x[0][j] * ri[0];
      for ( unsigned int i = 1 ; i < n ; ++i )
        s.ans( j ) += x[i][j] * ri[i];
    }

    if ( verbose ) {
      cout << "Equation System :" << endl;
      s.print();
      cout << endl;
    }

    // 連立方程式の計算
    if ( ! GaussianElimination( s ) ) {
      cerr << "Failed to calculate coefficients." << endl;
      return( false );
    }

    // 各係数が収束しているかを確認する
    isMatched = true;
    for ( unsigned int j = 0 ; j < p ; ++j ) {
      if ( fabs( a[j] - s.ans( j ) ) >= threshold )
        isMatched = false;
      a[j] = s.ans( j );
    }

    if ( verbose ) {
      PrintEquation( "Regression equation : y = ", a );
      cout << endl;
    }

    if ( isMatched ) break;

    for ( unsigned int i = 0 ; i < n ; ++i ) {
      double xi = a[0] * x[i][0];
      for ( unsigned int j = 1 ; j < p ; ++j )
        xi += a[j] * x[i][j];
      mu[i] = g.invf( xi );
    }
  }

  if ( cnt < maxCount ) {
    // 係数行列の再計算(=フィッシャー情報行列)
    for ( unsigned int j = 0 ; j < p ; ++j ) {
      for ( unsigned int k = j ; k < p ; ++k ) {
        s[j][k] = x[0][j] * x[0][k] /
          ( pdf.variance( pdf.aveInv( mu[0] ) ) * pow( g.df( mu[0] ), 2 ) );
        for ( unsigned int i = 1 ; i < n ; ++i )
          s[j][k] += x[i][j] * x[i][k] /
            ( pdf.variance( pdf.aveInv( mu[i] ) ) * pow( g.df( mu[i] ), 2 ) );
        s[k][j] = s[j][k];
      }
    }
    LinearEquationSystem<double> inv( 0 ); // 係数行列の逆行列
    Inverse( s, inv );

    PrintEquation( "Estimated regression equation : y = ", a );
    cout << "variance of a = ( " << inv[0][0];
    for ( unsigned int i = 1 ; i < inv.size() ; ++i )
      cout << ", " << inv[i][i];
    cout << " )" << endl << endl;
  } else {
    cout << "Failed to estimate regression coefficient" << endl << endl;
  }

  return( cnt < maxCount );
}

スコア法を利用するにあたり、導関数と逆関数の算出が必要になります。任意の関数に対して数値解を求めるために、差分法により微分係数を求めるための関数 DiffMethod と、ニュートン-ラフソン法を使って f(x) = y を満たす x を計算するための関数 Newton が用意されています。DiffMethod は中心差分と呼ばれる以下の計算式を使って近似解を求めています。

f'(x) ≈ [ f( x + h ) - f( x - h ) ] / 2h

x を中心に微小量 h だけ正負側にシフトした時の f(x) の値を求め、その二点を結んだ直線の傾きを求めたい微分係数としています。理論的には h → 0 のときの極限が正確な値になりますが、できるだけ h を小さくした値で近似的に求めているわけです。

DiffMethodNewton は、関数の型をテンプレート引数として渡せるようにして、関数ポインタ・関数オブジェクトのどちらでも利用できるようにしてます。しかし、今回は特にインスタンス内のメンバ関数を呼び出したいので、MemFunc というクラスを定義しています。このクラスは、インスタンス時にメンバ関数へのポインタと対象オブジェクトを受け取り、operator() を使って対象オブジェクトのメンバ関数を呼び出します。DiffMethodNewtonfunc() の形で任意の関数の処理ができるようにしているのに対し、メンバ関数を呼び出すためには obj.memfunc() や p->memfunc() の形で呼び出す必要があるため、MemFunc オブジェクトの operator() で変換して、関数ポインタや関数オブジェクトと同じように扱うことができるようにしているわけです。

ExpFamily_IF は (一母数型) 指数型分布族を表すためのインターフェースです。スコア法では、A(η) とその導関数 (平均値)、導関数の逆関数 ( μ から η への変換 )、二階導関数 (分散) を求める必要があるため、それらをメンバ関数 a, average, aveInv, variance として定義しています。ExpFamily_GenericDiffMethod を使って導関数と二階導関数の近似解を求めるように実装したもので、a を実装すればどのような関数でも値が求められるようにしています。また、正規分布とポアソン分布を表したクラス ExpFamily_NormDist, ExpFamily_Poisson もサンプルとして用意しています。

指数型分布族と同様に、連結関数に対してもインターフェース LinkFunction_IF を用意しています。連結関数では導関数と逆関数が必要となるので、汎用連結関数 LinkFunction_Generic では導関数に DiffMethod、逆関数に Newton を利用しています。また、その他のサンプルとして恒等関数 IFunc と対数関数 LogFunc を実装しています。

スコア法は ScoringMethod で実装されています。非常に長いプログラムですが、内容は先ほど説明した処理を順番に行なっているだけの簡単なものです。連立方程式は LinearEquationSystem クラスで定義して、解の計算は「ガウスの消去法(Gaussian Elimination)」を利用した関数 GaussianElimination を利用しています。全ての係数が収束するまで処理を繰り返し、収束するか、繰り返しの最大回数を超えたらループを抜けるようになっています。最後に求められた係数とその分散値を出力して処理を終了します。先に述べた通り、分散値はフィッシャー情報行列 Φ から得ることができますが、Φ は係数行列の逆行列と等しいため、収束後にもう一度係数行列を計算し、その逆行列を計算すれば Φ を求めることができます。逆行列の計算には、「数値演算法 (7) 連立方程式を解く -1-」の「3) 連立方程式による逆行列の計算」で作成したサンプル・プログラム Inverse を利用しています。なお、ここでは対角成分となる分散値のみを出力していますが、求めた行列の要素そのものを出力すれば、各係数どうしの共分散を得ることもできます。

確率・統計 (13) 回帰分析法」の章で使ったサンプル・データを、サンプル・プログラムを使って処理してみます。データは次のようなものでした。

表 4-2. 教科 A, B と総合テストの得点
総合テスト教科A教科B総合テスト教科A教科B
709037778466
525241878969
788049605140
707736878778
788438716856
668625606037
849839597634
789630495728
645281668432
765680698640

二教科 A, B のテストの点数を独立変数 x1, x2、全教科を総合評価するための総合テストの得点を従属変数 y として、総合テストの得点と二教科のテストの得点の間のモデル式を定義し、その回帰係数を計算します。線形重回帰モデルの場合、その結果は

y = 10.39 + 0.56x1 + 0.37x2

でした。スコア法を使い、指数型分布族を正規分布、連結関数を恒等関数として計算した結果は次のようになります ( verbose = true にして冗長モードで出力しています )。但し、正規分布の分散値は y の標本分散 111.35 としています。

*** Scoring Method ***

Exponential Family of Distribution : Normal Distribution (var = 1.113e+02)
Link Function : Identity Function

N = 20; p = 3

x = ( 1, 90, 37 )
    ( 1, 52, 41 )
    ( 1, 80, 49 )
    ( 1, 77, 36 )
    ( 1, 84, 38 )
    ( 1, 86, 25 )
    ( 1, 98, 39 )
    ( 1, 96, 30 )
    ( 1, 52, 81 )
    ( 1, 56, 80 )
    ( 1, 84, 66 )
    ( 1, 89, 69 )
    ( 1, 51, 40 )
    ( 1, 87, 78 )
    ( 1, 68, 56 )
    ( 1, 60, 37 )
    ( 1, 76, 34 )
    ( 1, 57, 28 )
    ( 1, 84, 32 )
    ( 1, 86, 40 )

y = ( 70, 52, 78, 70, 78, 66, 84, 78, 64, 76, 77, 87, 60, 87, 71, 60, 59, 49, 66, 69 )

----- cnt = 0 -----

mu = ( 70, 52, 78, 70, 78, 66, 84, 78, 64, 76, 77, 87, 60, 87, 71, 60, 59, 49, 66, 69 )
g'(mu) = ( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )
w = ( 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35 )

Equation System :
(0.179614)x0 + (13.5878)x1 + (8.40593)x2 = 12.5819
(13.5878)x0 + (1069.54)x1 + (626.286)x2 = 971.612
(8.40593)x0 + (626.286)x1 + (449.645)x2 = 604.176

Regression equation : y = 10.3853x0 + 0.560639x1 + 0.36864x2

----- cnt = 1 -----

mu = ( 74.4825, 54.6528, 73.2998, 66.8255, 71.4873, 67.8163, 79.7049, 75.2659, 69.3984, 71.2723, 81.8092, 85.7184, 53.7235, 87.9148, 69.1526, 57.6633, 65.5276, 52.6636, 69.2755, 73.3459 )
g'(mu) = ( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )
w = ( 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35, 111.35 )

Equation System :
(0.179614)x0 + (13.5878)x1 + (8.40593)x2 = 12.5819
(13.5878)x0 + (1069.54)x1 + (626.286)x2 = 971.612
(8.40593)x0 + (626.286)x1 + (449.645)x2 = 604.176

Regression equation : y = 10.3853x0 + 0.560639x1 + 0.36864x2

Estimated regression equation : y = 10.3853x0 + 0.560639x1 + 0.36864x2
variance of a = ( 219.571, 0.0250153, 0.0185105 )

計算結果は線形重回帰モデルと同じになることがわかります。連結関数は恒等関数なので g'(mu) は常に 1 となり、対角行列 W の対角成分も常に分散と同じ値 111.35 となっています。各係数の分散から標準誤差 ( S.E. ) を求めると、

定数項 ( 219.571 )1/2 = 14.8

x1の係数 ( 0.0250153 )1/2 = 0.158

x2の係数 ( 0.0185105 )1/2 = 0.136

となります。前述の通り、係数ベクトルは多変量正規分布に漸近的に従うので、その場合は信頼度 0.95 の区間が 平均 ± 1.96 x S.E. になることから、各係数の 95% 信頼区間は

定数項 10.3853 ± 14.8 x 1.96 = [ -18.6, 39.4 ]

x1の係数 0.560639 ± 0.158 x 1.96 = [ 0.251, 0.870 ]

x2の係数 0.36864 ± 0.136 x 1.96 = [ 0.102, 0.635 ]

になります。

次に、指数型分布族と連結関数に以下のような汎用クラスを使ってみます。

/*
  正規分布を ExpFamily_Generic で表現
*/
struct TestExp : public ExpFamily_Generic
{
  double var_;

  virtual double a( double eta ) const
  { return( ( pow( eta, 2 ) * var_ + log( 2 * M_PI * var_ ) ) / 2 ); }

  virtual string ident() const
  { return( "Test Function" ); }
};
TestExp testExp;
testExp.var_ = 111.35;

/*
  恒等関数を LinkFunction_Generic で表現
*/
struct TestLink : public LinkFunction_Generic
{
  virtual double operator()( double x ) const
  { return( x ); }

  virtual string ident() const
  { return( "Test Function" ); }
};
TestLink testLink;

同じデータで処理を行うと次のような結果になりました。

*** Scoring Method ***

Exponential Family of Distribution : Test Function
Link Function : Test Function

N = 20; p = 3

x = ( 1, 90, 37 )
    ( 1, 52, 41 )
    ( 1, 80, 49 )
    ( 1, 77, 36 )
    ( 1, 84, 38 )
    ( 1, 86, 25 )
    ( 1, 98, 39 )
    ( 1, 96, 30 )
    ( 1, 52, 81 )
    ( 1, 56, 80 )
    ( 1, 84, 66 )
    ( 1, 89, 69 )
    ( 1, 51, 40 )
    ( 1, 87, 78 )
    ( 1, 68, 56 )
    ( 1, 60, 37 )
    ( 1, 76, 34 )
    ( 1, 57, 28 )
    ( 1, 84, 32 )
    ( 1, 86, 40 )

y = ( 70, 52, 78, 70, 78, 66, 84, 78, 64, 76, 77, 87, 60, 87, 71, 60, 59, 49, 66, 69 )

----- cnt = 0 -----

mu = ( 70, 52, 78, 70, 78, 66, 84, 78, 64, 76, 77, 87, 60, 87, 71, 60, 59, 49, 66, 69 )
g'(mu) = ( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )
w = ( 111.351, 111.35, 111.347, 111.351, 111.347, 111.351, 111.349, 111.347, 111.351, 111.351, 111.349, 111.349, 111.349, 111.349, 111.351, 111.349, 111.351, 111.35, 111.351, 111.351 )

Equation System :
(0.179614)x0 + (13.5878)x1 + (8.40594)x2 = 12.582
(13.5878)x0 + (1069.54)x1 + (626.288)x2 = 971.615
(8.40594)x0 + (626.288)x1 + (449.646)x2 = 604.178

Regression equation : y = 10.3853x0 + 0.56064x1 + 0.36864x2

----- cnt = 1 -----

mu = ( 74.4825, 54.6528, 73.2998, 66.8256, 71.4873, 67.8163, 79.7049, 75.2659, 69.3984, 71.2723, 81.8093, 85.7184, 53.7235, 87.9148, 69.1526, 57.6633, 65.5277, 52.6637, 69.2755, 73.3459 )
g'(mu) = ( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )
w = ( 111.351, 111.351, 111.349, 111.353, 111.347, 111.351, 111.349, 111.351, 111.349, 111.351, 111.351, 111.349, 111.351, 111.351, 111.347, 111.35, 111.349, 111.35, 111.349, 111.349 )

Equation System :
(0.179614)x0 + (13.5878)x1 + (8.40593)x2 = 12.582
(13.5878)x0 + (1069.54)x1 + (626.287)x2 = 971.613
(8.40593)x0 + (626.287)x1 + (449.646)x2 = 604.176

Regression equation : y = 10.3852x0 + 0.56064x1 + 0.368641x2

Estimated regression equation : y = 10.3852x0 + 0.56064x1 + 0.368641x2
variance of a = ( 219.572, 0.0250154, 0.0185105 )

今度は W の対角成分で誤差が少し大きくなっていますが、ほぼ同じ結果が得られています。

*4-1)数値演算法 (5) 有理数と無理数の演算」の「6) ニュートン - ラフソン法」を参照

*4-2)確率・統計 (6) 標本分布」の「1) χ2-分布(Chi-square Distribution)」にある「χ2-分布に対する性質」を参照

*4-3)検索アルゴリズム (2) 二分探索/二分探索木」の「1) 二分探索(Binary Search)」にある「二分法」を参照


5) 尤度比 (Likelihood-ratio)

飽和モデルは、N 個の測定値(独立変数)に対してそれと同数の N 個のパラメータを使ってモデル式を定義していました。各測定値は同じ確率分布を持ち互いに独立であると仮定し、各パラメータは一つの独立変数のみに関連付けられます。但し、繰り返し測定を行ったなどの理由で独立変数が重複する場合、パラメータの数は相異なる独立変数の数と同数とします。飽和モデルに対する対数尤度関数は、指数型分布族が正準形のとき次のように定義されるのでした。

l(η|y) ≡ log L(η|y) = Σi{1→m}( Σj{1→ni}( ηiyij - A(ηi) + B(yij) ) )

ここで、m は飽和モデルにおける相異なる独立変数の数 ( = パラメータ数 ) を、ni は i 番目の独立変数において重複した数をそれぞれ表します。∂l / ∂ηi

∂l / ∂ηi = Σj{1→ni}( yij - A'( ηi ) )

なので、∂l / ∂ηi = 0 となるときの ηi

ηi = A' (-1)( Σj{1→ni}( yij ) / ni )

となって、これを l(η|y) の式に代入することによって飽和モデルにおける最大対数尤度を計算することができます。

yi の期待値 E[yi] = μi が、連結関数 g(μi) によって、独立変数の線形結合で表されるとき、その式を g(μi) = xiTα とし、パラメータ数を p とすれば、モデル式は

l(α|y) ≡ log L(α|y) = Σi{1→N}( η(α)yi - A( η(α) ) + B(yi) )

になります。但し、N は独立変数の(重複も含めた)数を表しています。尤度が最大となるときの η, α をそれぞれ h, a とし、そのときの「尤度比 (Likelihood-ratio)」λ を

λ = L(h|y) / L(a|y)

と定義すると、この値が大きければ、関心のあるモデル式が飽和モデルに比べてデータをうまく表せていない、すなわち当てはめ方がよくないことを意味します。実際には、尤度比の対数の二倍、

D ≡ 2log λ = 2[ l(h|y) - l(a|y) ]

を使ってモデル式の有効性を判断します。この値 D を「対数尤度統計量(Log Likelihood (Ratio) Statistic)」といいます。

上式に対して、テイラー - マクローリン展開を利用した近似式を二次の項まで求めると、最尤推定量 a が変数 α に非常に近いときは

l(α) ≈ l(a) + ∇l(a)T( α - a ) + ( α - a )TH( α - a ) / 2

となります。但し、∇l(a) は ∂l(a) / ∂aj ( j = 1, 2, ... ) からなるベクトルで、H は j 行 k 列の要素を ∂2l(a) / ajak とする行列です。∇l(a) はスコア統計量からなるベクトルなので、a が最尤推定量ならばゼロベクトルになります。また、H はフィッシャー情報行列 Φ そのものなので、

l(α) ≈ l(a) + ( α - a )TΦ( α - a ) / 2 より

2[ l(a) - l(α) ] ≈ ( α - a )TΦ( α - a )

となって、a の要素数 (すなわちモデル式のパラメータ数) を p とすれば、この値は自由度 p の χ2-分布に漸近的に従います (*5-1)。この式を使うと、対数尤度統計量 D は

D=2[ l(h) - l(a) ]
=2[ l(h) - l(η) ] - 2[ l(a) - l(α) ] + 2[ l(η) - l(α) ]

と表すことができます。第一項は自由度 m の χ2-分布に従い、第二項は自由度 p の χ2-分布に従います。最後の項は、l(α) による当てはめがよいとき l(η) ≈ l(α) となり、無視することができるので、当てはめがよければ D は漸近的に自由度 m - p の χ2-分布に従うことになります。

飽和モデルの最大尤度は、他のモデル式の最大尤度よりも必ず大きくなります。なぜなら、飽和モデルは他のモデルよりも変数が多く、尤度をできるだけ大きくするための自由度も最も高いからです。わかりやすい例では、分散が既知の正規分布に従う独立な N 個の確率変数 yi ( i = 1, 2, ... N ) に対し、飽和モデルは

L(μ) = [ 1 / ( 2πσ2 )N/2 ] Πi{1→N}( exp( -( yi - μi )2 / 2σ2 ) )

なので、μi = yi のとき尤度は最大値 1 / ( 2πσ2 )N/2 になるのに対し、パラメータ数が一つのみの場合は

L(μ) = [ 1 / ( 2πσ2 )N/2 ] Πi{1→N}( exp( -( yi - μ )2 / 2σ2 ) )

で、最大値は μ = Σi{1→N}( yi ) / N のときで、全ての yi が等しくない限り 1 / ( 2πσ2 )N/2 より小さくなります。これは、変数が少ない分、尤度が最大となるようにパラメータを調整する自由度が小さいためです。このことから、l(η) - l(α) は必ず正値をとり、当てはまりが良くなければその値は大きくなっていきます。従って、D が χ2-分布に従うことを利用して、推定や検定を行うことができます。この検定法は「尤比度検定 (Likelihood-ratio Test)」と呼ばれています。


yi が互いに独立に正規分布 N( μi, σ2 ) に従う場合を考えると、飽和モデルにおける対数尤度関数は

l(μ) = -Nlog( 2πσ2 ) / 2 - Σi{1→N}( ( yi - μi )2 ) / 2σ2

なので、l(μ) が最大値となるのは μi = yi のときで

l(μ)max = -Nlog( 2πσ2 ) / 2

になります。連結関数が恒等関数で、g(μi) = μi = xiTα のときは

l(α) = -Nlog( 2πσ2 ) / 2 - Σi{1→N}( ( yi - xiTα )2 ) / 2σ2

であり、α の最尤推定量を a とすれば

l(α)max = -Nlog( 2πσ2 ) / 2 - Σi{1→N}( ( yi - xiTa )2 ) / 2σ2

です。よって、両者の対数尤度統計量は

D = l(μ)max - l(α)max = Σi{1→N}( ( yi - xiTa )2 ) / σ2

であり、xiTa は予測値そのものなのでこれを y^i とすれば

D = Σi{1→N}( ( yi - y^i )2 ) / σ2

という結果になります。これは、観測値と予測値の残差の二乗和を分散で割った結果 (残差の平方和) であり、自由度 N - p - 1 の χ2-分布に従うのでした(*5-2)。飽和モデルのパラメータ数は N であり、線形重回帰モデルの場合は(定数項の添字をゼロとした時) p + 1 なので、D が従う確率分布に一致します。また、このとき、D は「漸近的に」ではなく「正確に」自由度 N - p - 1 の χ2-分布に従うことになります。

ここで、p = 0 の場合を考えると、これは μi = α0 すなわち定数であることを意味し、そのときの対数尤度の最大値は、α0 の最尤推定量が a0 = my すなわち yi の標本平均だったので

l(α0)max = -Nlog( 2πσ2 ) / 2 - Σi{1→N}( ( yi - my )2 ) / 2σ2

となり、l(μ)max との間の対数尤度統計量を D0 とすると

D0 = Σi{1→N}( ( yi - my )2 ) / σ2

となります。この値は観測値の ( 平均を原点とした時の ) 平方和を分散で割った値 (観測値の平方和) であり、自由度 N - 1 の χ2-分布に従います(*5-2)。p = 0 のときのモデル式は当てはめの最も悪いものであると考えられます。最も単純でパラメータ数も最小であることから、このモデルは「最小モデル (Minimal Model)」と呼ばれています。D0 は飽和モデルと最小モデルの尤度比なので、最も値が大きくなります。D0 と D の差が大きければ、D の値は相対的に小さいことになり、当てはめも良くなると考えられます。D0 と D の差と D0 との比率を R2 として

R2 = ( D0 - D ) / D0 = [ Σi{1→N}( ( yi - my )2 ) - Σi{1→N}( ( yi - y^i )2 ) ] / Σi{1→N}( ( yi - my )2 )

とすると、分散 σ2 を打ち消すことができて、「回帰分析法」で紹介した「決定係数 (Coefficient Of Determination)」「寄与率 (Contribution Ratio)」と全く同じ内容になります (*5-3)。ここで、分子部分は「観測値の平方和」と「残差の平方和」の差であり、この値は予測値とその標本平均との差の平方和 (予測値の平方和) と等しくなります。すなわち、予測値の標本平均を m^y として

R2 = Σi{1→N}( ( y^i - m^y )2 ) / Σi{1→N}( ( yi - my )2 )

が成り立ちます。なお、R2 の平方根は「重相関係数 (Multiple Correlation Coefficient)」と呼ばれます (*5-3)。

また、自由度 M, N の χ2-分布に従う互いに独立な確率変数 t, u に対して

F = ( t / M ) / ( u / N )

としたとき、F は自由度 ( M, N ) の F-分布に従うため、D0 - D = Σi{1→N}( ( y^i - m^y )2 ) / σ2 が自由度 p の χ2-分布に従うことを利用して(*5-4)、

F = [ ( D0 - D ) / p ] / [ D / ( N - p - 1 ) ]

を使って推定や検定を行うことができます。これらは、yi に共通な分散 σ2 が未知の場合に有効な推定・検定方法となるのでした。この結果から、尤度比検定は、重回帰分析において得られた「決定係数」や「分散分析表」の概念を一般化したものであると考えることができます。


最小モデルに対する対数尤度関数の一般式は次のようになります。

l(η|y) ≡ log L(η|y) = Σi{1→n}( ηyi - A(η) + B(yi) )

したがって、∂l / ∂η は

∂l / ∂η = Σi{1→n}( yi - A'(η) )

で、∂l / ∂η = 0 のとき

η = A' (-1)( Σi{1→n}( yi ) / n )

なので、これを l(η|y) に代入することで最小モデルに対する最大尤度関数が得られます。


一般的な尤比度検定の使い方は、あるモデル M1 と、その中から不要と思われるパラメータを除外した、より単純なモデル M0 を比較するというものです。M0, M1 それぞれの独立変数の数を q, p としたとき、M0 は不要なパラメータが除外されているので p > q が成り立ちます。モデル M0, M1 の最大対数尤度をそれぞれ l(a0|y), l(a1|y) としたとき ( つまり、a0, a1 は最尤推定量を表しています )、両者の対数尤度統計量 D は

D = 2[ l(a1|y) - l(a0|y) ]

と表すことができます。相異なる独立変数ベクトルの数を m とする飽和モデルの最大対数尤度を l(h|y)、飽和モデルと M0, M1 の対数尤度統計量を D0, D1 とすれば、

D0 = 2[ l(h|y) - l(a0|y) ]

D1 = 2[ l(h|y) - l(a1|y) ]

であり、M0, M1 のデータへの当てはめがよいほど D0, D1 の値は小さくなり、それらはそれぞれ自由度 m - q, m - p の χ2-分布に従います。D0, D1 によってどちらも当てはめがよいと確認できれば、その差 D0 - D1 を求めると

D0 - D1=2[ l(h|y) - l(a0|y) ] - 2[ l(h|y) - l(a1|y) ]
=2[ l(a1|y) - l(a0|y) ] = D

となって、この値は自由度 p - q の χ2-分布に従うので、D の信頼度が高ければ、より単純な M0 を最適なモデルとして選ぶことができます。前述した「回帰分析法」の中では、D0 に最小モデルを使い、回帰係数によりパラメータ数を少なくしたモデルとの対数尤度統計量により検定を行なっていることになります。

*5-1) 詳細については、この章の「4) スコア法 (Method of Scoring)」を参照

*5-2)確率・統計 (13) 回帰分析法」の「2) 重相関係数 (Multiple Correlation Coefficient)」にある「分散分析表」の説明を参照

*5-3)確率・統計 (13) 回帰分析法」の「2) 重相関係数 (Multiple Correlation Coefficient)」参照

*5-4)確率・統計 (13) 回帰分析法」の「補足2) 予測値の標本分散」参照


6) 残差統計量 (Residuals)

線形重回帰モデル yi = xiTα + εi では、εi はモデル式では説明できない誤差成分であり、N( 0, σ2 ) に従う確率変数として扱っていました。yi の期待値 μi = E[yi] が、α の最尤推定量 a によって当てはめ値 y^i = xiTa として得られたとき、yi - y^i を「残差 (Residual)」といいます。誤差成分 εi の標準偏差 σ は通常、未知の値ですが、これが推定量 σ^ として得られたとしたとき、残差を σ^ で割った値

( yi - y^i ) / σ^

は「標準化残差 (Standardized Residual)」または「スチューデント化残差 (Studentized Residual)」と呼ばれます。仮定したモデルがデータをよく表現しているのなら、残差は独立変数や従属変数とは無関係であり、さらには他のパラメータや測定順番などによっても相関は発生しないはずです。従って、横軸に独立変数や従属変数、測定順番、さらには他の関連するパラメータなどをとり、縦軸を標準化残差としたグラフを描いて関連性がないかをチェックすることによって、モデル式による当てはめのよさを調べることができます。標準化残差は利用する確率分布によって異なり、例えばポアソン分布の場合は E[yi] = V[yi] なので、この推定値を y^i としたとき、標準化残差は

( yi - y^i ) / √y^i

になります。

線形重回帰モデルでの残差 yi - y^i を成分とする残差ベクトル e = y - y^ = ( y1 - y^1, y2 - y^2, ... )T は、正規方程式

XTXa = XTy

より

y^ = Xa = X(XTX)-1XTy

であることを利用すると

e = y - X(XTX)-1XTy = [ E - X(XTX)-1XT ]y

となります。但し、E は「単位行列 (Identity Matrix)」とします。このとき、e の期待値 E[e] は

E[e]=[ E - X(XTX)-1XT ]E[y]
= - X(XTX)-1(XTX)α
= - = 0

であり、共分散行列 V[e] は

V[e]=E[eeT]
=[ E - X(XTX)-1XT ]E[yyT][ E - X(XTX)-1XT ]T

を計算することで求めることができます。E[yyT] は

E[yyT]=E[( + ε )( + ε )T]
=E[XααTXT + XαεT + εαTXT + εεT]
=XααTXT + E[εT] + E[ε]αTXT + E[εεT]
=XααTXT + σ2E

と変形ができます。但し、ε は εi からなる残差ベクトルで、互いに独立であり (従って、E[εεT] の非対角成分は全てゼロになります)、正規分布 N( 0, σ2 ) に従うとします (従って、E[ε] = 0, E[εT] = 0T です)。この式を代入すれば、

V[e]=[ E - X(XTX)-1XT ]( XααTXT + σ2E )[ E - X(XTX)-1XT ]T
=[ XααTXT + σ2E - X(XTX)-1(XTX)ααTXT - σ2X(XTX)-1XT ][ E - X(XTX)-1XT ]T
=σ2[ E - X(XTX)-1XT ][ E - X(XTX)-1XT ]T

となります。XTX は対称行列であり、その逆行列も対称行列なので(*6-1)、E - X(XTX)-1XT も対称行列です。従って、

[ E - X(XTX)-1XT ][ E - X(XTX)-1XT ]T
=[ E - X(XTX)-1XT ]2
=E - 2X(XTX)-1XT + [ X(XTX)-1XT ]2
=E - 2X(XTX)-1XT + X(XTX)-1(XTX)(XTX)-1XT
=E - X(XTX)-1XT

となり、E - X(XTX)-1XT はべき等行列になります ( 上記の計算過程から X(XTX)-1XT もべき等行列であることがわかります )。H = X(XTX)-1XT とすれば、

V[e] = σ2( E - H )

という結果が得られ、その対角成分が yi - y^i の分散となることから、H の第 i 番目の対角成分を hi とすれば

V[yi - y^i] = σ2( 1 - hi )

となります。H は「射影行列 (Projection Matrix)」または「ハット行列 (Hat Matrix)」と呼ばれます。

σ は相変わらず未知であるため、その推定量を σ^ とすれば、線形重回帰モデルでの標準化残差 ri

ri = ( yi - y^i ) / σ^( 1 - hi )1/2

で計算することができます。hi は「てこ比 (Leverage)」といい、y^ = Hy より、てこ比の大きな成分は当てはめ値に対して大きな影響を及ぼすことになります。hi は必ず正値になり、その和は独立変数ベクトルの成分の数 (以下、これを p とします) に等しいため、実測値の総数を N としたとき、てこ比が p / N の 2 から 3 倍以上であれば注意が必要だとされています (補足 3)。標準化残差とてこ比を組み合わせた指標として、「DEFFITS」と「クックの距離 (Cook's Distance)」があり、それぞれ

DFFITSi = ri[ hi / ( 1 - hi ) ]1/2

Di = ( DFFITSi )2 / 2 = ri2[ hi / ( 1 - hi ) ] / p

で表されます。これらが大きな値を示す場合、その実測値の影響力が大きいと判断することができます。

*6-1) 対称行列の逆行列がやはり対称行列になることの証明は「固有値問題 (2) カルーネン・レーベ展開」の「4) 主成分分析」にて最後の方で紹介しています。


今回は、一般化線形モデルの概念を、主に重回帰分析と比較した形で紹介しました。このモデルを利用した具体的な手法については、次の章で紹介したいと思います。


補足1) 多変量正規分布とカイ二乗分布

x = ( x1, x2, ... xp )T を、正規分布に従う p 個の確率変数からなるベクトルとします。x の共分散行列を V で表すとその r 行 c 列めの要素は E[( xr - μr )( xc - μc )] であり、さらに x の平均ベクトルを μ = ( μ1, μ2, ... μp )T とすれば、x は多変量正規分布 N( μ, V ) に従うことになります。V は対称行列であり、その固有値からなる対角行列を D、固有ベクトルからなる直交行列を Q としたとき V = QDQT または V-1 = QD-1QT が成り立つのでした。従って、

( x - μ )TV-1( x - μ ) = ( x - μ )TQD-1QT( x - μ ) = [ QT( x - μ ) ]TD-1[ QT( x - μ ) ] = x'TD-1x'

と変換することができます。但し、平均がゼロになるように座標をシフトした上で QT によって直交変換したベクトル QT( x - μ ) を x' としています。このときのベクトル x' は直交行列 QT によって回転・鏡映した状態であることを意味するので(主軸変換)、ベクトルどうしの角度や大きさは変化していません。x' = ( x'1, x'2, ... x'p )TD の対角成分(すなわち V の固有値)を λj ( j = 1, 2, ... p ) とすれば、

x'TD-1x' = Σj{1→p}( x'j2 / λj )

となります。ところで、多変量正規分布 N( 0, V ) は

N( 0, V ) = { 1 / ( 2π )p/2|V|1/2 } exp( -( x - μ )TV-1( x - μ ) / 2 )

なので、|V| = |D| であることを利用して

N( 0, V )={ 1 / ( 2π )p/2|V|1/2 } exp( -( x - μ )TV-1( x - μ ) / 2 )
={ 1 / ( 2π )p/2|D|1/2 } exp( -x'TD-1x' / 2 )・|det(J)|
={ 1 / ( 2π )p/2Πj{1→p}( √λj ) } exp( -Σj{1→p}( x'j2 / 2λj ) )・|det(J)|
=Πj{1→p}( { 1 / ( 2πλj )1/2 } exp( -x'j2 / 2λj ) )・|det(J)|

と式を変更することができます。但し、|det(J)| は変数変換によって生じるヤコビアンの絶対値で、その i 行 j 列の要素は ∂x'i / ∂xj になります。Q の i 列目の固有ベクトルを ui = ( ui,1, ui,2, ... ui,p ) としたとき、この値は

∂x'i / ∂xj=( ∂ / ∂xj )uiT( x - μ )
=( ∂ / ∂xjk{1→p}( ui,k( xk - μk ) )
=ui,j

となるので、ヤコビ行列は直交行列 Q と等しくなり、その行列式は ±1 なので (*N1-1)、最終的に N( 0, V ) は

N( 0, V ) = Πj{1→p}( { 1 / ( 2πλj )1/2 } exp( -x'j2 / 2λj ) )

となります。これは、平均ゼロ、分散 λj の正規分布 N( 0, λj ) の同時分布を意味し、このとき x'j は互いに独立な状態になります。標準正規分布 N( 0, 1 ) に従う互いに独立な確率変数の二乗和は、χ2-分布に従うことから、x'j / √λj の二乗和

Σj{1→p}( x'j2 / λj ) = x'TD-1x'

は自由度 p のχ2-分布に従い、

x'TD-1x' = ( x - μ )TV-1( x - μ )

より ( x - μ )TV-1( x - μ ) が自由度 p の χ2-分布に従うことになります。但し、V は逆行列を持つことを前提としているので、固有値にゼロが含まれている場合はこの式は成り立たなくなります。

特に一変量の正規分布に対しては、上式は

u2 / σ2 = ( x - μ )2 / σ2

となって、( x - μ ) / σ が標準正規分布に従うことから、その二乗は自由度 1 の χ2-分布に従います。

*N1-1)確率・統計 (5) 正規分布」の「補足4) 行列の積の行列式」の中で、|AB| = |A||B| が成り立つことを証明しています。これを使えば、QTQ = E (単位行列) より Q の行列式は ±1 になります。


補足2) 多変量のテイラー - マクローリン展開 (Multivariate Taylor-Maclaurin Expansion)

多変量のテイラー - マクローリン展開を証明するためには、多変数関数をいったん一変数関数に置き換える必要があります。それにはまず、多変数関数の合成関数の微分に関する公式を証明します。

一変数関数 f(x) が微分可能で、x は微分可能な関数 x = x(t) が成り立つとした時、微分の定義

f'(x) = lim{h→0}( [ f(x+h) - f(x) ] / h )

より

ε(h) = [ f(x+h) - f(x) - hf'(x) ] / h

とおけば ε(h) → 0 ( h → 0 ) であり、上式を変形した式

f(x+h) = f(x) + hf'(x) + hε(h) --- (1)

が成り立ちます。この式 (1) を使って合成関数を変形すると、

f( x(t+h) ) = f( x(t) + hx'(t) + hε1(h) )

と表せるので、δ = hx'(t) + hε1(h) としたとき

f( x(t+h) )=f( x(t) + δ )
=f( x(t) ) + δf'( x(t) ) + δε2(δ)
=f( x(t) ) + [ hx'(t) + hε1(h) ]f'( x(t) ) + [ hx'(t) + hε1(h) ]ε2(δ)
=f(x) + hf'(x)x'(t) + h{ ε1(h)f'(x) + [ x'(t) + ε1(h) ]ε2(δ) }

となりますが、h → 0 のとき ε1(h) → 0 であり、従って δ → 0 なので、ε2(δ) → 0 も成り立ち

ε1(h)f'(x) + [ x'(t) + ε1(h) ]ε2(δ) → 0 ( h → 0 )

となります。よって、(1) 式と見比べると f'(x)x'(t) = ( df / dx )( dx / dt ) が f( x(t+h) ) の導関数であり、従って

df / dt = ( df / dx )( dx / dt )

が成り立ちます。(1) 式を見ると、x を a に固定して h を変数とすれば、hε(h) が無視できるとき f( a + h ) は h の一次式であり、その傾きは f'(a) になります。hε(h) を無視して、x = a + h ( つまり h = x - a ) とすれば、(1) 式は

f(x) = f(a) + f'(a)( x - a )

となりますが、これは一変数のテイラー-マクローリン展開を一次項まで表した式と同一になります。これらの式は、f(x) を微小な領域において直線と見立てたときの近似式を表していると考えることができます。これを二変数の場合に拡張してみると、(1) 式は次のように表すことができます。

f( x + h, y + k ) = f(x,y) + hfx(x,y) + kfy(x,y) + hεx(h) + kεy(k) --- (2)

但し、εx(h) → 0 ( h→0 ) ; εy(k) → 0 ( k→0 )

ここで、fx( x, y ) と fy( x, y ) はそれぞれ f の x, y による偏微分です。k = 0 ならば (2) 式は

f( x + h, y ) = f(x,y) + hfx(x,y) + hεx(h)

であり、h = 0 ならば

f( x, y + k ) = f(x,y) + kfy(x,y) + kεy(k)

となって、x, y を固定して一変数関数として考えればこの式は (1) と同等になります。また、δ = ( h, k ), ε = ( εx(h), εy(k) ) としたとき、「コーシー = シュワルツの不等式」より | ( δ, ε ) | ≤ ||δ||・||ε|| が成り立つことから

| hεx(h) + kεy(k) | ≤ ( h2 + k2 )1/2( εx(h)2 + εy(k)2 )1/2

であり、ε( h, k ) = ( εx(h)2 + εy(k)2 )1/2 とすれば、εx(h) → 0, εy(k) → 0 のとき ε( h, k ) → 0 であり、(2) 式は

f( x + h, y + k ) = f(x,y) + hfx(x,y) + kfy(x,y) + ( h2 + k2 )1/2ε( h, k )

と表すこともできます。(2) 式において hεx(h), kεy(k) が無視できるとすれば、f( x + h, y + k ) は平面の方程式を表し、y を固定した時の x の増分は h、x を固定した時の y の増分は k になります。従って、この式は f( x, y ) を微小な領域において平面見立てたときの近似式を表していると考えることができます。さらに一般に、多変数 x = ( x1, x2, ... ) の関数 f(x) における (2) 式は

f( x + h ) = f(x) + ( h, ∇f(x) ) + ||h||ε(h)

但し、ε(h) → 0 ( h0 )

と表すことができます。但し、

∇f(x) = ( ∂f / ∂x1, ∂f / ∂x2, ... )

h = ( h1, h2, ... )

であり、

( h, ∇f(x) ) = h1∂f / ∂x1 + h2∂f / ∂x2 + ...

を意味します。


もう一度、二変数の場合に戻って、いよいよ合成関数の微分について考えます。二変数関数 f( x, y ) の変数 x, y が x( u, v ), y( u, v ) としてやはり二変数 u, v によって表されるとした時、(2) 式を使って

Δx ≡ x( u + h, v + k ) - x( u, v ) = hxu + kxv + hεu + kεv

Δy ≡ y( u + h, v + k ) - y( u, v ) = hyu + kyv + hεu + kεv

但し、εu → 0 ( h→0 ) ; εv → 0 ( k→0 )

と表すことができます (引数の一部は省略しています)。よって、

f( x(u+h,v+k), y(u+h,v+k) )=f( x + Δx, y + Δy )
=f(x,y) + Δxfx + Δyfy + Δxεx + Δyεy
=f(x,y) + ( hxu + kxv + hεu + kεv )fx + ( hyu + kyv + hεu + kεv )fy + ( Δxεx + Δyεy )
=f(x,y) + h( fxxu + fyyu ) + k( fxxv + fyyv ) + hεu( fx + fy ) + kεv( fx + fy )
 + ( hxu + kxv + hεu + kεvx + ( hyu + kyv + hεu + kεvy
=f(x,y) + h( fxxu + fyyu ) + k( fxxv + fyyv ) + hεu( fx + fy ) + kεv( fx + fy )
 + hεx( xu + εu ) + kεx( xv + εv ) + hεy( yu + εu ) + kεy( yv + εv )
=f(x,y) + h( fxxu + fyyu ) + k( fxxv + fyyv )
 + h[ εu( fx + fy ) + εx( xu + εu ) + εy( yu + εu ) ]
 + k[ εv( fx + fy ) + εx( xv + εv ) + εy( yv + εv ) ]

と変形することができますが、h → 0 のとき εu → 0、k → 0 のとき εv → 0 で、h → 0, k → 0 であれば Δx → 0, Δy → 0 なので εx → 0, εy → 0 が成り立ち、

εu( fx + fy ) + εx( xu + εu ) + εy( yu + εu ) → 0 ( h, k → 0 )

εv( fx + fy ) + εx( xv + εv ) + εy( yv + εv ) → 0 ( h, k → 0 )

が成り立ちます。よって、(2) 式と見比べると

∂f / ∂u = fxxu + fyyu = ( ∂f / ∂x )( ∂x / ∂u ) + ( ∂f / ∂y )( ∂y / ∂u )

∂f / ∂v = fxxv + fyyv = ( ∂f / ∂x )( ∂x / ∂v ) + ( ∂f / ∂y )( ∂y / ∂v )

が成り立つことが証明されます。一般に、多変数関数 f(x) の変数 x が、他の変数 u によって xi = xi(u) で表されるとき、

∂f / ∂ui = ( ∂f / ∂x1 )( ∂x1 / ∂ui ) + ( ∂f / ∂x2 )( ∂x2 / ∂ui ) + ...

が成り立つことも、同様なやり方で証明できます。


二変数関数 f( x, y ) に対し、x(t) = x + ht, y(t) = y + kt として、φ(t) を

φ(t) = f( x(t), y(t) ) = f( x + ht, y + kt ) ( 0 ≤ t ≤ 1 )

とします。テイラー-マクローリンの公式から、

φ(1) = φ(0) + φ'(0) + φ(2)(0) / 2! + ... + φ(n)(0) / n! + ...

であり、合成関数の微分の公式から

φ'(t)=dφ / dt
=( ∂ / ∂x )f( x + ht, y + kt )・( ∂x / ∂t ) + ( ∂ / ∂y )f( x + ht, y + kt )・( ∂y / ∂t )
=hfx( x + ht, y + kt ) + kfy( x + ht, y + kt )

となります。但し、fx( x + ht, y + kt ) = ( ∂ / ∂x )f( x + ht, y + kt ), fy( x + ht, y + kt ) = ( ∂ / ∂y )f( x + ht, y + kt ) であり、それぞれ f を x, y で偏微分した結果に相当します。このとき、上式を

φ'(t) = [ h( ∂ / ∂x ) + k( ∂ / ∂x ) ]f( x + ht, y + kt )

と表すことがあります。このときの ∂ / ∂x, ∂ / ∂y は「微分作用素 (Differential Operator)」と呼ばれます。

今度は二階微分を求めてみると、

φ(2)(t)=h( d / dt )fx( x + ht, y + kt ) + k( d / dt )fy( x + ht, y + kt )
=h[ ( ∂ / ∂x )fx( x + ht, y + kt )・( ∂x / ∂t ) + ( ∂ / ∂y )fx( x + ht, y + kt )・( ∂y / ∂t ) ]
 + k[ ( ∂ / ∂x )fy( x + ht, y + kt )・( ∂x / ∂t ) + ( ∂ / ∂y )fy( x + ht, y + kt )・( ∂y / ∂t ) ]
=h2fxx( x + ht, y + kt ) + hkfxy( x + ht, y + kt )
 + hkfyx( x + ht, y + kt ) + k2fyy( x + ht, y + kt )

となります。但し、fxx( x + ht, y + kt ), fyy( x + ht, y + kt ) はそれぞれ x, y による二階偏導関数、fxy( x + ht, y + kt ) は x, y の順番で偏微分を、fyx( x + ht, y + kt ) は y, x の順で偏微分を行った二階偏導関数です。fxy と fyx は必ずしも等しくないことに注意して下さい。微分作用素の部分だけ括るようにすれば、

φ(2)(t)=[ h2( ∂2 / ∂x2 ) + hk( ∂2 / ∂x∂y ) + hk( ∂2 / ∂y∂x ) + k2( ∂2 / ∂y2 ) ]f( x + ht, y + kt )
=[ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]2f( x + ht, y + kt )

と表すことができます。この結果から、

φ(r)(t) = [ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]rf( x + ht, y + kt )

が成り立つことが予想され、これが成り立つと仮定した時、

φ(r+1)(t)=[ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]{ [ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]rf( x + ht, y + kt ) }
=[ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]r+1f( x + ht, y + kt )

なので、帰納法により実際に成り立つことが証明できます。従って、

φ(1) = f( x + h, y + k )=φ(0) + φ'(0) + φ(2)(0) / 2! + ... + φ(n)(0) / n! + ...
=f( x, y ) + [ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]f( x, y ) + [ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]2f( x, y ) / 2! +
 ... + [ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]nf( x, y ) / n! + ...
=Σn{0→∞}( [ h( ∂ / ∂x ) + k( ∂ / ∂y ) ]nf( x, y ) / n! )

となり、これが二変数でのテイラー-マクローリン展開になります。同様の考え方によって、p 変数のテイラー-マクローリン展開は

f( x + h ) = Σn{0→∞}( [ h1( ∂ / ∂x1 ) + h2( ∂ / ∂x2 ) + ... + hp( ∂ / ∂xp ) ]nf( x, y ) / n! )

となります。


補足 3) てこ比の性質

「てこ比 (Leverage)」は、射影行列 H = X(XTX)-1XT の対角成分を指すのでした。H は対称行列かつべき等行列であり、E - H ( E は「単位行列 (Identity Matrix)」) も対称行列かつべき等行列です。任意の対称行列 A の i 番めの列ベクトルを ai としたとき、これは i 番めの行ベクトルでもあります。よって、A2 の i 番めの対角成分は || ai ||2 で必ずゼロ以上の値をとり、ゼロになるのは ai = 0 の場合のみです。A がべき等行列ならば、A2 = A なので、A が対称かつべき等ならその対角成分は必ずゼロ以上になります。従って、i 番めのてこ比を hi としたとき、H が対称行列かつべき等行列であることから hi ≥ 0 であり、E - H が対称行列かつべき等行列であることから 1 - hi ≥ 0 が成り立ちます。よって、

0 ≤ hi ≤ 1

であることが示されます。

A = BF となる行列 F が存在するならば、A の列ベクトルは全て B の列ベクトルの線形結合で表すことができます (*n3-1)。B の列ベクトルの中で線形独立なものの数は B の階数であり、その線形結合を列ベクトルとする A の階数は、B の階数より減ることはありますが大きくなることは決してありません (階数が減る簡単な例は、F = 0 のときで、この場合は A もゼロ行列なので、B の階数にかかわらず A の階数はゼロになります)。従って、

rank(A) = rank(BF) ≤ rank(B)

すなわち、任意の行列を掛けた場合は階数が小さくなる場合があることを意味します。これを利用すると、射影行列の定義から rank(H) ≤ rank(X) であることがすぐにわかります。しかし、

HX = X(XTX)-1(XTX) = X

より rank(X) = rank(HX) ≤ rank(H) でもあり、両者が成り立つためには rank(H) = rank(X) でなければなりません。また、H はべき等行列なので、対角成分の和「トレース(Trace)」は階数と等しく、rank(H) = tr(H) が成り立ちます。tr(H) はてこ比の総和を意味するので、結局

Σi( hi ) = rank(X)

という結果が得られます。X の行ベクトルが各独立変数のベクトルを表し、その成分数が p であるとします。また、そのベクトルが N 個あったとすれば、X は N 行 p 列の行列になります。N > p のとき、XTX が正則なら、rank(XTX) = p であり、従って rank(X) = p です。よって、Σi{1→N}( hi ) = p であり、hi の平均は p / N 程度となります。hi > 0 なので、p / N の 2 から 3 倍以上のてこ比があるということは、他のてこ比は相対的に小さいことになり、特定の独立変数における影響度が大きいことを意味するので注意が必要になります。

英語の "Leverage" は「(目的を達成するための)力、行動力、影響力、勢力」を意味するとともに「てこの作用、てこ装置、てこ比」の意味もあるようです。てこは、小さな力から大きな力を生み出すおなじみの道具のことですが、意味としては「影響力」という訳の方が合っているような気がします。なぜこのような和訳になったのかは不明です。

*n3-1)(12) 二標本の解析 -2-」の「補足2) べき等行列の階数」参照。


<参考文献>
1. 「一般化線形モデル入門」 Annette J. Dobson 著 (共立出版)
2. 「基礎課程 解析入門」 野本 久夫 / 岸 正倫 共著 (サイエンス社)
3. 「これなら分かる最適化数学」 金谷 健一 著 (共立出版)
4. 「統計のための行列代数 (上)」 David A. Harville 著 (シュプリンガー・ジャパン)
5. Wikipedia

◆◇◆更新履歴◆◇◆

◎ 「4) スコア法」において、漸化式の右辺の計算式が誤っていたため修正しました (2013-11-30)

(誤) Σi{1→N}( xijwi(m-1)[ μi(m-1) + ( yi - μi(m-1) )g'(μi)(m-1) ] )

(正) Σi{1→N}( xijwi(m-1)[ g(μi)(m-1) + ( yi - μi(m-1) )g'(μi)(m-1) ] )

連結関数が恒等関数でないと、計算結果がおかしくなります。サンプル・プログラムも併せて修正しています。

◎ 「スコア法」のサンプル・プログラムを少し見直しました (2013-12-15)

  1. 一母数指数型分布族用 I/F の ExpFamily_IF にメンバ関数 aveInv を追加
  2. スコア法での eta の計算を、Newton 法から aveInv の利用に変更

η の計算には μ = A'(η) の逆関数 η = A'-1(μ) を使って求めることができます。変更前は、A'(η) とその導関数 A''(η) を使ってニュートン法から η を得ていましたが、逆関数が既知の場合はそれを使った方が効率も精度もよくなります。ニュートン法による解の計算は、汎用一母数指数型分布族クラスの ExpFamily_Generic で実装しています。

◎ 「6) 残差統計量」を追加しました (2013-12-25)

◎ 「4) スコア法」のサンプル・プログラムを少し見直しました (2014-03-09)

◎ 「4) スコア法」の例にて信頼区間の計算が誤っていたので修正しました (2019-04-27)

フィッシャー情報行列の逆行列から、各係数の分散を出力するようにしました。

[Go Back]前に戻る [Back to HOME]タイトルに戻る
inserted by FC2 system