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, я исправил формулу. Теперь он соответствует встроенной функции.

Резюме,

  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

К сожалению, я не могу воспроизвести 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 таким способом не совсем верен.

Другие вопросы по тегам