AIC, aova त्रुटि: मॉडल सभी एक ही संख्या में टिप्पणियों के लिए फिट नहीं हैं, मॉडल सभी डेटासेट के समान आकार के लिए फिट नहीं थे


10

मेरे पास इस तरह के मॉडल हैं:

require(nlme)

set.seed(123)
n <- 100
k <- 5
cat <- as.factor(rep(1:k, n))
cat_i <- 1:k # intercept per kategorie
x <- rep(1:n, each = k)
sigma <- 0.2
alpha <- 0.001
y <- cat_i[cat] + alpha * x + rnorm(n*k, 0, sigma)
plot(x, y)

m1 <- lm(y ~ x)
summary(m1)

m2 <- lm(y ~ cat + x)
summary(m2)

m3 <- lme(y ~ x, random = ~ 1|cat, na.action = na.omit)
summary(m3)

अब मैं यह आकलन करने की कोशिश कर रहा हूं कि क्या मॉडल में यादृच्छिक प्रभाव मौजूद होना चाहिए। इसलिए मैं एआईसी या एनोवा का उपयोग कर मॉडल की तुलना करता हूं, और मुझे निम्नलिखित त्रुटि मिलती है:

> AIC(m1, m2, m3)
   df       AIC
m1  3 1771.4696
m2  7 -209.1825
m3  4 -154.0245
Warning message:
In AIC.default(m1, m2, m3) :
  models are not all fitted to the same number of observations  
> anova(m2, m3)
Error in anova.lmlist(object, ...) : 
  models were not all fitted to the same size of dataset

जैसा कि आप देख सकते हैं, दोनों ही मामलों में मैं समान डेटासेट का उपयोग करता हूं। मुझे दो उपचार मिले हैं, लेकिन मैं उन्हें संतोषजनक नहीं मानता:

  1. method = "ML"Lme () कॉल में जोड़ना - सुनिश्चित नहीं है कि क्या विधि को बदलना अच्छा है।
  2. lmer()इसके बजाय का उपयोग कर । आश्चर्यजनक रूप से, यह इस तथ्य के बावजूद काम करता है कि lmer () REML विधि का उपयोग करता है। हालाँकि मुझे यह समाधान पसंद नहीं है क्योंकि lmer()गुणांक के लिए पी-मान नहीं दिखाता है - मुझे lme()इसके बजाय पुराने का उपयोग करना पसंद है ।

क्या आपके पास कोई विचार है कि क्या यह बग है या नहीं और हम उसके आसपास कैसे जा सकते हैं?

जवाबों:


7

एक त्वरित खोज से पता चलता है कि यह संभव है (हालांकि मुझे यह स्वीकार करना होगा कि मुझे लगा कि यह नहीं था) और यह बग नहीं है ... बस एक और मामला जहां आर में तरीके छिपे हुए हैं और परिणामस्वरूप चीजें जो अप्रत्याशित लगती हैं। ', लेकिन RTFM भीड़ का कहना है, "यह प्रलेखन में है।" वैसे भी ... अपने समाधान करना है anovaके साथ lmeपहला तर्क और के रूप में lmदूसरे के रूप में मॉडल (और तीसरे यदि आप चाहें) तर्क (रों)। यदि यह अजीब लगता है, तो ऐसा इसलिए है क्योंकि यह थोड़ा अजीब है। कारण यह है कि जब आप कॉल करते हैं anova, तो anova.lmeविधि को केवल तभी कहा जाता है जब पहला तर्क एक lmeवस्तु हो। अन्यथा, यह कॉल करता है anova.lm(जो बदले में कॉल करता है anova.lmlist; यदि आप खोदते हैं , तो आप anova.lmदेखेंगे कि क्यों)। आप कैसे कॉल करना चाहते हैं, इसके बारे में विवरण के लिएanovaइस मामले में, मदद के लिए ऊपर खींचो anova.lme। आप देखेंगे कि आप अन्य मॉडलों की तुलना मॉडलों के साथ कर सकते हैं lme, लेकिन उन्हें पहले तर्क के अलावा किसी अन्य स्थिति में होना चाहिए। जाहिरा तौर पर यह भी मॉडल तर्कों के आदेश के बारे में बहुत परवाह किए बिना फ़ंक्शन anovaका उपयोग करके फिट होने वाले मॉडल पर उपयोग करना संभव है gls। लेकिन मुझे यह पता करने के लिए पर्याप्त विवरण नहीं है कि यह एक अच्छा विचार है या नहीं, या वास्तव में इसका क्या अर्थ है (यह शायद ठीक लगता है, लेकिन आपकी कॉल)। उस लिंक की तुलना lmकरने से यह lmeप्रतीत होता है कि यह अच्छी तरह से प्रलेखित है और एक विधि के रूप में उद्धृत किया गया है, इसलिए मैं उस दिशा में गलत करूंगा, मैं आप थे।

सौभाग्य।


1
ओह, और G11 के परिशिष्ट के साथ AIC के संबंध में user11852 का जवाब, उस मुद्दे को संबोधित करने के लिए कोई विशेष AIC.lme या कुछ भी नहीं है और पूरी बात मेरे वेतन ग्रेड से परे
खिसकने लगती है

4

यह निश्चित रूप से अजीब है। पहले विचार के रूप में: मॉडल की तुलना करते समय जहां मॉडल में अलग-अलग प्रभाव संरचनाएं होती हैं ( 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

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)


"आपको ML का उपयोग करना चाहिए" - लेकिन आप यह कैसे समझा सकते हैं कि lmerREML (मॉडल सारांश देखें) का उपयोग कर रहा है और AIC में ठीक काम करता है? तो दो संभावनाएँ हैं: 1) त्रुटि संदेश * एक सुविधा है , बग नहीं है, और यह जिस तथ्य के लिए काम करता lmerहै वह बग है। या 2) त्रुटि संदेश बग है , सुविधा नहीं।
जिज्ञासु

अपडेटेड पोस्ट देखें (मुझे कुछ कोड शामिल करना था)। आपकी मूल प्रतिक्रिया लिखते समय मैंने खुद ही आपका वैध बिंदु नोटिस किया था, लेकिन मैंने मूल रूप से इसे बाहर रखने का विकल्प चुना, ताकि मेरे उत्तर के पीछे तर्क सख्ती से गणना आधारित हो।
us --r11852

4
@Tomas lmer() नहीं है REML का उपयोग जब आप इसे तुलना कर पूछते हैं। IIRC में उन्होंने कुछ फैंसी शुगर को शामिल किया है lmer()ताकि आपको MLफिट की तुलना करने के लिए मॉडल को परिष्कृत न करना पड़े जब आप REMLवैरिएबल मापदंडों के सर्वोत्तम अनुमान प्राप्त करने के लिए व्यक्तिगत फिट पर चाहते हैं । देखो ?lmer, anova(fm1, fm2)कॉल करने के लिए और सहित पहले LME उदाहरण चलाएँ । anova()उन लोगों द्वारा रिपोर्ट की गई लॉग लाइबिलिटीज और पहले से छपे आउटपुट में देखें। anova()हो रही है एमएल आप के लिए अनुमान है।
गैविन सिम्पसन

अच्छा बिंदु गेविन, मैं भूल lmerगया कि दोनों एक ही समय में मिला (यह पीएलएस का उपयोग करता है इसलिए यह उस समय केवल एक अनुमान लगाता है)। मैं भूल गया कि आपने क्या उल्लेख किया था।
us --r11852

2
@rpierce: THE AIC सूचना भीतरanova() एमएल के आधार पर एक है। AIC ने बताया कि केवल AIC()REML पर आधारित है।
us --r11852
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.