我想知道能否从GLMNet获得AIC和BIC。我发现glmnet.cr似乎能做到这一点,但我的反应是时间,而不是顺序。我可以自己根据可能性来计算,但glmnet也不会返回。
切线:我真的可以返回 l1 范数吗?我觉得它应该只是
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
根据@merten的回答,我修正了公式。现在它与内置函数匹配。
总结
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的方式不太对。