Điều này là đặc biệt chắc chắn. Như một ý nghĩ đầu tiên: khi thực hiện mô hình so sánh nơi mô hình đang có tác dụng cố định cấu trúc khác nhau ( m2
và m3
ví dụ), cách tốt nhất là chúng ta như sẽ "thay đổi" . (Nó sẽ nhân nó với , trong đó ) Điều thú vị là nó hoạt động bằng cách sử dụng khiến tôi tin rằng nó có thể không phải là một lỗi. Có vẻ như nó thực thi "thực hành tốt".y k k X = 0MLREML
ykkX=0method="ML"
Đã nói rằng, hãy nhìn dưới mui xe:
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")
}
}
trong trường hợp của bạn, bạn có thể thấy rằng:
lls <- lapply(list(m2,m3), stats4::logLik)
attr(lls[[1]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
và rõ ràng logLik
là đang làm điều gì đó (có thể?) bất ngờ ...? không, không thực sự, nếu bạn nhìn vào tài liệu của logLik
, ?logLik
, bạn sẽ thấy nó được quy định rõ ràng:
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’)
Điều này đưa chúng tôi trở lại điểm ban đầu của chúng tôi, bạn nên sử dụng ML
.
Để sử dụng một câu nói phổ biến trong CS: "Đây không phải là lỗi, đó là một tính năng (thực)!"
EDIT : (Chỉ để giải quyết nhận xét của bạn :) Giả sử bạn phù hợp với mô hình khác sử dụng lmer
thời gian này:
m3lmer <- lmer(y ~ x + 1|cat)
và bạn làm như sau:
lls <- lapply(list(m2,m3, m3lmer), stats4::logLik)
attr(lls[[3]], "nobs")
#[1] 500
attr(lls[[2]], "nobs")
#[1] 498
Có vẻ như là một sự khác biệt rõ ràng giữa hai người nhưng thực sự không phải như lời giải thích của Gavin. Chỉ cần nói rõ ràng:
attr( logLik(lme(y ~ x, random = ~ 1|cat, na.action = na.omit, method="ML")),
"nobs")
#[1] 500
Có một lý do chính đáng tại sao điều này xảy ra về mặt phương pháp tôi nghĩ. lme
không cố gắng hiểu ý nghĩa của hồi quy LME cho bạn trong lmer
khi thực hiện so sánh mô hình, nó sẽ ngay lập tức trở lại kết quả ML. Tôi nghĩ rằng không có lỗi về vấn đề này lme
và lmer
chỉ là những lý do khác nhau đằng sau mỗi gói.
Xem thêm bình luận của Gavin Simposeon về một lời giải thích sâu sắc hơn về những gì đã anova()
xảy ra với (Điều tương tự thực tế xảy ra với AIC
)