এটি অবশ্যই অদ্ভুত। প্রথম চিন্তা হিসাবে: মডেল তুলনা করার সময় যেখানে মডেলগুলির বিভিন্ন স্থির প্রভাব স্ট্রাকচার থাকে ( m2
এবং m3
উদাহরণস্বরূপ), এটি আমাদের পক্ষে সেরাMLযেমন 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
।
সিএসে একটি সাধারণ বক্তব্য ব্যবহার করতে: "এটি কোনও বাগ নয়; এটি একটি (বাস্তব) বৈশিষ্ট্য!"
সম্পাদনা : (কেবলমাত্র আপনার মন্তব্যে সম্বোধন করার জন্য :) ধরে নিন আপনি 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
)