Bu kesinlikle tuhaf. İlk düşünce olarak: modellerin farklı sabit efekt yapılarına ( m2
ve m3
örneğin) sahip olduğu model karşılaştırması yaparken , bizim için en iyisiMLolarak REML
irade "değişim"y. (Şununla çarpılacaktır:k, nerede kX=0) Bu ilginç bir kullanım olabilir ki bu method="ML"
bir hata olmayabilir inanıyorum. Neredeyse "iyi uygulama" yı uyguladığı görülüyor.
Bunu söyledikten sonra, kaputun altına bakalım:
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")
}
}
sizin durumunuzda bunu görebilirsiniz:
lls <- lapply(list(m2,m3), stats4::logLik)
attr(lls[[1]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
ve belli ki logLik
beklenmedik bir şey yapıyor (belki?) ...? Eğer belgelerine bakarsanız hayır, gerçekten, değil logLik
, ?logLik
, bunu göreceksiniz açıkça belirtilmiştir:
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’)
Bu da bizi orijinal noktamıza geri getiriyor, kullanmalısınız ML
.
CS'de ortak bir deyim kullanmak için: "Bu bir hata değil; (gerçek) bir özellik!"
DÜZENLEME : (Sadece yorumunuzu ele almak için :) lmer
Bu zamanı kullanarak başka bir modele uyduğunuzu varsayın :
m3lmer <- lmer(y ~ x + 1|cat)
ve aşağıdakileri yaparsınız:
lls <- lapply(list(m2,m3, m3lmer), stats4::logLik)
attr(lls[[3]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
Bu ikisi arasında açık bir tutarsızlık gibi görünüyor, ama Gavin'in açıkladığı gibi değil. Sadece bariz olanı belirtmek için:
attr( logLik(lme(y ~ x, random = ~ 1|cat, na.action = na.omit, method="ML")),
"nobs")
#[1] 500
Bunun bence yöntembilim açısından olmasının iyi bir nedeni var. model karşılaştırmaları yaparken hemen ML sonuçlarına geri dönerken lme
LME regresyonunu anlamaya çalışır lmer
. Bence bu konuda hiçbir hata lme
ve lmer
her paketin arkasında sadece farklı gerekçeler var.
Ayrıca bakınız Gavin Simposon'un neler olup bittiğine dair daha anlayışlı bir açıklama hakkındaki yorumu anova()
(Aynı şey pratikte olur AIC
)