用于与lmer()拟合混合效应模型的包装器

时间:2017-03-09 00:15:46

标签: r wrapper lme4 mixed-models

我正在尝试在R中创建一个包装函数,它将使用lmer()向混合效应线性回归模型提供一系列参数(响应,预测变量,最大随机效应,参数) 。我遇到的问题是如何使包装函数足够灵活以容纳不同数量的参数。我没有看到如何在没有硬编码参数的情况下每次都能做到这一点(x1,x2,x3等)。当我们考虑包括随机斜率和截距(slope|intercept)的随机效应的最大随机效应时,这尤其复杂。我很感激您的任何建议。

#re.list should be a list of tuples (slope|intercept)
lmer.wrap(df, resp, feature.list, re.list, reml){      
  lmer(resp ~ 
            feature.set[1]
          + feature.set[2]
          + feature.set[3]
          + (re.list[1[1]]|re.list[1[2]])
          + (re.list[2[1]]|re.list[2[2]]),
          REML = reml,
          data = df) 
}

1 个答案:

答案 0 :(得分:1)

总的来说,我认为这不是一个好主意 - 自动化模型构建和最大模型通常会带来比他们更值得的麻烦。假设你现在知道你正在做什么并且有充分的理由这样做,接下来要知道的是到目前为止构建用于任意模型拟合的公式的最简单方法预测变量是将预测变量作为字符向量传递并粘贴在一起。 reformulate()是一个方便的快捷方式,但它与as.formula(paste(terms,collapse="+"))实际上并没有太大区别。

library(lme4)

lmer.wrap <- function(df, resp, feature.list, re.list, reml=FALSE) {
      ## set up random effects
      randstr <- sapply(re.list,
               function(x) sprintf("(%s|%s)",x[1],x[2]))
      form <- reformulate(c(feature.list,randstr),
                       response=resp)
      return(lmer(form,REML = reml,data = df))
}

让我们尝试一下:

lmer.wrap(sleepstudy,resp="Reaction",
            feature.list="Days",
            re.list=list(c("Days","Subject")))
## Linear mixed model fit by maximum likelihood  ['lmerMod']
## Formula: Reaction ~ Days + (Days | Subject)
## etc.

如果你想把这些术语作为R表达式传递(即resp=Reactionfeature.list=Days),那么事情会变得更加困难(在我努力编写代码之前我会这样做)问你是否想以美学原因这样做,或者是否有更强烈的要求。)