Saya punya model seperti ini:
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)
Sekarang saya mencoba menilai apakah efek acak harus ada dalam model. Jadi saya membandingkan model menggunakan AIC atau anova, dan saya mendapatkan kesalahan berikut:
> 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
Seperti yang Anda lihat, dalam kedua kasus saya menggunakan dataset yang sama. Saya telah menemukan dua solusi, tetapi saya tidak menganggapnya memuaskan:
- Menambah
method = "ML"
panggilan lme () - tidak yakin apakah ada baiknya mengubah metode. - Menggunakan
lmer()
sebagai gantinya. Anehnya, ini bekerja, meskipun faktanya lmer () menggunakan metode REML. Namun saya tidak suka solusi ini karenalmer()
tidak menunjukkan nilai p untuk koefisien - saya lebih suka menggunakan yang lebih tualme()
.
Apakah Anda tahu apakah ini bug atau tidak dan bagaimana kita bisa mengatasinya?
sumber
Ini aneh tentunya. Sebagai pemikiran pertama: ketika melakukan perbandingan model di mana model memiliki struktur efek tetap yang berbeda (M.L. y k k X= 0
m2
danm3
misalnya), yang terbaik bagi kami adalah karena akan "berubah" . (Ini akan melipatgandakannya dengan , di mana ) Sangat menarik bahwa ia bekerja menggunakan yang membuat saya percaya itu mungkin bukan bug. Sepertinya hampir seperti menegakkan "praktik yang baik".y k k X = 0REML
method="ML"
Karena itu, mari kita lihat di bawah tenda:
di mana dalam kasus Anda, Anda dapat melihat bahwa:
dan jelas
logLik
melakukan sesuatu (mungkin?) tak terduga ...? tidak ada, tidak benar-benar, jika Anda melihat dokumentasilogLik
,?logLik
, Anda akan melihatnya secara eksplisit dinyatakan:yang membawa kami kembali ke titik awal kami, Anda harus menggunakan
ML
.Untuk menggunakan ungkapan umum dalam CS: "Ini bukan bug; ini fitur (nyata)!"
EDIT : (Hanya untuk menjawab komentar Anda :) Asumsikan Anda cocok dengan model lain menggunakan
lmer
waktu ini:dan Anda melakukan hal berikut:
Yang tampak seperti perbedaan yang jelas antara keduanya tetapi sebenarnya tidak seperti yang dijelaskan Gavin. Hanya untuk menyatakan yang sudah jelas:
Ada alasan bagus mengapa ini terjadi dalam hal metodologi saya pikir.
lme
tidak mencoba untuk memahami regresi LME untuk Andalmer
saat melakukan perbandingan model, itu kembali segera ke hasil ML itu. Saya pikir tidak ada bug dalam hal inilme
danlmer
hanya alasan yang berbeda di balik setiap paket.Lihat juga komentar Gavin Simposon tentang penjelasan yang lebih mendalam tentang apa yang terjadi
anova()
(Hal yang sama terjadi secara praktis denganAIC
)sumber
lmer
menggunakan REML (lihat ringkasan model) dan berfungsi dengan baik di AIC? Jadi ada dua kemungkinan: 1) pesan kesalahan adalah * fitur , bukan bug, dan fakta bahwa ia berfungsilmer
adalah bug. Atau 2) pesan kesalahan adalah bug , bukan fitur.lmer()
tidak menggunakan REML saat Anda bertanya apakah ia melakukan perbandingan. IIRC mereka memasukkan beberapa gula mewahlmer()
sehingga Anda tidak perlu mengganti modelML
hanya dengan membandingkan cocok ketika Anda inginREML
pada masing-masing cocok untuk mendapatkan perkiraan terbaik dari parameter varians. Lihat?lmer
, jalankan contoh LME pertama hingga dan termasukanova(fm1, fm2)
panggilan. Lihatlah kemungkinan log yang dilaporkan olehanova()
dan yang dilaporkan sebelumnya dalam hasil cetak. Theanova()
semakin ML memperkirakan untuk Anda.lmer
keduanya mendapat pada saat yang sama (menggunakan PLS sehingga hanya memperkirakan satu pada saat itu). Saya lupa memeriksa apa yang Anda sebutkan.anova()
adalah yang didasarkan pada ML. AIC yang dilaporkan adilAIC()
adalah yang didasarkan pada REML.