У меня есть такие модели:
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
Как видите, в обоих случаях я использую один и тот же набор данных. Я нашел два лекарства, но я не считаю их удовлетворительными:
- Добавление
method = "ML"
в вызов lme () - не уверен, стоит ли менять метод. - Использование
lmer()
вместо. Удивительно, но это работает, несмотря на то, что lmer () использует метод REML. Однако мне не нравится это решение, потому чтоlmer()
оно не показывает p-значения для коэффициентов -lme()
вместо этого я предпочитаю использовать более старые .
У вас есть идея, если это ошибка или нет, и как мы можем обойти это?
источник
m2
m3
REML
method="ML"
Сказав это, давайте посмотрим под капотом:
где в вашем случае вы можете увидеть, что:
и, очевидно
logLik
, делает что-то (может быть?) неожиданное ...? нет, не очень, если вы посмотрите на документациюlogLik
,?logLik
вы увидите это явно указано:что возвращает нас к исходной точке, которую вы должны использовать
ML
.Чтобы использовать общее высказывание в CS: «Это не ошибка; это (реальная) особенность!»
РЕДАКТИРОВАТЬ : (просто чтобы ответить на ваш комментарий :) Предположим, вы подходите другой модели, используя
lmer
это время:и вы делаете следующее:
Что кажется явным несоответствием между ними, но на самом деле это не так, как объяснил Гэвин. Просто чтобы заявить очевидное:
Есть веская причина, почему это происходит с точки зрения методологии, я думаю.
lme
действительно пытается понять регрессию LME для вас, в то время какlmer
при сравнении моделей она сразу же возвращается к результатам ML. Я думаю, что нет никаких ошибок в этом вопросеlme
иlmer
просто разные причины для каждого пакета.См. Также комментарий Гэвина Симпосона о более глубоком объяснении того, что
anova()
происходило (практически то же самое происходит сAIC
)источник
lmer
используется REML (см. описание модели) и он отлично работает в AIC? Таким образом, есть две возможности: 1) сообщение об ошибке * является функцией , а не ошибкой, и тот факт, что оно работает,lmer
является ошибкой. Или 2) сообщение об ошибке является ошибкой , а не функцией.lmer()
не использует REML, когда вы просите его сравнить. Во IIRC они включили немного необычного сахара,lmer()
поэтому вам не нужно было переоснащать модель,ML
просто сравнивая совпадения, когда вы хотите, чтобыREML
отдельные совпадения получали наилучшие оценки параметров отклонения. Посмотрите?lmer
, запустите первый пример LME вплоть доanova(fm1, fm2)
вызова. Посмотрите на вероятности регистрации, о которых сообщают,anova()
и те, о которых сообщалось ранее в печатной продукции.anova()
Оценки становится ML для вас.lmer
получил оба одновременно (он использует PLS, поэтому он оценивает только один за раз). Я забыл проверить, что вы упомянули.anova()
является тем, основанным на ML. Только что сообщенный AICAIC()
основан на REML.