[R-sig-ME] Post-hoc analysis for the effect of a lower-order interaction

Lenth, Russell V ru@@e||-|enth @end|ng |rom u|ow@@edu
Fri Feb 4 21:34:08 CET 2022

Please refer to the package's vignette on interactions:

The simple way is to use the 'interaction' argument in 'contrast()' to generate interaction contrasts. For example:

    > library(emmens)

    > noise.lm <- lm(noise/10 ~ size * type * side, data = auto.noise)
    > EMM <- emmeans(noise.lm, ~ size*side*type)

    > contrast(EMM, interaction = "pairwise")
     size_pairwise side_pairwise type_pairwise estimate    SE df t.ratio p.value
     S - M         L - R         Std - Octel       0.50 0.624 24   0.802  0.4305
     S - L         L - R         Std - Octel       2.67 0.624 24   4.276  0.0003
     M - L         L - R         Std - Octel       2.17 0.624 24   3.474  0.0020

It is possible to do this manually by using 'contrast()' (or 'pairs()' method for pairwise comparisons) to create contrasts for one factor, calling 'contrast()' on the result to obtain contrasts of contrasts, etc. Here is the same example (with a multiplicity adjustment added) done manually:

> PR1 = pairs(EMM, by = c("side", "type"), name = "size.diff")
> PR2 = pairs(PR1, by = c("size.diff", "type"), name = "side.diff")
> PR3 = pairs(PR2, by = c("size.diff", "side.diff"), name = "type.diff")

> test(PR3, by = NULL, adjust = "sidak")
 type.diff   size.diff side.diff estimate    SE df t.ratio p.value
 Std - Octel S - M     L - R         0.50 0.624 24   0.802  0.8153
 Std - Octel S - L     L - R         2.67 0.624 24   4.276  0.0008
 Std - Octel M - L     L - R         2.17 0.624 24   3.474  0.0059

P value adjustment: sidak method for 3 tests

Russ Lenth

> Hi everyone,
> I recently got stuck in the post-hoc analysis for my model's interactions. 
>Let's say the interaction in the model is A:B:C, with the three variables being all two-level factors. I want to check if the effect of A:B varies across the two levels of C (getting a t-test between C's two levels, as what we get from the pairs() function for getting the difference of marginal means/slopes in a 2-way interaction).
> I've tried both emmeans and emtrends functions but failed. It always ended up expanding the higher-order interaction of all the three variables into basic cell contrasts (i.e. on specific levels of A and B), but not provided the overall contrast of how the lower-order interaction (A:B) performs in general on the two different levels of C. I also tried the joint_test function, but there is only the output of coefficients but not a between-level comparison on C. I am looking for the estimations of A:B on the two levels of C, and a t-test between these two estimations at the same time. Is this possible only using the emmeans package? Can I have some hints from you guys?

More information about the R-sig-mixed-models mailing list