※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

データ解析のための統計モデリング入門 GLMのモデル選択 読書メモ4


2017年 03月 07日

このブログ記事は『データ解析のための統計モデリング入門』(久保拓弥 著、岩波書店)という、とても分かりやすい統計モデリングの入門書を、さらに分かりやすくするために読書メモをまとめたものです。 今回は第4章、GLMのモデル選択についてのまとめの四回目です。 この章ではバイアスやAICについて説明がされています。 データを説明するモデルとして様々なモデルが考えられる時に、データへのあてはまりの良さだけを基準にモデルを選ぶことはできません。 そこでAICを使ったモデル選択の様子を見るためのコードを用意しました。 コードはRで書きました。
dataSize <- 100
expSize <- 1000

createData <- function(createY) {
createY <- match.fun(createY)
x <- runif(dataSize, 0, 10)
c <- runif(dataSize, 0, 10)
y <- createY(x, c)
data.frame(x, c, y)
}

createIndipendentData <- function() {
createData(function(x, c) rpois(dataSize, lambda = 4))
}

createCorrelatedXData <- function() {
createData(function(x, c) rpois(dataSize, lambda = exp(0.1 + 0.2 * x)))
}

createCorrelatedCData <- function() {
createData(function(x, c) rpois(dataSize, lambda = exp(0.1 + 0.2 * c)))
}

createCorrelatedXCData <- function() {
createData(function(x, c) rpois(dataSize, lambda = exp(0.1 + 0.2 * x + 0.2 * c)))
}

logLikelihood <- function(genData, b1, b2, b3) {
genData <- match.fun(genData)
data <- genData()
prob <- vector(length = dataSize)
for (j in 1:dataSize) {
prob[j] <- log(dpois(data$y[j], lambda = exp(b1 + b2 * data$x[j] + b3 * data$c[j])))
}
sum(prob)
}

meanLogLikelihood <- function(genData, b1, b2, b3) {
mean(replicate(dataSize, logLikelihood(genData, b1, b2, b3)))
}

calculateAic <- function(d, genData, f, n) {
fit <- glm(formula = f, family = poisson, data = d)
co <- append(fit$coefficients, replicate(2, 0))
names(co) <- n

meanLogLik <- meanLogLikelihood(genData, co["b1"], co["b2"], co["b3"])
bias <- logLik(fit) - meanLogLik
aic <- -2 * (logLik(fit) - length(fit$coefficients))
result <- c(logLik(fit), meanLogLik, bias, aic)
names(result) <- c("logLik", "meanLogLik", "bias", "aic")
result
}

calculateMeanAic <- function(genData, f, n) {
genData <- match.fun(genData)
m <- replicate(expSize, calculateAic(genData(), genData, f, n))
apply(m, 1, mean)
}

showAic <- function(genData) {
r1 <- calculateMeanAic(genData, y ~ 1, c("b1","b2","b3"))
r2 <- calculateMeanAic(genData, y ~ x, c("b1","b2","b3"))
r3 <- calculateMeanAic(genData, y ~ c, c("b1","b3","b2"))
r4 <- calculateMeanAic(genData, y ~ x + c, c("b1","b2","b3"))

cat("\t\t\tnull\t\tx\t\tc\t\txc\n")
cat("log likelihood\t\t", r1["logLik"], "\t", r2["logLik"], "\t",
r3["logLik"], "\t", r4["logLik"], "\n")
cat("mean log likelihood\t", r1["meanLogLik"], "\t",
r2["meanLogLik"], "\t", r3["meanLogLik"], "\t", r4["meanLogLik"], "\n")
cat("bias\t\t\t", r1["bias"], "\t", r2["bias"], "\t", r3["bias"], "\t", r4["bias"], "\n")
cat("aic\t\t\t", r1["aic"], "\t", r2["aic"], "\t", r3["aic"], "\t", r4["aic"], "\n\n")
}

cat("indipendent data\n")
showAic(createIndipendentData)

cat("correlated X data\n")
showAic(createCorrelatedXData)

cat("correlated C data\n")
showAic(createCorrelatedCData)

cat("correlated XC data\n")
showAic(createCorrelatedXCData)
少し長くなったので、解説は次回に回します。 ぜひ実行してみてください。