如何在函数中使用lmer

如何在函数中使用lmer,r,lme4,R,Lme4,我正在尝试编写一个函数来收集我在脚本中经常使用的一些调用 我在示例中使用了lme4软件包的sleepstudy数据 以下是我开始使用的函数的(简化版本): trimModel1 <- function(frm, df) { require(LMERConvenienceFunctions) require(lme4) lm<-lmer(frm,data=df) lm.trimmed = romr.fnc(lm, df) df = lm.trimmed$data

我正在尝试编写一个函数来收集我在脚本中经常使用的一些调用
我在示例中使用了lme4软件包的sleepstudy数据
以下是我开始使用的函数的(简化版本):

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
}
如果我在控制台中调用了trimModel1函数的命令,那么模型摘要的前三行如下所示:

Linear mixed model fit by REML 
Formula: frm    
Data: df
Linear mixed model fit by REML 
Formula: Reaction ~ Days + (Days | Subject) 
   Data: sleepstudy 
差异是一个问题,因为使用lme4包的多个包使用公式和数据字段。例如,当我使用上面的trimModel1函数时,effects包使用这些字段,下面这样的命令将不起作用:

library(effects)
plot(allEffects(fm1))
我在stackoverflow和R讨论组中查找解决方案,发现可以更改模型的公式字段。如果您取消注释
lm@call$formula这样做:

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
}

trimModel1对于那些搜索数据参数的人:
effects
在数据集具有保留名称时也会抛出此错误(
all
)。
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))
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
}