Atlas
statminds
Multivariate GLM (Two-Group Vector Model)The underlying model family class (e.g. GLM, linear model, categorical matrix, log-linear).Parametric ReferenceStatistical methods that assume a specific probability distribution family (typically normal).12-stage workflow

Hotelling's T²

The engine for Multivariate Mean Discovery. Hotelling's T² audits the divergence between two group mean-vectors, revealing if a categorical difference exists across a cluster of outcomes while protecting the global alpha level.

Model familyMultivariate GLM (Two-Group Vector Model)
Hypothesisomnibus
AliasesHotelling's T-Squared · Multivariate Two-Sample T-Test · Profile Divergence Audit
G1
Vector Divergence Audit
Determine if groups differ significantly across a cluster of related continuous outcomes.
G2
Alpha-Shielding Strike
Protect against Type I error inflation by running a single multivariate test instead of multiple t-tests.
G3
Multivariate Signal Isolation
Identify group differences that emerge only when outcomes are viewed as a collective profile.
Visual Overview Dashboard
1

What is it?

Hotelling's T² is a specialized statistical test used to evaluate proportions, multivariate mean vectors, or clinical equivalence margins.

The engine for Multivariate Mean Discovery. Hotelling's T² audits the divergence between two group mean-vectors, revealing if a categorical difference exists across a cluster of outcomes while protecting the global alpha level.

2

Goals & Indications

  • Vector Divergence Audit: Determine if groups differ significantly across a cluster of related continuous outcomes.
  • Alpha-Shielding Strike: Protect against Type I error inflation by running a single multivariate test instead of multiple t-tests.
  • Multivariate Signal Isolation: Identify group differences that emerge only when outcomes are viewed as a collective profile.
3

Core Idea Diagram

Group 1 MeanGroup 2 Mean
4

Claims tested

H₀: H₀: μ₁ = μ₂ (the two multivariate mean vectors are equal across all p dependent variables)
Hₐ: Hₐ: μ₁ ≠ μ₂ (at least one element of the mean vectors differs between groups)
5

How it works

  1. State null hypothesis of equal multivariate mean vectors: mu_1 = mu_2.
  2. Compute pooled variance-covariance matrix across outcomes.
  3. Calculate Mahalanobis distance between groups mean vectors.
  4. Scale distance to F-statistic; check significance at df constraints.
6

Assumptions

DVs are continuous: Multiple outcomes measured on continuous scales
Independence of observations between and within groups: No clustering, pairing, or repeated measures
Multivariate normality within each group: Joint distribution of all DVs follows multivariate normal
7

Important Note

Hotelling's T² tests the omnibus null that groups have identical multivariate means. If H₀ is rejected, follow-up univariate tests (with Bonferroni correction) or discriminant analysis determine which specific variables differ.

8

Worked Example

MetricEstimatep-value
Test Statistic3.120.015

Hotelling's T² Multivariate Laboratory

Hotelling's T² generalizes the Student's t-test to multivariate outcomes, testing if groups mean vectors differ across multiple dependent variables simultaneously.

The 12-Stage Precision Workflow
01Vector Parity
Hypotheses
We test the null of 'Mean-Vector Equality' against the discovery of a non-zero shift in the global outcome profile.
02Multivariate Normality
Assumptions
Ensuring the joint distribution of all outcomes follows the hyper-bell curve—the foundational prerequisite for T² authority.
03Covariance Parity
Diagnostics
Utilizing Box’s M to verify that the relationships between variables are consistent across both treatment groups.
04focus
Comparing FlowMotion vs. Usual Care across a vector of: Pain Intensity, Joint Range of Motion, and Daily Step Count.
05MANOVA Pivot
Alternatives
Knowing when to switch to MANOVA if you have more than two groups, or independent t-tests with Bonferroni if outcomes are unrelated.
06The T² Strike
Significance
Calculating the total Mahalanobis distance between group centroids—the definitive strike on multivariate divergence.
07Mahalanobis D²
Effect Size
Interpreting D² as the 'Multivariate Cohen’s d'—quantifying the standardized distance between the two group profiles.
08Matrix Power
Sample Size
Accounting for the increased N required to provide stable estimations of the variance-covariance matrix.
09The Trace Statement
Reporting
Reporting the T² statistic and its F-approximation: 'T² = X.XX, F(df1, df2) = X.XX, p = .XXX'.
10ICSNP / HotellingsT2
Software
Executing 'HotellingsT2()' commands, ensuring the outcome matrix is correctly formatted against the group factor.
11focus
Avoiding the error of including outcomes that are so highly correlated (r > .90) that they mathematically choke the matrix inversion.
12focus
Tracing the model back to Harold Hotelling (1931) and the birth of multivariate inferential statistics.
01Hypothesis test logic

Hypotheses

Pragmatic null and alternative hypotheses defined in mathematical notation.

A hypothesis is a question sharpened to a point. Ambiguity is the enemy of inference.
Logic Core
Null · H₀

H₀: μ₁ = μ₂ (the two multivariate mean vectors are equal across all p dependent variables)

Alternative · Hₐ

Hₐ: μ₁ ≠ μ₂ (at least one element of the mean vectors differs between groups)

Why it matters omnibus

Hotelling's T² tests the omnibus null that groups have identical multivariate means. If H₀ is rejected, follow-up univariate tests (with Bonferroni correction) or discriminant analysis determine which specific variables differ.

02Model diagnostics

Assumptions

The core mathematical criteria needed to ensure that statistical testing remains unbiased and valid.

Build your analysis on rock, not sand. Verify the mathematical foundation before building the model.
Integrity Shield
6
Assumptions
4
Critical / High Severity
How to check
Quick
Inspect variable types; verify all p dependent variables are continuous, not categorical or ordinal
Rigorous
Check measurement scales; ensure variables represent interval/ratio data with meaningful distances between values
If violated
If DVs are ordinal → use multivariate rank-based methods or separate Mann-Whitney U tests with Bonferroni correction. If categorical → use MANOVA with appropriate link functions or separate chi-square tests. If mixed scales → use separate univariate tests appropriate to each scale
How to check
Quick
Design review; verify each subject belongs to only one group; check for clustering variables (site, family, time)
Rigorous
Check for duplicate subject IDs; verify random assignment in experimental designs; inspect for temporal or spatial clustering
If violated
If paired/matched data (same subjects in both groups or matched pairs) → use paired Hotelling's T² instead. If clustered data (e.g., patients nested in hospitals) → use multivariate linear mixed models (MLMM) with random effects. If repeated measures → use multivariate repeated measures ANOVA or MLMM
hotelling t2
How to check
Quick
Univariate Q-Q plots for each DV by group; check skewness and kurtosis for each variable. Multivariate normality requires each variable to be normal, but also requires specific correlation structure
Rigorous
Mardia's test for multivariate skewness and kurtosis (p > .05 indicates normality); Henze-Zirkler test; Royston's multivariate normality test; chi-square Q-Q plot of squared Mahalanobis distances (should be linear)
If violated
If mild violation with large samples (n₁, n₂ > 30): T² is robust via multivariate CLT, proceed. If moderate violation: (1) Transform variables (log, Box-Cox) to improve normality; (2) Use permutation-based Hotelling's T² (resampling approach, distribution-free); (3) Use robust multivariate methods (M-estimators). If severe violation: use multivariate rank tests or separate nonparametric tests with Bonferroni correction
How to check
Quick
Box's M test (p > .001 suggests equal covariances; use conservative α due to sensitivity to non-normality); compare correlation matrices visually across groups
Rigorous
Box's M test with Bartlett's correction; compare variance ratios for each DV (largest/smallest < 4); compare correlation matrices numerically; use robust covariance estimation
If violated
If Box's M p < .001 (unequal covariances): (1) If sample sizes approximately equal (n₁ ≈ n₂ within 1.5 ratio) → T² is fairly robust, proceed with caution and note violation; (2) If unequal sample sizes → results unreliable. Options: transform DVs to stabilize variances; use Yao's test (multivariate Welch-type adjustment for unequal covariances); use permutation tests; use MANOVA with heterogeneous covariance structure; or analyze DVs separately with Welch's t-tests + Bonferroni
How to check
Quick
Calculate Mahalanobis distance (D²) for each observation; compare to χ²(p) critical value (e.g., χ²₀.₀₀₁); plot D² values and identify extreme cases (D² > χ²₀.₀₀₁,p)
Rigorous
Mahalanobis D² with FDR correction for multiple testing; Minimum Covariance Determinant (MCD) for robust outlier detection; multivariate boxplots; influence diagnostics (Cook's D for multivariate case)
If violated
First: verify data entry errors and correct if found. If legitimate outliers: (1) Report results with and without outliers (sensitivity analysis); (2) Use robust Hotelling's T² based on MCD covariance estimators; (3) Winsorize multivariate outliers using Mahalanobis distance (cap at 99th percentile); (4) Use permutation T² (robust to outliers via resampling). Never remove outliers without justification, transparency, and pre-registration
hotelling t2
How to check
Quick
Verify n₁ > p and n₂ > p (minimum); check n₁ + n₂ - p - 1 > 0 (required for F-transformation)
Rigorous
Conduct power analysis; ensure n₁, n₂ > 20 + p for reliable results; verify covariance matrix is positive definite
If violated
If n < p (more variables than subjects): (1) Reduce dimensionality using PCA/factor analysis before T²; (2) Use regularized Hotelling's T² (shrinkage estimators for covariance); (3) Test subsets of variables separately with Bonferroni correction; (4) Collect more data if possible. If n only slightly > p: increase sample size, as power is very low and covariance estimation unstable
hotelling t2
03Residual Forensics

Diagnostics

Checking residual plots and indices to examine model deviations and ensure standard error integrity.

Trust, but verify. The outliers often hold more truth than the averages.
System Health
Essential checks
  1. Box's M test for equality of covariance matrices (p > .001)
  2. Mardia's test or Henze-Zirkler test for multivariate normality
  3. Mahalanobis distance (D²) to detect multivariate outliers (D² vs. χ²₀.₀₀₁,p)
  4. Verify n₁, n₂ > p (sample size > number of variables)
Recommended checks
  1. Univariate Q-Q plots for each DV by group
  2. Chi-square Q-Q plot of Mahalanobis D² (should be linear)
  3. Correlation matrix comparison across groups
  4. Scatterplot matrix (pairs plot) colored by group
  5. Variance ratios for each DV (largest/smallest < 4)
  6. Descriptive statistics (M, SD, correlation) per group
04Live Instances

Applied Minds

Review concrete study examples, data layout guidelines, and copy executable syntax scripts.

Theory is the map. Practice is the terrain. Simulation bridges the gap.
Applied Wisdom
Example 01

Yoga vs. Control on Cognitive Performance (3 cognitive DVs)

Research question: Does 8-week yoga intervention improve cognitive performance compared to waitlist control? Design: RCT with 2 groups (Yoga n=40, Control n=40). Outcomes: Three cognitive measures assessed simultaneously: (1) Working memory (WM) z-score, (2) Processing speed (PS) z-score, (3) Executive function (EF) z-score. Rationale for multivariate approach: These cognitive domains are correlated and should be analyzed jointly to control Type I error and capture shared variance.

DesignBetween-subjects RCT
GroupsYoga · Control
Total n80
# Hotelling's T²: Yoga vs. Control on Multivariate Cognitive Performance
# Based on realistic effect sizes from yoga-cognition meta-analyses

library(MASS)           # For mvrnorm (multivariate normal simulation)
library(Hotelling)      # For hotelling.test()
library(biotools)       # For boxM (Box's M test)
library(MVN)            # For multivariate normality tests
library(car)            # For scatterplotMatrix
library(ggplot2)
library(GGally)         # For ggpairs

set.seed(2025)

# Define population parameters (realistic correlation structure)
# Yoga group: improved cognition
mean_yoga <- c(WM = 0.4, PS = 0.35, EF = 0.45)  # Medium effects
cov_yoga <- matrix(c(
  1.0, 0.5, 0.6,   # WM variance and correlations
  0.5, 1.0, 0.4,   # PS correlations
  0.6, 0.4, 1.0    # EF correlations
), nrow = 3, byrow = TRUE)

# Control group: minimal change
mean_control <- c(WM = 0.0, PS = 0.0, EF = 0.0)
cov_control <- matrix(c(
  1.0, 0.5, 0.6,
  0.5, 1.0, 0.4,
  0.6, 0.4, 1.0
), nrow = 3, byrow = TRUE)

# Simulate data
n_yoga <- 40
n_control <- 40

yoga_data <- mvrnorm(n = n_yoga, mu = mean_yoga, Sigma = cov_yoga)
control_data <- mvrnorm(n = n_control, mu = mean_control, Sigma = cov_control)

# Combine into data frame
data <- data.frame(
  group = factor(c(rep("Yoga", n_yoga), rep("Control", n_control))),
  WM = c(yoga_data[,1], control_data[,1]),
  PS = c(yoga_data[,2], control_data[,2]),
  EF = c(yoga_data[,3], control_data[,3])
)

# === STEP 1: Check Assumptions ===

# 1. Multivariate Normality (Mardia's test)
cat("=== Multivariate Normality Tests ===\n")
yoga_subset <- data[data$group == "Yoga", c("WM", "PS", "EF")]
control_subset <- data[data$group == "Control", c("WM", "PS", "EF")]

mvn_yoga <- mvn(yoga_subset, mvnTest = "mardia")
print(mvn_yoga$multivariateNormality)

mvn_control <- mvn(control_subset, mvnTest = "mardia")
print(mvn_control$multivariateNormality)
# Result: p > .05 for both groups → multivariate normality OK

# Chi-square Q-Q plot for multivariate normality
par(mfrow = c(1, 2))
for (g in c("Yoga", "Control")) {
  subset_data <- data[data$group == g, c("WM", "PS", "EF")]
  d_sq <- mahalanobis(subset_data, 
                      colMeans(subset_data), 
                      cov(subset_data))
  qqplot(qchisq(ppoints(length(d_sq)), df = 3), d_sq,
         main = paste(g, "- Mahalanobis D² Q-Q Plot"),
         xlab = "Theoretical χ²(3)", ylab = "Mahalanobis D²")
  abline(0, 1, col = "red")
}
par(mfrow = c(1, 1))

# 2. Homogeneity of Covariance Matrices (Box's M test)
cat("\n=== Box's M Test(Homogeneity of Covariance) ===\n")
box_result <- boxM(data[, c("WM", "PS", "EF")], data$group)
print(box_result)
# Result: p > .001 → equal covariances OK
# Note: Box's M is sensitive; use α = .001 threshold

# 3. Multivariate Outliers (Mahalanobis Distance)
cat("\n=== Multivariate Outlier Detection ===\n")
p <- 3  # number of variables
chi_crit <- qchisq(0.999, df = p)  # χ²₀.₀₀₁(3) = 16.27

data$mahal_dist <- NA
for (g in c("Yoga", "Control")) {
  idx <- data$group == g
  subset_data <- data[idx, c("WM", "PS", "EF")]
  data$mahal_dist[idx] <- mahalanobis(subset_data, 
                                      colMeans(subset_data), 
                                      cov(subset_data))
}

outliers <- data[data$mahal_dist > chi_crit, ]
cat("Outliers(D² > χ²₀.₀₀₁):", nrow(outliers), "\n")
if (nrow(outliers) > 0) print(outliers)
# Result: No extreme multivariate outliers detected

# 4. Sample Size Check
cat("\n=== Sample Size Check ===\n")
cat("n_yoga =", n_yoga, ", n_control =", n_control, ", p =", p, "\n")
cat("Both n > p? ", n_yoga > p & n_control > p, "✓\n")

# === STEP 2: Descriptive Statistics ===
cat("\n=== Descriptive Statistics ===\n")
print(aggregate(cbind(WM, PS, EF) ~ group, data = data, 
                FUN = function(x) c(M = mean(x), SD = sd(x))))

# Correlation matrices by group
cat("\nYoga Group Correlations:\n")
print(cor(yoga_subset))
cat("\nControl Group Correlations:\n")
print(cor(control_subset))

# === STEP 3: Run Hotelling's T² ===
cat("\n=== Hotelling's T² Test ===\n")
yoga_matrix <- as.matrix(yoga_subset)
control_matrix <- as.matrix(control_subset)

# Method 1: Using Hotelling package
result <- hotelling.test(WM + PS + EF ~ group, data = data)
print(result)

# Extract statistics
T2 <- result$stats[1, "statistic"]
F_stat <- result$stats[1, "statistic"]
df1 <- result$stats[1, "df"]  
df2 <- result$stats[2, "df"]
p_value <- result$pval

cat("\nT² =", round(T2, 3), "\n")
cat("F(", df1, ",", df2, ") =", round(F_stat, 3), "\n")
cat("p-value =", format.pval(p_value, digits = 3), "\n")

# === STEP 4: Effect Size (Mahalanobis D²) ===
cat("\n=== Effect Size: Mahalanobis D² ===\n")
mean_diff <- colMeans(yoga_subset) - colMeans(control_subset)
pooled_cov <- ((n_yoga - 1) * cov(yoga_subset) + 
               (n_control - 1) * cov(control_subset)) / (n_yoga + n_control - 2)
D2 <- t(mean_diff) %*% solve(pooled_cov) %*% mean_diff
cat("Mahalanobis D² =", round(D2, 3), "\n")
cat("Mahalanobis D =", round(sqrt(D2), 3), "(analogous to Cohen's d)\n")
cat("Interpretation: D ≈", round(sqrt(D2), 2), "→ medium-large multivariate effect\n")

# === STEP 5: Follow-up Univariate Tests (if T² significant) ===
if (p_value < 0.05) {
  cat("\n=== Follow-up Univariate t-tests(Bonferroni-corrected) ===\n")
  alpha_corrected <- 0.05 / 3
  cat("Bonferroni-corrected α =", alpha_corrected, "\n\n")
  
  for (var in c("WM", "PS", "EF")) {
    t_result <- t.test(data[[var]] ~ data$group, var.equal = TRUE)
    cat(var, ": t(", t_result$parameter, ") = ", round(t_result$statistic, 3),
        ", p = ", format.pval(t_result$p.value, digits = 3),
        ifelse(t_result$p.value < alpha_corrected, " *", ""), "\n", sep = "")
  }
}

# === STEP 6: Visualization ===

# Scatterplot matrix
ggpairs(data, columns = c("WM", "PS", "EF"), 
        aes(color = group, alpha = 0.6),
        upper = list(continuous = "points"),
        lower = list(continuous = "cor"),
        diag = list(continuous = "densityDiag"),
        title = "Multivariate Cognitive Performance: Yoga vs. Control") +
  theme_bw()

# Confidence ellipses (2D projection)
library(ggplot2)
ggplot(data, aes(x = WM, y = EF, color = group)) +
  geom_point(alpha = 0.6, size = 2) +
  stat_ellipse(level = 0.95, size = 1.2) +
  labs(title = "95% Confidence Ellipses: Working Memory vs. Executive Function",
       x = "Working Memory(z-score)", y = "Executive Function(z-score)",
       color = "Group") +
  theme_classic() +
  theme(legend.position = "top")

# Bar plot with error bars (univariate means)
data_long <- tidyr::pivot_longer(data, cols = c(WM, PS, EF), 
                                  names_to = "Cognitive_Domain", 
                                  values_to = "Z_Score")

summary_stats <- data_long %>%
  group_by(group, Cognitive_Domain) %>%
  summarise(M = mean(Z_Score), SE = sd(Z_Score) / sqrt(n()), .groups = "drop")

ggplot(summary_stats, aes(x = Cognitive_Domain, y = M, fill = group)) +
  geom_bar(stat = "identity", position = position_dodge(0.8), width = 0.7) +
  geom_errorbar(aes(ymin = M - 1.96*SE, ymax = M + 1.96*SE), 
                position = position_dodge(0.8), width = 0.2) +
  labs(title = "Cognitive Performance by Group(Multivariate Analysis)",
       x = "Cognitive Domain", y = "Mean Z-Score ± 95% CI",
       fill = "Group") +
  scale_fill_brewer(palette = "Set2") +
  theme_classic() +
  geom_hline(yintercept = 0, linetype = "dashed", alpha = 0.5)

# === APA-Style Reporting ===
cat("\n=== APA-Style Report ===\n")
cat("A Hotelling's T² test was conducted to compare multivariate cognitive\n")
cat("performance(working memory, processing speed, executive function) between\n")
cat("yoga intervention and waitlist control groups. Assumptions were satisfied:\n")
cat("multivariate normality(Mardia's test p > .05 for both groups), homogeneity\n")
cat("of covariance matrices(Box's M test p =", format.pval(box_result$p.value, digits = 3), "), and\n")
cat("no multivariate outliers detected(all D² < χ²₀.₀₀₁). Results showed a\n")
cat("statistically significant multivariate effect, T²(3, 76) =", round(T2, 2), ",\n")
cat("F(3, 76) =", round(F_stat, 2), ", p < .001, Mahalanobis D =", round(sqrt(D2), 2), "\n")
cat("(large multivariate effect). Follow-up univariate tests with Bonferroni\n")
cat("correction(α = .017) indicated yoga participants showed significantly greater\n")
cat("improvements in all three cognitive domains: working memory(M = 0.40 vs. 0.00,\n")
cat("p < .001), processing speed(M = 0.35 vs. 0.00, p < .001), and executive\n")
cat("function (M = 0.45 vs. 0.00, p < .001). These findings support yoga as an\n")
cat("effective intervention for broad cognitive enhancement.\n")
Interpretation Blueprint

Hotelling's T²(3, 76) = 11.5, F(3, 76) = 3.73, p = .015, Mahalanobis D = 0.61 (medium-large multivariate effect). The yoga group showed significantly better cognitive performance across all three correlated domains (WM, PS, EF) compared to control. Follow-up univariate tests with Bonferroni correction confirmed significant improvements in each domain. Using Hotelling's T² instead of separate t-tests controls familywise Type I error and accounts for correlations between cognitive measures, providing more statistical power than Bonferroni-corrected univariate tests.

05Tactical Pivots

Alternatives

Structured fallback pathways for choosing alternative tests when normality or slopes requirements fail.

When the path is blocked, pivot. Rigor is not rigidity; it is the intelligent adaptation to reality.
Adaptive Strategy
Multivariate Precision Ladder Ideal · Ratio / Interval Vector
Ratio Vector
Maintain Hotelling logic. Optimal for auditing group differences across a cluster of related continuous markers.
Peak Precision
Interval Vector
Ideal for Primary Profiles. Ensure the outcome vector has a stable variance-covariance matrix.
Standard Profile
Ordinal / Nominal
Abandon T². Use Log-Linear Analysis or Multi-group Chi-Square to model categorical profiles.
Identity Loss
Temporal Trajectory Audit Multivariate Snapshot
Static Profile
Cross-sectional gap.
Stay with Hotelling T². Protecting global alpha across multiple related outcomes.
Repeated Profile
Vector over time.
Pivot to Repeated Measures MANOVA (Profile Analysis) to model multivariate recovery trajectories.
Adaptive Technical Safeguards · adaptive safeguards
matrix heterogeneity
  • James' T² Test — A robust alternative when the variance-covariance matrices are unequal across groups.
  • Bootstrapped T² Strike — Resample the entire multivariate vector to bypass normality mandates.
multicollinearity
  • PCA Pre-Reduction — Collapse the outcome vector into orthogonal components before the T² strike.
  • Step-Down Analysis — Audit the unique contribution of each outcome using Roy-Bargmann logic.
06Adjusted Comparisons

Post-hoc

Group mean comparisons and correction controls (e.g. Tukey HSD, Bonferroni) to protect against Family-Wise Error Rates.

The omnibus test opens the door; post-hoc analysis explores the room.
Forensic Detail
Adjusted Comparisons

Post-hoc pairwise tests defined for this model.

Interpretation Guidelines

Hotelling's T² is an omnibus test. If significant, follow-up analyses determine which specific variables contribute to group differences.

07Standardized scale impact

Effect Size

Understanding effect sizes (e.g., Cohen's d, Partial Eta-Squared) and clinical impact benchmarks.

Significance is noise. Magnitude is the signal. Measure the impact, not just the probability.
Impact Magnitude

Multivariate analog of Cohen's d. D² = (μ₁ - μ₂)ᵀ Σ⁻¹ (μ₁ - μ₂). Interpretation: D < 0.5 (small), 0.5-0.8 (medium), > 0.8 (large). Preferred for interpretability.

η²ₚ = T² / (T² + (n₁ + n₂ - 2)). Interpretation: .01 (small), .06 (medium), .14 (large). Biased upward in small samples.

Used in MANOVA contexts; represents maximum variance explained by group difference

Recommended Metric: Mahalanobis D (or D²) - standardized distance between multivariate means accounting for correlations
Small
0.2
Medium
0.5
Large
0.8
0.50
Mahalanobis D (or D²) - standardized distance between multivariate means accounting for correlations
Recommended Measure
3
Available Metrics
ReportUse Mahalanobis D (or D²) - standardized distance between multivariate means accounting for correlations to represent clinical impact magnitude.
08Statistical Power

Sample Size

Guidelines for minimum sample requirements and power analysis parameters.

An underpowered study is an ethical failure. Respect the data by collecting enough of it.
Power Protocol
Floor Requirements

The 'Matrix Stability' Mandate: A minimum of N > p + 20 participants per group is required (where p is the number of outcomes). Multivariate models mathematically collapse if the sample is too shallow to invert the covariance matrix.

Effect SizeParametersRequired n
Small EffectD=0.50 (Small), p=3n ≈ 170 total
Medium EffectD=0.80 (Medium), p=3n ≈ 72 total
Large EffectD=1.20 (Large), p=3n ≈ 36 total
Key considerations

The 'Outcome Inflation' Trap: Adding 'Noise Variables' to the outcome vector (outcomes not influenced by the treatment) will 'Choke' your power and mask real effects. Only include high-signal metrics in the Hotelling strike.

G*Power StrategyBenchmark: F-tests → Hotelling T²: Two groups. Parameters: Mahalanobis D, Number of DVs (p), α = .05, Power = .80. Note: Power decreases exponentially as you add more outcomes to the vector without increasing N.
09APA narrative blueprint

Reporting

How to compile statistical results into publication prose matching APA and journal style guides.

Data does not speak for itself. It requires a translator. Be clear, be precise, be honest.
Narrative Arc
Worked APA paragraph example
A Hotelling's T² test was conducted to compare yoga intervention and waitlist control groups on three cognitive performance measures: working memory, processing speed, and executive function. Assumptions were satisfied: multivariate normality (Mardia's skewness p = .23, kurtosis p = .45 for yoga; skewness p = .31, kurtosis p = .52 for control), homogeneity of covariance matrices (Box's M test, p = .18), and no multivariate outliers detected (all D² < χ²₀.₀₀₁ = 16.27). Results showed a statistically significant multivariate effect, T²(3, 76) = 11.5, F(3, 76) = 3.73, p = .015, Mahalanobis D = 0.61, indicating a medium-to-large multivariate effect. Follow-up univariate tests with Bonferroni correction (α = .017) revealed that the yoga group scored significantly higher than controls on all three measures: working memory (M = 0.40, SD = 1.01 vs. M = 0.00, SD = 0.98; p = .012), processing speed (M = 0.35, SD = 0.97 vs. M = 0.00, SD = 1.02; p = .008), and executive function (M = 0.45, SD = 1.03 vs. M = 0.00, SD = 0.99; p = .004). These findings support yoga as an effective intervention for broad cognitive enhancement across multiple correlated domains.
Reusable template

A Hotelling's T² test was conducted to compare brief description of groups on p dependent variables: list DVs. Assumptions were evaluated: multivariate normality (Mardia's/Henze-Zirkler test results), homogeneity of covariance matrices (Box's M test, p = .XXX), and multivariate outliers (number cases with D² > χ²₀.₀₀₁ detected and action taken). Results showed a significant/non-significant multivariate effect, T²(p, df) = X.XX, F(p, n₁+n₂-p-1) = X.XX, p = .XXX, Mahalanobis D = X.XX (interpret effect size: small/medium/large). If significant: Follow-up univariate tests with Bonferroni correction (α = .05/p) indicated that group 1 scored significantly higher/lower than group 2 on list significant DVs with means, SDs, and p-values. Conclude with interpretation in research context.

Essential statistics to report
  • T² statistic
  • F-statistic with degrees of freedom
  • p-value
  • Mahalanobis D or D² (effect size)
  • Descriptive statistics per group (M, SD, correlation matrix)
  • Assumption check results (Box's M p-value, normality tests)
  • Follow-up univariate test results if T² significant (with Bonferroni correction)
  • Number of multivariate outliers detected and how handled
10Exhibit Builder

Manuscript Lab

Copy standard summary tables and forensic reporting grids to outline analysis details.

Table 1: Hotelling's T² for Multivariate Group Comparison
ComparisonHotelling's T²F (approx)df1, df2p-valueConclusion
Group 1 ↔ Group 212.456.122, 77.003Significant Separation
Note. Multivariate Outcome Vector: [Score A, Score B]. N = 80.
p = .003Confirms Multivariate Divergence. Groups differ significantly when audited holistically, even if individual components (like Score B) appear overlapping.
Header glossary

The Multivariate Multiplier. Measures the 'distance' between group averages across all outcome dimensions, accounting for the correlations between them.

The Stability Test. Converts the T² into an F-distribution to determine statistical significance.

11Algorithmic Logic

Command Center

Syntax libraries and function parameters for executing calculations in stats packages.

Code is the modern laboratory. Clean execution ensures reproducible discovery.
Execution Engine
# 1. Execute Hotelling's T2
Hotelling::hotelling.test(matrix_a, matrix_b)

# 2. Robust Alternative (for non-normal data)
ICSNP::HotellingsT2(matrix_a, matrix_b)
Library stack
R
HotellingICSNPstats
Python
statsmodels.multivariate.manova
Elite Forensic Strike

Traditional univariate t-tests ignore 'Correlated Evidence'. If Score A and Score B both increase slightly (but not enough for p < .05 each), Hotelling's T² will correctly identify the combined signal.

# Visualize Centroid Separation (H-E Plot)
heplot::heplot(manova_model)
12The Over-adjustment Trap

Common Mistakes

Analytical caveats and corrections to maintain modeling integrity.

Wisdom is learning from the failures of others. Anticipate the error before it occurs.
Defensive Logic
Why it's wrong
Inflates familywise Type I error rate and ignores correlations between DVs. With p=3 DVs and α=.05 per test, familywise error ≈ 1-(1-.05)³ = .14 (14%, not 5%). Also, separate tests waste statistical power by not leveraging covariances.
The correction
Always use Hotelling's T² when comparing groups on multiple correlated DVs. This controls familywise error and accounts for covariance structure. Only conduct follow-up univariate tests with Bonferroni correction if T² is significant.
Why it's wrong
Hotelling's T² assumes equal covariance matrices. When violated with unequal sample sizes, Type I error rates become inflated (especially if smaller group has larger variance) or power is reduced.
The correction
If Box's M p < .001: (1) With equal n → T² is fairly robust, proceed with caution; (2) With unequal n → use Yao's test (multivariate Welch), permutation T², or analyze DVs separately with Welch's t-tests + Bonferroni correction. Always report Box's M results.
Why it's wrong
The covariance matrix becomes singular (non-invertible) when n ≤ p, making T² mathematically undefined. Even if n slightly > p, covariance estimation is highly unstable and power is near zero.
The correction
Ensure n₁, n₂ > p + 20 for reliable results. If n < p: (1) Reduce dimensionality using PCA and apply T² to principal components; (2) Use regularized T² with shrinkage covariance estimators; (3) Test DVs in subsets with Bonferroni correction; (4) Collect more data.
Why it's wrong
A case can be a multivariate outlier (extreme in multivariate space) without being univariate outliers on any single variable. Multivariate outliers inflate Mahalanobis distances and can severely distort T² results and effect sizes.
The correction
Always calculate Mahalanobis D² for each observation and flag cases with D² > χ²₀.₀₀₁,p. Investigate outliers: verify data entry, conduct sensitivity analysis (with/without outliers), or use robust T² methods (MCD covariance estimators).
Why it's wrong
The p-value only indicates statistical significance, not practical magnitude. With large samples, tiny trivial multivariate differences can be 'significant'. Effect size (Mahalanobis D) quantifies the standardized distance between group centroids.
The correction
Always report Mahalanobis D (or D²) with interpretation: D < 0.5 (small), 0.5-0.8 (medium), > 0.8 (large). This is analogous to Cohen's d but accounts for multivariate structure. Include confidence intervals when possible.
Why it's wrong
The standard two-sample Hotelling's T² assumes independent groups. Using it for paired data violates independence and wastes power by ignoring within-subject correlations.
The correction
Use paired Hotelling's T² instead: compute difference scores D = X₂ - X₁ for each subject, then test H₀: μ_D = 0 using one-sample Hotelling's T² on the difference vectors. Alternatively, use multivariate repeated measures ANOVA.
Why it's wrong
Univariate normality of each DV is necessary but not sufficient for multivariate normality. Variables can each be normally distributed but have non-normal joint distribution (e.g., non-elliptical contours).
The correction
Always test multivariate normality using Mardia's test (skewness & kurtosis), Henze-Zirkler test, or chi-square Q-Q plot of Mahalanobis D². Univariate Q-Q plots are supplementary, not sufficient.
Why it's wrong
Hotelling's T² is an omnibus test indicating that groups differ somewhere in multivariate space, but doesn't specify which specific DVs drive the difference. Reporting only T² leaves interpretation incomplete.
The correction
If T² is significant, conduct follow-up analyses: (1) Univariate t-tests on each DV with Bonferroni correction (α/p); (2) Discriminant analysis to identify the linear combination maximally separating groups; (3) Report means, SDs, and effect sizes for each DV.
13Academic Lineage

References

Scholarly lineage and citation keys grounding the statistical framework.

We stand on the shoulders of giants. Honor the source of the method.
Academic Lineage
[1]
Hotelling, H. (1931). The generalization of Student's ratio. Annals of Mathematical Statistics, 2(3), 360-378.
Original paper introducing Hotelling's T² statistic as multivariate extension of Student's t-test
doi: 10.1214/aoms/1177732979
[2]
Gothe, N. P., & McAuley, E. (2015). Yoga and cognition: A meta-analysis of chronic and acute effects. Journal of Physical Activity & Health, 12(3), 468-479.
Meta-analysis showing yoga improves multiple cognitive domains. Basis for Example 1 effect sizes
doi: 10.1123/jpah.2014-0008
[3]
Goyal, M., Singh, S., Sibinga, E. M., et al. (2014). Meditation programs for psychological stress and well-being: A systematic review and meta-analysis. JAMA Internal Medicine, 174(3), 357-368.
Evidence for meditation effects on emotional regulation. Basis for Example 2
doi: 10.1001/jamainternmed.2013.13018
[4]
Rencher, A. C., & Christensen, W. F. (2012). Methods of Multivariate Analysis (3rd ed.). Wiley.
Comprehensive textbook on multivariate methods including Hotelling's T², assumptions, Box's M test, and follow-up procedures
[5]
Mardia, K. V. (1970). Measures of multivariate skewness and kurtosis with applications. Biometrika, 57(3), 519-530.
Classic paper on Mardia's test for multivariate normality (skewness and kurtosis)
doi: 10.1093/biomet/57.3.519
[6]
Box, G. E. P. (1949). A general distribution theory for a class of likelihood criteria. Biometrika, 36(3/4), 317-346.
Introduction of Box's M test for equality of covariance matrices
doi: 10.2307/2332671
A variable is a point; a vector is a personality. Use Hotelling's T² to see if your intervention changed the entire character of the recovery.
The Interpretive Rigor Directive
statminds · Hotelling'sMind reference · v2.2 · updated 2026-01-1715 of 15 sections