10

我有许多(类formulaFormula)形式的公式y ~ a*b,其中ab是因素。

我需要编写一个函数,该函数采用这样的公式并返回一个公式,其中包含交互中的所有术语“拼写出来”。这是一个例子:

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,并且两个模型的右侧都包含类似的术语。这些命令的重点是计算 F 统计量。问题fac1*fac2在于anovafac1*fac2变量,尽管它通常代表三个以上的变量。(例如,在上面的代码中,fac1*fac2代表八个变量。结果,anova低估了嵌套模型中的限制数量,并且高估了我的自由度。)

4

5 回答 5

10

查看帮助,formula因为可能存在对您有用的东西。

例如,该公式y ~ (a + b + c + d)^2将为您提供所有主要效果和所有 2 路交互,并且该公式y ~ (a + b) * (c + d)给出了您在上面显示的扩展。您还可以减去术语,因此y ~ a*b*c - a:b:c不包括 3 向交互。

于 2012-07-21T20:48:04.517 回答
8

下面的解决方案怎么样。我使用了一个更极端的复杂交互示例。

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
于 2016-07-22T11:44:56.813 回答
4

我还没有学习公式的所有技巧,但如果我想要明确的公式,我会倾向于使用 sapply 和粘贴:

# 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"
于 2012-07-21T21:03:39.673 回答
0

我只是偶然发现了这个解决方案:

  fac1 <- factor(c('a', 'a', 'b', 'b'))
  fac2 <- factor(c('c', 'd', 'c', 'd'))
  update(formula(x ~ fac1*fac2),~.)
于 2019-03-13T04:46:38.693 回答
-1

我们遇到了类似的问题,但更容易一些——在公式中我们得到了大约 50 个变量,我们必须经常更改它们;我们的解决方案是在 R 脚本中将它们循环发送到外部文件,制作实际公式,然后简单地读取该 txt 文件并粘贴它;据我记得,它可以在嵌套循环中完成,以制作更多公式,然后逐行读回文件;总而言之,同时使用 R 脚本和 bash 总是好的

于 2012-07-21T20:09:41.347 回答