1

我想快速比较在使用 R 中的包创建的summary()单个polr()模型上运行时作为输出提供的 AIC MASS。我编译此信息没有问题,但我无法弄清楚AIC 信息确切存储位置在polr模型对象本身中。

我已经尝试在我的模型对象上使用str()attributes(),我什至尝试使用getAnywhere("polr")来查看源代码本身。没有什么对我来说很突出。

有人知道如何从中提取 AIC 输出summary(polr_mod)吗?

参考示例:

library(MASS)
dat <- data.frame(v1 = factor(rep(0:2,each=3),ordered = T), v2 = rep(1:3,each=3))
mod_polr <- polr(v1 ~ v2, data = dat, Hess = T, method = "logistic" )
summary(mod_polr)

Call:
polr(formula = v1 ~ v2, data = dat, Hess = T, method = "logistic")

Coefficients:
     v2 
46.7233 

Intercepts:
      0|1       1|2 
 73.62014 117.05781 

Residual Deviance: 1.560782e-08 
AIC: 6.00 

^ 看,输出的底部是AIC: 6.00. 这存储在对象中的什么位置?我想调用/提取它。

4

1 回答 1

2

AIC是一个通用函数,没有类对象的方法,"polr"但有一个默认方法。默认方法的代码可以通过运行查看

getAnywhere("AIC.default")

它所做的是调用logLik它的第一个参数,然后用 计算 AIC k = 2
模型参数的数量由下式给出

attr(lls, "df")

计算是

lls <- logLik(mod_polr)
-2*as.numeric(lls) + k*attr(lls, "df")

反过来,logLik它也是通用的,但具有类对象的方法"polr"
返回的代码

getAnywhere("logLik.polr")

很简单,一条线。请注意,df在其代码中是edf在对象中"polr"。缩进如下。

logLik.polr <- function(object, ...) {
  structure(
    -0.5 * object$deviance, 
    df = object$edf, 
    nobs = object[["nobs"]], 
    class = "logLik"
  )
}

deviance的解释可在值 部分找到。edfnobshelp("polr)

deviance
残留偏差。

edf
模型使用的(有效)自由度数

就像那部分说的那样,nobs用于stepAIC(但不是用于logLik.polr)。

所以这一切都可以拼凑在一个函数中。为简化上述代码AIC的类对象编写一个方法。"polr"

AIC.polr <- function(x, k = 2){
  dev <- x$deviance
  nparams <- x$edf
  dev + k*nparams
}

AIC(mod_polr)
#[1] 6
于 2021-10-21T15:02:25.480 回答