首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中,如何动态地使用update()?

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

Stack Overflow用户
提问于 2012-07-30 16:20:12
回答 2查看 1.5K关注 0票数 1

在R中,我经常需要循环遍历lm类型对象的列表(例如glmlmeclm),并使用新的公式或其他参数更新它们。我使用lapply()进行此操作,因为它以相同的列表格式返回名称完整的列表格式,因此我可以继续这个过程。

有时,我传递的论点是动态的,并且对每个模型都是不同的。例如,

代码语言:javascript
复制
lapply(names(mylist) function(ii) {
  jj<-myotherlist[[ii]]; 
  update(mylist[[ii]],.~.+jj)
}) 

其中,jj是一个在列表中的每个模型中添加的术语,并且是在其他列表中根据每个模型定义的。

假设特定模型的预期结果公式是y~a+b+c。相反,结果lm对象中的call对象包含y~a+b+jj。因此,在某些情况下,生成的lm对象行为正常,但是每当需要计算公式时,它就会出错,因为jj早就消失了。是否有一种建议的方法可以强制update()在其输出中写入call对象时展开其参数中的所有变量,或者强制使用call对象的函数在lm对象的内部上下文中而不是全局上下文中计算调用,以便至少可以将新变量插入lm样式对象通常包含的modeldata对象中?

如果用动态变量更新的部件是数据参数,那么该怎么办?例如:

代码语言:javascript
复制
data=cbind(sharedByAllModels,y=kk)

...where kk是当前模型所特有的(可能是sharedByAllModels数据some中某些列的某种聚合)。

EN

回答 2

Stack Overflow用户

发布于 2012-07-30 18:16:45

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

代码语言:javascript
复制
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()

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2012-07-30 18:13:56

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11725479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档