簡體   English   中英

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

[英]AIC/AICc/BIC Formula in R for GLM

I'm trying to check that I understand how R calculates the statistic AIC, AICc (corrected AIC) and BIC for a glm() model object (so that I can perform the same calculations on revoScaleR::rxGlm() objects - particularly the AICc,默認不可用)

我知道這些定義如下:

p = model 參數的數量

n = 數據點數

AIC  = deviance + 2p
AICc = AIC + (2p^2 + 2p)/(n-p-1)
BIC  = deviance + 2p.log(n)

所以我嘗試復制這些數字並將它們與相應的 R function 調用進行比較。 它沒有用:

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

通過使用debug(AIC)我可以看到計算是不同的。 它基於 12 個參數(估計分散/尺度參數的一個額外參數?)。 此外,使用logLik()獲得對數似然度,它帶回一個數字-69.85 ,這向我表明 model 偏差將是-2*-69.85 = 139.71 (它不是)。

請問有誰知道我做錯了什么? 謝謝你。

extractAIC手冊

在哪里:

  • L 是擬合的可能性,而 edf 是等效的自由度(即,通常參數模型的參數數量)。
  • 對於廣義線性模型(即,對於 lm、aov 和 glm),-2log L 是偏差,由 deviance(fit) 計算。
  • k = 2 對應於傳統的 AIC,使用 k = log(n) 代替提供 BIC(貝葉斯 IC)。

因此

在@user20650 的評論和輸入中編輯以下討論

  • glm_a1$ranks返回擬合參數的數量,而不考慮高斯族中使用的擬合方差。

  • ?glm狀態

    偏差:最大為常數,減去最大對數似然的兩倍。 在合理的情況下,選擇常數以使飽和 model 偏差為零。

    這就是為什么-2*logLik(glm_a1) - deviance(glm_a1) = 7.78 > 0

  • summary(glm_a1)返回以下行Dispersion parameter for gaussian family taken to be 7.023544大約是 -2 對數似然和偏差之間的差異。


library(AICcmodavg)
#> Warning: package 'AICcmodavg' was built under R version 3.6.2
#> Warning: no function found corresponding to methods exports from 'raster' for:
#> 'wkt'

data(mtcars)

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

(loglik <- logLik(glm_a1))
#> 'log Lik.' -69.85491 (df=12)

# thus the degrees of freedom r uses are 12 instead of 11

n   <- attributes(loglik)$nobs # following user20650 recommendation 
p   <- attributes(loglik)$df # following user20650 recommendation
dev <- -2*as.numeric(loglik)
my_AIC  <- dev + 2 * p
my_AICc <- my_AIC + (2 * p^2 + 2 * p)/(n - p - 1)
my_BIC  <- dev +  p * log(n)

BIC(glm_a1) 
#> [1] 181.2986
my_BIC 
#> [1] 181.2986
AIC(glm_a1)
#> [1] 163.7098
my_AIC 
#> [1] 163.7098
AICc(glm_a1)
#> [1] 180.1309
my_AICc
#> [1] 180.1309

Function 計算rxGlm() object 的這些數量,與glm()的處理一致(調整偏差的“達到恆定”差異):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM