यह निश्चित रूप से अजीब है। पहले विचार के रूप में: मॉडल की तुलना करते समय जहां मॉडल में अलग-अलग प्रभाव संरचनाएं होती हैं ( m2
और m3
उदाहरण के लिए), यह हमारे लिए सबसे अच्छा हैमएलजैसा REML
कि "परिवर्तन" होगाy। (यह इसके साथ गुणा करेगाk, कहाँ पे kX=0) यह दिलचस्प है कि यह काम करता है method="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
जो दोनों के बीच एक स्पष्ट विसंगति की तरह लगता है लेकिन यह वास्तव में नहीं है जैसा कि गेविन ने समझाया है। स्पष्ट बताने के लिए:
attr( logLik(lme(y ~ x, random = ~ 1|cat, na.action = na.omit, method="ML")),
"nobs")
#[1] 500
मेरे विचार से कार्यप्रणाली के संदर्भ में ऐसा होने का एक अच्छा कारण है। मॉडल की तुलना lme
करते lmer
समय आपके लिए एलएमई प्रतिगमन की भावना बनाने की कोशिश करता है, यह तुरंत एमएल परिणाम है। मुझे लगता है कि इस मामले में कोई कीड़े नहीं हैं lme
और lmer
प्रत्येक पैकेज के पीछे अलग-अलग तर्क हैं।
गविन सिमोनसन की टिप्पणी पर और अधिक व्यावहारिक विवरण के साथ देखें कि क्या हुआ था anova()
(वही बात व्यावहारिक रूप से होती है AIC
)