モデルの適合度を比較するために、Rで尤度比検定を行う方法を探していました。私が最初にそれを自分でコード化され、デフォルトの両方見つかったanova()
機能ともlrtest()
にlmtest
パッケージ。ただし、チェックするとanova()
、「test」パラメータが「LRT」に設定されていても、常に他の2つの値とはわずかに異なるp値が生成されます。はanova()
、実際にいくつかの微妙に異なるテストを実行する、または私は何かを理解していないのですか?
プラットフォーム:Linux Mint 17で実行されているR 3.2.0 lmtest
バージョン0.9-33で
サンプルコード:
set.seed(1) # Reproducibility
n=1000
y = runif(n, min=-1, max=1)
a = factor(sample(1:5, size=n, replace=T))
b = runif(n)
# Make y dependent on the other two variables
y = y + b * 0.1 + ifelse(a==1, 0.25, 0)
mydata = data.frame(y,a,b)
# Models
base = lm(y ~ a, data=mydata)
full = lm(y ~ a + b, data=mydata)
# Anova
anova(base, full, test="LRT")
# lrtest
library(lmtest)
lrtest(base, full)
# Homebrew log-likelihood test
like.diff = logLik(full) - logLik(base)
df.diff = base$df.residual - full$df.residual
pchisq(as.numeric(like.diff) * 2, df=df.diff, lower.tail=F)
実行すると、anova()
p値が0.6071になり、他の2つは0.60599になります。わずかな違いですが、一貫性があり、浮動小数点数の格納方法が不正確になるには大きすぎます。誰かanova()
が別の答えを出す理由を説明できますか?