Как использовать lmer внутри функции
Я пытаюсь написать функцию, которая собирает некоторые вызовы, которые я часто использую в сценариях
Я использую данные сна в пакете lme4 в моих примерах
Вот (упрощенная версия) функция, с которой я начал:
trimModel1 <- function(frm, df) {
require(LMERConvenienceFunctions)
require(lme4)
lm<-lmer(frm,data=df)
lm.trimmed = romr.fnc(lm, df)
df = lm.trimmed$data
# update initial model on trimmed data
lm<-lmer(frm,data=df)
# lm@call$formula<-frm
mcp.fnc(lm)
lm
}
Когда я вызываю эту функцию, как показано ниже:
(fm1<-trimModel1(Reaction ~ Days + (Days|Subject),sleepstudy))
Первые три строки вывода выглядят так:
Linear mixed model fit by REML
Formula: frm
Data: df
Если бы я вызывал команды функции trimModel1 в консоли, первые три строки сводки модели выглядят так:
Linear mixed model fit by REML
Formula: Reaction ~ Days + (Days | Subject)
Data: sleepstudy
Разница в том, что некоторые пакеты, использующие пакет lme4, используют поля формулы и данных. Например, пакет эффектов использует эти поля, и команда, подобная приведенной ниже, не будет работать, когда я использую функцию trimModel1, описанную выше:
library(effects)
plot(allEffects(fm1))
Я оглянулся на дискуссионные группы Stackru и R, чтобы найти решение и увидел, что вы можете изменить поле формулы модели. Если вы раскомментируете lm@call$formula<-frm
строка в функции trimModel1 поле формулы в сводке отображается корректно. К сожалению, когда я запускаю функцию из пакета эффектов, я все равно получаю сообщение об ошибке:
Error in terms.formula(formula, data = data) :
'data' argument is of the wrong type
Это потому, что поле данных по-прежнему неверно.
Другое возможное решение, которое я нашел, - эта функция:
trimModel2 <- function(frm, df) {
require(LMERConvenienceFunctions)
require(lme4)
lm<-do.call("lmer",list(frm,data=df))
lm.trimmed = romr.fnc(lm, df)
df = lm.trimmed$data
# update initial model on trimmed data
lm<-do.call("lmer",list(frm,data=df))
mcp.fnc(lm)
lm
}
Когда я сейчас набираю следующие команды в консоли, я не получаю ошибок:
(fm2<-trimModel2(Reaction ~ Days + (Days|Subject),sleepstudy))
plot(allEffects(fm2))
Функция allEffects работает, но теперь проблема заключается в том, что сводка модели fm2 отображает необработанные данные исследования сна. Это не является большой проблемой для данных о состоянии сна, но с очень большими наборами данных иногда происходит сбой Rstudio при отображении модели.
Кто-нибудь знает, как заставить одну (или обе) из этих функций работать правильно?
Я думаю, что мне нужно изменить поле данных fm1@call$, но я не знаю как.
1 ответ
Сделай это так:
trimModel1 <- function(frm, df) {
require(LMERConvenienceFunctions)
require(lme4)
dfname <- as.name(deparse(substitute(df)))
lm<-lmer(frm,data=df)
lm.trimmed = romr.fnc(lm, df)
df = lm.trimmed$data
# update initial model on trimmed data
lm<-lmer(frm,data=df)
lm@call$formula <- frm
lm@call$data <- dfname
mcp.fnc(lm)
lm
}
Это "метод замещения-замены" для получения имени объекта от самого объекта.