I ran an experiment with treatment
(3 levels: ctrl, A, B) as a between-subject factor and environment
(4 levels: 1, 2, 3, 4) as a within subject factor. I have grounds to believe there should be an interaction between these two.
To analyze the data, I am using lmer
class in R:
> m1 <- lmer(Y ~ environment * treatment + (1 | subjID), data = d)
> anova(m1)
Type III Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
environment 7.6606 2.55353 3 360 51.2823 < 2.2e-16 ***
treatment 0.9647 0.48237 2 120 9.6874 0.0001258 ***
environment:treatment 0.7344 0.12240 6 360 2.4582 0.0241984 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
So, indeed, there seems to be a significant interaction. Moreover, using emmeans
it is easy to visualize this interaction is triggered mainly by the different effect of treatment in environment 4:
> emmip(m1, environment ~ treatment)
I would like to do analysis of contrasts to show this statistically. I know how to do pairwise comparisons within each level of environment
, which is easy:
> emmeans(m1, list(pairwise ~ treatment | environment), adjust = "holm",
lmer.df = "satterthwaite")
$`emmeans of treatment | environment`
environment = 1:
treatment emmean SE df lower.CL upper.CL
ctrl 0.4180488 0.03909552 426.06 0.34120468 0.4948929
A 0.5754762 0.03862729 426.06 0.49955241 0.6514000
B 0.3735000 0.03958120 426.06 0.29570128 0.4512987
environment = 2:
treatment emmean SE df lower.CL upper.CL
ctrl 0.3526829 0.03909552 426.06 0.27583882 0.4295270
A 0.4866667 0.03862729 426.06 0.41074289 0.5625904
B 0.3240000 0.03958120 426.06 0.24620128 0.4017987
environment = 3:
treatment emmean SE df lower.CL upper.CL
ctrl 0.3078049 0.03909552 426.06 0.23096077 0.3846490
A 0.4069048 0.03862729 426.06 0.33098098 0.4828285
B 0.1745000 0.03958120 426.06 0.09670128 0.2522987
environment = 4:
treatment emmean SE df lower.CL upper.CL
ctrl 0.6570732 0.03909552 426.06 0.58022907 0.7339173
A 0.6352381 0.03862729 426.06 0.55931431 0.7111619
B 0.6185000 0.03958120 426.06 0.54070128 0.6962987
Degrees-of-freedom method: satterthwaite
Confidence level used: 0.95
$`pairwise differences of treatment | environment`
environment = 1:
contrast estimate SE df t.ratio p.value
ctrl - A -0.15742741 0.05495933 426.06 -2.864 0.0088
ctrl - B 0.04454878 0.05563390 426.06 0.801 0.4237
A - B 0.20197619 0.05530587 426.06 3.652 0.0009
environment = 2:
contrast estimate SE df t.ratio p.value
ctrl - A -0.13398374 0.05495933 426.06 -2.438 0.0304
ctrl - B 0.02868293 0.05563390 426.06 0.516 0.6064
A - B 0.16266667 0.05530587 426.06 2.941 0.0103
environment = 3:
contrast estimate SE df t.ratio p.value
ctrl - A -0.09909988 0.05495933 426.06 -1.803 0.0721
ctrl - B 0.13330488 0.05563390 426.06 2.396 0.0340
A - B 0.23240476 0.05530587 426.06 4.202 0.0001
environment = 4:
contrast estimate SE df t.ratio p.value
ctrl - A 0.02183508 0.05495933 426.06 0.397 1.0000
ctrl - B 0.03857317 0.05563390 426.06 0.693 1.0000
A - B 0.01673810 0.05530587 426.06 0.303 1.0000
P value adjustment: holm method for 3 tests
but I would like first to say something like "the effect of treatment on Y is different in environment 4 than in the other environments" (basically to test the clear pattern in the figure above). So, what I am struggling with is how to test the general effect of treatment
within each level of environment
and how to test if these effects differ across environments.
Moreover, I would then like to test if the "general" interaction is a result of a different effect of treatment A in different environments or the result of a different effect of treatment B in different environments (or both). I can do this easily if I run new models with just subsets of the data but I bet there should be an easy way to all this with the original model.
Best Answer
I'd suggest looking at interaction contrasts; something like this:
This will display, and then compare, the treatment effects (means minus grand means) between environments. (From the graph, the
treatment
effects are all small forenvironment
4, whereas for the other three, the treatment effects are negative for treatmentsctrl
andB
and positive for treatmentA
.)You might want something besides
"pairwise"
so as to have fewer comparisons to look at; e.g.,"consec"
will restrict to just consecutive levels ofenvironment
.Addendum
Here's a more compact approach: First get the effects, then construct a contrast comparing the average of the first 3 environments with the last:
At this point we have two "factors" --
environment
andtrt.eff
; the latter has levelsctrl effect
,A effect
, andB effect
. Now let's contrast these:These are manually constructed interaction contrasts -- contrasts of contrasts. You could just display
icons
as the three differentby
groups with one contrast each. But if summarized as shown withby = NULL
, we combine them into one family and apply a multivariate t multiplicity adjustment for the family of three tests.