第六回「データ解析のための統計モデリング入門」前半
DESCRIPTION
読書会TRANSCRIPT
第六回「データ解析のための統計モデリング入門」
読書会第六章 GLMの応用範囲を広げる
@gepuro
自己紹介
•電気通信大学大学院 修士2年
•専門:信頼性工学、生存時間解析
6.1 さまざまな種類のデータで応用できるGLM
• GLMの特徴
•確率分布・リンク関数・線形予測子の組み合わせを指定することによって、さまざまなタイプのデータを表現できる
確率分布 乱数生成 glm()のfamily指定
よく使うリンク関数
(離散) 二項分布 rbinom() binomial logit
ポアソン分布 rpois() poisson log
負の二項分布 rnbinom() (glm.nb()関数) log
(連続) ガンマ分布 rgamma() gamma logかな?
正規分布 rnomd() Gaussian identity
6.2 例題:上限のあるカウントデータ
•二項分布を使う•応答変数𝑦 ∈ {0, 1, 2, … , 𝑁}の範囲の値をとる• 「N個体の実験対象に同じ処理をしたら、y個体で反応が陽性、N-y個体では陰性」
例題のデータ
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
表: データ例
植物の体サイズ𝑥𝑖と生存種子数𝑦𝑖
植物の体サイズ𝑥𝑖
生存種子数𝑦𝑖
○:肥料あり○:肥料なし
•体サイズ𝑥𝑖が大きくなると
生存種子数𝑦𝑖が大きくなるらしい
•肥料をやると生存種子数
が多くなるらしい
6.3二項分布で表現する「あり・なし」カウントデータ
•二項分布の確率分布
N個中のy個で事象が生起する確率
𝑝 𝑦 𝑁, 𝑞 =𝑁𝑦
𝑞𝑦 1 − 𝑞 𝑁−𝑦
確率𝑝(𝑦
𝑖|8,𝑞)
𝑦𝑖
ー:q=0.1ー:q=0.3ー:q=0.8
6.4 ロジスティック回帰とロジットリンク関数
線形予測子𝑧
確率𝑞
𝑞𝑖 = 𝑙𝑜𝑔𝑖𝑠𝑡𝑖𝑐 𝑧𝑖 =1
1 + exp(−𝑧𝑖)
• 6.4.1 ロジットリンク関数
種子の生存確率𝑞𝑖をパラメータにする
•ロジスティック関数と線形予測子𝑧𝑖 = 𝛽1 + 𝛽2𝑥𝑖の関係を見る
𝛽1 = 2
𝛽1 = 0
𝛽1 = −3
𝛽2 = 4
𝛽2 = 2
𝛽1 = −1
確率𝑞
確率𝑞
説明変数𝑥 説明変数𝑥
𝛽2 = 2の時 𝛽1 = 0の時
6.4.2 パラメータ推定
𝐿 𝛽𝑗 =
𝑖
𝑁𝑖
𝑦𝑖𝑞𝑖
𝑦𝑖 1 − 𝑞𝑖𝑁𝑖−𝑦𝑖
log(𝐿 𝛽𝑗 =
𝑖
𝑙𝑜𝑔𝑁𝑖𝑦𝑖
+ 𝑦𝑖 log 𝑞𝑖 + 𝑁𝑖 − 𝑦𝑖 log(1 − 𝑞𝑖)
尤度関数
対数尤度関数
対数尤度関数を最大にする推定値のセット{ 𝛽𝑗}を
探し出す。
最尤法
> 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 パラメータ推定
例題データの一部(肥料なし)
xx
生存種子数𝑦𝑖
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倍
𝑞𝑖1 − 𝑞𝑖
= exp −19.5 exp 1.95𝑥𝑖 exp(2.02𝑓𝑖)
𝑥𝑖が1単位増加したらexp(1.95 𝑥𝑖 + 1 )になる。exp 1.95 ≈ 7
オッズが7倍ぐらい増加する。
「病気であれば、発病リスクが7倍になる」と表現されることがある。
6.4.4 ロジスティック回帰のモデル選択
library(MASS)stepAIC(fit.xf)
AIC最少のモデルを選択することができる。
おまけglmを使わずに推定する。
対数尤度関数を定義する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)
}
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
それぞれの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の推定値の定義も忘れずに
ヘッセ行列を求める
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 )
逆行列を求める
> 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
対角行列の平方根を求める
> (se <- sqrt(diag(solve(hessian))))
[1] 1.4139149 0.1388867 0.2313375これらが標準誤差になる。
glmの結果
Std. Error1.41380.13890.2313
z統計量を求める
> (zvalue <- c(b1, b2, b3)/ se)
[1] -13.818242 14.058736 8.744485
glmの結果
z value-13.8214.068.74
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を使わずに、推定できた。
おしまい