模拟一个数据集,数据是根据逻辑回归模型生成的
set.seed(2023)
n <- 2500
k <- 10
X <- matrix(rnorm(n * k), ncol = k)
y <- rbinom(n, size = 1, prob = plogis(1 + 3 * X[,1] - 2 * X[,2]))
现在想根据这组数据,求解逻辑回归模型的系数,不要用现成函数 glm.fit()
,把它当作一个无约束优化问题来求解。
log_logit_lik <- function(beta) {
-sum(y * log(plogis(cbind(1, X) %*% beta)) - (1 - y) * log(1 - plogis(cbind(1, X) %*% beta)))
}
当我用 optim()
来求解发现,结果距离真值差距非常大,感觉负对数似然函数写错了,但是又不知道错哪了?求助
# Nelder-Mead
optim(
par = rep(1, 11), # 初始值
fn = log_logit_lik, # 目标函数
method = "Nelder-Mead"
)
$par
[1] 11.43868201 -3.91046434 4.99817589 -1.29366216 -1.25622057 -0.81202657
[7] 1.83220909 0.09821513 5.02672298 -1.31117426 1.60862047
$value
[1] -16007.3
$counts
function gradient
502 NA
$convergence
[1] 1
$message
NULL
逻辑回归模型的参考书 https://www.stat.umn.edu/geyer/5931/mle/glm.pdf
没明白 glm()
里面是咋算的,好像也没什么材料说计算过程,求助一下。