第六回「データ解析のための統計モデリング入門」前半

25
第六回「データ解析のた めの統計モデリング入門」 読書会 第六章 GLMの応用範囲を広げる @gepuro

Upload: atsushi-hayakawa

Post on 15-Jan-2015

1.742 views

Category:

Technology


2 download

DESCRIPTION

読書会

TRANSCRIPT

Page 1: 第六回「データ解析のための統計モデリング入門」前半

第六回「データ解析のための統計モデリング入門」

読書会第六章 GLMの応用範囲を広げる

@gepuro

Page 2: 第六回「データ解析のための統計モデリング入門」前半

自己紹介

•電気通信大学大学院 修士2年

•専門:信頼性工学、生存時間解析

Page 3: 第六回「データ解析のための統計モデリング入門」前半

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

• GLMの特徴

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

確率分布 乱数生成 glm()のfamily指定

よく使うリンク関数

(離散) 二項分布 rbinom() binomial logit

ポアソン分布 rpois() poisson log

負の二項分布 rnbinom() (glm.nb()関数) log

(連続) ガンマ分布 rgamma() gamma logかな?

正規分布 rnomd() Gaussian identity

Page 4: 第六回「データ解析のための統計モデリング入門」前半

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

•二項分布を使う•応答変数𝑦 ∈ {0, 1, 2, … , 𝑁}の範囲の値をとる• 「N個体の実験対象に同じ処理をしたら、y個体で反応が陽性、N-y個体では陰性」

Page 5: 第六回「データ解析のための統計モデリング入門」前半

例題のデータ

N y x f8 1 9.8 C8 6 10 C8 5 11 C8 6 11 C8 1 9.4 C8 1 8.8 C・・・ ・・・ ・・・ ・・・

•𝑁𝑖個の観察種子のうち生きていて発芽能力があるものは𝑦𝑖個、死んだ種子は𝑁𝑖 − 𝑦𝑖個

• xは体サイズ

• fは肥料の有無。Cは肥料なし、Tは肥料あり

> summary(data4a)N y x f

Min. :8 Min. :0.00 Min. : 7.660 C:50 1st Qu. :8 1st Qu. :3.00 1st Qu. : 9.338 T:50 Median :8 Median :6.00 Median: 9.965 Mean :8 Mean :5.08 Mean : 9.967 3rd Qu. :8 3rd Qu. :8.00 3rd Qu.:10.770 Max. :8 Max. :8.00 Max. :12.440

表: データ例

Page 6: 第六回「データ解析のための統計モデリング入門」前半

植物の体サイズ𝑥𝑖と生存種子数𝑦𝑖

植物の体サイズ𝑥𝑖

生存種子数𝑦𝑖

○:肥料あり○:肥料なし

•体サイズ𝑥𝑖が大きくなると

生存種子数𝑦𝑖が大きくなるらしい

•肥料をやると生存種子数

が多くなるらしい

Page 7: 第六回「データ解析のための統計モデリング入門」前半

6.3二項分布で表現する「あり・なし」カウントデータ

•二項分布の確率分布

N個中のy個で事象が生起する確率

𝑝 𝑦 𝑁, 𝑞 =𝑁𝑦

𝑞𝑦 1 − 𝑞 𝑁−𝑦

確率𝑝(𝑦

𝑖|8,𝑞)

𝑦𝑖

ー:q=0.1ー:q=0.3ー:q=0.8

Page 8: 第六回「データ解析のための統計モデリング入門」前半

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

線形予測子𝑧

確率𝑞

𝑞𝑖 = 𝑙𝑜𝑔𝑖𝑠𝑡𝑖𝑐 𝑧𝑖 =1

1 + exp(−𝑧𝑖)

• 6.4.1 ロジットリンク関数

種子の生存確率𝑞𝑖をパラメータにする

Page 9: 第六回「データ解析のための統計モデリング入門」前半

•ロジスティック関数と線形予測子𝑧𝑖 = 𝛽1 + 𝛽2𝑥𝑖の関係を見る

𝛽1 = 2

𝛽1 = 0

𝛽1 = −3

𝛽2 = 4

𝛽2 = 2

𝛽1 = −1

確率𝑞

確率𝑞

説明変数𝑥 説明変数𝑥

𝛽2 = 2の時 𝛽1 = 0の時

Page 10: 第六回「データ解析のための統計モデリング入門」前半

6.4.2 パラメータ推定

𝐿 𝛽𝑗 =

𝑖

𝑁𝑖

𝑦𝑖𝑞𝑖

𝑦𝑖 1 − 𝑞𝑖𝑁𝑖−𝑦𝑖

log(𝐿 𝛽𝑗 =

𝑖

𝑙𝑜𝑔𝑁𝑖𝑦𝑖

+ 𝑦𝑖 log 𝑞𝑖 + 𝑁𝑖 − 𝑦𝑖 log(1 − 𝑞𝑖)

尤度関数

対数尤度関数

対数尤度関数を最大にする推定値のセット{ 𝛽𝑗}を

探し出す。

最尤法

Page 11: 第六回「データ解析のための統計モデリング入門」前半

> model <- glm(cbind(y, N-y)~x+f, data=data4a, family=binomial)> model

Call: glm(formula = cbind(y, N - y) ~ x + f, family = binomial, data = data4a)

Coefficients:(Intercept) x fT

-19.536 1.952 2.022

Degrees of Freedom: 99 Total (i.e. Null); 97 ResidualNull Deviance: 499.2 Residual Deviance: 123 AIC: 272.2

6.4.2 パラメータ推定

Page 12: 第六回「データ解析のための統計モデリング入門」前半

例題データの一部(肥料なし)

xx

生存種子数𝑦𝑖

Page 13: 第六回「データ解析のための統計モデリング入門」前半

6.4.3 ロジットリンク関数の意味・解釈

𝑞𝑖1 − 𝑞𝑖

= exp 線形予測子

= exp(𝛽1 + 𝛽2𝑥𝑖 + 𝛽3𝑓𝑖)= exp 𝛽1 exp 𝛽2 exp(𝛽3)

ロジスティック関数:𝑞𝑖 =1

1+exp(−𝑧𝑖)

ロジット関数:𝑙𝑜𝑔𝑖𝑡 𝑞𝑖 = log𝑞𝑖

1−𝑞𝑖= 𝑧𝑖

変換

オッズ生存する確率

生存しない確率

𝑞𝑖 = 0.5ならオッズは1倍𝑞𝑖 = 0.8ならオッズは4倍

Page 14: 第六回「データ解析のための統計モデリング入門」前半

𝑞𝑖1 − 𝑞𝑖

= exp −19.5 exp 1.95𝑥𝑖 exp(2.02𝑓𝑖)

𝑥𝑖が1単位増加したらexp(1.95 𝑥𝑖 + 1 )になる。exp 1.95 ≈ 7

オッズが7倍ぐらい増加する。

「病気であれば、発病リスクが7倍になる」と表現されることがある。

Page 15: 第六回「データ解析のための統計モデリング入門」前半

6.4.4 ロジスティック回帰のモデル選択

library(MASS)stepAIC(fit.xf)

AIC最少のモデルを選択することができる。

Page 16: 第六回「データ解析のための統計モデリング入門」前半

おまけglmを使わずに推定する。

Page 17: 第六回「データ解析のための統計モデリング入門」前半

対数尤度関数を定義するfunQ <- function(beta1, beta2, beta3, x){

1 / (1 + exp(-(beta1 + beta2*x$x + beta3*x$f)))

}

logLikelyhood.part <- function(beta1, beta2, beta3, x){

log(choose(x$N, x$y))+x$y*log(funQ(beta1, beta2, beta3, x))+(x$N-x$y)*log(1-funQ(beta1, beta2, beta3, x))

}

logLikelyhood <- function(param){

beta1 <- param[1]

beta2 <- param[2]

beta3 <- param[3]

tmp <- 0

for(i in 1:nrow(data4a)){

tmp <- tmp + logLikelyhood.part(beta1, beta2, beta3, data4a[i,])

}

return(tmp)

}

Page 18: 第六回「データ解析のための統計モデリング入門」前半

optimで対数尤度の最大値を求める> optim(c(1,1,1), logLikelyhood, control=list(fnscale=-1))

$par

[1] -19.537817 1.952571 2.022927

$value

[1] -133.1056

$counts

function gradient

228 NA

$convergence

[1] 0

$message

NULL

これらが推定値になる。

glmの結果Coefficients:(Intercept) x fT

-19.536 1.952 2.022

Page 19: 第六回「データ解析のための統計モデリング入門」前半

それぞれの2階微分を求める

f <- expression(

y*log(1/(1+exp(-b1-b2*x-b3*z)))

+ (N-y)*log(1-1/(1+exp(-b1-b2*x-b3*z)))

)

b11 <- D(D(f, "b1"),"b1")

b12 <- D(D(f, "b1"),"b2")

b13 <- D(D(f, "b1"),"b3")

b21 <- D(D(f, "b2"),"b1")

b22 <- D(D(f, "b2"),"b2")

b23 <- D(D(f, "b2"),"b3")

b31 <- D(D(f, "b3"),"b1")

b32 <- D(D(f, "b3"),"b2")

b33 <- D(D(f, "b3"),"b3")

b1 <- -19.537817b2 <- 1.952571b3 <- 2.022927の推定値の定義も忘れずに

Page 20: 第六回「データ解析のための統計モデリング入門」前半

ヘッセ行列を求める

rslt <- NULL

for(hen in c(b11, b12, b13, b21, b22, b23, b31, b32, b33)){

tmp <- 0

for(i in 1:nrow(data4a)){

N <- data4a[i,]$N

y <- data4a[i,]$y

x <- data4a[i,]$x

z <- data4a[i,]$f

tmp <- tmp + eval(hen)

}

rslt <- c(rslt, tmp)

}

hessian <- -matrix(rslt, 3,3 )

Page 21: 第六回「データ解析のための統計モデリング入門」前半

逆行列を求める

> solve(hessian)

[,1] [,2] [,3]

[1,] 1.9991552 -0.19551996 -0.19765617

[2,] -0.1955200 0.01928951 0.01778859

[3,] -0.1976562 0.01778859 0.05351702

Page 22: 第六回「データ解析のための統計モデリング入門」前半

対角行列の平方根を求める

> (se <- sqrt(diag(solve(hessian))))

[1] 1.4139149 0.1388867 0.2313375これらが標準誤差になる。

glmの結果

Std. Error1.41380.13890.2313

Page 23: 第六回「データ解析のための統計モデリング入門」前半

z統計量を求める

> (zvalue <- c(b1, b2, b3)/ se)

[1] -13.818242 14.058736 8.744485

glmの結果

z value-13.8214.068.74

Page 24: 第六回「データ解析のための統計モデリング入門」前半

glmの結果

Pr(>|z|) Pr(>|z|)<2e-16 ***<2e-16 ***<2e-16 ***を求める

> pnorm(abs(zvalue), lower.tail=F)

[1] 9.892197e-44 3.404587e-45 1.120176e-18

glmを使わずに、推定できた。

Page 25: 第六回「データ解析のための統計モデリング入門」前半

おしまい