【问题标题】:wrapper for fitting mixed-effect model with lmer()使用 lmer() 拟合混合效应模型的包装器
【发布时间】:2017-07-29 19:02:30
【问题描述】:

我正在尝试在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) 
}

【问题讨论】:

  • ?reformulate ...`

标签: r wrapper lme4 mixed-models


【解决方案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),事情会变得相当困难(在我努力尝试编码之前,我会问你是否想这样做出于审美原因或是否有更强的要求)。

【讨论】:

  • 公式很简单。当你想通过 weightsoffset 时,它会变得很荒谬。
  • 谢谢,这很有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 2020-06-10
相关资源
最近更新 更多