GLM(一般化線形モデル)~221.114.158.246/~bunken/statistics/GLM_nakano.pdf•...

Preview:

Citation preview

統計勉強会

~GLM(一般化線形モデル)~

2010.3.8

中野貴瑛(理論生態学研究室)

目次

• はじめに

• 統計モデルとは

• モデル選択

• 一般化線形モデルとは

• どんなGLMを使おうか

• GLMM(一般化線形混合モデル)とは

• モデルの検査

• モデル選択の悩みどころ

• 調べるとよさそうなもの

• 架空データを用いた解析例

2

はじめに

• このスライドの目的

– 一般化線形(混合)モデルGLM(M)の概念をつかむ

– GLM(M)を使いたいときに、あまり困らないで済むようにする

• 注意事項

– 不確かな情報がある可能性あり

– あくまで参考程度にとどめること

• 参考になりそうなもの– 北大・久保さんのページ http://hosho.ees.hokudai.ac.jp/~kubo/ce/FrontPage.html

3

統計モデルとは

• 観測データを解析するということは、統計モデリングをすることである

• 統計モデル:観測データのパターンをうまく説明できるようなモデル

• たとえば、ちょっと歪んだサイコロを50回振ったとする。このとき・・・

– どの目が出る確率も、同じ 1/6 だ

– 目の値が小さい方が出る確率が高い

などが統計モデル。

• 実は検定でも 統計モデリングをしている– 2の目が出る確率が有意に高いだろう、

などと言って検定をすれば、それは

「どの目が出る確率も、同じ 1/6だ」という

モデルを帰無仮説とした検定をしている

ことになる。

4

1 2 3 4 5 6

0.0

0.1

0.2

0.3

0.4

0.5

出目の確率分布(n=50)

目の値

頻度

モデル選択

モデル選択とは

考えうるモデルの中から、簡潔かつデータによく当てはまっているモデルを選ぶこと

• そうして得られた最適なモデルの挙動や予測性をみたり、

他のモデルとの比較を行ったりして考察する

• よく用いられる基準に、AIC(赤池情報量基準)がある

• 具体的な方法は後述

5

モデルを作ったら

モデルAとモデルBが有意に異なってる?

最適なモデルはどれかな?

検定

モデル選択

どっち?

モデル選択

検定のあやしさ

• 例:ある魚の体長が、一腹卵数に関係していそう。

• こんなときに、こんなことしていない?

6

15 20 25 30 35 40 45

02

04

06

08

0

体長(cm)

一腹卵数(個)

15 20 25 30 35 40 45

02

46

81

0

体長(cm)

√(一腹卵数

)

平方根変換 回帰直線を引く

相関係数の検定

有意差!

関係があるかないかも確かに重要だけど、どんな風に関係しているかが知りたいのでは?

ワーイ\ (≧∇≦)/

体長が小さくなったら卵数がマイナスになっちゃうよ??

モデル選択

検定のあやしさ

• パラメトリック検定では– 正規分布に従い等分散性のあるデータだけしか扱えない

• パラメトリック検定が無理なら、ひとくくりにノンパラメトリック検定– 検出力の低下・等分散性のなさは気にしない

• さらに、データをあれこれいじることも(区分け・割り算・変換etc...)– そうやって出てきた有意差って意味あるの?

• そもそも、有意水準って自分で決めるもの– 本当に客観的なの?

• ある説明変数が有意に効いてるってことも大事だろうけど・・・– それがどのような振る舞いをしているのかが、生態学にとって重要なのでは?

7

モデル選択

検定とモデル選択

• 「検定はダメダメでモデル選択は万能」というわけではない

• 使い分けが重要

• 仮説をしぼった実験(調査)から、

新しい要因や関係の存在を確実に示したいとき

– 例)新薬が効いているのかを知りたい

• 予測精度が高いモデルを作りたいときや、

仮説を対等に見て、どちらかを選びたいとき

• 生態学、とくに野外での非実験的な調査・観察から得たデータは

検定には不向きである場合が多い

8

検定

モデル選択

GLM(一般化線形モデル)を知って、モデリング&モデル選択をしよう!

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

• 根本的な概念は直線回帰と同じ

– 最尤推定法でパラメータを推定

• 右の例は、 というモデル

• しかし、さらに幅広いことができる

– 応答変数が正規分布に従わなさそうな場合にも対応可能

一般化線形モデルとは

9

5 10 15 20 25

51

01

52

02

5

説明変数

応答変数

正規分布を仮定した最尤推定は特に最小二乗法と呼ばれる

右の例におけるパラメータは切片と傾きの2つ

ii xy 21

線形予測子

一般化線形モデルとは

• たとえば応答変数がカウントデータの時:

• たとえば応答変数が成功・失敗データの時:

• いずれも、link関数というものを用いることで、線形の土俵に持ち込むことができる

10

10 15 20 25 30 35 40 45

02

04

06

08

0

説明変数

応答変数

0 1 2 3 4

0.0

0.2

0.4

0.6

0.8

1.0

説明変数

応答変数

ii xy 21exp なぜexp?

→カウントデータは非負だから

iie xy 21log と表現できるので、link関数はlog

モデル:

モデル:

i

ix

y21exp1

1

x = xi のときの平均値

x = xi のときの成功確率

ii

i

ie xy

y

y21)(logit

1log

と表現できるので、link関数はlogit

線形予測子

線形予測子

ポアソン回帰モデルとも呼ぶ

ロジスティック回帰モデルとも呼ぶ

一般化線形モデルとは

さらに・・・

• 複数の説明変数があってもOK

– いわゆる“重回帰“的なことも可能

• 例)ある植物の結実数を、日当たり・土中のリン濃度・植物の高さ、で説明

• 説明変数がカテゴリカルでもOK

– いわゆる“分散分析”的なことも可能

• 例)処理A~Cによる違いをみる

• 一口にGLMと言っても、非常に幅広い解析ができる

• もちろん、複数の説明変数にカテゴリカル変数が混ざっていてもよい

11

どんなGLMを使おうか

よく用いられる確率分布

• 正規分布– 応答変数が連続データ

– 負の値を許す

• ポアソン分布– 応答変数が離散データ

– 0以上で上限とくになし

– 平均と分散がほぼ等しい

• 二項分布– 応答変数が離散データ

– 0以上で有限

• とりあえずはこの3つで十分かも

• 確率分布はモデルの骨格になるので、しっかり勉強しよう・・・12

魚Aの体長、動物Bの体重、

鳥Cの採餌にかかる時間 etc…

両生類Dの卵数、アブの訪花個体数、

イラガの繭数、トカゲの尾振り回数 etc…

生存率、成功率、

n個のうち何個が○○だった、みたいなデータ(要するに確率が知りたい) etc...

応答変数が従っていそうな確率分布を考える

最終的に示したいモノ

どんなGLMを使おうかすべては応答変数の確率分布を

仮定するところから始まる・・・

13

応答変数が・・・正規分布: 1

-∞ ~ +∞

0 ~ +∞

0 ~ 1

値の範囲が

0, 1, 2, ・・・, N

0 , 1, 2, ・・・, +∞値の範囲が

連続値?

離散値?

ガンマ分布: 5

ベータ分布: 0

二項分布: 2

ポアソン分布: 3

過(大)分散?over-dispersion

ベータ二項分布: 0or

GLMM: Z

Yes

No

ゼロがやたらと{多く・少なく}しかも思い当たる理由あり

ZIP model: α hurdle model: β

過(大)分散?over-dispersion

No

No

負の二項分布: 4or

GLMM: Z

Yes

どんなGLMを使おうか

前ページからの続き

14

Rの、パラメータ推定関数

0 :ベータ分布・ベータ二項分布 不明

1 :正規分布 glm(family = gaussian), lm()

2 :二項分布 glm(family = binomial)

3 :ポアソン分布 glm(family = poisson)

4 :負の二項分布 glm.nb() @library(MASS)

5 :ガンマ分布 glm(family = gamma)

α:ZIP(zero inflated poisson) model zeroinfl(dist = "poisson") @library(pscl)

β:hurdle model hurdle(dist = "poisson") @library(pscl)

Z :GLMM(Generaized Linear Mixed Model) glmmML(family = binomial or poisson) @library(glmmML),

lmer(family = gaussian) @library(lme4)

特殊なポアソン回帰モデルGLMMで手に負えないデータは、階層ベイズモデルで・・・

GLMM(一般化線形混合モデル)とは

Generalized Linear Mixed Model

• GLMでは考慮していなかったランダム効果を組み込んだモデル– ランダム効果:調査地間のばらつきとか、定量化できていない個体差とかの、

興味はないけど存在はするばらつき

• ランダム効果が一つなら、glmmML() @library(glmmML)がよさげ

• lmer() @ library(lme4)は、複数の・あるいはネストされたランダム効果も組み込み可– でも挙動不審な場合がある?

• ランダム効果が複数あるなら、ベイズ推定がオススメ(R + WinBUGS)

15

モデルの検査

• モデルをたくさん作ってモデル選択をして、ベストモデルが分かればそれでよし?

• モデル選択は相対的なもの

ベストモデルが本当にしっかりとしたものなのかを検査する必要がある

• 過大分散と過小分散

– そのモデルから予想されるよりも、実際のデータのばらつきが大きい(過大分散)

• 重要な説明変数を見落としている可能性

• ランダム効果を考慮する必要があるかも

– そのモデルから予想されるよりも、実際のデータのばらつきが小さい(過小分散)

• サンプルの独立性が保たれていない可能性

– 実際によくあるのは過大分散

– 単に過分散という場合には過大分散を指すことが多い

– 過分散について議論できるのは、平均が決まると自動的にばらつきも決まってしまう確率分布(ポアソン分布、二項分布)を用いたモデルだけ

• 他にもあるはず・・・

– モデルの検査はないがしろにされているのが現状?

16

モデル選択の悩みどころ

• 検定ならば・・・– 「有意差があったので、これこれは効いてます!」と言える

• モデル選択だと・・・– 「ベストモデルに説明変数A が含まれていたということは、A を含んでいないモデルよりもベストモデルが現状をよく

説明出来ていたわけで、つまりそれは、A が重要であることを意味しているんですよ・・・」

– このスタンスが納得できないと、あるいは他の良い結論方法がわからないと、

モデル選択は難しいかもしれない(気持ち的に)

17

結論がビシッときまらない

調べるとよさそうなもの

• 説明変数、応答変数

• 固定効果(fixed effect)、ランダム効果(random effect)

• AIC(赤池情報量基準)

• 尤度

• 最尤推定法

• 確率分布(特に、正規分布・二項分布・ポアソン分布)

• 信頼区間

• モデルの検査方法

• リンク関数、線形予測子

18

架空データを用いた解析例

解析の流れ

19

データ収集

解析しやすいようにデータをまとめる

色々と作図をして傾向をチェック

仮説を立てる

Rに放り込んでモデルを量産

モデル選択とその結果の確認

モデルの検査

OK?

考察・まとめ

Yes

No

A

E

C

B

D

A~Eの一部あるいは全部を、2つの例で紹介

この流れ・方法が絶対というわけではない。あくまで参考として。

・仮説→絞ったデータ収集→解析・仮説→たくさんデータ収集→解析・たくさんデータ収集→解析→言えそうなことを探す

どれがいいのだろうか・・・

架空データを用いた解析例(ケース1)

ケース1

ある魚Aを川で計100匹捕獲し、一腹卵数を数えた。

一腹卵数のモデルを作る。

収集したデータ:①卵数、②親魚の体長、③捕獲した場所(上流・中流・下流)

20

A. 解析しやすいようにデータをまとめる

1. エクセルなどで入力データフレームを意識

項目名

2. テキスト(タブ区切り)形式で保存

・項目名はアルファベット推奨・カテゴリカルデータでは、文字列を使う(Rが数値と勘違いしないように)

・場合によってはカテゴリカルデータはダミー変数化したほうがいいかも(アブ長談)

架空データを用いた解析例(ケース1)

21

A. 解析しやすいようにデータをまとめる

3. Rに取り込む

これで準備は完了

架空データを用いた解析例(ケース1)

22

B. 色々と作図をして傾向をチェック

No.

100 300 500 1.0 1.5 2.0 2.5 3.0

020

40

60

80

100

100

300

500

eggs

size

510

15

20

25

30

0 20 40 60 80 100

1.0

1.5

2.0

2.5

3.0

5 10 15 20 25 30

site

pairs(data1, panel=panel.smooth)

plot()で一つずつ作図してもいいけど、

pairs()で対散布図が描ける。

panel=panel.smooth で平滑線が引ける

関係がありそう!

もし説明変数間に相関が見られた場合、同じような影響の二重評価などにより、正確な予測ができなくなる。

その場合、説明変数を減らすなどの対策が必要。

架空データを用いた解析例(ケース1)

23

B. 色々と作図をして傾向をチェック

attach(data1)

plot(size, eggs, type = "n")

points(size[site=="upper"], eggs[site=="upper"], col = 2)

points(size[site=="middle"], eggs[site=="middle"], col = 3, pch = 20)

points(size[site=="lower"], eggs[site=="lower"], col = 4, pch = 18)

カテゴリカル変数を色分けで対処してみたり・・・

他にも、思いつく限り作図をしてみることが大切

5 10 15 20 25 30

10

02

00

30

04

00

50

0

size

eg

gs

架空データを用いた解析例(ケース1)

24

C. Rに放り込んでモデルを量産

model1 <- glm(eggs~1 , data = data1, family = poisson)

model2 <- glm(eggs~size , data = data1, family = poisson)

model3 <- glm(eggs~site , data = data1, family = poisson)

model4 <- glm(eggs~size + site , data = data1, family = poisson)

model5 <- glm(eggs~size + site + size:site, data = data1, family = poisson)

今回の場合、

おそらく5通りのモデルが考えられる

線形予測子が切片のみの場合、“1“と記述

扱うデータフレームを指定する

仮定する応答変数の確率分布応答変数を最初に書き、チルダ以降に説明変数を記述

交互作用項

全部まとめて、size*siteと書くことも可能

架空データを用いた解析例(ケース1)

D. モデル選択とその結果の確認

* 全てのモデルのAICを確認→選択

* stepAIC() @library(MASS) で楽をする

* update() を使う

summary(モデル)で、結果を確認

・詳細情報は個別にアクセス可能

・項目名はnames(モデル)で分かる

はじめはこれがオススメ

25

架空データを用いた解析例(ケース1)

D. モデル選択とその結果の確認

・AICが低いモデルほど、簡潔かつデータによく当てはまっているモデル・一番AICが低いモデルだけを見るのではなく、それに近いAICのものもチェック・それらのモデルが持つ項やパラメータ等を比較し、考察へつなげる

26

model AIC

model1 6128.3

model2 1545.3

model3 6116.2

model4 1532.6

model5 1533.4

model2 <- glm(eggs~size , ...)

model4 <- glm(eggs~size + site , ...)

model5 <- glm(eggs~size + site + size:site, ...)

架空データを用いた解析例(ケース1)

D. モデル選択とその結果の確認

27

解析結果の見方

係数推定値 標準誤差 p値

切片

量的な変数

カテゴリカル変数

カテゴリカル変数は、一つのカテゴリーが基準(つまり係数は0)として扱われる。そして、それ以外のカテゴリーで基準に対する係数がそれぞれ推定される。

p値は、その推定値が0から有意に離れているかどうかの目安。でも、かなりいい加減らしい。

この結果では、siteがmiddleの場合の係数が0に近いように見える。そこで、middleとlower(基準)を合わせて一つのカテゴリーとしたモデルを作り、AICを比較してみる、という方法が考えられる。

架空データを用いた解析例(ケース1)

D. モデル選択とその結果の確認

28

カテゴリカル変数(site)のカテゴリーを1つ減らした新たなモデル。AICが小さくなったため、このモデルを最適なモデルとして、次に検査を行う。

lower と middle を合わせてmidlow という名前にした。

それが基準となり、それに対する upper の係数が推定されている。

※カテゴリーの変更に伴い、site→site2, data1→data2 と名前を変えた。

06839.0*09702.010031.3exp

*09702.010031.3exp

size

size

推定された係数から、この魚Aの卵数の予測は体長(size)を用いて以下のように表せる

中下流:上流:

架空データを用いた解析例(ケース1)

D. モデル選択とその結果の確認

29

ベストモデルの予測を図示

中下流の魚の卵数と上流のそれとでは大差がないようにも見える。

06839.0*09702.010031.3exp

*09702.010031.3exp

size

size

推定された係数から、この魚Aの卵数の予測は体長(size)を用いて以下のように表せる

中下流:上流:

10 15 20 25 30

10

02

00

30

04

00

赤が中・下流、青が上流の個体

size(cm)

eg

gs

架空データを用いた解析例(ケース1)

E. モデルの検査

30

とりあえず今回は・・・

過分散のチェック > ovdis(model6, 0.99)

confidence interval level: 99 %

outers: 41 in 100 samples

「予測値が大きいほど実測値が予測値から外れる」などの傾向は見られない

99%信頼区間から外れているプロットが明らかに全体の1%以上存在している

過分散

GLMMにする、負の二項分布でのGLMにする、などの対策が必要か

満足する? Bへ戻る?

ケース1 終100 200 300 400

10

02

00

30

04

00

50

0

予測値に対する応答変数の実測値及びモデルの信頼区間

predictive value(予測値)

応答変数の実測値

架空データを用いた解析例(ケース2)

ケース2

ある植物Bは、花を咲かせた後に1つの実をつけるが、つけない場合もあることがわかっている。

そこで、植物Bを100本観察し、花の数を数えた。

その数日後、つけていた実の数を数えた。

結実確率のモデルを作る。

収集したデータ:①花の数、②実の数、③植物の高さ(cm)

31

A. 解析しやすいようにデータをまとめる

1. エクセルなどで入力データフレームを意識

2. テキスト(タブ区切り)形式で保存

知りたいのは結実確率だが、fluits / flowers のように勝手に割り算しない

分母がサンプルごとに異なっていても平気

架空データを用いた解析例(ケース2)

32

C. Rに放り込んでモデルを量産

model1 <- glm(cbind(fluits, flowers-fluits)~1 , family = binomial, data = case2)

model2 <- glm(cbind(fluits, flowers-fluits)~height, family = binomial, data = case2)

今回の場合、

おそらく2通りのモデルが考えられる

確率を扱いたいので、二項分布を仮定する

応答変数部分を、

cbind(結実した数, 結実しなかった数)

となるように記述

Bは飛ばして

D. モデル選択とその結果の確認

AIC

model1 1006.6

model2 149.4

・AICが低いモデルほど、簡潔かつデータによく当てはまっているモデル・今回の場合、heightを説明変数にもつmodel2がベストモデルと言えよう

flowers ではなく、「結実しなかった数」をデータ項目としておいてもよい

~した ~しなかった有り 無し成功 失敗・ ・・ ・・ ・

架空データを用いた解析例(ケース2)

D. モデル選択とその結果の確認

33

height*29346.068065.14exp1

1

推定された係数から、この植物Bの結実確率の予測は植物の高さ(height)を用いて以下のように表せる

架空データを用いた解析例(ケース2)

D. モデル選択とその結果の確認

34

height*29346.068065.14exp1

1

推定された係数から、この植物Bの結実確率の予測は植物の高さ(height)を用いて以下のように表せる

30 40 50 60 70 80

0.0

0.2

0.4

0.6

0.8

1.0

height(cm)

結実確率の予測

ベストモデルの予測を図示

架空データを用いた解析例(ケース2)

E. モデルの検査

35

今回も・・・

過分散のチェック > ovdis(model2, 0.99)

confidence interval level: 99 %

outers: 0 in 100 samples

99%信頼区間から外れているプロットはひとつもない

過分散ではない

満足する? Bへ戻る?

ケース2 終

0 5 10 15

05

10

15

予測値に対する応答変数の実測値及びモデルの信頼区間

predictive value(予測値)

応答変数の実測値

36

おまけ#過分散(overdispersion)を調べる関数。lmを継承したモデリング関数なら代入して平気なはず。

#model:過分散を調べたいモデル, level:信頼区間

#family = poisson(link = log), binomial(link = logit)) にのみ対応

ovdis <- function(model, level = 0.95){

if((level < 0) || (level > 1)){

cat("level: error¥n")

}else{

if(model$family$family == "poisson"){

Y <- model$y

pred <- model$fitted

area.over <- qpois(1 - (1-level)/2, lambda = pred)

area.under <- qpois(0 + (1-level)/2, lambda = pred)

}else if(model$family$family == "binomial"){

Y <- model$model[1][,1][,1]

N <- model$model[1][,1][,2]

YN <- Y+N

pred <- model$fitted*YN

area.over <- qbinom(1 - (1-level)/2, size = YN, prob = pred/YN)

area.under <- qbinom(0 + (1-level)/2, size = YN, prob = pred/YN)

}

info <- data.frame(Y, pred, area.over, area.under)

info <- info[order(info$pred),]

with(info,{

plot(pred, Y, xlab = "predictive value(予測値)",

main = "過分散チェック", ylab = "応答変数の実測値&モデルの信頼区間")

points(pred, pred, type = "l")

lines(pred, area.over, lty = 2, col = 2)

lines(pred, area.under, lty = 2, col = 4)

})

samples <- length(Y)

outers <- length(Y[Y < area.under | area.over < Y])

cat(c("confidence interval level:", level*100, "%¥n"))

cat(c("outers:", outers, "in", samples, "samples¥n"))

}

}

過分散とかを調べるところで使ったovdis()

Recommended