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

R:从GLMNet获取AIC/BIC/可能性,r,statistics,glmnet,R,Statistics,Glmnet,我想知道我是否能从GLMNet获得AIC和BIC。我发现glmnet.cr似乎能够做到这一点,但我的反应是时间,而不是顺序。我可以根据可能性自己计算,但glmnet也没有返回 切向:我真的可以返回l1norm吗?我觉得应该是这样 fit$norm 但事实似乎并非如此。(我知道上面说不要把数字拿出来,但我实际上没有用R) 提前感谢您的帮助。我一直在努力研究如何计算glmnet模型的AIC和BIC。然而,经过相当多的搜索,我在谷歌搜索结果的第三页找到了答案。可以找到它。我把它贴在这里是为了将来的读

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

切向:我真的可以返回l1norm吗?我觉得应该是这样

fit$norm
但事实似乎并非如此。(我知道上面说不要把数字拿出来,但我实际上没有用R)


提前感谢您的帮助。

我一直在努力研究如何计算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

fit不幸的是,我无法使用此公式从“正常”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")
新的:

    BICAICglm(glm1)
    AICc       BIC 
    -4.518496 -3.232914 

因此,用这种方法计算BIC和AICc的方法不太正确。

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

总结

  • 原始对数似然(tLL)为偏差
  • 添加了AIC和来自内置函数的AICc以进行比较
  • 根据内置函数进行回答

    AIC(glm1)
    [1] 21.91018
    BIC(glm1)
    [1] 23.90165
    
    小样本的校正

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

    简短的回答是否定的,但可能有一种解决方法,这取决于你想做什么。我假定您使用的是
    glmnet
    R软件包,但我们需要更多地了解您的模型。例如,它是否具有高斯响应?交叉验证中有一些答案可能会有所帮助。因此我最终也使用了这个,但从我阅读的(以及其他地方的计算)来看,它不会给出2L的完全相同的值(您通常会使用)。但由于fit$nulldev是一个常量,因此可以将其用作替换项。如果您想知道为什么您的AICc值与其他计算不一致,请注意。
    BICAICglm(glm1)
         AIC      BIC     AICc 
    21.91018 23.90165 22.61607
    
    AIC(glm1)
    [1] 21.91018
    BIC(glm1)
    [1] 23.90165
    
    AIC(glm1, k=2*nobs(glm1)/(nobs(glm1)-1-glm1$rank))
    [1] 22.61607