นี่เป็นเรื่องแปลกอย่างแน่นอน ในฐานะที่เป็นความคิดแรกเมื่อทำเปรียบเทียบรูปแบบที่จำลองจะมีแตกต่างกันโครงสร้างผลกระทบคงที่ ( m2
และm3
ตัวอย่าง) ที่ดีที่สุดคือให้เราเป็นน้ำพระทัย "เปลี่ยน" Y(มันจะทวีคูณด้วยโดยที่ ) มันน่าสนใจที่มันใช้งานได้ซึ่งทำให้ฉันเชื่อว่ามันอาจไม่ใช่ข้อผิดพลาด ดูเหมือนว่าเกือบจะบังคับใช้ "การปฏิบัติที่ดี"MLREML
Ykk X= 0method="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
ลองใช้ความรู้สึกของการถดถอย LME สำหรับคุณในขณะlmer
ที่ทำการเปรียบเทียบแบบจำลองมันจะย้อนกลับไปที่ผลลัพธ์ ML ทันที ฉันคิดว่าไม่มีข้อบกพร่องในเรื่องนี้lme
และlmer
เหตุผลที่แตกต่างกันตามแต่ละแพ็คเกจ
ดูความคิดเห็นของ Gavin Simposon เกี่ยวกับคำอธิบายที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับanova()
สิ่งที่เกิดขึ้นด้วย (สิ่งเดียวกันเกิดขึ้นจริงด้วยAIC
)