首页 文章

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

提问于
浏览
0

我正在尝试在 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 回答

  • 1

    总的来说,我不值得 . 假设你现在知道自己在做什么,并且有充分的理由这样做,接下来要知道的是 by far 构建具有任意预测变量的模型拟合公式的最简单方法是将预测变量作为字符传递矢量并将它们粘贴在一起 . 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 ),那么事情会变得更加困难(在我尝试编写代码之前,我会问你是否想要出于审美原因这样做或者是否有更强烈的要求) .

相关问题