2017-03-09 117 views
0

我试图在R中创建一个包装函数,它将一系列参数(响应,预测器,最大随机效果,参数)提供给混合效果线性回归型号使用lmer()。我遇到的问题是如何使包装函数足够灵活以适应不同数量的参数。我没有看到我没有在每次(x1,x2,x3等)都没有对函数进行硬编码的情况下做到这一点。当我们考虑包括随机效应和随机斜率在内的最大随机效应并截取(slope|intercept)时,这是特别复杂的。我会很感激你的任何建议。用于拟合混合效果模型与lmer()的包装

#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) 
} 
+0

请参阅'?reconulate' ...' –

回答

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),事情就变得相当困难(之前我去尝试努力编码它我会问你是否想要这样做的美学原因或是否有一些更强大的要求)。

+0

虽然公式很容易。这是当你想通过'权重'和'抵消',它变得荒谬。 –

+0

'抵消'可以在公式中... –

+0

谢谢,这是非常有益的! –

相关问题