Skip to content

Remove term from formula #318

@kliegl

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.

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