【问题标题】:R: Getting AIC/BIC/Likelihood from GLMNetR:从 GLMNet 获取 AIC/BIC/Likelihood
【发布时间】:2017-04-16 15:31:08
【问题描述】:

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

Tangential:我真的可以返回 l1norm 吗?我觉得应该只是

fit$norm

但似乎并非如此。 (我知道它说不要把数字拉出来,但我实际上并没有使用 R)

提前感谢您的帮助。

【问题讨论】:

  • 简短的回答是否定的,但可能有办法解决它,具体取决于您要执行的操作。我想你正在使用glmnet R 包,但我们需要更多地了解你的模型。例如,它是否具有高斯响应? Cross-Validated 上有一些答案可能会有所帮助。

标签: r statistics glmnet


【解决方案1】:

我在计算 glmnet 模型的 AIC 和 BIC 的方法上苦苦挣扎。然而,经过相当多的搜索,我在谷歌结果的第三页找到了答案。可以找到here。我将其发布在这里以供未来的读者阅读,因为我相信我不会是唯一的人。

最后,我通过以下方式实现了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

【讨论】:

  • 所以我最终也使用了它,但从我读到的(以及其他地方的计算)来看,它不会为您提供完全相同的 2L 值(您通常会使用)。但是由于 fit$nulldev 是一个常量,它可以用作替换。请注意,以防您想知道为什么您的 AICc 值与其他计算不一致。
【解决方案2】:

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

总结,

  1. 原始对数似然 (tLL) 是偏差。
  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

【讨论】:

    【解决方案3】:

    很遗憾,我无法使用此公式从“正常”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的方式不太对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 2016-11-15
      • 1970-01-01
      • 2015-11-24
      • 2018-02-09
      • 1970-01-01
      • 2015-10-01
      • 2018-02-21
      相关资源
      最近更新 更多