我有很多formula
或Formula
类的公式y ~ a*b
,其中a
和b
是因素。
我需要编写一个函数,该函数采用这样的公式并返回一个公式,其中交互中的所有项都是“拼写出来的”。这是一个例子:
fac1 <- factor(c('a', 'a', 'b', 'b'))
fac2 <- factor(c('c', 'd', 'c', 'd'))
BigFormula(formula(x ~ fac1*fac2))
其中BigFormula
返回formula(x ~ a + b + c + d + a:c + a:d + b:c + b:d)
。
有一种简单的方法吗?
(上下文:我正在运行anova(mod1, mod2)
形式的许多命令,其中mod2
嵌套在mod1
中,两个模型的右侧都包含fac1*fac2
之类的术语1}}。这些命令的要点是计算F统计量。问题是anova
将fac1*fac2
视为三个变量,即使它通常代表三个以上的变量。(在上面的代码中)例如,fac1*fac2
代表八个变量。)因此,anova
低估了嵌套模型中的限制数量,并高估了我的自由度。)
答案 0 :(得分:7)
查看formula
的帮助,可能存在适合您的现有内容。
例如,公式y ~ (a + b + c + d)^2
将为您提供所有主要效果和所有双向互动,而公式y ~ (a + b) * (c + d)
会给出您在上面显示的扩展。
您还可以减去术语,因此y ~ a*b*c - a:b:c
不会包含3向互动。
答案 1 :(得分:4)
以下解决方案如何?我使用了一个复杂交互的更极端的例子。
f = formula(y ~ a * b * c * d * e)
为了说明交互条款,我们从terms.formula()返回的值中提取条款:
terms = attr(terms.formula(f), "term.labels")
产生:
> terms
[1] "a" "b" "c" "d" "e" "a:b" "a:c"
[8] "b:c" "a:d" "b:d" "c:d" "a:e" "b:e" "c:e"
[15] "d:e" "a:b:c" "a:b:d" "a:c:d" "b:c:d" "a:b:e" "a:c:e"
[22] "b:c:e" "a:d:e" "b:d:e" "c:d:e" "a:b:c:d" "a:b:c:e" "a:b:d:e"
[29] "a:c:d:e" "b:c:d:e" "a:b:c:d:e"
然后我们可以将它转换回公式:
f = as.formula(sprintf("y ~ %s", paste(terms, collapse="+")))
> f
y ~ a + b + c + d + e + a:b + a:c + b:c + a:d + b:d + c:d + a:e +
b:e + c:e + d:e + a:b:c + a:b:d + a:c:d + b:c:d + a:b:e +
a:c:e + b:c:e + a:d:e + b:d:e + c:d:e + a:b:c:d + a:b:c:e +
a:b:d:e + a:c:d:e + b:c:d:e + a:b:c:d:e
答案 2 :(得分:3)
我还没有学习公式的所有技巧,但是如果我想要明确的公式,我会倾向于使用公开的粘贴:
# the factors
fac1 <- factor(c('a', 'a', 'b', 'b'))
fac2 <- factor(c('c', 'd', 'c', 'd'))
# create all the interaction terms
out <- sapply(levels(fac1), function(ii) {
sapply(levels(fac2), function(jj) {
paste0(ii,":",jj)
})
})
# along with the single terms
terms <- c(levels(fac1), levels(fac2), as.vector(out))
# and create the rhs of the formula
rhs <- paste0(terms, collapse=" + ")
# finally add the lhs
f <- paste0("x ~ ", rhs)
我们最终得到:
> f
[1] "x ~ a + b + c + d + a:c + a:d + b:c + b:d"
答案 3 :(得分:0)
我们遇到了类似的问题,但有点容易 - 在公式中我们得到了50个变量,我们不得不经常更改它们;我们的解决方案是在R脚本中将它们循环发送到外部文件制作实际公式然后简单读取txt文件并粘贴它;据我所知,它可以在嵌套循环中完成,以制作更多的公式,然后逐行读回文件; 总而言之,使用R脚本和bash
总是好的