R有一个方便操作公式的工具,update.formula()
。当你想得到类似“包含以前的公式中的所有术语的公式,除了x
”之类的东西时,这很好地起作用。从公式中删除偏移项
f1 <- z ~ a + b + c
(f2 <- update.formula(f1, . ~ . - c))
## z ~ a + b
然而,这似乎并没有与偏移项工作:
f3 <- z ~ a + offset(b)
update(f3, . ~ . - offset(b))
## z ~ a + offset(b)
我就挖下来,terms.formula
,其中?update.formula
引用:代
[后,...]然后通过'terms.formula(simplify = TRUE)'将结果简化为。
terms.formula(z ~ a + offset(b) - offset(b), simplify=TRUE)
## z ~ a + offset(b)
(即,这似乎并没有删除offset(b)
...)
我知道我可以通过使用deparse()
和文本处理砍了一个解决方案,或处理的公式递归地删除术语我不想要的,但这些解决方案是丑陋的和/或恼人的实现。要么启示为为什么这不起作用,或合理紧凑的解决方案,将是伟大的...
多一点挖'terms.formula'表明它**明确地保留了偏移项**,尽管这似乎还没有被记录在任何地方...... –
查看'?offset'文档说''可以有多于一个模型公式中的一个偏移量,但是 - 是n不支持偏移项(和等于+)。“'。这可能是你的'offset()'术语没有简化的原因吗? –
不是最迷人的,但你可以尝试添加一个'offset(-b)'而不是?你的公式不会简化,但我认为效果应该是一样的。如果您尝试使用lm(mpg_ cyl,data = mtcars); lm(mpg_cyl + offset(disp),data = mtcars); lm(mpg_cyl + offset(disp)+ offset(-disp),data = mtcars);'你看第一个和第三个'lm()'是一样的。 –