提问者:小点点

r:从GLMNet获取AIC/BIC/可能性


我想知道能否从GLMNet获得AIC和BIC。我发现glmnet.cr似乎能做到这一点,但我的反应是时间,而不是顺序。我可以自己根据可能性来计算,但glmnet也不会返回。

切线:我真的可以返回 l1 范数吗?我觉得它应该只是

fit$norm

但似乎不是。(我知道它说不要拉出数字,但我实际上没有使用 R)

预先感谢你的帮助。


共3个答案

匿名用户

我一直在纠结如何计算glmnet模型的AIC和BIC。然而,经过大量的搜索,我在谷歌搜索结果的第三页找到了答案。可以在这里找到。我把它贴在这里是为了将来的读者,因为我相信我不是唯一的一个。

最后,我以以下方式实现了AIC和BIC:

fit <- glmnet(x, y, family = "multinomial") 

tLL <- fit$nulldev - deviance(fit)
k <- fit$df
n <- fit$nobs
AICc <- -tLL+2*k+2*k*(k+1)/(n-k-1)
AICc

BIC<-log(n)*k - tLL
BIC

匿名用户

根据@merten的回答,我修正了公式。现在它与内置函数匹配。

总结

  1. 原始对数似然(tL)是偏差
  2. 添加内置函数中的AIC和AICc进行比较
BICAICglm=function(fit){
  #tLL <- fit$null.deviance - deviance(fit)  
  tLL <- -deviance(fit) # 2*log-likelihood
  k <- dim(model.matrix(fit))[2]
  n <- nobs(fit)
  AICc <- -tLL+2*k+2*k*(k+1)/(n-k-1)
  AIC_ <- -tLL+2*k

  BIC<-log(n)*k - tLL
  res=c(AIC_, BIC, AICc)
  names(res)=c("AIC", "BIC", "AICc")
  return(res)
}
#some data simulation to test
set.seed(123)
x=rnorm(20)
set.seed(231)
y=as.numeric(x+rnorm(20)<0)

#the model
glm1=glm(y~x, family="binomial")

结果

BICAICglm(glm1)
     AIC      BIC     AICc 
21.91018 23.90165 22.61607

根据内置函数的答案

AIC(glm1)
[1] 21.91018
BIC(glm1)
[1] 23.90165

小样本量的AICc校正

AIC(glm1, k=2*nobs(glm1)/(nobs(glm1)-1-glm1$rank))
[1] 22.61607

匿名用户

不幸的是,我无法从“正常”glm模型(内置函数BIC作为正确的参考)中使用此公式复制BIC

我修改了上面建议的代码,使其适用于glm对象:

    #BIC function for glm according to stackoverflow
    BICAICglm=function(fit){
      tLL <- fit$null.deviance - deviance(fit)
      k <- dim(model.matrix(fit))[2]
      n <- nobs(fit)
      AICc <- -tLL+2*k+2*k*(k+1)/(n-k-1)
      AICc

      BIC<-log(n)*k - tLL
      res=c(AICc, BIC)
      names(res)=c("AICc", "BIC")
      return(res)
    }

    #some data simulation to test
    set.seed(123)
    x=rnorm(20)
    set.seed(231)
    y=as.numeric(x+rnorm(20)<0)

    #the model
    glm1=glm(y~x, family="binomial")

现在,当我们应用标准BIC()函数时,我们得到了模型的“真”BIC,然后我们可以将其与这里提出的函数进行比较。

    BIC(glm1)
    [1] 23.68755

新的是:

    BICAICglm(glm1)
    AICc       BIC 
    -4.518496 -3.232914 

所以这种计算BIC和AICc的方式不太对。