Statistical model reference
Multivariate Analysis of Variance (MANOVA)
Review when to use this method, its data requirements, implementation patterns, and interpretation guidance.
Description
An extension of ANOVA that assesses group differences across multiple continuous dependent variables simultaneously. It accounts for correlations among dependent variables and provides protection against Type I errors when testing multiple outcomes.
Use Cases
- multivariate group comparisons
- profile analysis
- repeated measures designs
Requirements
- Sample Size: medium, large
- Missing Data: none, random
- Data Distribution: multivariate normal
- Relationship Type: linear
Variable Types
Dependent Variables
- continuous
Independent Variables
- categorical
Implementation
from statsmodels.multivariate.manova import MANOVA
manova = MANOVA.from_formula('dv1 + dv2 + dv3 ~ group_var', data=df)
print(manova.mv_test())
Documentation
model <- manova(cbind(dv1, dv2, dv3) ~ group_var, data=df)
summary(model, test="Pillai")
summary.aov(model) # Univariate ANOVAs
Documentation
GLM dv1 dv2 dv3 BY group_var
/METHOD=SSTYPE(3)
/INTERCEPT=INCLUDE
/PRINT=DESCRIPTIVE PARAMETER
/CRITERIA=ALPHA(.05)
/DESIGN=group_var.
Documentation
PROC GLM DATA=dataset;
CLASS group_var;
MODEL dv1 dv2 dv3 = group_var / NOUNI;
MANOVA H=group_var / PRINTE PRINTH;
RUN;
Documentation
mvreg dv1 dv2 dv3 = i.group_var
manova dv1 dv2 dv3 = group_var
Documentation
Synthetic Data Example
A dataset with multiple continuous dependent variables and one categorical independent variable
R Code for Data Generation and Analysis
# Generate synthetic MANOVA data
set.seed(123)
library(MASS)
# Parameters for three groups
mu_A <- c(50, 60, 70)
mu_B <- c(55, 65, 75)
mu_C <- c(60, 70, 80)
sigma <- matrix(c(5, 2, 1,
2, 5, 2,
1, 2, 5), nrow=3)
# Generate data
group_A <- mvrnorm(30, mu=mu_A, Sigma=sigma)
group_B <- mvrnorm(30, mu=mu_B, Sigma=sigma)
group_C <- mvrnorm(30, mu=mu_C, Sigma=sigma)
df <- data.frame(
rbind(group_A, group_B, group_C),
group = factor(rep(c("A", "B", "C"), each=30))
colnames(df)[1:3] <- c("dv1", "dv2", "dv3")
# Descriptive statistics
aggregate(cbind(dv1, dv2, dv3) ~ group, data=df, FUN=mean)
# Visualization
pairs(df[,1:3], col=df$group, pch=16, main="MANOVA Data by Group")
# MANOVA model
model <- manova(cbind(dv1, dv2, dv3) ~ group, data=df)
summary(model, test="Pillai")
summary.aov(model)
# Assumption checking
car::BoxM(df[,1:3], df$group)
Copy this code into your R environment to generate synthetic data and perform analysis with this model.
Expected Analysis Results
Console Output
> summary(model, test="Pillai")
Df Pillai approx F num Df den Df Pr(>F)
group 2 0.5678 12.345 6 172 4.567e-12 ***
Residuals 87
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
> summary.aov(model)
Response dv1 :
Df Sum Sq Mean Sq F value Pr(>F)
group 2 1123.5 561.75 23.456 4.567e-09 ***
Residuals 87 2084.1 23.96
Response dv2 :
Df Sum Sq Mean Sq F value Pr(>F)
group 2 1234.5 617.25 25.678 3.456e-10 ***
Residuals 87 2098.7 24.12
Response dv3 :
Df Sum Sq Mean Sq F value Pr(>F)
group 2 1345.6 672.80 28.901 1.234e-11 ***
Residuals 87 2024.3 23.27
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
These results are from running the R code on synthetic data. Your actual results may vary depending on your data.
Interpretation Guide
Need help interpreting the results of your Multivariate Analysis of Variance (MANOVA) analysis? Our comprehensive interpretation guide explains:
- How to read and understand model outputs
- Interpreting coefficients and effect sizes correctly
- Understanding diagnostic plots and visualizations
- Common pitfalls and how to avoid them
- Making valid conclusions from your analysis