UPDATE: 2022-09-04 10:28:51
このノートではロジスティク回帰モデルのパラメタを最尤法で計算する方法についてまとめておく。この記事は以前ブログに書いたものを転記しただけで追記も何もしていない。
数理部分は、下記を参照しました。パラメタを推定するところは、optim()
を使いました。
library(tidyverse)
set.seed(1989)
<- tibble(y = sample(c(0, 1), 10, replace = TRUE),
df x1 = rnorm(10),
x2 = rnorm(10))
<- df %>% select(starts_with("x"))
X <- df %>% select(y)
y
# Sigmoid function
<- function(x) {
sigmoid 1.0 / (1.0 + exp(-x))
}
# Cost function
<- function(theta, X, y){
cost_func <- sigmoid(X %*% theta)
h <- -1*(t(y) %*% log(h) + t(1-y) %*% log(1-h))
cost
cost
}
# Gradient function
<- function(theta, X, y){
gradient <- sigmoid(X %*% theta)
h <- (t(X) %*% (h - y))
grad
grad
}
<- function(X, y){
log_reg # Add intercept and convert matrix
<- X %>% mutate(alpha = 1) %>% select(alpha, everything()) %>% as.matrix()
X <- y %>% as.matrix()
y # Initialize parms
<- matrix(rep(0, ncol(X)), nrow = ncol(X))
theta # Optimize by BFGS(準ニュートン法)
<- optim(par = theta, fn = cost_func, gr = gradient, X = X, y = y, method = "BFGS")
res_opt # Get parms
return(res_opt$par)
}
実行結果はこちら。
log_reg(X = X, y = y)
## [,1]
## [1,] -1.1322717
## [2,] -0.4637470
## [3,] -0.7010454
glm()
の結果と一緒みたいなのでOKでしょう。
<- glm(y ~ x1 + x2, data = df, family = binomial(link = "logit"))
g $coefficients %>% as.matrix() g
## [,1]
## (Intercept) -1.1322713
## x1 -0.4637478
## x2 -0.7010468