如何在函数内部使用lmer

时间:2013-01-11 09:59:45

标签: 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
  # 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))

我在stackoverflow和R讨论组中查看了解决方案,并看到您可以更改模型的公式字段。如果取消注释trimModel1函数中的lm@call$formula<-frm行,则会正确显示摘要中的公式字段。不幸的是,当我从效果包中运行一个函数时,我仍然会收到错误:

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模型的摘要显示了原始的sleepstudy数据。这对于睡眠研究数据来说不是一个大问题,但是有很大的数据集,有时Rstudio在显示模型时会崩溃。
有谁知道如何使这些功能中的一个(或两个)正常工作? 我想我必须改变fm1 @ call $ data字段,但我不知道如何。

1 个答案:

答案 0 :(得分:4)

这样做:

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
}

从对象本身获取对象名称是“解析 - 替代技巧”。