我想知道我是否可以从GLMNet获得AIC和BIC。我发现glmnet.cr似乎能够做到,但我的反应是时间,而不是顺序。我可以从可能性中自己计算,但glmnet也没有返回。
切向:我真的可以返回l1norm吗?我觉得它应该只是
.nav > ul
但似乎并非如此。 (我知道它说不要把数字拉出去,但我实际上并没有使用R)
提前感谢您的帮助。
答案 0 :(得分:3)
我正在努力解决如何为glmnet模型计算AIC和BIC的方法。然而,经过相当多的搜索,我在google结果的第三页找到了答案。它可以找到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
答案 1 :(得分: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的方法不太正确。
答案 2 :(得分:0)
基于@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