AIC、anovaエラー:モデルがすべて同じ数の観測値に適合していない、モデルがすべて同じサイズのデータ​​セットに適合していない


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またはanovaを使用してモデルを比較すると、次のエラーが発生します。

> 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

ご覧のとおり、どちらの場合も同じデータセットを使用しています。私は2つの救済策を見つけましたが、それらが満足できるとは思いません:

  1. method = "ML"lme()呼び出しへの追加 -メソッドを変更することが適切かどうかわからない。
  2. lmer()代わりに使用します。驚いたことに、lmer()がREMLメソッドを使用しているにもかかわらず、これは機能します。ただし、lmer()は係数のp値を表示しないため、この解決策は好きではありませんlme()。代わりに古い値を使用するのが好きです。

これがバグであるかどうか、またそれをどうやって回避できるか考えていますか?

回答:


6

クイック検索は、それが可能である(私はそれがそうではなかったと思ったと認めなければなりませんが)、それはバグではないことを示しています... Rのメソッドが非表示になっていて、予期しないように見える結果が生じる別のケース'、しかし、RTFMの群衆は「それはドキュメントにある」と言います。とにかく...あなたのソリューションを行うことですanovalme最初の引数ととしてlmモデル第二として、(あなたが好きなら3番目)の引数(複数可)。これが奇妙に思えるのは、少し奇妙だからです。その理由は、を呼び出すとanovaanova.lme最初の引数がlmeオブジェクトである場合にのみメソッドが呼び出されるためです。それ以外の場合は、それが呼び出されますanova.lm(次にが呼び出されanova.lmlistます。を掘り下げると、そのanova.lm理由がわかります)。通話方法の詳細についてanovaこの場合、ヘルプを表示しanova.lmeます。他のモデルとlmeモデルを比較できることがわかりますが、それらは最初の引数以外の位置にある必要があります。どうやら、モデル引数の順序をあまり気にせずにanovagls関数を使用してフィットするモデルで使用することも可能です。しかし、それが良いアイデアであるかどうか、またはそれが何を意味するのかを判断するための詳細については十分に理解していません(おそらく問題ないようですが、あなたの電話)。そのリンクからの比較lmlme十分に文書化され、方法として引用されているように見えるので、私はその方向に誤りますが、私はあなたでした。

幸運を。


1
ああ、そしてGavinの補遺のあるAICに関するuser11852の回答は、特別なAIC.lmeやその問題に対処するための何かがなく、すべてが私の給与
水準

3

これは間違いなく独特です。最初に考えたとおりのモデルが(別の固定効果構造をしているモデル比較やったときm2m3など)を、それが私たちに最善であるとして意志「変更」。(それはで乗算されます。で、)使用して機能するのは興味深いことで、バグではない可能性があります。それはほとんど「良い習慣」を実施しているようです。y k k X = 0MLREMLykkX=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

これは明らかに2つの間に矛盾があるように見えますが、Gavinが説明したとおりではありません。明白なことを述べるだけです:

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

私が考える方法論の観点からこれが起こるのには十分な理由があります。lmeLME回帰の意味を理解しようとしますがlmer、モデルの比較を行うと、すぐにMLの結果にフォールバックします。私は、この問題に関するバグが存在しないと思いますlmeし、lmer各パッケージの後ろのちょうど別の理論的根拠は。

何がanova()起こったのかについてのより洞察に満ちた説明についてのGavin Simposonのコメントも参照してください(同じことが実際にはで起こりますAIC


「MLを使用する必要があります」-しかし、lmerREMLを使用して(モデルの概要を参照)、AICで正常に機能することをどのように説明できますか?したがって、2つの可能性があります。1)エラーメッセージは*機能ではなくバグであり、機能するのlmerはバグです。または2)エラーメッセージはバグであり、機能ではありません。
好奇心が

更新された投稿を参照してください(コードを含める必要がありました)。元の応答を書いているときに私はあなたの有効な点に気づきましたが、私は元々それを除外することを選択したので、私の答えの根拠は厳密に計算ベースです。
usεr11852

3
@Tomas lmer() は、比較を依頼するときにREMLを使用しません。IIRCにはファンシーシュガーが含まれているlmer()ため、個々の近似で分散パラメーターの最良の推定値を得るために、ML近似を比較するだけでモデルを再近似する必要はありませんREMLでした。を見て?lmer、最初のLMEの例をanova(fm1, fm2)呼び出しまで含めて実行します。によって報告された対数尤度とanova()、印刷出力で以前に報告された可能性を確認します。anova()あなたのためのML推定値を得ています。
Gavin Simpson

良い点ギャビン、私lmerは両方を同時に得たことを忘れます(それはPLSを使用するので、一度に1つだけを概算します)。あなたが言ったことをチェックするのを忘れました。
usεr11852

2
@rpierce:報告されたanova() AIC はMLに基づいたものです。報告されたAIC AIC()はREMLに基づくものです。
usεr11852
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.