用于GLM的R中的AIC/AICc/BIC公式

用于GLM的R中的AIC/AICc/BIC公式,r,glm,R,Glm,我试图检查我是否理解R如何计算glm()model对象的统计AIC、AICc(纠正的AIC)和BIC(这样我就可以对revoScaleR::rxGlm()对象执行相同的计算-尤其是AICc,它在默认情况下不可用) 我理解这些定义如下: 设p=模型参数的数量 设n=数据点的数量 AIC = deviance + 2p AICc = AIC + (2p^2 + 2p)/(n-p-1) BIC = deviance + 2p.log(n) 所以我尝试复制这些数字,并将它们与相应的R函数调用进行比

我试图检查我是否理解R如何计算
glm()
model对象的统计AIC、AICc(纠正的AIC)和BIC(这样我就可以对
revoScaleR::rxGlm()
对象执行相同的计算-尤其是AICc,它在默认情况下不可用)

我理解这些定义如下:

p
=模型参数的数量

n
=数据点的数量

AIC  = deviance + 2p
AICc = AIC + (2p^2 + 2p)/(n-p-1)
BIC  = deviance + 2p.log(n)
所以我尝试复制这些数字,并将它们与相应的R函数调用进行比较。它不起作用:

library(AICcmodavg) # for the AICc() function

data(mtcars)

glm_a1 <- glm(mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb,
              data = mtcars,
              family = gaussian(link = "identity"),
              trace = TRUE)

summary(glm_a1)

n   <- nrow(glm_a1$data) # 32
p   <- glm_a1$rank # 11
dev <- glm_a1$deviance# 147.49

my_AIC  <- dev + 2 * p
my_AICc <- my_AIC + (2 * p^2 + 2 * p)/(n - p - 1)
my_BIC  <- dev + 2 * p * log(n)

AIC(glm_a1) # 163.71
my_AIC # 169.49

AICc(glm_a1) # 180.13 (from AICcmodavg package)
my_AICc # 182.69

BIC(glm_a1) # 181.30
my_BIC # 223.74
library(AICcmodavg)#用于AICc()函数
数据(mtcars)

glm_a1在
extractAIC
手册中

其中:

  • L是拟合的可能性,edf是拟合的等效自由度(即,常用参数模型的参数数量)
  • 对于广义线性模型(即lm、aov和glm),-2log L是偏差,由偏差(拟合)计算得出
  • k=2对应于传统的AIC,使用k=log(n)提供BIC(Bayes IC)
因此

在@user20650的评论和输入中编辑以下讨论
  • glm_a1$ranks
    返回拟合参数的数量,而不考虑高斯族中使用的拟合方差

  • ?glm
    状态

    偏差:高达常数,减去最大对数可能性的两倍。在合理的情况下,选择该常数,以使饱和模型的偏差为零

    这就是为什么
    -2*logLik(glm_a1)-偏差(glm_a1)=7.78>0

  • summary(glm_a1)
    返回高斯族的下一行
    色散参数,取值为7.023544
    约为-2对数似然和偏差之间的差值


图书馆(AICcmodavg)
#>警告:包“AICcmodavg”是在R版本3.6.2下构建的
#>警告:找不到与从“光栅”导出的方法对应的函数:
#>“wkt”
数据(mtcars)
glm_a1偏差=147.4944次迭代-1
#>偏差=147.4944次迭代-2
(loglik‘log Lik.-69.85491(df=12)
#因此r使用的自由度是12而不是11
n[1]180.1309

函数,用于计算与处理
glm()
一致的
rxGlm()
对象的这些数量(调整偏差中的“最大恒定”差异):


wrc_信息\u标准注意,您可以从
attributes(logLik(glm_a1))
中获得
p
n
。我认为op中的一些混淆是
偏差(glm_a1)!=-2*logLik(glm_a1)
;所以看起来它是一个常数。@Alan;re AIC用于高斯模型。额外的参数用于方差项。请注意,它不会估计这一点,因为我们通常感兴趣的是AIC的差异,而不是绝对值。@Alan'
?glm
表示偏差:高达一个常数,减去最大对数似然的两倍。在合理的情况下,选择该常数使饱和模型的偏差为零。“如果这有帮助的话,;/statistics中自由度的字面定义是@user20650所述的估计参数的数量,我们有11个变量和截距参数,还有一个额外的方差参数term@Alan在
摘要中(glm_a1)
它为高斯族输出以下
色散参数,取值为7.023544
,近似等于
-2logLik(glm_a1)-偏差(glm_a1)
wrc_information_criteria <- function(rx_glm) # an object created by rxGlm()
{

  # add 1 to parameter count for cases where the GLM scale parameter needs to be estimated (notably Gamma/gaussian)
  
  extra_parameter_flag <- case_when(
    rx_glm$family$family == "gaussian" ~ 1,
    rx_glm$family$family == "Gamma" ~ 1,
    rx_glm$family$family == "poisson" ~ 0,
    rx_glm$family$family == "binomial" ~ 0,
    TRUE ~ 999999999
  )
  
  n   <- rx_glm$nValidObs
  p   <- rx_glm$rank + extra_parameter_flag 
  dev <- rx_glm$deviance
  
  cat("\n")
  cat("n       :", n, "\n")
  cat("p       :", p, "\n")
  cat("deviance:", dev, "\n")
  
  AIC  <- dev + 2 * p
  AICc <- AIC + (2 * p^2 + 2 * p)/(n - p - 1)
  BIC  <- dev + p * log(n)
  
  # make a constant adjustment to AIC/AICc/BIC to give consistency with R's built in AIC/BIC functions applied to glm objects
  # can do this because rxGlm() supplies AIC already (consistent with R/glm()) - as long as computeAIC = TRUE in the function call
  
  deviance_constant_adjustment <- rx_glm$aic[1] - AIC
  
  AIC  <- AIC  + deviance_constant_adjustment
  AICc <- AICc + deviance_constant_adjustment
  BIC  <- BIC  + deviance_constant_adjustment
  
  cat("\n")  
  cat("AIC: ", AIC , "\n")
  cat("AICc:", AICc, "\n")
  cat("BIC: ", BIC , "\n")
  
}
data(mtcars)

glm_a1 <- glm(mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb,
              data = mtcars,
              family = gaussian(link = "identity"),
              trace = TRUE)

glm_b1 <- rxGlm(mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb,
                data = mtcars,
                family = gaussian(link = "identity"),
                verbose = 1,
                computeAIC = TRUE)

AIC(glm_a1)
AICc(glm_a1)
BIC(glm_a1)

wrc_information_criteria(glm_b1) # gives same results for glm_b1 as I got for glm_a1