予測区間

GLMの予測区間
~直感的理解と図示方法~
var. 2010.3.24
目次
• はじめに
• family = poisson 編
– ケース1(説明変数がない場合)
– ケース2(説明変数が1つある場合)
– ケース3(説明変数が複数ある場合)
• family = binomial 編(以下、未完成・・・)
2
はじめに
• このスライドの目的
– タイトルの通り、GLMの予測区間について理解を深め、
Rによる作図ができるようになること。
•
前提とするもの
– よくつかわれる確率分布に関する、ある程度の知識
– GLM(一般化線形モデル)に関する、ある程度の知識
•
予測区間とは
– 母集団を仮定した上で、将来観察されるであろう標本値に対して「どの範囲にあると予
測されるか」を示すものである。(wikipedia より)
• これに対し、信頼区間とは、母集団の母数(標本から測定できない)に対して 「どの範囲にあ
ると推定できるか」を示すものである。混同しないように注意。(wikipedia より)
•
その他
– “GLMの”予測区間と言ってるけど、考え方は他のモデルでも同じかも。
– ただし、ランダム効果入りのモデルは別。要注意。
3
family = poisson 編
• GLM(一般化線形モデル)は、“一般化”とつくだけあって、
いろいろな確率分布を扱うことができる。
• ここでは、その中でも理解しやすいと思われる、ポアソン分
布に従ったデータを題材として解説していく。
ケース1(説明変数がない場合)
•
まさお君は釣りが好きであった。今までに手賀沼に釣りに行った回数はちょうど
50回である。まさお君は、よく釣れるブルーギルの数を記録していた。そのデータ
を利用して、手賀沼で釣れるブルーギルの数をモデリングすることにした。ちなみ
に、釣りをする時間は毎回一定であった。
釣れたブルーギル数のヒストグラム
gill <- rpois(50, 5) #ポアソン分布に従う乱数生成
hist(gill)
#ヒストグラム作成
mean(gill)
#平均
var(gill)
#分散
平均:4.74
分散:4.52
平均≒分散となっていて、ポアソン分
布に従っていそう!
注)乱数を使っているので、実際に試した場合とは微妙に値が異なると思います。
5
ケース1(説明変数がない場合)
•
•
釣れたブルーギルの匹数を応答変数としてGLMを作成。
説明変数は無し(平均値のパラメータ:beta のみ)。
model1 <- glm(gill ~ 1, family = poisson) #GLMを作成
beta1 <- model1$coefficients
#このモデルのbetaの値を格納
#このモデルの確率分布を調べる
pred1 <- c()
#確率を入れる変数を用意
for(i in 0:max(gill)){
pred1[i+1] <- dpois(i, exp(beta1))
}
#lambda = exp(beta)のとき、
#釣れる数がi匹である確率を求める
#ちなみにこれは、for文を用いずに書くことも可能↓
pred1 <- sapply(0:max(gill), function(i) dpois(i, exp(beta1)))
6
ケース1(説明変数がない場合)
•
そうして求まった確率に、サンプル数をかければ予測値となる。
#hist()だとx軸がいい加減になっちゃうので、度数分布データに直して改めて作図
plot(table(factor(gill, levels = 0:max(gill))))
#先ほど求めた確率にサンプル数をかけて出した予測値を重ね描き
lines(0:max(gill), pred1*50, type = "b")
けっこういい感じな予測?
そして、次からがいよいよ予測区間!
7
ケース1(説明変数がない場合)
•
まず、話を予測値からに確率分布に戻す(サンプル数をかけていない状態)
plot(0:max(gill), pred1, type = "b")
この確率分布を見て分かること
・4匹釣れる確率が一番高い
・0匹や10匹の確率は低い
→ほとんど起こらない両側2.5%ずつに入る
部分を調べて、95%予測区間を求めよう!
(95%というのは、よく使われているだけで
あって、目的に応じて何%でも構わない。)
8
ケース1(説明変数がない場合)
•
両側の2.5%の境目を調べるには qpois() を使う。
qpois(0.025, exp(beta1))
#qpois(分位数, lambda) という風に使う
qpois(0.975, exp(beta1))
#結果、2.5%の方は1、 97.5%の方は9であった。
つまり・・・
この2本の線より内側の部分が、95%予測区間。
はみ出ているのは10匹釣れた2サンプルのみ
→ 2/50 = 4% なので、このモデルの予測は悪くないといえる。
ちなみに、はみ出ているサンプルが5%より遥かに多いと、過分散の可能性が疑われる
9
ケース2(説明変数が1つある場合)
•
まさお君は釣りが好きであった。今までに霞ヶ浦に釣りに行った回数はちょうど50
回である。まさお君は、よく釣れるブラックバスの数を記録していた。そのデータを
利用して、霞ヶ浦で釣れるブラックバスの数をモデリングすることにした。ちなみに、
釣りをする時間は毎回一定であった。さらに今回は、近くで釣りをしていた人の数
も記録してあり、データとして使うことができる!
#下準備・・・
beta2 <- c(1.5, -0.03) #架空データのパラメータ
people <- rpois(50, 2) #近くで釣りをしていた人の数を適当に生成
#パラメータと人の数から、釣れたブラックバスの数を生成
bass <- rpois(50, exp(beta2[1] + people * beta2[2]))
d <- data.frame(people, bass) #なんとなくデータフレームにしてみる
・
・
・
10
ケース2(説明変数が1つある場合)
•
今回のデータを図示してみよう!
plot(d$people, d$bass) #横軸に人の数、縦軸に釣れたブラックバスの数
なんとなく、近くで釣りをしていた人
が多いほど、ブラックバスの釣れた
数が少ないように思える・・・
でもちょっと待って!?
この図とケース1のような図との
関係、わかってますか?
11
ケース2(説明変数が1つある場合)
•
見えているプロットの数を数えると32個。でも、サンプル数は50だったはず・・・
→いくつかのプロットは重なってしまっている
→それが、この図では見られない“度数”
people = 0 のときのbassのヒストグラム
people = 1 のときのbassのヒストグラム
people = 2 のときのbassのヒストグラム
people = 3 のときのbassのヒストグラム
この図は、peopleが0~6のときのbassのヒスト
グラムを並べて、上から見たような図である!
12
ケース2(説明変数が1つある場合)
•
ということは、peopleが0~6の場合ごとに
確率分布あるいは予測値を考えることができる。
people = 0 のときのbassの予測値(てきとー)
people = 1 のときのbassの予測値(てきとー)
people = 2 のときのbassの予測値(てきとー)
people = 3 のときのbassの予測値(てきとー)
ということは・・・・・・
13
ケース2(説明変数が1つある場合)
•
予測区間も同様に考えることができる!
people = 0 のときのbassの95%予測区間(てきとー)
people = 1 のときのbassの95%予測区間(てきとー)
people = 2 のときのbassの95%予測区間(てきとー)
people = 3 のときのbassの95%予測区間(てきとー)
イメージがつかめれば、もう
予測区間は描けたも同然!
14
ケース2(説明変数が1つある場合)
•
•
釣れたブラックバスの匹数を応答変数としてGLMを作成。
説明変数はpeople(パラメータは切片及びpeopleの係数)。
model2 <- glm(bass ~ people, family = poisson, data = d) #GLMを作成
beta2 <- model1$coefficients
#このモデルのパラメータを格納
•
beta2には、切片及びpeopleの係数を格納。
•
モデルから得られたパラメータを使って、横軸(people)がとる値ごとに95%予測区
間を調べていく。
#people = i のときの、bassのヒストグラムの左側2.5%の境目
pred2.1 <- sapply(0:max(d$people), function(i){
qpois(0.025, exp(beta2[1]+ i * beta2[2]))
})
#people = i のときの、bassのヒストグラムの右側2.5%の境目
pred2.2 <- sapply(0:max(d$people), function(i){
qpois(0.975, exp(beta2[1]+ i * beta2[2]))
})
15
ケース2(説明変数が1つある場合)
•
得られた予測区間の両側はこんな感じ
•
あまりパッとしないけど、とりあえず作図してみる。
→→→
plot(d$people, d$bass)
lines(0:max(d$people), pred2.1, type = "b")
lines(0:max(d$people), pred2.2, type = "b")
この2本の線より内側の部分が、95%予
測区間。
はみ出ているのは4サンプル(見えるプ
ロットは3つだけど、先に述べたようにこ
の図では“度数”を確認することができな
い)。
→ 2/50 = 4% なので、このモデルの予
測は悪くないといえる。
では、説明変数が2つ、3つと増えた場合にはどうす
ればよいのだろう? →次のスライドへ
16
ケース3(説明変数が複数ある場合)
•
•
説明変数が2つであれば、3次元の図を描けないこともない。
しかしそれ以上となると、各軸に説明変数をとることは厳しい。
•
ところで、「ポアソン分布に従うデータのモデル」の予測区間を決めているのは
いったいなんだろうか?
答え・・・ ポアソン分布のパラメータ:λ
•
•
だったら、横軸にλ、縦軸に応答変数をとればいいじゃないか。
今さらながら、ポアソン分布のパラメータλは、その分布の平均と分散を意味する。
そして、線形予測子を z とするならば、λ=exp(z) である(リンク関数がlogの場合)。
•
まぁ、難しい話はおいといて、実践・・・
17
ケース3(説明変数が複数ある場合)
•
一日に見つけた鳥の数(tori)が、平均気温(kion)、雲量(kumo)、雨の有無
(ame)で決まるだろう、とかいう適当すぎるモデルを考える。
kion <- round(rnorm(20, 20, 5), 1)
#平均気温(℃)
kumo <- round(rnorm(20, 40, 20), 1) #雲量、単位は謎
ame <- rbinom(20, 1, 0.4) #雨が降った:1、降らなかった:0
tori <- rpois(20, exp(0.1 + 0.04 * kion + 0.04 * kumo - 0.06 * ame))
d3 <- data.frame(tori, kion, kumo, ame)
こんな感じの架空データができる。
次に、モデルを作って各パラメータの値を得る。
model3 <- glm(tori ~ kion + kumo + ame,
family = poisson, data = d3) #GLMを作成
beta3 <- model3$coefficients #各パラメータの値を格納
18
ケース3(説明変数が複数ある場合)
•
•
•
そして、各説明変数の取りうる値すべての組み合わせで95%予測区間を・・・なん
てことはしなくてもいい。
なぜなら、各説明変数がどんな値を取ろうとも、最終的にはλという一つの値に落
ち着くから。
model$fitted でモデルが予測したλの値を取り出すことができる。
kion=21.2, kuom = 35.1, ame = 1 で、各パラメータが
beta3のときのλ・・・といった感じに、この場合20個のλを取
り出すことができる。
・そのλの最大値と最小値を調べて、その間を適当な間隔で刻む
(λs とする)。
・λs それぞれで95%予測区間を調べる。
・横軸にλ、縦軸にtoriをとってプロットする。
・さらに、横軸にλs、縦軸にそれらの予測区間をとり、描く。
次のスライドで、コード及び結果を示す。
19
ケース3(説明変数が複数ある場合)
•
Rコード
model3$fitted #モデルの予測(λ)
fit.min <- min(model3$fitted) #モデルの予測したλの最小値
fit.max <- max(model3$fitted) #モデルの予測したλの最大値
lambdas <- seq(fit.min, fit.max, 1) #λの最小値から最大値までを1間隔で刻む
pred3.1 <- qpois(0.025, lambdas)
#刻んだλごとに予測区間を調べる
pred3.2 <- qpois(0.975, lambdas)
plot(model3$fitted, tori)
lines(lambdas, pred3.1, type = "b", col = 4, pch = 20)
lines(lambdas, pred3.2, type = "b", col = 4, pch = 20)
20
ケース3(説明変数が複数ある場合)
•
結果の図
この2本の線より内側の部分が、95%予
測区間。
<重要事項>
・しっかりと理解していないと、途中で何
をしているのかわからなくなる。
・この予測区間は過分散のチェックにも
使える。
・もし間違ったことが書いてあったら、被
害者を増やさないためにもすぐに修正し
てほしい。
family = poisson 編 完
21
family = binomial 編
• GLM(一般化線形モデル)は、“一般化”とつくだけあって、
いろいろな確率分布を扱うことができる。
• ここでは、よく扱われる二項分布に従ったデータを題材として
解説していく・・・予定だけど、時間がなく未完成。
– 有志による付け足しを望む(あるいは暇ができたら追加する)
• 基本的な考え方は family = poisson 編と共通しているはず。