这绝对是奇特的。作为第一个想法:在模型具有不同的固定效应结构(例如)的情况下进行模型比较时,我们最好使用m2
ML“改变”。(它会将它与相乘,其中)有趣的是,它使用它可以工作,这让我相信它可能不是一个错误。似乎它几乎强制执行“良好做法”。m3
MLREML
ykkX=0method="ML"
话虽如此,让我们看看引擎盖下:
methods(AIC)
getAnywhere('AIC.default')
A single object matching ‘AIC.default’ was found
It was found in the following places
registered S3 method for AIC from namespace stats
namespace:stats with value
function (object, ..., k = 2)
{
ll <- if ("stats4" %in% loadedNamespaces())
stats4:::logLik
else logLik
if (!missing(...)) {
lls <- lapply(list(object, ...), ll)
vals <- sapply(lls, function(el) {
no <- attr(el, "nobs") #THIS IS THE ISSUE!
c(as.numeric(el), attr(el, "df"), if (is.null(no)) NA_integer_ else no)
})
val <- data.frame(df = vals[2L, ], ll = vals[1L, ])
nos <- na.omit(vals[3L, ])
if (length(nos) && any(nos != nos[1L]))
warning("models are not all fitted to the same number of observations")
val <- data.frame(df = val$df, AIC = -2 * val$ll + k * val$df)
Call <- match.call()
Call$k <- NULL
row.names(val) <- as.character(Call[-1L])
val
}
else {
lls <- ll(object)
-2 * as.numeric(lls) + k * attr(lls, "df")
}
}
在您的情况下,您可以看到:
lls <- lapply(list(m2,m3), stats4::logLik)
attr(lls[[1]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
显然logLik
正在做某事(也许?)出乎意料...?不,不是真的,如果您查看 , 的文档logLik
,?logLik
您会看到它明确说明:
There may be other attributes depending on the method used: see
the appropriate documentation. One that is used by several
methods is ‘"nobs"’, the number of observations used in estimation
(after the restrictions if ‘REML = TRUE’)
这使我们回到了最初的观点,您应该使用ML
.
用 CS 中的一句俗话说:“这不是错误;这是(真正的)功能!”
编辑:(只是为了解决您的评论:)假设您使用lmer
这个时间适合另一个模型:
m3lmer <- lmer(y ~ x + 1|cat)
并且您执行以下操作:
lls <- lapply(list(m2,m3, m3lmer), stats4::logLik)
attr(lls[[3]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
两者之间似乎存在明显差异,但实际上并非如 Gavin 所解释的那样。只是为了说明显而易见的:
attr( logLik(lme(y ~ x, random = ~ 1|cat, na.action = na.omit, method="ML")),
"nobs")
#[1] 500
我认为在方法论方面发生这种情况是有充分理由的。lme
确实会尝试为您理解 LME 回归,而lmer
在进行模型比较时,它会立即退回到它的 ML 结果。我认为在这个问题上没有错误,lme
每个lmer
包背后都有不同的理由。
另请参阅 Gavin Simposon 的评论,对发生的事情进行更深入的解释anova()
(实际上发生了同样的事情AIC
)