R: Получение AIC/BIC/ вероятности от GLMNet
Мне интересно, могу ли я получить AIC и BIC от GLMNet. Я нашел glmnet.cr, который, кажется, может это сделать, но мой ответ - время, а не порядковый номер. Я мог бы рассчитать это сам по вероятности, но glmnet это тоже не возвращает.
Тангенциальный: могу ли я на самом деле вернуть l1norm? Я чувствую, что это должно быть просто
fit$norm
но это не так. (Я знаю, что это говорит не вытаскивать цифры, но я на самом деле не использую R)
Заранее спасибо за помощь.
1 ответ
Я много боролся со способом расчета AIC и BIC для моделей glmnet. Однако после долгих поисков я нашел ответ на третьей странице Google. Это можно найти здесь. Я публикую его здесь для будущих читателей, так как считаю, что не могу быть единственным.
В итоге я реализовал 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, я исправил формулу. Теперь он соответствует встроенной функции.
Резюме,
- исходное логарифмическое правдоподобие (tLL) было смещением.
- Для сравнения добавлены 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
К сожалению, я не могу воспроизвести BIC, используя эту формулу для "нормальной" модели glm (для которой встроенная функция BIC работает в качестве правильной ссылки)
Я изменил код, предложенный выше, чтобы он работал с объектом glm:
#BIC function for glm according to stackru
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 таким способом не совсем верен.