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