Alex Rivera | Logout

expanding factor interactions within a formula

Asked 2012-07-21T19:50:18.373
11

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.)

r
Edit
Report

1 Answer

4

I still have yet to learn all the tricks of formula, but if I want explicit formulas I'll tend to use sapply along with pasting:

# 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)

We end up with:

> f
[1] "x ~ a + b + c + d + a:c + a:d + b:c + b:d"
answered 2012-07-21T21:03:39.673

Your Answer