说我有一个Formula
的列表:
library(Formula)
models <- list(y ~ x1, y ~ x2, y ~ x3)
models <- lapply(models, as.Formula)
并说我想将它们更新为y ~ 1 | x1 | 1
,y ~ 1 | x2 | 1
和y ~ 1 | x3 | 1
(例如,使用mnlogit
)。如果我将update
与lapply
一起使用,我可以将| 1
添加到结尾:
lapply(models, update, . ~ . | 1) # Works as expected
# [[1]]
# y ~ x1 | 1
#
# [[2]]
# y ~ x2 | 1
#
# [[3]]
# y ~ x3 | 1
但我无法将1 |
添加到开头:
lapply(models, update, . ~ 1 | . | 1) # Fails -- why is the dot not replaced?
# [[1]]
# y ~ 1 | . | 1
#
# [[2]]
# y ~ 1 | . | 1
#
# [[3]]
# y ~ 1 | . | 1
有谁知道这是为什么,或者如何解决它(当然,除了逐个修复每个模型之外)?
答案 0 :(得分:3)
至于主要问题:如何设置公式??
我建议首先添加两个额外的拦截部分,然后重新订购右侧:
f <- y ~ x2
ff <- update(Formula(f), . ~ . | 1 | 1)
formula(ff, rhs = c(2, 1, 3))
## y ~ 1 | x2 | 1
然后关注:为什么更新只适用于。在第一部分?
您希望此代码返回相同的结果:
f <- y ~ x2
update(Formula(f), . ~ 1 | . | 1)
## y ~ 1 | . | 1
但显然它没有。原因很简单:update()
方法遍历所有左手和右手部分。在这里,第一个右侧部分x2
会更新1
。第二个右侧部分为空(f
只有一个右侧),因此更新为.
。类似地,对于第三部分。
如果原始公式中只有一个右侧,则可以实施您的方法。但有几个部分,这将是一个烂摊子。如,
update(Formula(y ~ x1 | x2 | x3), . ~ . + z1 | 1 | . - x3)
## y ~ x1 + z1 | 1 | 1
答案 1 :(得分:1)
当我遇到一个简单的问题时,我个人总是利用字符串。这是在基础R:
htmlTable(..., css.cell = "padding-left: .5em; padding-right: .2em;")
输出是:
lapply(models, function(x) {
as.formula(paste( 'y ~ 1 | ', labels(terms(x)) , '| 1')))
}
所有这些都是您需要的公式。
如果[[1]]
y ~ 1 | x1 | 1
<environment: 0x000000000a475128>
[[2]]
y ~ 1 | x2 | 1
<environment: 0x00000000003ea848>
[[3]]
y ~ 1 | x3 | 1
<environment: 0x000000000a94e100>
接受公式参数中的字符串(即将任何公式字符串转换为内部公式类型,如mnlogit
那么),那么您甚至不需要lm
位以上as.formula
。