expanding factor interactions within a formula
r
Solution
How about the following solution. I use a more extreme example of a complex interaction.
`f = formula(y ~ a * b * c * d * e)`
To spell out the interaction terms, we extract the terms from the value returned by terms.formula():
`terms = attr(terms.formula(f), "term.labels")`
which yields:
> 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"
And then we can convert it back to a formula:
`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
Problem
I have many formulas (of class `formula` or `Formula`) of the form `y ~ a*b`, where `a` and `b` are factors. I need to write a function that takes such a formula and returns a formula with all of the terms in the interaction "spelled out." Here is an example: ``` fac1 <- factor(c('a', 'a', 'b', 'b')) fac2 <- factor(c('c', 'd', 'c', 'd')) BigFormula(formula(x ~ fac1*fac2)) ``` where `BigFormula` returns `formula(x ~ a + b + c + d + a:c + a:d + b:c + b:d)`. Is there a simple way to do this? (The context: I am running many commands of the form `anova(mod1, mod2)`, where `mod2` nests in `mod1`, and where the right-hand side of both models contains terms like `fac1*fac2`. The point of these commands is to calculate F-statistics. The problem is that `anova` treats `fac1*fac2` as three variables, even though it usually represents more than three variables. (In the code above, for example, `fac1*fac2` represents eight variables.) As a result, `anova` underestimates the number of restrictions in the nested model, and it overestimates my degrees of freedom.)