install.packages("pwrss")
library(pwrss)Power Analysis for Ordinal and Disordinal Contrasts
Instal and load the {pwrss} package in R:
1 Basic idea
In a \(2 \times 2\) factorial design, an interaction means that the effect of Factor \(A\) changes across the levels of Factor \(B\). The four cell means are written in this order:
\[ [\mu_{A_1B_1},\ \mu_{A_1B_2},\ \mu_{A_2B_1},\ \mu_{A_2B_2}]. \]
The same order must be used in mu.vector, sd.vector, p.vector, and contrast.matrix. The simple effect of \(A\) at \(B_1\) is:
\[ D_{B_1} = \mu_{A_1B_1}-\mu_{A_2B_1}. \]
For the stated cell order, its contrast is:
\[ \mathbf{c}_{B_1}=[1,\ 0,\ -1,\ 0]. \]
The simple effect of \(A\) at \(B_2\) is:
\[ D_{B_2} = \mu_{A_1B_2}-\mu_{A_2B_2}. \]
Its contrast is:
\[ \mathbf{c}_{B_2}=[0,\ 1,\ 0,\ -1]. \]
The interaction is the difference between these simple effects:
\[ \psi=D_{B_1}-D_{B_2}. \]
Therefore,
\[ \begin{aligned} \psi &=(\mu_{A_1B_1}-\mu_{A_2B_1}) -(\mu_{A_1B_2}-\mu_{A_2B_2})\\ &=\mu_{A_1B_1}-\mu_{A_1B_2} -\mu_{A_2B_1}+\mu_{A_2B_2}. \end{aligned} \]
Thus, the correct interaction contrast is:
\[ \boxed{\mathbf{c}_{AB}=[1,\ -1,\ -1,\ 1]}. \]
This can also be obtained by subtracting the two simple-effect contrasts:
\[ [1,\ 0,\ -1,\ 0] - [0,\ 1,\ 0,\ -1] = [1,\ -1,\ -1,\ 1]. \]
| Contrast | A1B1 | A1B2 | A2B1 | A2B2 |
|---|---|---|---|---|
| Effect of A at B1 | 1 | 0 | -1 | 0 |
| Effect of A at B2 | 0 | 1 | 0 | -1 |
| Interaction | 1 | -1 | -1 | 1 |
2 Ordinal interaction
An ordinal interaction occurs when the two simple effects do not reverse direction. They usually have the same sign. The lines do not cross.
2.1 Cell means
Code
mu_ordinal <- c(
A1B1 = 12,
A1B2 = 16,
A2B1 = 10,
A2B2 = 12
)
ordinal_table <- data.frame(
`Factor A` = c("A1", "A2"),
B1 = c(mu_ordinal["A1B1"], mu_ordinal["A2B1"]),
B2 = c(mu_ordinal["A1B2"], mu_ordinal["A2B2"]),
check.names = FALSE
)
kable(ordinal_table, row.names = FALSE)| Factor A | B1 | B2 |
|---|---|---|
| A1 | 12 | 16 |
| A2 | 10 | 12 |
2.2 Simple effects
At \(B_1\):
\[ D_{B_1}=12-10=2. \]
At \(B_2\):
\[ D_{B_2}=16-12=4. \]
Both effects are positive, but the effect is larger at \(B_2\). Therefore, this is an ordinal interaction.
2.3 Interaction effect
\[ \begin{aligned} \psi &=D_{B_1}-D_{B_2}\\ &=2-4\\ &=-2. \end{aligned} \]
Using the interaction contrast gives the same answer:
\[ \begin{aligned} \psi &=1(12)-1(16)-1(10)+1(12)\\ &=-2. \end{aligned} \]
With a common population standard deviation of \(5\):
\[ d=\frac{\psi}{SD}=\frac{-2}{5}=-0.40. \]
2.4 Plot
2.5 Power analysis
power.f.ancova.shieh(
mu.vector = c(12, 16, 10, 12), # adjusted cell means (marginal)
sd.vector = c(5, 5, 5, 5), # unadjusted standard deviations
p.vector = c(0.25, 0.25, 0.25, 0.25), # should sum to 1
contrast.matrix = c(1, -1, -1, 1),
power = 0.80,
alpha = 0.05
)+--------------------------------------------------+
| SAMPLE SIZE CALCULATION |
+--------------------------------------------------+
One-Way Analysis of Covariance (F-Test)
----------------------------------------------------
Hypotheses
----------------------------------------------------
H0 (Null) : eta.squared = 0
H1 (Alternative) : eta.squared > 0
----------------------------------------------------
Results
----------------------------------------------------
Effect Size (eta-squared) = 0.010
Total Sample Size = 788 <<
Type 1 Error (alpha) = 0.050
Type 2 Error (beta) = 0.200
Statistical Power = 0.800
# or
power.t.contrast(
mu.vector = c(12, 16, 10, 12), # adjusted cell means (marginal)
sd.vector = c(5, 5, 5, 5), # unadjusted standard deviations
p.vector = c(0.25, 0.25, 0.25, 0.25), # should sum to 1
contrast.vector = c(1, -1, -1, 1),
power = 0.80,
alpha = 0.05,
verbose = 2
)+--------------------------------------------------+
| SAMPLE SIZE CALCULATION |
+--------------------------------------------------+
Single Contrast Analysis (T-Test)
----------------------------------------------------
Hypotheses
----------------------------------------------------
H0 (Null) : psi = 0
H1 (Alternative) : psi != 0
----------------------------------------------------
Key Parameters
----------------------------------------------------
Contrast Est. (psi) = -2
Standardized psi (d) = -0.400
Degrees of Freedom = 783
Non-centrality of Alt. = -2.805
Non-centrality of Null = 0
Critical Value = -1.963 and 1.963
----------------------------------------------------
Results
----------------------------------------------------
Effect Size (d) = -0.400
Total Sample Size = 788 <<
Type 1 Error (alpha) = 0.050
Type 2 Error (beta) = 0.200
Statistical Power = 0.800
----------------------------------------------------
Definitions
----------------------------------------------------
psi : Contrast estimate, sum(contrast[i] * mu[i])
d : Standardized contrast estimate
3 Disordinal interaction
A disordinal interaction, also called a crossover interaction, occurs when the two simple effects have opposite signs. The direction reverses, so the lines cross.
3.1 Cell means
Code
mu_disordinal <- c(
A1B1 = 11,
A1B2 = 15,
A2B1 = 13,
A2B2 = 13
)
disordinal_table <- data.frame(
`Factor A` = c("A1", "A2"),
B1 = c(mu_disordinal["A1B1"], mu_disordinal["A2B1"]),
B2 = c(mu_disordinal["A1B2"], mu_disordinal["A2B2"]),
check.names = FALSE
)
kable(disordinal_table, row.names = FALSE)| Factor A | B1 | B2 |
|---|---|---|
| A1 | 11 | 15 |
| A2 | 13 | 13 |
3.2 Simple effects
At \(B_1\):
\[ D_{B_1}=11-13=-2. \]
At \(B_2\):
\[ D_{B_2}=15-13=2. \]
The first simple effect is negative and the second is positive. Therefore, the direction reverses and this is a disordinal interaction.
3.3 Interaction effect
\[ \begin{aligned} \psi &=D_{B_1}-D_{B_2}\\ &=-2-2\\ &=-4. \end{aligned} \]
Using the interaction contrast gives the same answer:
\[ \begin{aligned} \psi &=1(11)-1(15)-1(13)+1(13)\\ &=-4. \end{aligned} \]
With a common population standard deviation of \(5\):
\[ d=\frac{\psi}{SD}=\frac{-4}{5}=-0.80. \]
3.4 Plot
3.5 Power analysis
power.f.ancova.shieh(
mu.vector = c(11, 15, 13, 13), # adjusted cell means (marginal)
sd.vector = c(5, 5, 5, 5), # unadjusted standard deviations
p.vector = c(0.25, 0.25, 0.25, 0.25), # should sum to 1
contrast.matrix = c(1, -1, -1, 1),
power = 0.80,
alpha = 0.05
)+--------------------------------------------------+
| SAMPLE SIZE CALCULATION |
+--------------------------------------------------+
One-Way Analysis of Covariance (F-Test)
----------------------------------------------------
Hypotheses
----------------------------------------------------
H0 (Null) : eta.squared = 0
H1 (Alternative) : eta.squared > 0
----------------------------------------------------
Results
----------------------------------------------------
Effect Size (eta-squared) = 0.038
Total Sample Size = 200 <<
Type 1 Error (alpha) = 0.050
Type 2 Error (beta) = 0.198
Statistical Power = 0.802
# or
power.t.contrast(
mu.vector = c(11, 15, 13, 13), # adjusted cell means (marginal)
sd.vector = c(5, 5, 5, 5), # unadjusted standard deviations
p.vector = c(0.25, 0.25, 0.25, 0.25), # should sum to 1
contrast.vector = c(1, -1, -1, 1),
power = 0.80,
alpha = 0.05,
verbose = 2
)+--------------------------------------------------+
| SAMPLE SIZE CALCULATION |
+--------------------------------------------------+
Single Contrast Analysis (T-Test)
----------------------------------------------------
Hypotheses
----------------------------------------------------
H0 (Null) : psi = 0
H1 (Alternative) : psi != 0
----------------------------------------------------
Key Parameters
----------------------------------------------------
Contrast Est. (psi) = -4
Standardized psi (d) = -0.800
Degrees of Freedom = 195
Non-centrality of Alt. = -2.821
Non-centrality of Null = 0
Critical Value = -1.972 and 1.972
----------------------------------------------------
Results
----------------------------------------------------
Effect Size (d) = -0.800
Total Sample Size = 200 <<
Type 1 Error (alpha) = 0.050
Type 2 Error (beta) = 0.198
Statistical Power = 0.802
----------------------------------------------------
Definitions
----------------------------------------------------
psi : Contrast estimate, sum(contrast[i] * mu[i])
d : Standardized contrast estimate
4 Challenge
Remember cell means for the ordinal contrast.
Code
mu_ordinal <- c(
A1B1 = 12,
A1B2 = 16,
A2B1 = 10,
A2B2 = 12
)
ordinal_table <- data.frame(
`Factor A` = c("A1", "A2"),
B1 = c(mu_ordinal["A1B1"], mu_ordinal["A2B1"]),
B2 = c(mu_ordinal["A1B2"], mu_ordinal["A2B2"]),
check.names = FALSE
)
kable(ordinal_table, row.names = FALSE)| Factor A | B1 | B2 |
|---|---|---|
| A1 | 12 | 16 |
| A2 | 10 | 12 |
How many participants are required to detect the main effect of A? Confirm with a reduced form of the code by considering factor A only (instead of factor.levels = c(2, 2), work around factor.levels = 2).
A total of at least 92 participants are required to detect the main effect of A.
Find out how: