Newton Raphson用于逻辑回归

时间:2014-11-08 19:58:05

标签: r algorithm logistic-regression

我为Newton Raphson编写了逻辑回归代码。不幸的是我尝试了很多数据没有收敛。有一个错误,我不知道它在哪里。任何人都可以帮助找出问题所在。

首先数据如下; y表示响应(0,1),Z是115 * 30矩阵,这是探索变量。我需要估计30个参数。

y = c(rep(0,60),rep(1,55))
X = sample(c(0,1),size=3450,replace=T)
Z = t(matrix(X,ncol=115))
#The code is ;
B     = matrix(rep(0,30*10),ncol=10)
B[,1] = matrix(rep(0,30),ncol=1)
for(i in 2 : 10){
  print(i)
  p       <- exp(Z %*%as.matrix(B[,i])) / (1 + exp(Z %*% as.matrix(B[,i])))
  v.2     <- diag(as.vector(1 * p*(1-p)))
  score.2 <- t(Z) %*% (y - p) # score function
  increm  <- solve(t(Z) %*% v.2 %*% Z) 
  B[,i]   =  as.matrix(B[,i-1])+increm%*%score.2
  if(B[,i]-B[i-1]==matrix(rep(0.0001,30),ncol=1)){
    return(B)
  }
}

1 个答案:

答案 0 :(得分:3)

发现它!您基于p更新了B[,i],您应该使用B[,i-1] ...

当我找到答案时,我清理了你的代码并将结果合并到一个函数中。 R的内置glm似乎有效(见下文)。需要注意的是,这种方法很可能是不稳定的:拟合一个包含30个预测变量的二元模型,只有115个二元响应,并且没有任何惩罚或收缩,是非常乐观的......

set.seed(101)
n.obs <- 115
n.zero <- 60
n.pred <- 30
y <- c(rep(0,n.zero),rep(1,n.obs-n.zero))
X <- sample(c(0,1),size=n.pred*n.obs,replace=TRUE)
Z <- t(matrix(X,ncol=n.obs))

R的内置glm钳工确实有效(它使用迭代重加权最小二乘,而不是N-R):

g1 <- glm(y~.-1,data.frame(y,Z),family="binomial")  

(如果您想查看结果library("arm"); coefplot(g1)。)

## B_{m+1} = B_m + (X^T V_m X)^{-1} X^T (Y-P_m)

NRfit功能:

NRfit <- function(y,X,start,n.iter=100,tol=1e-4,verbose=TRUE) {
    ## used X rather than Z just because it's more standard notation
    n.pred <- ncol(X)
    B <-  matrix(NA,ncol=n.iter,
                 nrow=n.pred)
    B[,1] <- start
    for (i in 2:n.iter) {
        if (verbose) cat(i,"\n")
        p <- plogis(X %*% B[,i-1])
        v.2 <- diag(c(p*(1-p)))
        score.2 <- t(X) %*% (y - p) # score function
        increm <- solve(t(X) %*% v.2 %*% X) 
        B[,i] <- B[,i-1]+increm%*%score.2
        if (all(abs(B[,i]-B[,i-1]) < tol)) return(B)
    }
    B
}

matplot(res1 <- t(NRfit(y,Z,start=coef(g1))))
matplot(res2 <- t(NRfit(y,Z,start=rep(0,ncol(Z)))))
all.equal(res2[6,],unname(coef(g1))) ## TRUE