在公式中扩展因子相互作用

时间:2012-07-21 19:50:18

标签: r

我有很多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中,两个模型的右侧都包含fac1*fac2之类的术语1}}。这些命令的要点是计算F统计量。问题是anovafac1*fac2视为三个变量,即使它通常代表三个以上的变量。(在上面的代码中)例如,fac1*fac2代表八个变量。)因此,anova低估了嵌套模型中的限制数量,并高估了我的自由度。)

4 个答案:

答案 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

总是好的