StatsModels.jl icon indicating copy to clipboard operation
StatsModels.jl copied to clipboard

Remove term from formula

Open kliegl opened this issue 1 year ago • 1 comments

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.

kliegl avatar Oct 15 '24 07:10 kliegl

The problem applies only to categorical variables in the formula; excluding terms from the formula works as expected when categorical variables are replaced with (sets of) indicator variables. No need for the loop. I leave the issue open for now because the subtraction method would be nice to have anyway. Feel free to close the issue.

kliegl avatar Oct 15 '24 11:10 kliegl