One-Way MANOVA
The engine for Multivariate Discovery. One-Way MANOVA audits the effect of a categorical grouping on multiple continuous outcomes simultaneously, protecting the global alpha from inflation.
What is it?
One-Way Repeated Measures MANOVA evaluates changes in multiple continuous outcomes across three or more repeated conditions (e.g. Pre, Mid, Post) within a single group.
When to use it
- Repeated Measures: Same subjects tested across multiple trials.
- Multiple DVs: Continuous, correlated dependent variables.
- Single Cohort: Tracking trajectory of a single group.
Core Idea
Maps outcome trends in multi-dimensional space. Shows the joint path of change (Pre → Mid → Post) across both dependent variables:
Useful for tracking multivariate recovery where physiological (e.g. heart rate) and psychological (e.g. mood) outcomes shift simultaneously.
Hypotheses
How it works
Partitions the within-subject covariance matrix. It evaluates Wilk's Lambda against the subject baseline variations to determine trajectory significance.
Assumptions
Important Note
Repeated measures MANOVA effectively bypasses sphericity issues of univariate repeated measures because it does not require equal variances of differences.
Quick Example
Repeated Measures MANOVA Live Laboratory
Vary the trajectory shift over time to watch the bivariate path stretch and separate.
| Multivariate Test | Value | F-Approx | p-value |
|---|---|---|---|
| Wilk's Lambda (Λ) | 0.813 | 4.15 | 0.0274 |
Hypotheses
Pragmatic null and alternative hypotheses defined in mathematical notation.
H₀: The mean vectors across all DVs are equal at all timepoints (μ₁ = μ₂ = μ₃ = ... = μₖ for all DVs simultaneously)
Hₐ: At least one timepoint differs on at least one DV (vector of means differs)
Tests within-subjects effects across multiple DVs simultaneously. Use Wilks' Lambda, Pillai's Trace, or Roy's Largest Root. Protects against Type I error inflation when testing correlated DVs.
Assumptions
The core mathematical criteria needed to ensure that statistical testing remains unbiased and valid.
Diagnostics
Checking residual plots and indices to examine model deviations and ensure standard error integrity.
- Box's M test for homogeneity of variance-covariance matrices
- Mauchly's test of sphericity (per DV if using univariate approach)
- Mardia's test or Henze-Zirkler test for multivariate normality
- Mahalanobis distance to identify multivariate outliers
- Bartlett's test of sphericity (tests if correlation matrix differs from identity)
- Q-Q plots per DV per timepoint
- Scatterplot matrix of DVs to check linear relationships
- Variance-covariance matrices per timepoint
- Profile plots (means across time) for each DV
- Correlation matrix of DVs
- Descriptive statistics (M, SD) per DV per timepoint
Applied Minds
Review concrete study examples, data layout guidelines, and copy executable syntax scripts.
Cognitive Training Effects on Multiple Cognitive Domains (3 DVs × 3 Timepoints)
Research question: Does 12-week cognitive training improve multiple cognitive domains? Design: 45 older adults (65+ years) complete training. Outcomes: 3 cognitive DVs (Working Memory, Processing Speed, Executive Function) measured at baseline, 6 weeks, and 12 weeks. RM-MANOVA tests if cognitive profile changes over time.
# One-way RM-MANOVA: Cognitive training across 3 timepoints × 3 DVs
library(tidyverse)
library(car) # For Anova() with Type II/III SS
library(heplots) # For multivariate effect sizes
library(mvnormtest) # For multivariate normality
library(rstatix) # For Box's M test
set.seed(2025)
# Simulate cognitive data: 3 DVs improving over time
subjects <- 1:45
data_wide <- expand.grid(
subject = subjects,
timepoint = c("Baseline", "Week6", "Week12")
) %>%
mutate(
timepoint = factor(timepoint, levels = c("Baseline", "Week6", "Week12")),
time_numeric = as.numeric(timepoint) - 1,
# Simulate correlated cognitive improvements
wm = rnorm(135, mean = 0 + 0.3*time_numeric, sd = 0.9),
ps = rnorm(135, mean = 0 + 0.25*time_numeric, sd = 0.95),
ef = rnorm(135, mean = 0 + 0.35*time_numeric, sd = 0.85)
)
# Add within-subject correlation
subject_effects <- data.frame(
subject = subjects,
subj_wm = rnorm(45, 0, 0.4),
subj_ps = rnorm(45, 0, 0.35),
subj_ef = rnorm(45, 0, 0.4)
)
data_wide <- data_wide %>%
left_join(subject_effects, by = "subject") %>%
mutate(
wm = wm + subj_wm,
ps = ps + subj_ps,
ef = ef + subj_ef
) %>%
select(subject, timepoint, wm, ps, ef)
# === STEP 1: Check Assumptions ===
# 1. Descriptive statistics per DV per timepoint
data_wide %>%
group_by(timepoint) %>%
summarise(
WM_M = mean(wm), WM_SD = sd(wm),
PS_M = mean(ps), PS_SD = sd(ps),
EF_M = mean(ef), EF_SD = sd(ef)
)
# 2. Correlation among DVs
cat("\n=== Correlation Matrix(All Timepoints) ===")
data_wide %>%
select(wm, ps, ef) %>%
cor() %>%
round(3)
# 3. Box's M test (homogeneity of covariance matrices)
cat("\n=== Box's M Test ===")
box_m_result <- box_m(data_wide[, c("wm", "ps", "ef")],
data_wide$timepoint)
print(box_m_result)
# Interpretation: p > .001 suggests assumption met
# 4. Multivariate normality (check at each timepoint)
# Using Shapiro-Wilk per DV as approximation
cat("\n=== Normality Tests per DV per Timepoint ===")
for (tp in c("Baseline", "Week6", "Week12")) {
cat("\n", tp, ":\n")
tp_data <- data_wide %>% filter(timepoint == tp)
cat(" WM:", shapiro.test(tp_data$wm)$p.value, "\n")
cat(" PS:", shapiro.test(tp_data$ps)$p.value, "\n")
cat(" EF:", shapiro.test(tp_data$ef)$p.value, "\n")
}
# === STEP 2: Prepare Data for RM-MANOVA ===
# Need wide format: one row per subject, columns for each DV × timepoint
data_rmanova <- data_wide %>%
pivot_wider(
id_cols = subject,
names_from = timepoint,
values_from = c(wm, ps, ef),
names_sep = "_"
)
head(data_rmanova)
# === STEP 3: Run RM-MANOVA (Multivariate Approach) ===
# Define within-subjects factor (timepoint with 3 levels)
idata <- data.frame(
timepoint = factor(c("Baseline", "Week6", "Week12"))
)
# Multivariate model using car::Anova
model <- lm(cbind(wm_Baseline, wm_Week6, wm_Week12,
ps_Baseline, ps_Week6, ps_Week12,
ef_Baseline, ef_Week6, ef_Week12) ~ 1,
data = data_rmanova)
# Define within-subject design
# Each DV has 3 timepoints
idata_full <- expand.grid(
dv = c("wm", "ps", "ef"),
timepoint = c("Baseline", "Week6", "Week12")
)
# Simplified approach: Analyze each DV separately with RM-ANOVA,
# then use MANOVA to test all DVs simultaneously
# Alternative: Use multivariate profile analysis
cat("\n=== Multivariate Profile Analysis ===")
# Reshape for multivariate testing
wm_matrix <- as.matrix(data_rmanova[, c("wm_Baseline", "wm_Week6", "wm_Week12")])
ps_matrix <- as.matrix(data_rmanova[, c("ps_Baseline", "ps_Week6", "ps_Week12")])
ef_matrix <- as.matrix(data_rmanova[, c("ef_Baseline", "ef_Week6", "ef_Week12")])
# Combine into single multivariate outcome
Y <- cbind(wm_matrix, ps_matrix, ef_matrix)
# Within-subjects contrasts (test for time effect)
C <- matrix(c(-1, 1, 0, # Baseline vs Week 6
-1, 0, 1), # Baseline vs Week 12
nrow = 3, ncol = 2)
# Test time effect for each DV
cat("\nWorking Memory over time:\n")
wm_time <- lm(wm_matrix %*% C ~ 1)
Anova(wm_time, multivariate = TRUE)
cat("\nProcessing Speed over time:\n")
ps_time <- lm(ps_matrix %*% C ~ 1)
Anova(ps_time, multivariate = TRUE)
cat("\nExecutive Function over time:\n")
ef_time <- lm(ef_matrix %*% C ~ 1)
Anova(ef_time, multivariate = TRUE)
# === STEP 4: Effect Sizes ===
cat("\n=== Effect Sizes ===")
# Partial eta squared for each DV
# (Calculated from multivariate tests)
# === STEP 5: Profile Plots ===
data_long <- data_wide %>%
pivot_longer(cols = c(wm, ps, ef),
names_to = "cognitive_domain",
values_to = "z_score")
ggplot(data_long, aes(x = timepoint, y = z_score,
color = cognitive_domain, group = cognitive_domain)) +
stat_summary(fun = mean, geom = "line", size = 1.2) +
stat_summary(fun = mean, geom = "point", size = 3) +
stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.2) +
labs(title = "Cognitive Training Effects Across 12 Weeks",
subtitle = "Three cognitive domains show improvement",
x = "Assessment Timepoint",
y = "Mean z-score ± SE",
color = "Cognitive Domain") +
scale_color_brewer(palette = "Set1",
labels = c("Executive Function", "Processing Speed", "Working Memory")) +
theme_classic() +
theme(legend.position = "bottom")
# === APA Reporting ===
cat("
=== APA Report ===
A one-way repeated measures MANOVA examined cognitive changes across 12 weeks
of training(N=45) on three domains: working memory, processing speed, and
executive function. Box's M test indicated homogeneity of covariance matrices,
p = .XX. Multivariate tests revealed a significant time effect, Wilks' Λ = .65,
F(6, 82) = 7.23, p < .001, partial η² = .35 (large multivariate effect).
Univariate follow-up tests showed:
- Working memory: F(2, 88) = 15.4, p < .001, partial η² = .26
- Processing speed: F(2, 88) = 11.2, p < .001, partial η² = .20
- Executive function: F(2, 88) = 18.7, p < .001, partial η² = .30
Post-hoc pairwise comparisons(Bonferroni-corrected) indicated all three domains
improved significantly from baseline to Week 6 and Week 12 (all p < .01),
with continued gains from Week 6 to Week 12 (p < .05). Results demonstrate
broad cognitive benefits of training, consistent with meta-analytic evidence.
")Multivariate tests: Wilks' Λ = .65, F(6, 82) = 7.23, p < .001, partial η² = .35 (large effect). All three cognitive domains improved significantly over 12 weeks (all univariate p < .001). Executive function showed largest gains (η²p = .30), followed by working memory (.26) and processing speed (.20). Results demonstrate transfer effects across multiple cognitive domains, supporting broad cognitive training benefits consistent with meta-analytic evidence (Karbach & Verhaeghen, 2014).
Alternatives
Structured fallback pathways for choosing alternative tests when normality or slopes requirements fail.
- Pillai's Trace Pivot — The most robust omnibus statistic when Box's M is significant or group sizes are small.
- Bootstrapped MANOVA — Resample the entire multivariate vector to bypass normality mandates.
- Discriminant Function Analysis (DFA) — Identify which outcomes contribute uniquely to group separation.
- PCA Pre-Reduction — Collapse highly redundant outcomes into a single high-signal component before testing.
Post-hoc
Group mean comparisons and correction controls (e.g. Tukey HSD, Bonferroni) to protect against Family-Wise Error Rates.
Post-hoc pairwise tests defined for this model.
No specific guidelines provided.
Effect Size
Understanding effect sizes (e.g., Cohen's d, Partial Eta-Squared) and clinical impact benchmarks.
Λ ranges 0-1. Smaller values = larger effect. Λ = .90 (small), .75 (medium), .50 (large). Most commonly reported
Ranges 0-1. Larger values = larger effect. Most robust to violations of assumptions. V = .10 (small), .25 (medium), .50 (large)
Proportion of variance explained. Small: .01, Medium: .06, Large: .14. Calculate per DV for univariate follow-ups
Pillai's Trace for robustness; Wilks' Lambda for convention and power when assumptions met
0.2
0.5
0.8
Sample Size
Guidelines for minimum sample requirements and power analysis parameters.
At least 20 subjects for reliable multivariate tests. Larger n needed as number of DVs increases. Rule: n > # DVs + # timepoints + 10
| Effect Size | Parameters | Required n |
|---|---|---|
| Small Effect | α=.05, power=.80 | n ≈ 300+ |
| Medium Effect | α=.05, power=.80 | n ≈ 50-80 depending on # DVs and timepoints |
| Large Effect | α=.05, power=.80 | n ≈ 25-40 |
Reporting
How to compile statistical results into publication prose matching APA and journal style guides.
A one-way repeated measures MANOVA examined changes in k DVs: list them across # timepoints. State sample and design. Assumptions: 'Box's M test indicated homogeneity of covariance matrices, p = .XX. Multivariate normality was assessed via [Mardia's test/univariate checks.'] Multivariate tests revealed a significant/non-significant effect of time, Wilks' Λ/Pillai's Trace = .XX, F(df1, df2) = X.XX, p = .XXX, partial η² = .XX. If significant: Univariate follow-up tests (with Bonferroni correction, α = .XX) showed significant time effects for: list DVs with F-statistics, p-values, and effect sizes. Describe pattern: which DVs increased/decreased, when. Conclude with substantive interpretation.
- Multivariate test statistic (Wilks' Λ or Pillai's Trace)
- F-statistic with df for multivariate test
- p-value for multivariate test
- Multivariate effect size (partial η²)
- Box's M test result
- Univariate F-statistics per DV (if multivariate significant)
- Univariate p-values with Bonferroni correction
- Univariate effect sizes (partial η² per DV)
- Descriptive statistics per DV per timepoint (M, SD)
Manuscript Lab
Copy standard summary tables and forensic reporting grids to outline analysis details.
| Effect | Pillai's Trace | F | Hypoth df | Error df | p | ηp² |
|---|---|---|---|---|---|---|
| Group (Intercept) | .982 | 1245.2 | 3 | 95 | < .001 | .98 |
| Group (Primary) | .245 | 10.24 | 3 | 95 | < .001 | .24 |
| Residuals | — | — | — | — | — | — |
The 'Global Signal'. An omnibus statistic representing the overall group separation across all outcome variables.
Model Complexity. The number of independent contrasts used to estimate the multivariate effect.
Residual Degrees of Freedom. The remaining information used to stabilize the multivariate noise estimate.
Multivariate Multiplier. The signal-to-noise ratio calculated using the variance-covariance matrix.
Multivariate Probability. The chance that the group centroids are identical across all outcome dimensions.
Command Center
Syntax libraries and function parameters for executing calculations in stats packages.
# 1. Construct Multivariate Matrix
outcomes <- as.matrix(df[, c('marker1', 'marker2', 'marker3')])
# 2. Execute Omnibus MANOVA
model <- manova(outcomes ~ group, data = df)
summary(model, test = 'Pillai')
# 3. Step-Down Univariate Audit
summary.aov(model)Protect against Type I inflation by auditing the 'Centroid Gap' before diving into individual outcome analyses.
# Multivariate Outlier Audit (Mahalanobis Distance)
performance::check_outliers(model, method = 'mahalanobis')
# Visualize Centroid Separation (H-E Plot)
heplot::heplot(model)Common Mistakes
Analytical caveats and corrections to maintain modeling integrity.
References
Scholarly lineage and citation keys grounding the statistical framework.