Ini aneh tentunya. Sebagai pemikiran pertama: ketika melakukan perbandingan model di mana model memiliki struktur efek tetap yang berbeda ( m2
dan m3
misalnya), yang terbaik bagi kami adalah karena akan "berubah" . (Ini akan melipatgandakannya dengan , di mana ) Sangat menarik bahwa ia bekerja menggunakan yang membuat saya percaya itu mungkin bukan bug. Sepertinya hampir seperti menegakkan "praktik yang baik".y k k X = 0M.L.REML
ykk X= 0method="ML"
Karena itu, mari kita lihat di bawah tenda:
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")
}
}
di mana dalam kasus Anda, Anda dapat melihat bahwa:
lls <- lapply(list(m2,m3), stats4::logLik)
attr(lls[[1]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
dan jelas logLik
melakukan sesuatu (mungkin?) tak terduga ...? tidak ada, tidak benar-benar, jika Anda melihat dokumentasi logLik
, ?logLik
, Anda akan melihatnya secara eksplisit dinyatakan:
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’)
yang membawa kami kembali ke titik awal kami, Anda harus menggunakan ML
.
Untuk menggunakan ungkapan umum dalam CS: "Ini bukan bug; ini fitur (nyata)!"
EDIT : (Hanya untuk menjawab komentar Anda :) Asumsikan Anda cocok dengan model lain menggunakan lmer
waktu ini:
m3lmer <- lmer(y ~ x + 1|cat)
dan Anda melakukan hal berikut:
lls <- lapply(list(m2,m3, m3lmer), stats4::logLik)
attr(lls[[3]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
Yang tampak seperti perbedaan yang jelas antara keduanya tetapi sebenarnya tidak seperti yang dijelaskan Gavin. Hanya untuk menyatakan yang sudah jelas:
attr( logLik(lme(y ~ x, random = ~ 1|cat, na.action = na.omit, method="ML")),
"nobs")
#[1] 500
Ada alasan bagus mengapa ini terjadi dalam hal metodologi saya pikir. lme
tidak mencoba untuk memahami regresi LME untuk Anda lmer
saat melakukan perbandingan model, itu kembali segera ke hasil ML itu. Saya pikir tidak ada bug dalam hal ini lme
dan lmer
hanya alasan yang berbeda di balik setiap paket.
Lihat juga komentar Gavin Simposon tentang penjelasan yang lebih mendalam tentang apa yang terjadi anova()
(Hal yang sama terjadi secara praktis dengan AIC
)