logLik.lm():为什么R使用(p + 1)代替p来获得自由度?

时间:2016-06-20 08:09:07

标签: r regression glm lm information-theory

我试图了解R中AIC / BIC的结果。由于某种原因,R将1加到要估算的参数数量上。因此,R使用与2 * p - 2 * logLik不同的公式(在高斯情况下logLik是残差平方和)。实际上它使用:2 * (p + 1) - 2 * logLik

经过研究,我发现问题与stats:::logLik.lm()有关。

> stats:::logLik.lm  ## truncated R function body
## ...
##     attr(val, "df") <- p + 1
## ...

作为一个真实的例子(使用R&#39;内置数据集trees),请考虑:

x <- lm(Height ~ Girth, trees)  ## a model with 2 parameters
logLik(x)
## 'log Lik.' -96.01663 (df=3)

这真是令人费解。谁知道为什么?

来自@ crayfish44的编辑1:glm示例

model.g <- glm(dist ~ speed, cars, family=gaussian)
logLik(model.g) # df=3
model.p <- glm(dist ~ speed, cars, family=poisson)
logLik(model.p) #df=2
model.G <- glm(dist ~ speed, cars, family=Gamma)
logLik(model.G) #df=3

Edit2:logLik

的方法
> methods(logLik)
[1] logLik.Arima*  logLik.glm*  logLik.lm*  logLik.logLik* logLik.nls*

1 个答案:

答案 0 :(得分:2)

当我们决定检查stats:::logLik.lm时,我们真的非常接近答案。如果我们进一步检查stats:::logLik.glm (感谢@ crayfish44的glm示例:Mate,你很棒。再次给你灵感,自上一篇关于persp()和{{1}的帖子以来谢谢!),我们已经解决了这个问题。

使用trans3d()的缺陷是我们无法查看代码的注释。所以我决定检查R-3.3.0的源文件。您可以打开文件:::以查看通用函数R-3.3.0/src/library/stats/R/logLik.R的注释代码。

logLik.**

注意以下几行:

## log-likelihood for glm objects
logLik.glm <- function(object, ...)
{
    if(!missing(...)) warning("extra arguments discarded")
    fam <- family(object)$family
    p <- object$rank
    ## allow for estimated dispersion
    if(fam %in% c("gaussian", "Gamma", "inverse.gaussian")) p <- p + 1
    val <- p - object$aic / 2
    ## Note: zero prior weights have NA working residuals.
    attr(val, "nobs") <- sum(!is.na(object$residuals))
    attr(val, "df") <- p
    class(val) <- "logLik"
    val
 }

p <- object$rank ## allow for estimated dispersion if(fam %in% c("gaussian", "Gamma", "inverse.gaussian")) p <- p + 1 是排名检测后模型系数的效果数。

  • 当我们有p"gaussian()""Gamma()"响应时,自由度加1,因为我们需要估计指数分布的色散参数。
  • 对于&#34; "inverse.gaussian()"&#34;和&#34; binomial()&#34;响应,已知色散参数为1,因此无需估计。

也许poisson()应该考虑解释这个问题,以防有些问题像我们一样愚蠢!