Simple Effects in SPSS

In these notes, we run a factorial ANOVA in SPSS, and follow up with simple effects analyses. The data come from Eyesenck (1974). We compute the simple effects analyses following the statistically significant F of the overall ANOVA. The data in SPSS look as follows (the first 20 observations are shown):

Using Windows

Using Syntax

First, we run the factorial ANOVA:

glm count by condition age.

Note the following regarding the above output:

Corrected Model = SS condition + SS age + SS condition*age
Total SS = SS condition + SS age + SS condition*age + SS error
Corrected Total = SS total - SS Intercept

What Does the Intercept Term Represent?

The intercept term of 13479.210 is computed as the grand total (or "grand sum") of all the count data, squared, then divided by N, the number of observations (which in our case is 100). The sum of the count data is equal to 1161.00. Squaring this term, we get 1347921, then dividing by 100, we get 13479.210. Alternatively, it is also equal to the grand mean of all the data, squared, multiplied by N [(11.61^2)(100)] = 13479.210. To better understand why it is computed this way, recall how the various sums of squares for the factorial ANOVA are computed:

Notice how each effect, whether it be a row, column, or interaction, is equal to the squared effect multiplied by a factor of N (whether it be Kn, Jn, or n). The calculation of the intercept term follows the same logic, only that now, we're not taking a difference between a group mean and a grand mean (as was the case for the rows, column effects), nor are we computing anything like the interaction effect of SS AB cells minus SSA minus SSB. Rather, the intercept term simply reflects the overall mean of the data, squared, multiplied by total N. A statistically significant intercept term simply suggests that the overall mean of the data is not equal to 0. Is that of interest to you? Probably not, which is why the intercept term is rarely interpreted in the above parameterization of the ANOVA. In alternative parameterizations, the intercept term is very meaningful, as we briefly discuss below.

Demonstrating the Meaning of the Intercept Term

We mentioned above that the intercept significance test isn't really of interest to us, since it simply represents the test of the null hypothesis that the grand mean of all the data is equal to 0. However, there is a very practical way to make the intercept term much more meaningful to us, and in some advanced linear models (especially longitudinal work, multilevel models), the intercept plays a very important role.

Consider what would happen if we centered the count data, and re-ran the factorial ANOVA. We would have the following:

COMPUTE count_centered = count - 11.61.
EXECUTE.

The intercept term is now equal to 0.000. This isn't that surprising, since the intercept is still computed as previously, the square of the grand mean multiplied by N. However, what is the mean of centered data? The mean of centered data is always equal to 0. So, the computation is literally (0.000)(100) = 0. The test of significance on the intercept term tests the same thing as it did previously (i.e., before we centered the data), the null hypothesis that the mean of the count data is equal to 0. Not surprisingly, it is 100% not significant (p = 1.000). Again, the intercept term isn't of interest to us here, because by centering, we already knew how it would turn out. Notice that the F ratios for the other terms have not changed simply because we centered.

Where centering data, and interpreting the intercept term really comes into play, is in regression-style models. In traditional ANOVA-style models, centering the dependent variable isn't extremely common.

Visualizing the Interaction

Next, we obtain a plot of the statistically significant condition*age interaction:

/plot = profile(condition*age)

Suppose now that we would like to do a simple effects analysis of age @ each condition. The syntax we need is:

/emmeans = tables (condition*age) compare (age)

where "emmeans" is short for "estimated marginal means," and "compare (age)" asks SPSS to compare age at each condition.

The above results are not very surprising to us. We see that at condition = 1, there is no evidence for a difference between the means of young and old (p = .694). Likewise, at condition = 2, we have no evidence of a difference between ages (p = .582). However, at conditions 3, 4, and 5, we have evidence of a difference between ages young and old (p = .003, .001, .000). Be sure to note the error term used for each contrast, it is equal to 8.026, the error term from the overall ANOVA. Had we used independent error terms, our p-values would be different. Why do we use MS error across all simple effects? It's because MS error is our best guess (estimate) at the population variance under the null hypothesis, and it is based on more degrees of freedom than would be the error terms on more restricted analyses (i.e, the simple effects analyses). However, had we reason to suggest our variances to be unequal, we may have considered not using the pooled MS error term, and would have opted for independent error terms.

Suppose that instead of computing differences of age at each condition, we wanted to compare condition at each age, we would use:

/emmeans = tables (condition*age) compare (condition).

where, as previously, "emmeans" is short for "estimated marginal means." The syntax "compare(condition)" tells SPSS to compare condition at each age. We obtain the following:

The output suggests there to be no effect for condition at each age. To visualize this, let's obtain the interaction plot once more, but this time, instead of having condition on the x-axis, we'll put age:

/PLOT = PROFILE( age*condition )

It always helps to obtain tables of means to ensure the interaction graphs were plotted correctly, and it is what you intended to obtain. The plot of cell means was obtained above to the right [/EMMEANS = TABLES(condition*age)]. All looks good. We can see that the cell means correspond to what we're seeing in the graph.

Again, note the error term used in the simple effects. It is equal to 8.026, that of the overall MS error of the ANOVA. This is how it should be. Because condition has 5 levels, we can ask SPSS to provide a Tukey post-hoc test for the condition factor. It didn't make sense to ask for a post-hoc on age, since age only had 2 levels. The post-hoc for condition looks as follows:

/POSTHOC = condition(TUKEY).

From the table, we can observe which condition means are statistically different from one another. SPSS also provides an additional table to make some sense of the post-hoc test:

Conclusions from the above table are as follows:

Condition means 1 and 2 are different from condition mean 3.
Condition means 1 and 2 are different from condition means 4 and 5.
Condition mean 3 is different from means 4 and 5.

We may have preferred simply to do contrasts on the condition means, which would usually be guided by theoretical expectation before analyzing the data. Suppose we had theoretical reason for wanting to compare condition means one by one to condition 5. We could run a simple contrast:

UNIANOVA
count  BY condition age
/CONTRAST (condition)=Simple
/METHOD = SSTYPE(3)
/INTERCEPT = INCLUDE
/POSTHOC = condition ( TUKEY )
/PLOT = PROFILE( age*condition )
/EMMEANS = TABLES(condition*age)
/CRITERIA = ALPHA(.05)
/DESIGN = condition age condition*age.

The values of each contrast are highlighted. The p-values are located in the row "Sig.". We can see that the first 3 contrasts are statistically significant, whereas the last one is not.