Будут ли переменные случайного эффекта автоматически приниматься как факторы в lmer (или lme) в R?
Я понимаю, что иметь непрерывную или числовую переменную в качестве случайного эффекта в модели смешанных эффектов не имеет особого смысла (например, см. Здесь).
Но что мне интересно, если lme4::lmer
или же nlme::lme
в R целенаправленно мешают вам сделать это...
В частности, я спрашиваю: если я поставлю lmer
(или же lme
) любая нефакторная (не категориальная) переменная как случайный эффект, автоматически ли функция рассматривает ее как фактор?
Вставка factor()
непосредственно в лмер (как это обычно делается при использовании lm
) выдает следующую ошибку:
lmer(y ~ z + (1|factor(x)), data = dat)
Error: couldn't evaluate grouping factor factor(x) within model frame: try adding grouping factor to data frame explicitly if possible
Несмотря на то, что в приведенной выше ошибке упоминается добавление фактора группировки непосредственно в данные, в нем не указано, должен ли упомянутый фактор группировки быть фактором (или это, возможно, подразумевается в слове выбора)?
Я понимаю, что довольно просто просто создать новую переменную факторного класса непосредственно из моих данных, но мне просто любопытно, действительно ли это необходимо при использовании lmer
(или же lme
).
1 ответ
Это не имеет значения.
library(lme4)
sl <- sleepstudy
sl$Subject <- as.numeric(levels(sl$Subject))[sl$Subject]
## subject as factor
m1 <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
## subject as numeric
m2 <- update(m1, data = sl)
all.equal(VarCorr(m1), VarCorr(m2))
# TRUE
Проверяя остальную часть объекта, вызов отличается (что имеет смысл, я назвал фрейм данных чем-то другим), а фрейм отличается (из-за разницы между числом и фактором в теме). Все остальное идентично.
all.equal(m1, m2)
#[1] "Attributes: < Component “call”: target, current do not match when deparsed >"
#[2] "Attributes: < Component “frame”: Component “Subject”: 'current' is not a factor >"
Факторы группирования подвержены factorize()
в mkBlist()
, который называется внутри mkReTrms()
, которая создает матрицу модели для случайных эффектов. factorize()
это помощник, который в конечном итоге вызывает factor(x)
в правой части выражения в формуле случайных эффектов (при условии, что это уже фактор и т. д.)