R:从GLMNet获取AIC / BIC / Likelihood

6

我想知道是否可以从GLMNet获取AIC和BIC。 我发现glmnet.cr似乎能够做到这一点,但我的响应是时间而不是序数。我可以通过似然度自己计算,但glmnet也不返回它。

顺便问一下:我是否可以返回l1norm?我觉得应该只是

fit$norm

但似乎并不是这样。(我知道它说不要提取数字,但我实际上没有使用R)

感谢您的帮助。


简短的回答是不行,但根据您要做什么,可能有绕过的方法。我假设您正在使用glmnet R包,但我们需要了解更多关于您的模型的信息。例如,它是否具有高斯响应?Cross-Validated上有一些答案可能会有所帮助。 - Peter Ellis
3个回答

8
我曾经苦恼于如何计算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

3
所以我最终也使用了这个,但根据我所读的(和其他地方的计算),它不会给你与通常使用的2L完全相同的值。但由于fit$nulldev是一个常数,它可以用作替代。只是一个警告,以防您想知道为什么您的AICc值与其他计算不匹配。 - Faller

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接