এআইসি, আনোভা ত্রুটি: মডেলগুলি সমস্ত একই সংখ্যার পর্যবেক্ষণে লাগানো হয় না, মডেলগুলি সমস্ত একই আকারের ডেটাসেটে লাগানো হয়নি


9

আমার কাছে এর মতো মডেল রয়েছে:

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 () আরএমএল পদ্ধতি ব্যবহার করে তা সত্ত্বেও এটি কাজ করে। তবে আমি এই সমাধানটি পছন্দ করি না কারণ lmer()সহগের জন্য পি-মানগুলি দেখায় না - এর lme()পরিবর্তে আমি আরও পুরানো ব্যবহার করতে পছন্দ করি ।

এটি কোনও বাগ আছে বা না থাকলে আপনার কী ধারণা আছে এবং আমরা কীভাবে এটি ঘুরে দেখতে পারি?

উত্তর:


6

একটি দ্রুত অনুসন্ধান দেখায় যে এটি সম্ভব (যদিও আমাকে স্বীকার করতে হবে যে আমি এটি ভাবিনি যে এটি ছিল) এবং এটি কোনও বাগ নয় ... ঠিক আর একটি ক্ষেত্রে যেখানে আর-এর পদ্ধতিগুলি গোপন রয়েছে এবং ফলাফলগুলি অপ্রত্যাশিত বলে মনে হয় ', তবে আরটিএফএমের ভিড় বলে, "এটি ডকুমেন্টেশনে রয়েছে।" যাই হোক ... আপনার সমাধান করতে হয় anovaসঙ্গে lmeপ্রথম আর্গুমেন্ট এবং lmদ্বিতীয় হিসাবে মডেল (এবং তৃতীয় যদি আপনি চান) যুক্তি (গুলি)। এটি যদি অদ্ভুত বলে মনে হয় তবে এটি কিছুটা বিজোড় কারণ। কারণ আপনি কল যখন যে anova, anova.lmeপদ্ধতি বলা হয় শুধুমাত্র যদি প্রথম আর্গুমেন্ট একটি হল lmeঅবজেক্ট। অন্যথায়, এটি কল করে anova.lm(যা ঘুরিয়ে কলগুলি anova.lmlist; যদি আপনি খনন করেন তবে আপনি anova.lmকেন তা দেখবেন)। আপনি কীভাবে কল করতে চান সে সম্পর্কে বিশদ জানতেanovaএই ক্ষেত্রে, জন্য সহায়তা টানুন anova.lme। আপনি দেখতে পাবেন যে আপনি অন্যান্য মডেলগুলিকে মডেলগুলির সাথে তুলনা করতে পারেন lmeতবে তাদের প্রথম যুক্তি ছাড়া অন্য অবস্থানে থাকতে হবে। দৃশ্যত anovaমডেলের glsতর্কগুলির ক্রম সম্পর্কে খুব বেশি যত্ন না করে ফাংশনটি ব্যবহার করে ফিট করে এমন মডেলগুলি ব্যবহার করা সম্ভব । তবে এটি একটি ভাল ধারণা কিনা এবং তা সঠিকভাবে বোঝায় কি না তা নির্ধারণ করার জন্য আমি বিশদ সম্পর্কে পর্যাপ্ত পরিমাণে জানি না (এটি সম্ভবত ভাল বলে মনে হচ্ছে তবে আপনার কল)। সেই লিঙ্কটির সাথে তুলনা করা ভালভাবে ডকুমেন্টেড এবং একটি পদ্ধতি হিসাবে উদ্ধৃত lmহয়েছে lmeবলে মনে হয়, তাই আমি সেদিকেই ত্রুটি করতাম, আমিই তুমি।

শুভকামনা।


1
ওহ, এবং গাভিনের সংযোজন সম্পর্কিত এআইসি সম্পর্কিত ব্যবহারকারী 11852 এর উত্তর, এই সমস্যাটির সমাধান করার জন্য কোনও বিশেষ এআইসি.লমে বা কিছুই নেই এবং পুরো জিনিসটি আমার বেতন গ্রেড ছাড়িয়ে যেতে শুরু করে
রাসেলপিয়ের্স

3

এটি অবশ্যই অদ্ভুত। প্রথম চিন্তা হিসাবে: মডেল তুলনা করার সময় যেখানে মডেলগুলির বিভিন্ন স্থির প্রভাব স্ট্রাকচার থাকে ( 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)


"আপনার এমএল ব্যবহার করা উচিত" - তবে আপনি কীভাবে ব্যাখ্যা করতে পারবেন যে lmerএটি আরএমএল ব্যবহার করছে (মডেলের সারাংশ দেখুন) এবং এআইসিতে ভাল কাজ করে? সুতরাং দুটি সম্ভাবনা রয়েছে: 1) ত্রুটি বার্তাটি একটি বৈশিষ্ট্য , বাগ নয়, এবং এটি যে lmerবাগের জন্য কাজ করে তা একটি বাগ। অথবা 2) ত্রুটি বার্তাটি কোনও বাগ , বৈশিষ্ট্য নয়।
কৌতুহল

আপডেট পোস্ট দেখুন (আমি কিছু কোড অন্তর্ভুক্ত ছিল)। আপনার মূল প্রতিক্রিয়াটি লেখার সময় আমি নিজেই আপনার বৈধ পয়েন্টটি লক্ষ্য করেছি তবে আমি মূলত এটির বাইরে রাখার সিদ্ধান্ত নিয়েছি যাতে আমার উত্তরের পিছনে যুক্তিটি কঠোরভাবে গণনা ভিত্তিক।
usεr11852

3
@Tomas lmer() নেই REML ব্যবহার যখন আপনি এটি তুলনা না জিজ্ঞাসা করুন। আইআইআরসি তারা কিছু অভিনব চিনি অন্তর্ভুক্ত করেছে lmer()যাতে আপনি বৈকল্পিক পরামিতিগুলির সেরা অনুমানের জন্য পৃথক ফিটগুলিতে চাইলে ফিটগুলির সাথে MLতুলনা করার জন্য আপনাকে মডেলটিকে রিফিট করতে হবে না REML। দেখুন ?lmer, anova(fm1, fm2)কল পর্যন্ত এবং প্রথম সহ প্রথম এলএমই উদাহরণ চালান । রিপোর্ট করা লগ সম্ভাবনা anova()এবং মুদ্রিত আউটপুট এর পূর্বে রিপোর্ট করা দেখুন। anova()হচ্ছে এমএল তোমার জন্য অনুমান।
গ্যাভিন সিম্পসন

ভাল পয়েন্ট গাভিন, আমি ভুলে lmerগেছি যে একই সাথে উভয়ই পেয়েছে (এটি পিএলএস ব্যবহার করে তাই এটি কেবলমাত্র একবারে অনুমান করার পরে যায়)। আপনি যা উল্লেখ করেছেন তা আমি ভুলে গেছি।
usεr11852

2
@ আরপিয়ার্স: এর মধ্যেanova() রিপোর্ট করা এআইসি হ'ল এমএল ভিত্তিক। এআইসি রিপোর্ট করেছেন কেবলমাত্র AIC()আরএএমএল-এর উপর ভিত্তি করে।
usεr11852
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.