为什么我的代码实现Fisher评分算法无法收敛?

时间:2017-09-20 20:54:48

标签: r statistics logistic-regression glm newtons-method

# 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)
}

我正在使用迭代重新加权最小二乘法。 XY来自内置数据集birthwt。我不明白为什么这种方法不会收敛。它总是返回NaN。但是当我移除拦截时,它会收敛。我知道我可以简单地使用glm,但我想了解实现。

0 个答案:

没有答案