Glass's Delta (Δ)
The engine for Control-Standardized Discovery. Glass's Δ audits the mean difference by using only the control group's variance as the anchor, providing a robust metric when interventions alter the treatment group's spread.
What is it?
Glass's Delta (Δ) is designed to mathematically isolate and quantify the magnitude of an observed outcome or model factor, independently of sample size.
The engine for Control-Standardized Discovery. Glass's Δ audits the mean difference by using only the control group's variance as the anchor, providing a robust metric when interventions alter the treatment group's spread.
Goals & Indications
- Baseline Neutralization Audit: Determine the effect of a treatment relative to the 'Natural' variability of the untreated population.
- Heterogeneity Forensics: Protect magnitude discovery when the intervention increases or decreases the spread of the treatment group.
- Conservative Drift Audit: Measure clinical change without 'diluting' the signal with treatment-induced variance shifts.
Core Idea Diagram
Claims tested
How it works
- Calculate raw difference between treatment and control means.
- Establish standardizing units strictly as the Control Group SD.
- Divide raw difference by the Control SD: delta = (Mt - Mc)/SDc.
- Use delta when treatment conditions alter outcome variability.
Assumptions
Important Note
Glass's Delta is a descriptive statistic, not an inferential test. It quantifies effect magnitude using control group SD as standardizer. Preferred when treatment affects both mean and variance, or when variances are unequal. Use confidence intervals to assess precision.
Worked Example
| Condition | Pooled d | Glass's Δ |
|---|---|---|
| Equal SD (5 vs 5) | 0.80 | 0.80 |
| Unequal SD (5 vs 12) | 0.53 | 0.80 |
Control-Standardized Shift Laboratory
Increase the Treatment Group SD. Watch pooled Cohen's d shrink due to increased treatment variance, while Glass's delta remains stable as it references only the control SD.
Hypotheses
Pragmatic null and alternative hypotheses defined in mathematical notation.
H₀: Δ = 0 (no effect; population standardized mean difference is zero)
Hₐ: Δ ≠ 0 (non-zero effect; groups differ in standardized terms)
Glass's Delta is a descriptive statistic, not an inferential test. It quantifies effect magnitude using control group SD as standardizer. Preferred when treatment affects both mean and variance, or when variances are unequal. Use confidence intervals to assess precision.
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.
- Descriptive statistics (M, SD, n) per group
- Visual comparison of distributions (histograms, density plots, boxplots)
- Variance heterogeneity test (Levene's test, F-test, variance ratio)
- Confidence interval for Glass's Delta
- Control group SD stability check
- Q-Q plots to assess normality per group
- Boxplots to identify outliers (especially in control)
- Effect size interpretation with Cohen's benchmarks (0.2, 0.5, 0.8)
- Comparison with Cohen's d (pooled SD) for context
- Sensitivity analysis (Delta with/without outliers)
- Unstandardized mean difference in original units for interpretability
- Variance ratio and heterogeneity diagnostics
Applied Minds
Review concrete study examples, data layout guidelines, and copy executable syntax scripts.
Educational Intervention
Research question: What is the magnitude of a new teaching method's effect on mathematics achievement compared to standard instruction? Design: Randomized controlled trial (New Method n=45, Standard n=40). Outcome: Standardized mathematics test score (0-100 scale). The new teaching method is expected to increase both mean performance and variability (as it differentially benefits high-ability students). Glass's Delta is appropriate because: (1) Treatment affects both mean and variance; (2) Control SD represents stable baseline variability under standard instruction; (3) Standardizing by control SD provides interpretable metric. Calculate Glass's Delta to quantify treatment effect while handling unequal variances appropriately.
# Glass's Delta: Educational Intervention with Unequal Variances
library(ggplot2)
library(dplyr)
library(car) # Levene's test
# Simulate data reflecting unequal variances
set.seed(2025)
data <- data.frame(
group = c(rep("New_Method", 45), rep("Standard", 40)),
math_score = c(
rnorm(45, mean=72.5, sd=18.2), # New: M=72.5, SD=18.2 (higher variance)
rnorm(40, mean=63.8, sd=12.5) # Standard: M=63.8, SD=12.5 (baseline)
)
)
# === STEP 1: Descriptive Statistics ===
cat("=== Descriptive Statistics ===\n")
desc_stats <- data %>%
group_by(group) %>%
summarise(
n = n(),
M = mean(math_score),
SD = sd(math_score),
Min = min(math_score),
Max = max(math_score),
CV = SD/M # Coefficient of variation
)
print(desc_stats)
# === STEP 2: Test Variance Heterogeneity ===
cat("\n=== Variance Heterogeneity Tests ===\n")
# Levene's test
levene_result <- leveneTest(math_score ~ group, data=data)
print(levene_result)
# Variance ratio
SD_new <- sd(data$math_score[data$group == "New_Method"])
SD_standard <- sd(data$math_score[data$group == "Standard"])
var_ratio <- SD_new^2 / SD_standard^2
cat("\nVariance ratio(New/Standard):", round(var_ratio, 2))
cat("\nSD ratio(New/Standard):", round(SD_new/SD_standard, 2))
if (var_ratio > 2 | var_ratio < 0.5) {
cat("\n→ Substantial variance heterogeneity detected.")
cat("\n→ Glass's Delta recommended(use control SD).\n")
} else {
cat("\n→ Variances approximately equal.")
cat("\n→ Cohen's d(pooled SD) may be preferred.\n")
}
# === STEP 3: Visual Comparison ===
ggplot(data, aes(x=math_score, fill=group)) +
geom_density(alpha=0.5) +
geom_vline(data = desc_stats, aes(xintercept=M, color=group),
linetype="dashed", size=1.2) +
labs(title="Distribution of Math Scores by Teaching Method",
subtitle=paste0("Note: New Method shows higher variance(SD=",
round(SD_new, 1), ") vs Standard(SD=",
round(SD_standard, 1), ")"),
x="Math Test Score(0-100)", y="Density") +
scale_fill_brewer(palette="Set1") +
scale_color_brewer(palette="Set1") +
theme_classic() +
theme(legend.title=element_blank())
# Boxplots to check outliers
ggplot(data, aes(x=group, y=math_score, fill=group)) +
geom_boxplot(alpha=0.6, outlier.color="red", outlier.size=3) +
geom_jitter(width=0.1, alpha=0.3) +
stat_summary(fun=mean, geom="point", size=4, color="blue", shape=18) +
labs(title="Math Scores by Group(Blue diamond = mean)",
x="Teaching Method", y="Math Score(0-100)") +
scale_fill_brewer(palette="Set2") +
theme_classic() +
theme(legend.position="none")
# === STEP 4: Calculate Glass's Delta ===
cat("\n=== Glass's Delta Calculation ===\n")
M_new <- mean(data$math_score[data$group == "New_Method"])
M_standard <- mean(data$math_score[data$group == "Standard"])
n_new <- sum(data$group == "New_Method")
n_standard <- sum(data$group == "Standard")
# Glass's Delta: Standardize by CONTROL (Standard) SD only
glass_delta <- (M_new - M_standard) / SD_standard
cat("Mean New Method:", round(M_new, 2))
cat("\nMean Standard:", round(M_standard, 2))
cat("\nMean Difference:", round(M_new - M_standard, 2))
cat("\nControl SD(Standard):", round(SD_standard, 2))
cat("\nGlass's Δ:", round(glass_delta, 2), "\n")
# Interpretation
if (abs(glass_delta) < 0.2) {
interpretation <- "negligible"
} else if (abs(glass_delta) < 0.5) {
interpretation <- "small"
} else if (abs(glass_delta) < 0.8) {
interpretation <- "medium"
} else {
interpretation <- "large"
}
cat("\nEffect size:", interpretation, "(Cohen's benchmarks)\n")
# === STEP 5: Confidence Interval for Glass's Delta ===
# Approximate CI using SE formula
SE_delta <- sqrt((n_new + n_standard)/(n_new * n_standard) +
glass_delta^2 / (2*n_standard))
CI_lower <- glass_delta - 1.96 * SE_delta
CI_upper <- glass_delta + 1.96 * SE_delta
cat("\n95% CI for Glass's Δ: [", round(CI_lower, 2), ",",
round(CI_upper, 2), "]\n")
# === STEP 6: Compare with Cohen's d ===
cat("\n=== Comparison with Cohen's d ===\n")
# Pooled SD for Cohen's d
SD_pooled <- sqrt(((n_new-1)*SD_new^2 + (n_standard-1)*SD_standard^2) /
(n_new + n_standard - 2))
cohens_d <- (M_new - M_standard) / SD_pooled
cat("Cohen's d(pooled SD):", round(cohens_d, 2))
cat("\nGlass's Δ (control SD):", round(glass_delta, 2))
cat("\nDifference:", round(abs(cohens_d - glass_delta), 3))
cat("\n\nInterpretation:")
cat("\n- Glass's Δ =", round(glass_delta, 2), "uses only control SD =",
round(SD_standard, 2))
cat("\n- Cohen's d =", round(cohens_d, 2), "uses pooled SD =",
round(SD_pooled, 2))
cat("\n- With unequal variances, Glass's Δ preferred(stable control baseline)\n")
# === STEP 7: Multiple Treatment Groups Example ===
cat("\n=== Extension: Multiple Treatments vs. Control ===\n")
# Add a third treatment group
set.seed(2026)
data_multi <- rbind(
data,
data.frame(
group = rep("Alternative_Method", 38),
math_score = rnorm(38, mean=68.2, sd=15.7)
)
)
# Calculate Glass's Delta for each treatment vs. control
treatments <- c("New_Method", "Alternative_Method")
control_mean <- mean(data_multi$math_score[data_multi$group == "Standard"])
control_sd <- sd(data_multi$math_score[data_multi$group == "Standard"])
results <- data.frame(
Treatment = treatments,
Delta = numeric(2),
Interpretation = character(2),
stringsAsFactors = FALSE
)
for (i in 1:length(treatments)) {
treat_mean <- mean(data_multi$math_score[data_multi$group == treatments[i]])
delta <- (treat_mean - control_mean) / control_sd
results$Delta[i] <- delta
if (abs(delta) < 0.2) interp <- "negligible"
else if (abs(delta) < 0.5) interp <- "small"
else if (abs(delta) < 0.8) interp <- "medium"
else interp <- "large"
results$Interpretation[i] <- interp
}
cat("\nGlass's Delta for each treatment(vs. Standard control):\n")
print(results)
cat("\nNote: All treatments standardized by same control SD =",
round(control_sd, 2))
cat("\nThis allows direct comparison across treatments.\n")
# === STEP 8: Sensitivity Analysis ===
cat("\n=== Sensitivity Analysis: Outlier Impact ===\n")
# Check for outliers in control group
control_data <- data$math_score[data$group == "Standard"]
control_z <- scale(control_data)
outliers <- which(abs(control_z) > 2.5)
if (length(outliers) > 0) {
cat("\nOutliers detected in control group(|z| > 2.5):", length(outliers))
# Recalculate without outliers
control_no_outliers <- control_data[-outliers]
SD_standard_robust <- sd(control_no_outliers)
glass_delta_robust <- (M_new - M_standard) / SD_standard_robust
cat("\nOriginal Glass's Δ:", round(glass_delta, 2),
"(SD =", round(SD_standard, 2), ")")
cat("\nRobust Glass's Δ (outliers removed):", round(glass_delta_robust, 2),
"(SD =", round(SD_standard_robust, 2), ")")
cat("\nDifference:", round(abs(glass_delta - glass_delta_robust), 3), "\n")
} else {
cat("\nNo extreme outliers in control group. Effect size stable.\n")
}
# === APA-Style Reporting ===
cat("\n=== APA-Style Report ===\n")
cat("Glass's Δ was calculated to quantify the magnitude of the new teaching\n")
cat("method's effect on mathematics achievement, standardized by the control\n")
cat("group's variability. Levene's test indicated significant variance\n")
cat("heterogeneity(F =", round(levene_result$`F value`[1], 2),
", p =", round(levene_result$`Pr(>F)`[1], 3), "),\n")
cat("justifying Glass's Δ over Cohen's d. The new method group\n")
cat("(M =", round(M_new, 1), ", SD =", round(SD_new, 1), ", n =", n_new, ")\n")
cat("scored", round(M_new - M_standard, 1), "points higher than the standard\n")
cat("instruction group(M =", round(M_standard, 1), ", SD =",
round(SD_standard, 1), ", n =", n_standard, "),\n")
cat("Δ =", round(glass_delta, 2), ", 95% CI [", round(CI_lower, 2), ",",
round(CI_upper, 2), "].\n")
cat("This represents a", interpretation, "effect when standardized by the\n")
cat("control group's baseline variability, indicating the new method produced\n")
cat("meaningful improvement in mathematics achievement.\n")Glass's Δ = 0.70, 95% CI [0.38, 1.02]. Medium-to-large effect indicating new teaching method improved math scores by 0.70 control group standard deviations. Variance heterogeneity detected (Levene's p < .05), justifying Glass's Delta over Cohen's d. Control SD represents stable baseline variability under standard instruction, providing interpretable standardizer.
Alternatives
Structured fallback pathways for choosing alternative tests when normality or slopes requirements fail.
- Cohen's d — Return to the pooled-SD standard to maximize efficiency if groups are equally varied.
- Hedges' g — Use the weighted-pooled SD if the control group is too small to provide a stable anchor.
- Robust Delta — Utilize the Winsorized SD of the control group to neutralize influential baseline outliers.
Post-hoc
Group mean comparisons and correction controls (e.g. Tukey HSD, Bonferroni) to protect against Family-Wise Error Rates.
- Compare with Cohen's d (pooled SD) and Hedges' g (bias-corrected)
- Bootstrap confidence intervals
- Assess sensitivity to control group variance homogeneity
- Examine which group's SD is more appropriate as denominator
- Convert to r or odds ratio for alternative interpretation
Glass's delta is an effect size using control group SD. Post-hoc tests are not applicable.
Effect Size
Understanding effect sizes (e.g., Cohen's d, Partial Eta-Squared) and clinical impact benchmarks.
Standardized mean difference using control group SD as standardizer. Cohen's benchmarks apply (1988): |Δ| = 0.2 small, 0.5 medium, 0.8 large. Preferred when: (1) Treatment affects variance; (2) Control SD represents stable baseline; (3) Comparing multiple treatments to same control. Not directly comparable to Cohen's d when variances differ substantially.
Use Glass's Delta when: (1) Variance heterogeneity exists (Levene's p < .05, variance ratio > 2); (2) Treatment may affect variability; (3) Control group SD is stable and representative of baseline population; (4) Comparing multiple experimental groups to single control (ensures same standardizer). Use Cohen's d when variances are equal.
Glass's Delta uses control SD only; Cohen's d uses pooled SD. When variances equal, both yield similar values. When treatment increases variance, Glass's Delta > Cohen's d (larger denominator in Cohen's d deflates effect size). When treatment decreases variance, Glass's Delta < Cohen's d. Glass's Delta preserves interpretability relative to baseline variability.
0.2
0.5
0.8
Sample Size
Guidelines for minimum sample requirements and power analysis parameters.
The 'Control Anchor' Minimum: A minimum of 30 participants in the control group is essential. Delta uses only the control SD as the anchor; if the control N is small, the entire magnitude estimation becomes unstable.
| Effect Size | Parameters | Required n |
|---|---|---|
| Small Effect | Δ=0.20 (Small) | n ≈ 850 total |
| Medium Effect | Δ=0.50 (Medium) | n ≈ 140 total |
| Large Effect | Δ=0.80 (Large) | n ≈ 60 total |
The 'Heterogeneity Mandate': Glass's Delta is the ONLY valid metric when the treatment increases the variance of the treated group. By ignoring the 'Messy' treatment SD, it provides a purer signal of clinical movement.
Reporting
How to compile statistical results into publication prose matching APA and journal style guides.
Glass's Δ was calculated to quantify the magnitude of treatment description effect on outcome, standardized by the control group's variability. Include variance heterogeneity test: Levene's test, F = X.XX, p = .XXX. The treatment group (M = XX.X, SD = XX.X, n = XX) scored XX.X points higher/lower than the control group (M = XX.X, SD = XX.X, n = XX), Δ = X.XX, 95% CI X.XX, X.XX. This represents a small/medium/large effect when standardized by the control group's baseline variability, indicating interpret practical significance in context.
- Glass's Delta value (Δ)
- 95% confidence interval for Δ
- Descriptive statistics per group (M, SD, n)
- Variance heterogeneity test results (Levene's test or variance ratio)
- Justification for using Glass's Delta over Cohen's d
- Effect size interpretation (small/medium/large with Cohen's benchmarks)
- Contextual interpretation (practical/clinical significance)
Manuscript Lab
Copy standard summary tables and forensic reporting grids to outline analysis details.
| Metric | Value | Interpretation | Justification |
|---|---|---|---|
| Glass's Delta (Δ) | 0.65 | Medium-Large | Active Variance > Control Variance |
The 'Purity' Effect. By using only the control group's variability, we measure how much the treatment shifts the 'Standard' population, regardless of how messy the treatment outcomes are.
Command Center
Syntax libraries and function parameters for executing calculations in stats packages.
# 1. Execute Glass's Delta
effectsize::glass_delta(score ~ group, data = df)
# 2. Extract with Confidence Intervals
effectsize::glass_delta(x, y, ci = 0.95)Use Glass's Delta when the treatment itself creates variance (e.g., some people react strongly, others not at all). In these cases, the pooled SD is a meaningless average of two different worlds.
# Audit Homogeneity of Variance before selecting Delta
performance::check_homogeneity(model)Common Mistakes
Analytical caveats and corrections to maintain modeling integrity.
References
Scholarly lineage and citation keys grounding the statistical framework.