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

wrapper for fitting mixed-effect model with lmer()

我正在尝试在 R 中创建一个包装函数,它将使用 [=12] 将一系列参数(响应、预测变量、最大随机效应、参数)提供给混合效应线性回归模型=].我遇到的问题是如何使包装函数足够灵活以适应不同数量的参数。如果每次都将参数硬编码到函数中(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) 
}

总的来说,我认为这不是一个好主意 - 自动化模型构建和最大模型通常会导致比其价值更多的麻烦。假设目前您知道自己在做什么并且有充分的理由这样做,接下来要知道的是到目前为止构建模型拟合公式的最简单方法任意预测变量是将预测变量作为 字符向量 传递并将它们粘贴在一起。 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)传递,事情会变得相当困难(在我尝试编写代码之前,我会询问您是否出于审美原因或是否有更严格的要求这样做)。