在R中,如何动态使用update()?

时间:2012-07-30 16:20:12

标签: r lm

在RI中,通常需要循环浏览lm类型对象列表(例如glmlmeclm)并使用新公式或其他参数更新它们。我使用lapply()执行此操作,因为它以相同的列表格式返回它们,名称保持不变,因此我可以继续此过程。

有时我传递的参数是动态的,并且每个模型都有所不同。例如,

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

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

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

AND,如果使用动态变量更新的部分是数据参数怎么办? E.g:

kk

...其中{{1}}对于当前模型是唯一的(可能是sharedByAllModels数据帧中某些列的某种聚合)。

2 个答案:

答案 0 :(得分:2)

回答您的主要问题,您可以使用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

答案 1 :(得分:1)

使用do.call,它在执行前评估其参数。请参阅anova test fails on lme fits created with pasted formula