AIC, anova hatası: Modellerin hepsi aynı sayıda gözleme takılmamış, modellerin hepsi aynı boyuttaki veri kümesine takılmamış


10

Ben böyle modeller var:

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)

Şimdi rastgele etkinin modelde mevcut olup olmayacağını değerlendirmeye çalışıyorum. Bu yüzden modelleri AIC veya anova kullanarak karşılaştırıyorum ve aşağıdaki hatayı alıyorum:

> 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

Gördüğünüz gibi, her iki durumda da aynı veri kümesini kullanıyorum. İki çözüm buldum, ancak onları tatmin edici bulmuyorum:

  1. method = "ML"Lme () çağrısına ekleme - yöntemi değiştirmenin iyi bir fikir olup olmadığından emin değilim.
  2. lmer()Bunun yerine kullanmak . Şaşırtıcı bir şekilde, bu, lmer () 'nin REML yöntemini kullanmasına rağmen çalışır. Ancak bu çözümü sevmiyorum çünkü lmer()katsayılar için p değerleri göstermiyor - lme()bunun yerine daha eski kullanmayı seviyorum .

Bunun bir hata olup olmadığı hakkında bir fikriniz var mı ve nasıl dolaşabiliriz?

Yanıtlar:


7

Hızlı bir arama, bunun mümkün olmadığını (bunun olmadığını düşündüğümü itiraf etmeliyim) ve bunun bir hata olmadığını gösterir ... R'deki yöntemlerin gizlendiği ve 'beklenmedik görünen şeylerle sonuçlandığı başka bir durum ", ancak RTFM kalabalığı" Belgelerin içinde "diyor. Neyse ... senin çözüm yapmaktır anovaile lmeilk argüman gibi lmmodellerin ikincisi olarak (ve isterseniz üçüncü) argüman (lar). Bu tuhaf görünüyorsa, bunun nedeni biraz tuhaf olmasıdır. Bunun nedeni, aradığınızda anova, anova.lmeyöntemin yalnızca ilk bağımsız değişken bir lmenesne olması durumunda çağrılmasıdır . Aksi takdirde, çağırır anova.lm(sırayla çağrı yapar anova.lmlist; içeri anova.lmgirerseniz, nedenini göreceksiniz). Nasıl aramak istediğinizle ilgili ayrıntılar içinanovabu durumda yardımını yukarı çekin anova.lme. Diğer modelleri modellerle karşılaştırabileceğinizi göreceksiniz lme, ancak ilk argümandan farklı bir konumda olmaları gerekiyor. Görünüşe göre , model argümanlarının sırasına çok fazla önem vermeden anova, glsişlevi kullanan modellerde kullanmak da mümkündür . Ama bunun iyi bir fikir olup olmadığını veya tam olarak ne anlama geldiğini (muhtemelen iyi görünüyor, ancak çağrınız) belirlemek için detayları yeterince bilmiyorum. Karşılaştıran o bağlantısından lmiçin lmeo yöne err diye, göründüğünü de I were you, bir yöntem olarak belgelenmiş ve anılan edilecek.

İyi şanslar.


1
Oh, ve user11852'nin Gavin eki ile AIC ile ilgili cevabı, özel bir AIC.lme ya da bu sorunu ele alacak bir şey yok ve her şey ödeme
notumun

4

Bu kesinlikle tuhaf. İlk düşünce olarak: modellerin farklı sabit efekt yapılarına ( m2ve m3örneğin) sahip olduğu model karşılaştırması yaparken , bizim için en iyisiMLolarak REMLirade "değişim"y. (Şununla çarpılacaktır:k, nerede kX=0) Bu ilginç bir kullanım olabilir ki bu method="ML"bir hata olmayabilir inanıyorum. Neredeyse "iyi uygulama" yı uyguladığı görülüyor.

Bunu söyledikten sonra, kaputun altına bakalım:

 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")
     }     
 }

sizin durumunuzda bunu görebilirsiniz:

  lls <- lapply(list(m2,m3), stats4::logLik)
  attr(lls[[1]], "nobs")
  #[1] 500
  attr(lls[[2]], "nobs")
  #[1] 498

ve belli ki logLikbeklenmedik bir şey yapıyor (belki?) ...? Eğer belgelerine bakarsanız hayır, gerçekten, değil logLik, ?logLik, bunu göreceksiniz açıkça belirtilmiştir:

 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’)

Bu da bizi orijinal noktamıza geri getiriyor, kullanmalısınız ML.

CS'de ortak bir deyim kullanmak için: "Bu bir hata değil; (gerçek) bir özellik!"

DÜZENLEME : (Sadece yorumunuzu ele almak için :) lmerBu zamanı kullanarak başka bir modele uyduğunuzu varsayın :

m3lmer <- lmer(y ~ x + 1|cat)

ve aşağıdakileri yaparsınız:

lls <- lapply(list(m2,m3, m3lmer), stats4::logLik)
attr(lls[[3]], "nobs")
#[1] 500
 attr(lls[[2]], "nobs")
#[1] 498

Bu ikisi arasında açık bir tutarsızlık gibi görünüyor, ama Gavin'in açıkladığı gibi değil. Sadece bariz olanı belirtmek için:

 attr( logLik(lme(y ~ x, random = ~ 1|cat, na.action = na.omit, method="ML")),
 "nobs")
#[1] 500

Bunun bence yöntembilim açısından olmasının iyi bir nedeni var. model karşılaştırmaları yaparken hemen ML sonuçlarına geri dönerken lmeLME regresyonunu anlamaya çalışır lmer. Bence bu konuda hiçbir hata lmeve lmerher paketin arkasında sadece farklı gerekçeler var.

Ayrıca bakınız Gavin Simposon'un neler olup bittiğine dair daha anlayışlı bir açıklama hakkındaki yorumu anova()(Aynı şey pratikte olur AIC)


"ML kullanıyor olmalısınız" - ancak bunun lmerREML (model özetine bakın) ve AIC'de iyi çalıştığını nasıl açıklayabilirsiniz ? Yani iki olasılık vardır: 1) hata mesajı, hata değil * bir özelliktir ve bunun için çalıştığı gerçeği lmerbir hatadır. Veya 2) hata mesajı bir hata , özellik değil.
Meraklı

Güncellenmiş gönderiye bakın (bazı kodları dahil etmek zorunda kaldım). Orijinal cevabınızı yazarken geçerli noktanızı kendim fark etmiştim, ama aslında cevabımın arkasındaki mantık kesinlikle hesaplama tabanlı olmak için dışarıda tutmayı seçtim.
usεr11852

4
@Tomas lmer() , karşılaştırma yapmasını istediğinizde REML kullanmaz. IIRC, bazı fantezi şekerler içerdiğinden , varyans parametrelerinin en iyi tahminlerini elde etmek için bireysel uyumlarda istediğiniz uyumu karşılaştırmak lmer()için modeli yeniden takmak zorunda kalmadınız . Bakın , ilk LME örneğini aramaya kadar ve aramayı dahil ederek çalıştırın . Tarafından raporlanan günlük çıktılarına ve basılı çıktıda daha önce rapor edilenlere bakın. Oluyor ML sizin için tahmin ediyor. MLREML?lmeranova(fm1, fm2)anova()anova()
Gavin Simpson

İyi nokta Gavin, unuttum ki lmerher ikisi de aynı anda var (PLS kullanır, bu yüzden sadece bir tahmin tahmin). Bahsettiğiniz şeyi kontrol etmeyi unuttum.
usεr11852

2
@rpierce: AIC bildirdi içindeanova() ML dayalı biridir. Rapor edilen AIC sadece AIC()REML'ye dayanmaktadır.
usεr11852
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.