1

在 RI 中,经常需要循环遍历lm类型对象列表(例如glm, lme, clm)并使用新公式或其他参数更新它们。我这样做lapply()是因为它以相同的列表格式返回它们,名称完整,所以我可以继续这个过程。

有时我传递的论点是动态的,并且因每个模型而异。例如,

lapply(names(mylist) function(ii) {
  jj<-myotherlist[[ii]]; 
  update(mylist[[ii]],.~.+jj)
}) 

wherejj是添加到列表中每个模型的术语,并在每个模型的基础上在其他列表中定义。

假设特定模型的预期结果公式应该是y~a+b+c. 取而代之的是,结果对象内的调用lm对象包含y~a+b+jj. 因此,在某些情况下,生成的lm对象行为正常,但每当需要评估公式时,它就会出错,因为jj它早已不复存在。是否有一种推荐的方法可以在将对象update()写入其输出时强制扩展其参数中的所有变量,call或者强制使用该call对象的函数在对象的内部上下文而不是全局上下文中评估调用lm,以便在至少我可以将新变量填充到样式对象通常包含的model对象中吗datalm

而且,如果使用动态变量更新的部分数据参数怎么办?例如:

data=cbind(sharedByAllModels,y=kk)

... wherekk是当前模型所独有的(可能是 sharedByAllModels 数据框中某些列的某种聚合)。

4

2 回答 2

3

回答您的主要问题,您可以使用bquote()来控制更新公式对象的哪些部分(即 中的那些部分.())得到评估。

mylist <- list(y ~ a + b, y ~ A + B)
myotherlist <- list("c", "C")

lapply(1:2, function(ii) {
    jj <- as.name(myotherlist[[ii]])
    update(mylist[[ii]], bquote(. ~ . + .(jj)))})
# [[1]]
# y ~ a + b + c
# 
# [[2]]
# y ~ A + B + C

或者,substitute()以类似的方式使用:

lapply(1:2, function(ii) {
      jj <- as.name(myotherlist[[ii]])
      update(mylist[[ii]], substitute(. ~ . + jj))
      })
# [[1]]
# y ~ a + b + c
# 
# [[2]]
# y ~ A + B + C
于 2012-07-30T18:16:45.620 回答
1

Use do.call,它在执行前评估它的参数。请参阅使用粘贴公式创建的 lme 拟合上的 anova 测试失败

于 2012-07-30T18:13:56.847 回答