在R中,我经常需要循环遍历lm类型对象的列表(例如glm、lme、clm),并使用新的公式或其他参数更新它们。我使用lapply()进行此操作,因为它以相同的列表格式返回名称完整的列表格式,因此我可以继续这个过程。
有时,我传递的论点是动态的,并且对每个模型都是不同的。例如,
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样式对象通常包含的model或data对象中?
如果用动态变量更新的部件是数据参数,那么该怎么办?例如:
data=cbind(sharedByAllModels,y=kk)...where kk是当前模型所特有的(可能是sharedByAllModels数据some中某些列的某种聚合)。
发布于 2012-07-30 18:16:45
在回答您的主要问题时,您可以使用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-30 18:13:56
使用do.call,它在执行之前对其参数进行评估。见anova test fails on lme fits created with pasted formula。
https://stackoverflow.com/questions/11725479
复制相似问题