Atlas
statminds
Hybrid GLM (Split-Plot Design)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

Mixed ANOVA

The engine for Longitudinal Discovery. Mixed ANOVA combines Between-Subjects groupings with Within-Subjects repeated measures to audit recovery trajectories.

Model familyHybrid GLM (Split-Plot Design)
Hypothesisomnibus
AliasesSplit-Plot ANOVA · Between-Within ANOVA · Mixed-Factorial Omnibus Test
G1
Trajectory Audit
Track how outcomes evolve across multiple timepoints for different treatment groups.
G2
Within-Between Synergy
Isolate the interaction between group membership and temporal change.
G3
Sphericity Neutralization
Correct for the inherent correlation between repeated measurements on the same participant.
Visual Overview Dashboard
1

What is it?

Mixed ANOVA (also Split-Plot ANOVA) incorporates one Between-Subjects factor and one Within-Subjects repeated measure to trace longitudinal recovery profiles.

2

When to use it

  • Between Factor: Independent treatment groups (e.g. Active vs Control).
  • Within Factor: Chronological repeated tests (e.g. Pre, Mid, Post).
  • Longitudinal Study: Track subjects over time.
3

Core Idea

It maps the divergence of trajectories. If the treatment works, the active group should show a steeper recovery slope than control:

PreMidPostControlActive

The Group × Time Interaction evaluates if the slopes diverge. A significant interaction indicates the rate of change differs between groups.

4

Hypotheses

H₀(Group): Groups are equal on average.
H₀(Time): Mean outcome is constant over time.
H₀(Interaction): Trajectory profiles are parallel.
5

How it works

Splits variance into two compartments:
1. **Between-Subjects**: Group vs Error(Subjects)
2. **Within-Subjects**: Time, Group×Time vs Error(Within)

6

Assumptions

⚖️ Homogeneity of Variance: Levene's test on groups.
🔮 Sphericity: Mauchly's test on repeated measures.
👥 Subject Independence: Separate patients in each group.
7

Important Note

If sphericity fails repeatedly, we adjust using the Greenhouse-Geisser (GG) corrections to reduce degrees of freedom and prevent false-positive inflation.

8

Quick Example

GroupPreMidPost
Treatment48.262.478.1
Control49.051.252.4
Interactive Sandbox

Mixed ANOVA Live Laboratory

Adjust Group shifts, Time trends, and Interactions to see how the Within-Between split partitions F-statistics.

Presets
Between Group Effect0
Within Time Effect+5
Group × Time Interaction0
Measurement Noise (σ)6
Subject Count per Group (N)8
Longitudinal Profile Plot (Gray: individual subject trajectories)Y-Axis: Outcome Score
20406080Treatment GroupControl GroupPre-TestMid-PointPost-Test
Mixed ANOVA Calculations Table
SourceSSdfMSFp-value
Between-Subjects Effects
Group1484.411484.46.870.0194
Error (Subj/Group)3027.114216.2--
Within-Subjects Effects
Time98.5249.21.820.1805
Group × Time101.7250.91.880.1711
Error (Within)757.02827.0--
Statistical Verdict
Group Effect (Treatment vs Control): ✅ Significant
Time Effect (Chronological Shift): ❌ Not Sig.
Divergence (Group × Time): ❌ NO Divergence
Parallel trajectories. Any improvement over time is equivalent across both groups, suggesting no specific treatment advantage.
The 12-Stage Precision Workflow
01Trajectory Logic
Hypotheses
We test if the 'Flow' of the outcome over time differs by group—the ultimate test for longitudinal efficacy.
02The Sphericity Mandate
Assumptions
Mauchly's test is the gatekeeper. We must ensure that the variances of differences between timepoints are equal.
03Correction Forensics
Diagnostics
Applying Greenhouse-Geisser or Huynh-Feldt 'shields' to adjust degrees of freedom when sphericity fails.
04Live Trajectories
Examples
Following FlowMotion participants from Baseline to 6, 12, and 24 weeks, auditing the divergence from Usual Care.
05Mixed Model Pivots
Alternatives
Knowing when to pivot to Linear Mixed Models (LMM) if participant dropout creates unbalanced, missing data strings.
06Temporal Precision
Post-hoc
Executing 'Simple Effects' to identify the EXACT timepoint where the FlowMotion group significantly pulls away from the control.
07Partial η²
Effect Size
Calculating the impact of 'Time', 'Group', and the 'Time x Group' interaction on the total variance landscape.
08Correlation Multiplier
Sample Size
Accounting for the Intraclass Correlation (ICC)—higher correlation between timepoints allows for smaller, more efficient samples.
09The Interaction Focus
Reporting
Describing the 'Diverging Slopes' narrative: how one group recovered while the other plateaued.
10Long vs Wide Logic
Software
Structuring data correctly to handle the hybrid nature of between-subject factors and within-subject repeated measures.
11The Independence Sin
Common Mistakes
The fatal error of treating repeated measures as independent observations, which leads to dangerously inflated p-values.
12Longitudinal Lineage
References
Grounding the analysis in the Split-Plot traditions and the modern evolution of Longitudinal Modeling.
01Hypothesis test logic

Hypotheses

Pragmatic null and alternative hypotheses defined in mathematical notation.

We test the null hypothesis of equality to prove the alternative of distinction.
Logic Core
Null · H₀

H₀: (1) All group means are equal (between-subjects main effect), (2) All repeated measure means are equal (within-subjects main effect), (3) No Group × Time interaction

Alternative · Hₐ

Hₐ: At least one main effect or interaction is significant

Why it matters omnibus

Tests three hypotheses: between-subjects main effect, within-subjects main effect, and interaction. The interaction is often the primary hypothesis in treatment studies: Does the pattern of change over time differ between groups? If interaction is significant (p<α), follow up with simple effects analysis.

02Model diagnostics

Assumptions

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

Variance homogeneity is a key assumption, though ANOVA is robust to moderate inequality when group sizes are equal. Severe inequality requires Welch's adjustment to prevent distorted p-values.
Integrity Shield
9
Assumptions
6
Critical / High Severity
How to check
Quick
Inspect variable type; create histograms to verify scale is not discrete/categorical. Check sufficient range and variability
Rigorous
Formal measurement scale validation; verify measurement units are truly interval/ratio with equal intervals. Assess floor/ceiling effects
If violated
If ordinal with limited categories (e.g., Likert 1-5) → use nonparametric methods (Friedman test with between-subjects stratification) or ordinal mixed model. If many ordinal levels (7+) and approximately interval-like → may proceed cautiously (robust to mild violations). If binary → use generalized linear mixed model (GLMM) with binomial family. If count → use GLMM with Poisson/negative binomial family
friedman
How to check
Quick
Verify study design; confirm each subject belongs to exactly one group. Check that group assignment is categorical (e.g., Treatment vs. Control, not continuous dose). Verify random assignment if experimental
Rigorous
Check randomization scheme; verify no subject appears in multiple groups; ensure mutually exclusive group assignment. Confirm IV represents discrete categories, not a continuous variable artificially binned
If violated
If groups are not independent (e.g., matched pairs, twins) → use two-way repeated measures ANOVA with both factors as within-subjects. If groups are nested/clustered → use three-level mixed model with random effects for clusters. If IV is continuous (e.g., age, dosage as numeric predictor) → use linear mixed model with continuous predictor instead of ANOVA
linear mixed model
How to check
Quick
Verify study design; confirm same subjects measured multiple times (e.g., baseline, post-test, follow-up). Check that subject IDs appear multiple times in dataset (once per time point). Verify temporal ordering if time-based
Rigorous
Examine data structure; each subject should have k observations (where k = number of within-subjects levels). Check for missing data patterns. Verify measurement occasions are comparable (same instrument, same conditions)
If violated
If measurements are NOT on same subjects (e.g., different participants at each time point) → use two-way between-subjects ANOVA instead. If some subjects have different numbers of measurements → use linear mixed model which handles unbalanced data. If 'time points' are actually different conditions that could be randomized → verify it's truly repeated measures
linear mixed model
How to check
Quick
Design review: Check if subjects are clustered (e.g., students in schools, patients in clinics). Look for family/sibling relationships. Verify random sampling from population
Rigorous
Calculate intraclass correlation (ICC) to detect clustering beyond factors in model. Check for autocorrelation if subjects recruited sequentially. Verify no contamination or carryover between subjects
If violated
If additional clustering exists (e.g., students nested in schools) → use three-level mixed model with random effects for clusters: lmer(outcome ~ group*time + (1|cluster/subject)). If subjects are related (families, twins) → include family random effects. If pseudo-replication (multiple measurements incorrectly treated as independent subjects) → restructure as proper repeated measures. Document and model all sources of non-independence
How to check
Quick
Boxplots by group and time; identify values >1.5 IQR beyond quartiles. Check for extreme standardized residuals (|z|>3) within each cell
Rigorous
Fit preliminary model and extract studentized residuals (|r|>3 suspect). Calculate Cook's distance (D>4/n flagged). Check leverage values (hat>2p/n). Create influence plots. Examine outliers in context: data entry errors vs. legitimate extreme values
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 mixed models with M-estimators or trimmed means; (3) Winsorize extreme values to 5th/95th percentiles (pre-specify threshold); (4) Transform DV if outliers due to skewness (log, sqrt, Box-Cox); (5) Use linear mixed model which is more robust to outliers than traditional ANOVA. Never remove outliers solely to achieve p<.05; document all decisions transparently
linear mixed model
How to check
Quick
Q-Q plots of overall residuals; histograms of residuals per group or time point; check for severe skewness or heavy tails. With many cells, check overall residual distribution as proxy
Rigorous
Shapiro-Wilk test on overall residuals or per cell if n_cell ≥5 (p>.05 desired). Anderson-Darling test. Check skewness (<|2|) and kurtosis (<|7|). Plot residuals vs. fitted values to detect patterns
If violated
If mild violation with balanced design and n≥20 per group: Mixed ANOVA is robust via Central Limit Theorem; proceed with caution. If moderate-severe non-normality: (1) Transform DV (log for right-skew, sqrt for count-like, inverse for severe right-skew, Box-Cox optimal transformation); (2) Use linear mixed model with REML (more robust); (3) Bootstrap confidence intervals (resampling-based inference); (4) Permutation test; (5) For binary/count outcomes, use GLMM with appropriate family. Report transformation/approach used
linear mixed model
How to check
Quick
Levene's test on between-subjects groups (p>.05 indicates equal variances); can test on baseline data or residuals. Boxplots by group should show similar spread. Check ratio of largest to smallest variance (<3:1 acceptable)
Rigorous
Bartlett's test (sensitive to normality). Brown-Forsythe test (median-based, more robust). Plot residuals vs. fitted values by between-subjects groups; check for funnel patterns. Formal: Extract residuals from full model and test variance equality across groups
If violated
If Levene's p<.05 (unequal variances): (1) Transform DV (log if variance increases with mean; sqrt for counts); (2) Use linear mixed model with heterogeneous variance structure allowing different variances per group (nlme::lme with weights=varIdent(form=~1|group)); (3) Use robust standard errors (sandwich estimators); (4) Welch-type corrections for between-subjects comparisons. Report variance heterogeneity and corrections applied. Do NOT use standard F-tests without correction
How to check
Quick
Mauchly's test of sphericity (p>.05 indicates sphericity met). Software (ezANOVA, SPSS, pingouin) provides Mauchly's W statistic automatically. Check epsilon (ε) values: Greenhouse-Geisser (conservative), Huynh-Feldt (liberal)
Rigorous
Mauchly's test; if violated (p<.05), examine epsilon: ε<.75 indicates serious violation. Inspect covariance matrix of within-subjects measures: check if variances of all pairwise differences are approximately equal. For k time points, there are k(k-1)/2 pairwise differences to examine
If violated
If Mauchly's p<.05 (sphericity violated): (1) REQUIRED: Apply Greenhouse-Geisser correction (conservative; use if ε<.75) or Huynh-Feldt correction (less conservative; use if ε>.75) to adjust degrees of freedom and p-values for within-subjects effects; (2) BETTER: Use multivariate approach (MANOVA) which doesn't assume sphericity but requires more subjects; (3) BEST: Use linear mixed model which flexibly models covariance structure without sphericity assumption (specify AR(1), unstructured, or compound symmetry). NEVER report uncorrected F-tests when Mauchly's p<.05. Always report ε and corrected p-values
linear mixed model
How to check
Quick
Box's M test (p>.001 indicates equality; use conservative α due to test sensitivity). Available in SPSS (Repeated Measures ANOVA options). Visual: Compare correlation matrices of within-subjects measures across groups
Rigorous
Box's M test on covariance matrices. Note: Very sensitive to departures from normality and large sample sizes (often significant even with minor violations). Consider practical significance: If group covariance matrices look similar visually, minor violations may be ignorable
If violated
Box's M is very sensitive; minor violations are often acceptable if groups are balanced (equal n). If p<.001 (severe violation): (1) Check group balance; if balanced, proceed cautiously (mixed ANOVA is robust); (2) If unbalanced, use multivariate approach (MANOVA) which is more robust; (3) BEST: Use linear mixed model with separate covariance structures per group (nlme allows group-specific covariance matrices); (4) Transform DV. Report Box's M result but interpret cautiously given test sensitivity
03Residual Forensics

Diagnostics

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

Trust, but verify. Outliers can reveal critical data quality issues or genuine subgroup effects that averages obscure.
System Health
Essential checks
  1. Mauchly's test of sphericity for within-subjects factor
  2. Levene's test for homogeneity of variance across between-subjects groups
  3. Q-Q plots of residuals to assess normality
  4. Interaction plot (Group × Time) to visualize interaction pattern
  5. Greenhouse-Geisser or Huynh-Feldt epsilon (ε) if sphericity violated
Recommended checks
  1. Boxplots by group and time to identify outliers
  2. Residuals vs. fitted values plot to check homoscedasticity
  3. Profile plots showing mean trajectory for each group
  4. Descriptive statistics (M, SD, n) for each group×time cell
  5. Cook's distance to identify influential cases
  6. Simple effects analysis if interaction significant
  7. Box's M test for homogeneity of covariance matrices
  8. Effect size plots (means with 95% CI by group and time)
  9. Within-subjects correlation matrix (check compound symmetry)
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

Treatment Efficacy Over Time (2×3 Mixed Design)

Research question: Does CBT reduce anxiety more than waitlist control over 8 weeks? Design: 2 (Group: CBT vs. Control, between) × 3 (Time: Baseline, Week 4, Week 8, within). Outcome: State-Trait Anxiety Inventory (STAI) score (continuous, 20-80, higher=more anxiety). Sample: 80 participants (40 CBT, 40 Control). Hypothesis: Significant Group × Time interaction (CBT shows greater reduction than Control over time).

Design2 (Group: between) × 3 (Time: within)
Outcome ScaleSTAI anxiety score (20-80)
# Mixed-design ANOVA: Group (between) × Time (within)
# Clinical trial: CBT vs. Control for anxiety reduction

library(ez)          # ezANOVA for mixed designs
library(emmeans)     # Marginal means and contrasts
library(ggplot2)
library(dplyr)
library(tidyr)
library(car)         # Levene's test

# Simulate realistic clinical trial data
set.seed(2025)
n_per_group <- 40
time_points <- c("Baseline", "Week4", "Week8")

# Create between-subjects design
data_between <- data.frame(
  subject_id = 1:80,
  group = rep(c("CBT", "Control"), each=n_per_group),
  baseline_anxiety = rnorm(80, mean=52, sd=10)  # Individual differences
) %>%
  mutate(baseline_anxiety = pmax(25, pmin(75, baseline_anxiety)))

# Generate longitudinal data (repeated measures)
data_long <- data_between %>%
  crossing(time = factor(time_points, levels=time_points)) %>%
  mutate(
    time_numeric = as.numeric(time) - 1,  # 0, 1, 2
    
    # True effects:
    # CBT reduces anxiety by -4 pts per timepoint
    # Control reduces by -1 pt (placebo/natural improvement)
    # Within-subject correlation ~0.65
    
    group_effect = ifelse(group == "CBT", -4, -1),
    
    # STAI = Baseline + Group×Time + error
    stai_score = baseline_anxiety + group_effect * time_numeric +
                 rnorm(n(), mean=0, sd=4),  # Within-subject error
    stai_score = pmax(20, pmin(80, stai_score))
  ) %>%
  select(subject_id, group, time, stai_score)

# Convert to factors
data_long$subject_id <- factor(data_long$subject_id)
data_long$group <- factor(data_long$group)
data_long$time <- factor(data_long$time, levels=time_points)

cat("=== Data Structure ===")
cat("\nTotal participants:", length(unique(data_long$subject_id)))
cat("\nTotal observations:", nrow(data_long))
cat("\nDesign: 2 (Group) × 3 (Time) mixed ANOVA\n")

# Descriptive statistics
cat("\n=== Descriptive Statistics ===")
desc_stats <- data_long %>%
  group_by(group, time) %>%
  summarise(n = n(), M = mean(stai_score), SD = sd(stai_score), .groups='drop')
print(desc_stats)

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

cat("\n\n=== ASSUMPTION CHECKS ===")

# 1. Normality of residuals
model_prelim <- lm(stai_score ~ group * time, data=data_long)
residuals_all <- residuals(model_prelim)

cat("\n1. Normality of Residuals")
shapiro_test <- shapiro.test(sample(residuals_all, min(5000, length(residuals_all))))
cat("\n   Shapiro-Wilk: W=", round(shapiro_test$statistic, 4), 
    ", p=", round(shapiro_test$p.value, 3))
cat(ifelse(shapiro_test$p.value > 0.05, " ✓", " ⚠"), "\n")

# Q-Q plot and histogram
par(mfrow=c(1,2))
qqnorm(residuals_all, main="Q-Q Plot: Residuals")
qqline(residuals_all, col="red", lwd=2)
hist(residuals_all, breaks=30, main="Histogram: Residuals", 
     xlab="Residuals", col="lightblue")

# 2. Homogeneity of variance (between-subjects)
cat("\n2. Homogeneity of Variance(Between-Subjects)")
levene_test <- leveneTest(stai_score ~ group, 
                          data=filter(data_long, time=="Baseline"))
cat("\n   Levene's test: F=", round(levene_test$`F value`[1], 3),
    ", p=", round(levene_test$`Pr(>F)`[1], 3))
cat(ifelse(levene_test$`Pr(>F)`[1] > 0.05, " ✓", " ⚠"), "\n")

# Boxplots by group
par(mfrow=c(1,1))
ggplot(data_long, aes(x=time, y=stai_score, fill=group)) +
  geom_boxplot() +
  labs(title="STAI Anxiety by Group and Time",
       x="Time Point", y="STAI Anxiety Score",
       fill="Group") +
  theme_classic() +
  scale_fill_manual(values=c("CBT"="#66c2a5", "Control"="#fc8d62"))

# 3. Sphericity (within-subjects factor: Time)
cat("\n3. Sphericity(Within-Subjects Factor: Time)")
cat("\n   Note: Sphericity tested automatically in ezANOVA output below")
cat("\n   If Mauchly's p<.05 → use Greenhouse-Geisser or Huynh-Feldt correction\n")

# === STEP 2: Run Mixed-design ANOVA ===

cat("\n\n=== MIXED-DESIGN ANOVA ===")

# Using ezANOVA (automatically tests sphericity and provides corrections)
anova_result <- ezANOVA(
  data = data_long,
  dv = stai_score,
  wid = subject_id,
  within = time,
  between = group,
  type = 3,
  detailed = TRUE,
  return_aov = TRUE
)

print(anova_result$ANOVA)

cat("\n=== Sphericity Tests(Mauchly's) ===")
if(!is.null(anova_result$`Mauchly's Test for Sphericity`)) {
  print(anova_result$`Mauchly's Test for Sphericity`)
  cat("\nIf p<.05, sphericity violated → use corrections below\n")
}

cat("\n=== Sphericity Corrections ===")
if(!is.null(anova_result$`Sphericity Corrections`)) {
  print(anova_result$`Sphericity Corrections`)
  cat("\nGreenhouse-Geisser(GGe): Conservative(use if ε<.75)")
  cat("\nHuynh-Feldt(HFe): Less conservative(use if ε>.75)\n")
}

# === STEP 3: Interpret Results ===

cat("\n\n=== INTERPRETATION ===")

cat("\n1. BETWEEN-SUBJECTS MAIN EFFECT(Group):")
cat("\n   Tests if CBT differs from Control averaged across all time points")
cat("\n   If p<.05 → CBT and Control differ overall\n")

cat("\n2. WITHIN-SUBJECTS MAIN EFFECT(Time):")
cat("\n   Tests if anxiety changes over time(averaged across groups)")
cat("\n   If p<.05 → Significant change from Baseline to Week 4 to Week 8")
cat("\n   CHECK SPHERICITY! Use GG or HF p-value if Mauchly's p<.05\n")

cat("\n3. GROUP × TIME INTERACTION(PRIMARY HYPOTHESIS):")
cat("\n   Tests if rate of change over time differs between CBT and Control")
cat("\n   If p<.05 → CBT shows different trajectory than Control(EXPECTED!)")
cat("\n   This is the KEY test for treatment efficacy in clinical trials\n")

# === STEP 4: Visualize Interaction ===

cat("\n\n=== VISUALIZATION ===")

# Interaction plot: Group × Time
interaction_means <- data_long %>%
  group_by(group, time) %>%
  summarise(M = mean(stai_score), 
            SE = sd(stai_score)/sqrt(n()),
            .groups='drop')

ggplot(interaction_means, aes(x=time, y=M, color=group, group=group)) +
  geom_line(size=1.5) +
  geom_point(size=4) +
  geom_errorbar(aes(ymin=M-1.96*SE, ymax=M+1.96*SE), width=0.15) +
  labs(title="Group × Time Interaction: CBT vs. Control",
       subtitle="Mean STAI Anxiety Score ± 95% CI",
       x="Time Point", y="Anxiety(STAI)",
       color="Group") +
  theme_classic(base_size=14) +
  theme(legend.position="bottom") +
  scale_color_manual(values=c("CBT"="#2E86AB", "Control"="#A23B72")) +
  ylim(30, 60)

# Profile plot showing individual trajectories (sample)
data_sample <- data_long %>% 
  filter(subject_id %in% sample(unique(subject_id), 20))

ggplot(data_sample, aes(x=time, y=stai_score, group=subject_id, color=group)) +
  geom_line(alpha=0.4) +
  geom_point(alpha=0.4, size=2) +
  facet_wrap(~group) +
  labs(title="Individual Trajectories(Sample of 10 per Group)",
       x="Time Point", y="STAI Anxiety Score") +
  theme_classic()

# === STEP 5: Post-hoc Tests (if interaction significant) ===

cat("\n\n=== POST-HOC: Simple Effects Analysis ===")

# If Group×Time interaction is significant, test simple effects:
# (1) Effect of Group at each Time point

cat("\nSimple effects: CBT vs. Control at each time point\n")

emm_time <- emmeans(anova_result$aov, ~ group | time)
pairs_by_time <- pairs(emm_time, adjust="bonferroni")
print(pairs_by_time)

cat("\nInterpretation: Compare CBT vs. Control at Baseline, Week 4, Week 8")
cat("\nExpected: No difference at Baseline(randomization);")
cat("\n          CBT < Control at Week 4 and Week 8 (treatment effect)\n")

# (2) Effect of Time within each Group
cat("\n\nSimple effects: Time effect within each group\n")

emm_group <- emmeans(anova_result$aov, ~ time | group)
pairs_by_group <- pairs(emm_group, adjust="bonferroni")
print(pairs_by_group)

cat("\nInterpretation: Test if anxiety changes over time within CBT and Control")
cat("\nExpected: Large decline in CBT; small/no decline in Control\n")

# === STEP 6: Effect Sizes ===

cat("\n\n=== EFFECT SIZES ===")

# Partial eta-squared from ezANOVA output
cat("\nPartial η² for each effect(from ANOVA table above):")
cat("\n  - Group(between): Variance explained by group differences")
cat("\n  - Time(within): Variance explained by time trend")
cat("\n  - Group×Time: Variance explained by differential trajectories")
cat("\nInterpretation: .01=small, .06=medium, .14=large(Cohen, 1988)\n")

# Calculate Cohen's d for key comparison: CBT vs. Control at Week 8
week8_data <- filter(data_long, time=="Week8")
cbt_8 <- filter(week8_data, group=="CBT")$stai_score
control_8 <- filter(week8_data, group=="Control")$stai_score

cohens_d <- (mean(cbt_8) - mean(control_8)) / 
            sqrt((var(cbt_8) + var(control_8)) / 2)

cat("\nCohen's d(CBT vs. Control at Week 8):", round(cohens_d, 2))
cat("\nInterpretation: .2=small, .5=medium, .8=large")
cat("\nExpected d ~ -0.6 to -0.8 (negative = CBT lower anxiety)\n")

# === STEP 7: Bootstrap Confidence Intervals ===

cat("\n\n=== BOOTSTRAP CI for Group Difference at Week 8 ===")

library(boot)

# Bootstrap function
boot_diff <- function(data, indices) {
  d <- data[indices, ]
  cbt_mean <- mean(d$stai_score[d$group=="CBT"])
  control_mean <- mean(d$stai_score[d$group=="Control"])
  return(cbt_mean - control_mean)
}

boot_results <- boot(data=week8_data, statistic=boot_diff, R=2000)
boot_ci <- boot.ci(boot_results, type="bca")  # Bias-corrected accelerated

cat("\nMean difference(CBT - Control):", round(boot_results$t0, 2), "points")
cat("\n95% BCa Bootstrap CI: [", 
    round(boot_ci$bca[4], 2), ",", 
    round(boot_ci$bca[5], 2), "]")
cat("\nInterpretation: We are 95% confident the true difference is in this range\n")

# === APA-Style Reporting ===

cat("\n\n=== APA-STYLE REPORT ===")
cat("
A 2 (Group: CBT vs. Control, between-subjects) × 3 (Time: Baseline, Week 4, 
Week 8, within-subjects) mixed-design ANOVA was conducted to examine the 
effectiveness of CBT for anxiety reduction. The sample included 80 participants 
(40 CBT, 40 Control) measured at three time points(N=240 observations).

Assumptions were evaluated: Residuals were approximately normally distributed 
(Shapiro-Wilk W=.XX, p=.XX). Levene's test indicated homogeneity of variance 
across groups(F(1,78)=X.XX, p=.XX). Mauchly's test of sphericity was 
[non-significant / significant] for the Time factor(W=.XX, p=.XX); 
[no correction was needed / Greenhouse-Geisser correction was applied with ε=.XX].

Results revealed a significant Group×Time interaction, F(2, 156)=XX.XX, p<.001, 
partial η²=.XX(large effect), indicating that CBT and Control groups showed 
different trajectories over time. Simple effects analysis showed that at baseline, 
CBT(M=52.1, SD=10.2) and Control(M=51.8, SD=9.8) did not differ(p=.89), 
confirming successful randomization. At Week 4, CBT showed significantly lower 
anxiety(M=48.2, SD=9.5) than Control(M=50.7, SD=9.2), p=.02, d=-0.27 (small 
effect). By Week 8, this difference increased substantially: CBT(M=44.3, SD=9.1) 
versus Control(M=50.1, SD=8.9), p<.001, d=-0.64 (medium-large effect). Bootstrap 
analysis confirmed the Week 8 difference: mean=-5.8 points, 95% CI [-8.2, -3.4].

The main effect of Time was significant, F(2, 156)=XX.XX, p<.001, partial η²=.XX, 
indicating overall anxiety reduction across time points. The main effect of Group 
was [significant/non-significant], F(1, 78)=X.XX, p=.XX, partial η²=.XX.

These findings demonstrate that CBT is effective for anxiety reduction, with 
therapeutic benefits emerging by Week 4 and strengthening through Week 8. The 
medium-large effect size at Week 8 (d=-0.64) is consistent with meta-analytic 
estimates of CBT efficacy for anxiety disorders(Hofmann et al., 2012).
")

cat("\n\n=== KEY REPORTING ELEMENTS ===")
cat("
✓ Design clearly specified(2×3 mixed)
✓ Sample size and group sizes reported(n=40 per group)
✓ Assumption checks reported(normality, homogeneity, sphericity)
✓ Sphericity corrections applied if needed(GG or HF)
✓ All effects reported: Group×Time, Time, Group with F, df, p, partial η²
✓ Simple effects analysis for significant interaction
✓ Effect sizes for key comparisons(Cohen's d)
✓ Bootstrap CI for robustness
✓ Means, SDs, and CIs for each cell
✓ Interpretation linked to research question and literature
")
Interpretation Blueprint

Group×Time interaction F(2,156)=28.4, p<.001, partial η²=.27 (large effect): CBT shows significantly steeper decline (−4 pts/timepoint) than Control (−1 pt/timepoint). At Week 8, Cohen's d=−0.64 (medium-large effect), with CBT participants scoring 5.8 points lower (95% CI [−8.2, −3.4]). Main effect of Time: F(2,156)=45.2, p<.001, ε=.92 (sphericity satisfied). Findings demonstrate robust CBT efficacy for anxiety reduction, with therapeutic benefits emerging by Week 4 and strengthening through Week 8, consistent with meta-analytic evidence (Hofmann et al., 2012).

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
Measurement Precision Ladder Ideal · Ratio / Interval
Ratio
Maintain Mixed ANOVA. Optimal for tracking recovery units (e.g., blood markers, range of motion).
Peak Signal
Interval
Ideal for Patient Reported Outcomes. Ensure the 'Rate of Change' is linear across the follow-up window.
Standard Precision
Ordinal
Pivot to Ordinal GEE or Non-parametric Mixed Models if stages are ordered but units are unequal.
Rank Compression
Nominal
Abandon ANOVA. Use McNemar-Bowker or Multilevel Logistic to model directional status flips.
Information Suicide
Temporal Trajectory Audit Hybrid Between-Within
Repeated
3-5 timepoints.
Stay with Mixed ANOVA. The balanced path for clinical recovery trajectories.
Unbalanced
High missing data.
Pivot to Linear Mixed Models (LMM) to preserve participants with incomplete time-strings.
Continuous Time
Random visit dates.
Pivot to LMM with continuous time-slopes to account for varying follow-up windows.
Adaptive Technical Safeguards · adaptive safeguards
sphericity violation
  • Greenhouse-Geisser Shield — Conservative correction for unequal variances of differences.
  • Huynh-Feldt Pivot — A more liberal correction if epsilon is near 1.0.
  • MANOVA Path — Abandon sphericity entirely by treating timepoints as a multivariate vector.
Unequal variances
  • Robust Standard Errors — Protect group comparisons from heterogeneous spread across sites.
  • GLS Variance Modeling — Explicitly model the variance structure per group.
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

For significant Group×Time interaction, conduct simple effects: (1) Group effect at each time point; (2) Time effect within each group. Apply appropriate multiple comparison corrections to control familywise error rate.

07Standardized scale impact

Effect Size

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

Eta-squared tells you the 'ownership' of variance. How much of the outcome does your treatment actually control?
Impact Magnitude

Proportion of variance in DV attributable to effect, excluding variance from other effects. Small: .01, Medium: .06, Large: .14 (Cohen, 1988). Most commonly reported in mixed ANOVA.

Proportion of total variance including between-subjects variance. More appropriate for mixed designs. Provides comparable effect sizes across different designs.

Standardized mean difference for pairwise comparisons. Small: .2, Medium: .5, Large: .8. Calculate for key simple effects (e.g., treatment vs. control at final timepoint).

Less biased than η²; estimates population effect size accounting for sampling variability. Interpretation same as η² but more conservative.

Recommended Metric: Partial η² for omnibus effects (from ANOVA table); Cohen's d for specific pairwise comparisons; generalized η² for cross-design comparisons
Small
0.2
Medium
0.5
Large
0.8
0.50
Partial η² for omnibus effects (from ANOVA table); Cohen's d for specific pairwise comparisons; generalized η² for cross-design comparisons
Recommended Measure
4
Available Metrics
ReportUse Partial η² for omnibus effects (from ANOVA table); Cohen's d for specific pairwise comparisons; generalized η² for cross-design comparisons 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

Longitudinal Mandate: A minimum of 25 participants per between-subjects group is required to stabilize the trajectory audit, assuming at least 3 temporal measurements.

Effect SizeParametersRequired n
Small Effectf=.10 (Small)n ≈ 158 total
Medium Effectf=.25 (Medium)n ≈ 34 total
Large Effectf=.40 (Large)n ≈ 18 total
Key considerations

Missing data is the 'Cancer' of Mixed ANOVA. A 20% attrition buffer is non-negotiable. If correlation between timepoints is low (r < .30), the sample size must double to maintain the same discovery threshold.

G*Power StrategyBenchmark: F-tests → ANOVA: Repeated measures, within-between interaction. Parameters: 2 groups, 3 timepoints, α = .05, Power = .80, Correlation among measures = 0.5. The 'Temporal Multiplier': Higher correlation between timepoints increases power.
09APA narrative blueprint

Reporting

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

Report the F-statistic as the signal-to-noise ratio, showing how much of the variance is driven by treatment differences versus background noise.
Narrative Arc
Worked APA paragraph example
A 2 (Group: CBT vs. Control, between-subjects) × 3 (Time: Baseline, Week 4, Week 8, within-subjects) mixed-design ANOVA examined CBT effectiveness for anxiety reduction. The sample included 80 participants (40 per group) measured at three time points (N=240 observations). Assumptions were met: Residuals were normally distributed (Shapiro-Wilk W=.98, p=.12), Levene's test indicated homogeneity of variance (F(1,78)=1.52, p=.22), and Mauchly's test showed sphericity was satisfied for Time (W=.94, p=.08). Results revealed a significant Group×Time interaction, F(2, 156)=28.42, p<.001, partial η²=.27 (large effect), indicating that CBT and Control groups showed different anxiety trajectories over time. Simple effects analysis showed that at baseline, groups did not differ (p=.89), confirming successful randomization. At Week 4, CBT showed significantly lower anxiety (M=48.2, SD=9.5) than Control (M=50.7, SD=9.2), t(78)=2.31, p=.024, d=-0.27 (small effect). By Week 8, this difference increased substantially: CBT (M=44.3, SD=9.1) versus Control (M=50.1, SD=8.9), t(78)=5.68, p<.001, d=-0.64 (medium-large effect; 95% CI [-8.2, -3.4]). The main effect of Time was significant, F(2, 156)=45.23, p<.001, partial η²=.37, indicating overall anxiety reduction across time points. The main effect of Group was non-significant, F(1, 78)=3.12, p=.081, partial η²=.04. These findings demonstrate that CBT is effective for anxiety reduction, with therapeutic benefits emerging by Week 4 and strengthening through Week 8 (Cohen's d=-0.64 at endpoint), consistent with meta-analytic estimates of CBT efficacy for anxiety disorders (Hofmann et al., 2012).
Reusable template

A k (Between-factor: levels, between-subjects) × j (Within-factor: levels, within-subjects) mixed-design ANOVA was conducted to examine research question. The sample included N participants (n per group per between-factor group) measured at j time points (N=total observations observations). Assumptions were evaluated: Report normality (Shapiro-Wilk), homogeneity of variance for between-subjects factor (Levene's test), sphericity for within-subjects factor (Mauchly's test). If sphericity violated: Mauchly's test indicated sphericity was violated for factor/interaction (W=.XX, p=.XX), so Greenhouse-Geisser/Huynh-Feldt correction was applied (ε=.XX). Results revealed report interaction first if significant, then main effects. For significant interaction: The Between × Within interaction was significant, F(df1, df2)=X.XX, p=.XXX, partial η²=.XX interpret effect size, indicating that describe pattern. Simple effects analysis showed describe key patterns with specific comparisons, p-values, and effect sizes. Main effects: The main effect of Between-factor was significant/non-significant, F(df1, df2)=X.XX, p=.XX, partial η²=.XX. The main effect of Within-factor was significant/non-significant, F(df1, df2)=X.XX, p=.XX, partial η²=.XX if sphericity corrected, report corrected df and p. Conclude with interpretation in context of research question and literature.

Essential statistics to report
  • F-statistic for each main effect and interaction
  • Degrees of freedom (numerator and denominator)
  • p-value
  • Effect size (partial η² for omnibus, Cohen's d for pairwise)
  • Descriptive statistics per cell (M, SD, n)
  • Sphericity test (Mauchly's W, p-value, ε) and corrections applied
  • Levene's test for between-subjects homogeneity
  • Post-hoc test results with adjusted p-values for significant effects
  • Confidence intervals for key comparisons
  • Statement about assumption checks
10Exhibit Builder

Manuscript Lab

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

Table 1: Mixed ANOVA Summary for Treatment Efficacy over Time
SourceType III SSdfMSFpηp²
Group (Between)45.2145.28.12.005.06
Time (Within)112.81.670.522.45< .001.16
Group × Time38.41.624.07.64.002.06
Error372.1188.83.14
Note. Adjusted for Sphericity (GG). N = 120 (60 per group).
Group × Time (p=.002)This interaction is the 'Clinical Proof'. It confirms the Treatment Group's recovery curve is significantly steeper than the Control.
Time (ηp² = .16)A large effect size for recovery, indicating time is a dominant driver of variance in this cohort.
Header glossary

The 'Gold Standard' audit. Tests for global differences between independent groups regardless of time.

The 'Recovery' audit. Tests if the population as a whole changed over the intervals.

The 'Efficacy' audit. The critical interaction—proves if one group recovered faster than the other.

Statistical Currency. Note the separation of degrees of freedom into Group-level and Subject-level pools.

Relative Impact. The percentage of variance uniquely explained by each factor within its respective partition.

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 Mixed ANOVA
model <- aov_ez(id = 'subject_id', dv = 'score', data = df, 
                between = 'group', within = 'time')

# 2. Extract Group-specific Trajectories
emmeans(model, ~ time | group)
Library stack
R
afexemmeansggplot2
Python
pingouinseaborn
Elite Forensic Strike

Audit the homogeneity of covariance matrices (Box's M) to ensure group comparison integrity.

# 12-Stage Assumption Audit
performance::check_model(model)

# Generate Instant Manuscript Paragraph
report::report(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
When sphericity is violated (Mauchly's p<.05), the F-test for within-subjects effects and interactions involving within-subjects factors becomes invalid—it is too liberal, inflating Type I error. Sphericity assumes equal variances of differences between all pairs of within-subjects levels. Violation means some pairwise differences have larger variance than others, distorting the F-distribution. Using uncorrected F-tests can lead to false positives.
The correction
ALWAYS check Mauchly's test. If p<.05, REQUIRED: Apply Greenhouse-Geisser correction (if ε<.75, conservative) or Huynh-Feldt correction (if ε≥.75, less conservative) to adjust degrees of freedom and p-values. Report: 'Mauchly's test indicated sphericity was violated (W=.68, p=.02), so Greenhouse-Geisser correction was applied (ε=.81). The corrected within-subjects effect: F_GG(1.62, 126.4)=23.4, p<.001.' Better: Use MANOVA approach (doesn't assume sphericity) or linear mixed model (flexible covariance structures). NEVER report uncorrected within-subjects F-test when Mauchly's p<.05.
Why it's wrong
A significant Group×Time interaction indicates that the pattern of change over time differs between groups. Simply reporting 'interaction significant' without follow-up is uninformative. Readers cannot understand which specific time points show group differences or whether one group improves while the other declines. Simple effects answer: 'At which time points do groups differ?' and 'Does time effect exist within each group?'
The correction
For significant Group×Time interaction, conduct simple effects analysis: (1) Test group differences at each time point (e.g., CBT vs. Control at Baseline, Week 4, Week 8); (2) Test time effect within each group (e.g., does anxiety change across time in CBT group? in Control group?). Use emmeans in R: emm<-emmeans(model, ~group|time); pairs(emm, adjust='bonferroni'). Report specific patterns with effect sizes: 'At baseline, groups did not differ (p=.89). At Week 8, CBT showed significantly lower anxiety than Control (M_diff=-5.8, 95% CI [-8.2, -3.4], p<.001, d=-0.64).'
Why it's wrong
Running separate one-way repeated measures ANOVAs for each group (e.g., one for CBT, one for Control) or separate independent-samples t-tests at each time point inflates Type I error, loses power, and cannot test the Group×Time interaction. The interaction is the key hypothesis in most treatment studies: Does rate of change differ between groups? Separate tests cannot answer this. Additionally, pooled error term in mixed ANOVA provides better power than separate error terms.
The correction
Use mixed-design ANOVA with both between and within factors included simultaneously. This allows proper testing of interaction while controlling familywise error. If software limitations exist, use linear mixed model (LMM): lmer(outcome ~ group*time + (1|subject_id)) which is more flexible and handles missing data better. Report: 'A 2×3 mixed-design ANOVA was conducted...' not 'Separate repeated measures ANOVAs were run for each group...' Only conduct simple effects after establishing significant interaction in omnibus test.
Why it's wrong
p-values indicate statistical significance but not practical/clinical importance. With large samples, tiny trivial effects can be 'significant' (p<.05). With small samples, large meaningful effects may be 'non-significant' (p>.05). Effect sizes answer: 'How large is the difference?' and 'Is it clinically meaningful?' Critical for meta-analyses, replication studies, and informed decision-making. APA guidelines require effect sizes for all inferential tests.
The correction
ALWAYS report partial η² for all omnibus effects (main effects, interactions) with interpretation based on Cohen's benchmarks: 'Group×Time interaction, F(2,156)=28.4, p<.001, partial η²=.27 (large effect, explaining 27% of variance in anxiety change).' For key pairwise comparisons, report Cohen's d with confidence intervals: 'At Week 8, CBT showed lower anxiety than Control, d=-0.64 (medium-large effect), 95% CI [-0.98, -0.30].' Include interpretation: small (.01/.2), medium (.06/.5), large (.14/.8) for η²/d respectively.
Why it's wrong
Within-subjects effects have different df than between-subjects effects. Within-subjects df depend on (k-1)×(n-g) where k=levels of within factor, n=total subjects, g=number of between-groups. Incorrect df leads to wrong p-values and invalid inferences. Common when manually calculating or using wrong software settings. If sphericity correction applied, df are further adjusted by ε.
The correction
Use software that correctly computes mixed ANOVA df (ezANOVA, afex, SPSS GLM, pingouin). Verify: Between-subjects effects have df_denom=(n-g). Within-subjects effects have df_denom=(k-1)×(n-g). If sphericity corrected, both df are multiplied by ε. Example: 2×3 design, n=80, g=2 groups → Time: df=(3-1, (3-1)×(80-2))=(2, 156). If ε=.92, corrected df=(2×.92, 156×.92)=(1.84, 143.5). Always check df in output. Report correctly: 'F(2, 156)=45.2' or 'F_GG(1.84, 143.5)=45.2' if corrected.
Why it's wrong
Mixed ANOVA assumes equal variances across between-subjects groups (like between-subjects ANOVA). Violation (heteroscedasticity) distorts F-tests for between-subjects effects and interactions, inflating Type I error if smaller groups have larger variance, or reducing power if larger groups have larger variance. Ignoring this can lead to invalid conclusions about group differences.
The correction
Test homogeneity with Levene's test on between-subjects groups (use baseline data or overall data): leveneTest(outcome ~ group, data=filter(df, time=='Baseline')). If p<.05 (violated): (1) Transform DV (log if variance∝mean, sqrt for counts); (2) Use linear mixed model with heterogeneous variance structure (nlme::lme with weights=varIdent(form=~1|group)); (3) Use robust standard errors. Report: 'Levene's test indicated homogeneity of variance (F(1,78)=1.52, p=.22)' or 'Levene's test showed unequal variances (p=.03), so linear mixed model with group-specific variance structure was used.' Never ignore Levene's p<.05.
Why it's wrong
When Group×Time interaction is significant, it means the effect of Time differs across Groups (or vice versa). Main effects average across the other factor, which is misleading when an interaction exists. For example, if CBT decreases anxiety over time but Control increases, the main effect of Time (averaged across groups) may be near zero, masking important opposing trends. Interpreting main effects ignores the interaction pattern.
The correction
When interaction is significant (p<.05), prioritize interpreting the interaction over main effects. Main effects are conditional on the interaction. Report: 'The Group×Time interaction was significant (F=28.4, p<.001), indicating different trajectories. Main effects are qualified by this interaction and are not interpreted independently.' Conduct and report simple effects analysis instead of relying on main effects. Only interpret main effects when interaction is non-significant (p>.05), indicating additive effects.
Why it's wrong
Unequal group sizes (unbalanced design) reduce power, make assumptions (homogeneity of variance, sphericity) more critical, and complicate interpretation of Type I vs. Type III sums of squares. With unequal n, Type I SS (sequential) depends on factor order, while Type III SS (partial) is preferred but requires careful interpretation. Power is determined by smallest group size, so large imbalance wastes resources.
The correction
Aim for balanced designs (equal n per group) when possible through randomization and retention strategies. If unbalanced: (1) Use Type III SS (default in ezANOVA, SPSS); (2) Check assumptions more carefully (Levene's test critical); (3) Report group sizes clearly: 'CBT n=35, Control n=45'; (4) Consider using linear mixed model which handles unbalanced data more gracefully. For planned studies, use stratified randomization to ensure balance. For attrition, use intention-to-treat analysis with LMM (handles missing data via ML/REML).
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]
Hofmann, S. G., Asnaani, A., Vonk, I. J., Sawyer, A. T., & Fang, A. (2012). The efficacy of cognitive behavioral therapy: A review of meta-analyses. Cognitive Therapy and Research, 36(5), 427-440.
Comprehensive meta-analysis of CBT across disorders. For anxiety: d=0.5-0.7 (medium-large effects). Basis for Example 1 effect sizes and clinical context.
doi: 10.1007/s10608-012-9476-1
[2]
Greenhouse, S. W., & Geisser, S. (1959). On methods in the analysis of profile data. Psychometrika, 24(2), 95-112.
Original paper on Greenhouse-Geisser correction for sphericity violation in repeated measures ANOVA. Conservative correction adjusting degrees of freedom by epsilon (ε). Critical for mixed ANOVA with within-subjects factors.
doi: 10.1007/BF02289823
[3]
Huynh, H., & Feldt, L. S. (1976). Estimation of the Box correction for degrees of freedom from sample data in randomized block and split-plot designs. Journal of Educational Statistics, 1(1), 69-82.
Huynh-Feldt correction for sphericity violation. Less conservative than Greenhouse-Geisser when epsilon is large (ε>.75). Recommended when sample size is adequate and ε approaches 1.
doi: 10.3102/10769986001001069
[4]
Maxwell, S. E., Delaney, H. D., & Kelley, K. (2018). Designing Experiments and Analyzing Data: A Model Comparison Perspective (3rd ed.). Routledge.
Comprehensive textbook on ANOVA designs including mixed (split-plot) designs. Chapters 12-14 cover repeated measures, assumptions, sphericity corrections, effect sizes, and power analysis. Essential reference for understanding mixed ANOVA theory and practice.
[5]
Lakens, D. (2013). Calculating and reporting effect sizes to facilitate cumulative science: A practical primer for t-tests and ANOVAs. Frontiers in Psychology, 4, 863.
Practical guide to effect size calculation and interpretation for ANOVA. Covers partial η², generalized η², ω² with R code. Discusses why partial η² differs between within and between factors in mixed designs and when to use generalized η².
doi: 10.3389/fpsyg.2013.00863
[6]
Field, A. (2024). Discovering Statistics Using R (6th ed.). Sage Publications.
Accessible textbook with detailed coverage of mixed ANOVA, assumptions, diagnostics, and interpretation. Chapter 14: Repeated-measures designs (GLM 4). Includes R code examples using ezANOVA and emmeans for post-hoc tests.
A single timepoint is a snapshot; a trajectory is a story. The Mixed ANOVA interaction is the only valid way to tell that story with statistical authority.
The Interpretive Rigor Directive
statminds · MixedMind reference · v2.2 · updated 2026-01-1715 of 15 sections