# Set data sets
data <- MASS::birthwt
X <- as.matrix(cbind(1, data[, -1]))
Y <- data[, 1]
n <- dim(X)[1]
p <- dim(X)[2]
beta <- rep(0, p) # Initialize beta
beta1 <- rep(1, p) # Initialize beta1
# fit logit regression using Fisher scoring
while (sum(abs(beta - beta1)) > 0.01) {
beta1 <-beta
# Calculate mu and eta
eta <- X %*% beta1
mu <- exp(eta) / (1 + exp(eta))
# Calculate the derivatives
dmu_deta <- exp(eta) / (( 1 + exp(eta)) ^ 2)
deta_dmu <- 1 / mu + 1 / (1 - mu)
V <- mu * (1 - mu) # Calculate the variance function
W <- diag((dmu_deta ^ 2 / V)[,]) # Calculate the weight matrix
Z <- eta + (Y - mu) * deta_dmu # Calculate Z
beta <- solve(t(X) %*% W %*% X) %*% (t(X) %*% W %*% Z)
}
我正在使用迭代重新加权最小二乘法。 X
和Y
来自内置数据集birthwt
。我不明白为什么这种方法不会收敛。它总是返回NaN
。但是当我移除拦截时,它会收敛。我知道我可以简单地使用glm
,但我想了解实现。