Power Analysis for Ordinal and Disordinal Contrasts

Instal and load the {pwrss} package in R:

install.packages("pwrss")
library(pwrss)

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: