Skip to content

Remove term from formula #318

Description

@kliegl

In a A x B design, how do I remove one main effect and keep the other and the interaction term (e.g., remove Group main effect in Group (2) x Time (2) when I do not expect a group difference at pretest)?

I can add terms to a formula:

f1 = @formula y ~ 1 + Time  +  (1  |  Subj);  
f1 = f1.lhs ~ (f1.rhs + Term(:Time & :Group) )
m1 = fit(MixedModel, f1, dat; contrasts)

But how can I substract a term? For example, could this be implemented, too?

f2 = @formula y ~ 1 + Time + Group + Time & Group +  (1  | Subj);  
f2 = f2.lhs ~ (f2.rhs - Term(:Group) )

ERROR: MethodError: no method matching -(::Tuple{ConstantTerm{Int64}, Term, InteractionTerm{Tuple{…}}, FunctionTerm{typeof(|), Vector{…}}}, ::Term)
The function - exists, but no method is defined for this combination of argument types.

One workaround is to extract terms from a fitted model matrix and then assemble the needed ones to a new formula:

f3 = @formula y ~ 1 + Group*Time  +  (1  |  Subj);  
m3 = fit(MixedModel, f3, dat; contrasts)
mm3 = modelmatrix(m3)
dat.T    = mm3[:, 3];
dat.TxG  = mm3[:, 4];
f4 = @formula y ~ 1 + T  +  TxG + (1  | Subj); 
m4 = fit(MixedModel, f4, dat; contrasts)

However, this becomes very cumbersome with many terms nested under the first one. Or is there a simple loop to assemble a formula selectively from the model matrix? Adding a subtraction method would be very helpful. Thank you.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions