2016年1月12日火曜日

GLMの基礎:正規分布、直接回帰の限界

確率モデル」からの続き。

本投稿の一連の「GLMの基礎」の基礎となるのが、本書第 章「一般化線形モデル(GLM)」。「ここをちゃんと理解しなければ先に進めない」と、何度も読み直している。

私にとって GLM が難しく思えた理由に

GLM は 確率分布、リンク関数、線形予測子を指定する統計モデル

という特徴がある。この 3 つの関係の理解に腐心したが、概ね理解できた。

そんな GLM の特徴の前に、「なぜ GLM なのか?」を知ることが重要。よってここでは、第 3 章の最終節「3.7 『何でも正規分布』『何でも直線』には無理がある」をもとに「なぜ GLM?」について記す。

以下の図は、ダウンロードファイル中の chapter03 フォルダにある d0.RData をプロットしたもの。
> load("d0.RData") 
> ggplot()+ geom_point(data=d0,aes(x=x,y=y),size=3,colour="#CC0000")

このプロット図に、LMGLM の回帰式を当てはめる。


一目瞭然な直接回帰の限界

問題:この応答変数 y, 説明変数 x で回帰分析せよ。

直線回帰式 yi = β1 + β2xi の切片と係数を求める(今回 glm 関数を使わなかった理由は後述)。

> x<-seq(min(d0$x),max(d0$x),length=100)
> lm(y~x,data=d0)

Call:
lm(formula = y ~ x, data = d0)

Coefficients:
(Intercept)            x  
     -1.424        2.890  

この結果から、回帰式を先のプロット図に重ねる(本書図3.9の左図に相当)
> x<-seq(min(d0$x),max(d0$x),length=100)
> df<-data.frame(x=x,y=-1.424+2.890*x)
> ggplot()+ geom_point(data=d0,aes(x=x,y=y),size=3,colour="#CC0000")+geom_line(data=df,aes(x=x,y=y))

外れ値はあるけど、分布の中央に線が引かれているから OK じゃね?

はダメですよね? 仮に「観測データ ≥ 0」の条件がなかったとしても、「外れ値、多すぎじゃね?」と私なら思います。

次が GLM で回帰分析した結果(本書図3.9の右図に相当)

> x<-seq(min(d0$x),max(d0$x),length=100)
> fit.B <- glm(y~x,data=d0,family = poisson(link = "log"))
> df.B<-data.frame(x=x,y=predict(fit.B,newdata=data.frame(x=x),type="response"))
> ggplot()+ geom_point(data=d0,aes(x=x,y=y),size=3,colour="#CC0000")+geom_line(data=df.B,aes(x=x,y=y))

「観測データ ≥ 0」の条件も満たしている上に、「当てはまりの良さ」は直線回帰より優れていることは一目瞭然(glm 関数等 については後日詳述)。


LM は GLM の一部

これ以降は「やり直し『データ解析のための統計モデリング入門』」の「本書の流れ」を補足したもの。

直線回帰は「線形モデル(linear model, LM)」で「一般線形モデル(general linear model)」、つまり「一般化(generalized)ではない線形モデル」ということ。ややこしいが、GLM は「一般化線形モデル(generalized linear model)」。

さらに、LM の統計モデルは

 確率分布 :等分散の正規分布
 リンク関数:なし

以下は "log" とリンク関数を指定した GLM の回帰分析で

> glm(y~x,data=d0,family = poisson(link = "log"))

glm に「リンク関数なし」を指定可能で「link = "identity"」と恒等リンク関数(identity link function)を指定。

ただし、今回は以下のようにエラー(poisson では無効な負の値が理由と想定)

> fit.A <- glm(y~x,data=d0,family = poisson(link = "identity"))
 エラー:  係数の有効なセットが見出されませんでした: 初期値を与えてください 

familypoisson 以外にすればよいのかもしれないが、今回は lm 関数を用いた。


GLMの目的と特徴」に続く。

0 件のコメント:

コメントを投稿