Atlas
statminds
Effect Size (Bias-Corrected 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

Hedges' g

The engine for Small-Sample Precision. Hedges' g audits the standardized distance between group means while mathematically neutralizing the upward 'Inflation Bias' inherent in Cohen's d for small cohorts.

Model familyEffect Size (Bias-Corrected Model)
Hypothesiseffect_size_measure
AliasesBias-Corrected Cohen's d · Corrected Standardized Mean Difference · Small-Sample Magnitude Index
G1
Small-Sample Accuracy Audit
Correct for the systematic overestimation of effect size when working with lean participant pools.
G2
Bias Neutralization
Apply the 'J-correction' factor to ensure your magnitude estimation reaches the threshold of mathematical authority.
G3
Discovery Stability
Provide a more conservative and reliable metric for magnitude in pilot studies and rare-event research.
Visual Overview Dashboard
1

What is it?

Hedges' g is designed to mathematically isolate and quantify the magnitude of an observed outcome or model factor, independently of sample size.

The engine for Small-Sample Precision. Hedges' g audits the standardized distance between group means while mathematically neutralizing the upward 'Inflation Bias' inherent in Cohen's d for small cohorts.

2

Goals & Indications

  • Small-Sample Accuracy Audit: Correct for the systematic overestimation of effect size when working with lean participant pools.
  • Bias Neutralization: Apply the 'J-correction' factor to ensure your magnitude estimation reaches the threshold of mathematical authority.
  • Discovery Stability: Provide a more conservative and reliable metric for magnitude in pilot studies and rare-event research.
3

Core Idea Diagram

Cohen's d (Biased)Hedges' g (Corrected)J correction factor shrinks estimate in small samples
4

Claims tested

H₀: H₀: δ = 0 (no effect; population standardized mean difference is zero)
Hₐ: Hₐ: δ ≠ 0 (non-zero effect; groups differ in standardized terms)
5

How it works

  1. Compute standard Cohen's d based on pooled sample standard deviations.
  2. Calculate model degrees of freedom: df = n1 + n2 - 2.
  3. Compute Hedges' small-sample correction factor: J = 1 - 3/(4*df - 1).
  4. Multiply Cohen's d by J to get the unbiased Hedges' g estimate.
6

Assumptions

DV is continuous: Outcome measured on continuous scale with meaningful distances
Independence of observations: No clustering, nesting, or repeated measures
Approximate normality of DV: Outcome follows bell curve for accurate confidence intervals
7

Important Note

Hedges' g is a descriptive statistic that corrects Cohen's d for small-sample bias. It is the preferred effect size for meta-analysis and small samples (n < 50). Use confidence intervals to assess precision of the effect size estimate.

8

Worked Example

N1, N2Cohen's dHedges' g
N=5 (df=8)0.800.72 (J=0.90)
N=20 (df=38)0.800.78 (J=0.98)
Interactive Sandbox

Small-Sample Correction Laboratory

Slide the sample sizes. Observe how Hedges' g shrinks the estimate relative to Cohen's d as sample size decreases, resolving the upward bias.

Sample Size Group 1 (n₁)8
Sample Size Group 2 (n₂)8
Raw Difference between groups1.00
Bias Adjustment
Cohen's d: 0.833
Hedges' g: 0.788
Degrees of freedom: 14
Correction Factor J: 0.9455
Estimate Shrunk By: 5.5%
Correction Curve (N vs. J factor)
N=16 (J=0.945)
The 12-Stage Precision Workflow
01Corrected Parity
Hypotheses
We test the null of zero magnitude using an estimator that refuses to 'Inflate' the story just because the sample is small.
02Pooling Mandate
Assumptions
Ensuring the groups share a similar variance structure before applying the weighted-pooled standard deviation logic.
03The J-Correction
Diagnostics
Calculating the correction factor based on degrees of freedom—the smaller the N, the more powerful the 'Deflation' of the effect size.
04focus
Measuring the magnitude of FlowMotion recovery in a tiny N=15 pilot group where Cohen's d would be dangerously high.
05Cohen's d Pivot
Alternatives
Knowing when to switch back to Cohen's d as N increases beyond 50, where the bias becomes mathematically negligible.
06Confidence Strikes
Significance
Reporting the 95% CI for g—essential for proving that the 'Corrected' magnitude is statistically robust.
07The Magnitude Cap
Effect Size
Interpreting g values using the same benchmarks as d: 0.2, 0.5, and 0.8—but with higher confidence in the result's integrity.
08Bias Reduction
Sample Size
Determining the N required to bring the point estimate of g into alignment with the 'True' population parameter.
09The Correction Statement
Reporting
Explicitly stating: 'Hedges' g was used to correct for the small sample bias inherent in standardized mean differences.'
10hedges_g() Logic
Software
Executing 'hedges_g' or 'effsize' commands, ensuring the algorithm uses the (N-3) based correction formula.
11focus
The fatal error of reporting Cohen's d for very small samples, which inadvertently 'Sells' a bigger story than the data supports.
12focus
Tracing the model back to Larry Hedges (1981) and the foundational shift toward meta-analytic accuracy.
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₀: δ = 0 (no effect; population standardized mean difference is zero)

Alternative · Hₐ

Hₐ: δ ≠ 0 (non-zero effect; groups differ in standardized terms)

Why it matters effect_size_measure

Hedges' g is a descriptive statistic that corrects Cohen's d for small-sample bias. It is the preferred effect size for meta-analysis and small samples (n < 50). Use confidence intervals to assess precision of the effect size estimate.

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
7
Assumptions
2
Critical / High Severity
How to check
Quick
Verify variable type; check that outcome has many distinct values (not just 2-3 categories); confirm measurement scale has equal intervals
Rigorous
Validate measurement properties; verify ratio/interval scale assumptions; check that standardization (dividing by SD) is interpretable
If violated
If ordinal with few categories (e.g., Likert 1-5) → use rank-biserial correlation or Cliff's delta instead. If binary outcome → use odds ratio, risk ratio, or phi coefficient. If count data → consider risk difference or number needed to treat (NNT). Hedges' g requires continuous data for meaningful interpretation
phi coefficient
How to check
Quick
Review study design; check for duplicate subject IDs; identify clustering variables (site, family); verify no matched pairs or repeated measures
Rigorous
Calculate ICC to detect clustering; check for autocorrelation in sequential data; verify sampling independence
If violated
If paired/matched design → use Cohen's dz for within-subjects (dz = M_diff / SD_diff) with appropriate bias correction. If clustered data → calculate multilevel effect sizes accounting for ICC, or aggregate to cluster level. If repeated measures → use within-subjects effect size formulas (dz, drm)
How to check
Quick
Q-Q plots; histograms; check skewness (<|2|) and kurtosis (<|7|); visual inspection for severe departures
Rigorous
Shapiro-Wilk test per group; Anderson-Darling test; examine distribution tails for extreme values
If violated
Hedges' g point estimate is robust to non-normality (describes observed difference), but CIs may be inaccurate with small samples. Solutions: (1) Use bootstrap CIs for g (percentile or BCa method); (2) Transform data (log, sqrt) then calculate g; (3) Report rank-biserial correlation (distribution-free); (4) Use robust effect sizes (trimmed means, Winsorized g). Point estimate remains interpretable even with non-normality
How to check
Quick
Levene's test (p > .05); variance ratio (s₁²/s₂² < 2 or 3); boxplots with similar IQR
Rigorous
F-test for variance equality (if normality met); visual residual plots; check SD ratio (SD₁/SD₂ should be 0.5-2.0)
If violated
If variances unequal: (1) Use Glass's Δ with Hedges correction (standardize by control group SD only, then apply J correction); (2) Calculate g with separate SDs and report both; (3) Transform data to stabilize variance (log if variance ∝ mean); (4) Report unstandardized mean difference with both SDs. Note: Hedges' g correction addresses small-sample bias, NOT heterogeneity of variance
glass delta
How to check
Quick
Boxplots; identify values >1.5 IQR from quartiles; check |z| > 3 within groups; visual inspection of scatterplots
Rigorous
Studentized residuals (|r| > 3); Cook's distance; leverage-influence plots; examine distribution tails
If violated
Outliers inflate SD, deflating effect size. Options: (1) Verify data accuracy first (correct entry errors); (2) Use robust Hedges' g with trimmed means (10-20% trimming) and Winsorized SD; (3) Report g with and without outliers (sensitivity analysis); (4) Use median-based effect sizes (Cliff's delta); (5) Transform data. Never silently remove outliers. Small samples are especially vulnerable to outlier influence
How to check
Quick
Overlaid histograms or density plots; compare skewness/kurtosis across groups; Q-Q plots per group
Rigorous
Kolmogorov-Smirnov test for distribution shape; compare moments (variance, skewness, kurtosis) across groups
If violated
If distributional shapes differ fundamentally (e.g., one skewed, one normal), Hedges' g may be misleading as it assumes groups differ primarily in central tendency. Consider: (1) Quantile-based effect sizes (compare medians, IQR); (2) Stochastic superiority/dominance (probability one random observation from Group A > Group B); (3) Separate analyses for different parts of distribution (quantile regression)
How to check
Quick
Check total sample size: if N < 100 or either group n < 50, Hedges' g is recommended; if N > 200, Cohen's d and Hedges' g will be nearly identical
Rigorous
Calculate correction factor J = 1 - 3/(4df - 1). If J > 0.99 (large sample), difference between d and g is negligible. If J < 0.95 (very small sample), correction is substantial and important
If violated
Not truly 'violated' - with large samples (N > 200), Cohen's d and Hedges' g converge. In this case, either metric is appropriate. However, for consistency in meta-analysis or when combining with smaller studies, Hedges' g is still preferred. For very large samples (N > 1000), the correction is trivial but harmless
cohens d
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. Descriptive statistics (M, SD, n) per group
  2. Visual comparison of distributions (histograms, density plots)
  3. Variance ratio or Levene's test for homogeneity
  4. Confidence interval for Hedges' g
  5. Correction factor J and comparison with uncorrected Cohen's d
Recommended checks
  1. Q-Q plots to assess normality
  2. Boxplots to identify outliers
  3. Effect size interpretation with Cohen's benchmarks (0.2, 0.5, 0.8)
  4. Sensitivity analysis (g with/without outliers)
  5. Demonstration of bias correction magnitude (d vs g)
  6. Unstandardized mean difference in original units for interpretability
  7. Sample size justification for using Hedges' g over Cohen's d
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

Bias Correction Demo

Research question: Does a novel mindfulness intervention reduce anxiety in college students compared to control? Design: Small RCT (Intervention n=15, Control n=13, total N=28). Outcome: State-Trait Anxiety Inventory (STAI) score at post-intervention (continuous, 20-80, higher = more anxiety). Small sample size requires Hedges' g to correct Cohen's d upward bias. This example demonstrates: (1) calculating both Cohen's d and Hedges' g, (2) quantifying bias correction magnitude, (3) proper interpretation with small samples, (4) comprehensive diagnostic checks including normality, homogeneity, and outliers.

DesignSmall sample RCT with unequal n
GroupsIntervention · Control
Total n28
Outcome ScaleSTAI anxiety score (continuous, 20-80)
# Hedges' g: Small Sample Clinical Trial - Mindfulness for Anxiety
# Demonstrates bias correction in small samples (n=28)

library(effsize)     # cohen.d() function
library(ggplot2)     # visualization
library(dplyr)       # data manipulation
library(car)         # Levene's test
library(moments)     # skewness/kurtosis

# ============================================================================
# SIMULATE DATA: Small RCT (Intervention n=15, Control n=13)
# ============================================================================
set.seed(2025)
data <- data.frame(
  group = c(rep("Intervention", 15), rep("Control", 13)),
  anxiety = c(
    rnorm(15, mean=42.3, sd=9.2),   # Intervention: M=42.3, SD=9.2
    rnorm(13, mean=51.7, sd=8.5)    # Control: M=51.7, SD=8.5
  )
)

cat("======================================================================\n")
cat("HEDGES' G: BIAS-CORRECTED EFFECT SIZE FOR SMALL SAMPLES\n")
cat("======================================================================\n\n")

# ============================================================================
# STEP 1: DESCRIPTIVE STATISTICS
# ============================================================================
cat("STEP 1: DESCRIPTIVE STATISTICS\n")
cat("------------------------------\n")
desc_stats <- data %>%
  group_by(group) %>%
  summarise(
    n = n(),
    M = mean(anxiety),
    SD = sd(anxiety),
    Min = min(anxiety),
    Max = max(anxiety),
    Skewness = skewness(anxiety),
    Kurtosis = kurtosis(anxiety) - 3  # Excess kurtosis
  )
print(desc_stats)

n_intervention <- sum(data$group == "Intervention")
n_control <- sum(data$group == "Control")
total_n <- nrow(data)

cat("\nTotal N =", total_n, "(SMALL SAMPLE → Hedges' g recommended)\n\n")

# ============================================================================
# STEP 2: DIAGNOSTIC CHECKS
# ============================================================================
cat("STEP 2: DIAGNOSTIC CHECKS\n")
cat("-------------------------\n\n")

# 2.1 Normality checks
cat("2.1 Normality Assessment:\n")
shapiro_intervention <- shapiro.test(data$anxiety[data$group == "Intervention"])
shapiro_control <- shapiro.test(data$anxiety[data$group == "Control"])

cat("Intervention: Shapiro-Wilk W =", round(shapiro_intervention$statistic, 3),
    ", p =", round(shapiro_intervention$p.value, 3))
if (shapiro_intervention$p.value > 0.05) {
  cat(" → Normal\n")
} else {
  cat(" → Non-normal(consider robust methods)\n")
}

cat("Control:      Shapiro-Wilk W =", round(shapiro_control$statistic, 3),
    ", p =", round(shapiro_control$p.value, 3))
if (shapiro_control$p.value > 0.05) {
  cat(" → Normal\n")
} else {
  cat(" → Non-normal(consider robust methods)\n")
}

cat("Interpretation: p > .05 suggests approximate normality(acceptable for g)\n\n")

# 2.2 Homogeneity of variance
cat("2.2 Homogeneity of Variance:\n")
levene_test <- leveneTest(anxiety ~ group, data=data)
cat("Levene's Test: F =", round(levene_test$`F value`[1], 3),
    ", p =", round(levene_test$`Pr(>F)`[1], 3))
if (levene_test$`Pr(>F)`[1] > 0.05) {
  cat(" → Variances equal(pooled SD appropriate)\n")
} else {
  cat(" → Variances unequal(consider Glass's delta or Welch correction)\n")
}

SD_intervention <- sd(data$anxiety[data$group == "Intervention"])
SD_control <- sd(data$anxiety[data$group == "Control"])
variance_ratio <- SD_intervention^2 / SD_control^2
cat("Variance ratio(Intervention/Control) =", round(variance_ratio, 2))
if (variance_ratio > 0.5 & variance_ratio < 2.0) {
  cat(" → Within acceptable range(0.5-2.0)\n\n")
} else {
  cat(" → Outside acceptable range(pooled SD may be inappropriate)\n\n")
}

# 2.3 Outlier detection
cat("2.3 Outlier Detection:\n")
outliers <- data %>%
  group_by(group) %>%
  mutate(
    z_score = (anxiety - mean(anxiety)) / sd(anxiety),
    is_outlier = abs(z_score) > 3
  ) %>%
  filter(is_outlier)

if (nrow(outliers) == 0) {
  cat("No extreme outliers detected(|z| > 3)\n\n")
} else {
  cat("WARNING:", nrow(outliers), "extreme outliers detected:\n")
  print(outliers[, c("group", "anxiety", "z_score")])
  cat("Consider sensitivity analysis or robust methods\n\n")
}

# ============================================================================
# STEP 3: VISUAL COMPARISON
# ============================================================================
cat("STEP 3: CREATING VISUALIZATIONS\n")
cat("--------------------------------\n\n")

# 3.1 Overlaid density plots
p1 <- ggplot(data, aes(x=anxiety, fill=group)) +
  geom_density(alpha=0.5) +
  geom_vline(data = data %>% group_by(group) %>% summarise(M=mean(anxiety)),
             aes(xintercept=M, color=group), linetype="dashed", linewidth=1) +
  labs(title="Distribution of Anxiety Scores by Group(Small Sample)",
       subtitle=paste0("N = ", total_n, " (Intervention n=", n_intervention, 
                       ", Control n=", n_control, ")"),
       x="STAI Anxiety Score(20-80)", y="Density") +
  scale_fill_brewer(palette="Set1") +
  scale_color_brewer(palette="Set1") +
  theme_classic() +
  theme(legend.position="top")
print(p1)

# 3.2 Boxplots with individual points (helpful for small n)
p2 <- ggplot(data, aes(x=group, y=anxiety, fill=group)) +
  geom_boxplot(alpha=0.6, width=0.5, outlier.shape=NA) +
  geom_jitter(width=0.15, alpha=0.6, size=2.5) +
  stat_summary(fun=mean, geom="point", size=4, color="red", shape=18) +
  labs(title="Anxiety Scores: Intervention vs Control",
       subtitle="Red diamonds = means; dots = individual observations",
       x="Group", y="STAI Anxiety Score(20-80)") +
  scale_fill_brewer(palette="Set1") +
  theme_classic() +
  theme(legend.position="none")
print(p2)

# 3.3 Q-Q plots for normality
par(mfrow=c(1,2))
qqnorm(data$anxiety[data$group == "Intervention"], main="Q-Q Plot: Intervention")
qqline(data$anxiety[data$group == "Intervention"], col="red")
qqnorm(data$anxiety[data$group == "Control"], main="Q-Q Plot: Control")
qqline(data$anxiety[data$group == "Control"], col="blue")
par(mfrow=c(1,1))

# ============================================================================
# STEP 4: CALCULATE COHEN'S D (UNCORRECTED)
# ============================================================================
cat("\nSTEP 4: COHEN'S D(UNCORRECTED)\n")
cat("-------------------------------\n")

M_intervention <- mean(data$anxiety[data$group == "Intervention"])
M_control <- mean(data$anxiety[data$group == "Control"])

# Pooled standard deviation
SD_pooled <- sqrt(((n_intervention-1)*SD_intervention^2 + 
                    (n_control-1)*SD_control^2) / 
                   (n_intervention + n_control - 2))

cohen_d <- (M_intervention - M_control) / SD_pooled

cat("Mean Intervention:", round(M_intervention, 2), "\n")
cat("Mean Control:     ", round(M_control, 2), "\n")
cat("Mean Difference:  ", round(M_intervention - M_control, 2), "\n")
cat("SD Intervention:  ", round(SD_intervention, 2), "\n")
cat("SD Control:       ", round(SD_control, 2), "\n")
cat("SD Pooled:        ", round(SD_pooled, 2), "\n")
cat("\nCohen's d(uncorrected):", round(cohen_d, 3), "\n")

# Interpretation
if (abs(cohen_d) < 0.2) {
  d_interpretation <- "negligible"
} else if (abs(cohen_d) < 0.5) {
  d_interpretation <- "small"
} else if (abs(cohen_d) < 0.8) {
  d_interpretation <- "medium"
} else {
  d_interpretation <- "large"
}
cat("Effect size magnitude:", d_interpretation, "(Cohen, 1988)\n\n")

# ============================================================================
# STEP 5: CALCULATE HEDGES' G (BIAS-CORRECTED)
# ============================================================================
cat("STEP 5: HEDGES' G(BIAS-CORRECTED)\n")
cat("-----------------------------------\n")

# Degrees of freedom
df <- n_intervention + n_control - 2

# Hedges' correction factor J
J <- 1 - (3 / (4*df - 1))

# Hedges' g
hedges_g <- cohen_d * J

# Bias magnitude
bias <- cohen_d - hedges_g
bias_percent <- (bias / cohen_d) * 100

cat("Degrees of freedom(df):", df, "\n")
cat("Correction factor J:     ", round(J, 5), "\n")
cat("\nCohen's d(uncorrected): ", round(cohen_d, 3), "\n")
cat("Hedges' g(corrected):   ", round(hedges_g, 3), "\n")
cat("\nBias reduction:          ", round(bias, 4), 
    " (", round(bias_percent, 2), "%)\n")

if (abs(cohen_d) < 0.2) {
  g_interpretation <- "negligible"
} else if (abs(cohen_d) < 0.5) {
  g_interpretation <- "small"
} else if (abs(cohen_d) < 0.8) {
  g_interpretation <- "medium"
} else {
  g_interpretation <- "large"
}
cat("Effect size magnitude:   ", g_interpretation, "(Cohen, 1988)\n\n")

cat("INTERPRETATION:\n")
cat("With small sample(N=", total_n, ", df=", df, "), the correction factor J=", 
    round(J, 3), "\n")
cat("reduces Cohen's d by", round(bias_percent, 1), 
    "%, yielding Hedges' g=", round(hedges_g, 2), ".\n")
cat("This correction is IMPORTANT to avoid overestimating the population effect.\n\n")

# ============================================================================
# STEP 6: CONFIDENCE INTERVALS
# ============================================================================
cat("STEP 6: CONFIDENCE INTERVALS\n")
cat("----------------------------\n")

# CI for Cohen's d (using effsize package)
cohen_result <- cohen.d(anxiety ~ group, data=data)
cat("\nCohen's d: ", round(cohen_result$estimate, 3), 
    ", 95% CI [", round(cohen_result$conf.int[1], 3), 
    ", ", round(cohen_result$conf.int[2], 3), "]\n")

# Approximate CI for Hedges' g (apply J correction to CI bounds)
# Note: This is an approximation; exact CI requires more complex calculations
hedges_ci_lower <- cohen_result$conf.int[1] * J
hedges_ci_upper <- cohen_result$conf.int[2] * J

cat("Hedges' g: ", round(hedges_g, 3), 
    ", 95% CI [", round(hedges_ci_lower, 3), 
    ", ", round(hedges_ci_upper, 3), "] (approximate)\n\n")

cat("INTERPRETATION:\n")
if (hedges_ci_lower * hedges_ci_upper > 0) {
  cat("CI does NOT include zero → Effect is statistically significant.\n")
} else {
  cat("CI includes zero → Effect is NOT statistically significant.\n")
  cat("Small sample may lack power to detect true effect.\n")
}

ci_width <- hedges_ci_upper - hedges_ci_lower
cat("CI width =", round(ci_width, 2), "→", 
    ifelse(ci_width < 0.5, "Precise estimate", 
           ifelse(ci_width < 1.0, "Moderate precision", 
                  "Wide CI(imprecise, need larger sample)")))
cat("\n\n")

# ============================================================================
# STEP 7: ALTERNATIVE EFFECT SIZES
# ============================================================================
cat("STEP 7: ALTERNATIVE EFFECT SIZES\n")
cat("---------------------------------\n")

# Glass's delta (standardize by control SD only)
glass_delta <- (M_intervention - M_control) / SD_control
glass_delta_corrected <- glass_delta * J  # Can also apply Hedges correction

cat("Glass's Δ (control SD):          ", round(glass_delta, 3), "\n")
cat("Glass's Δ (bias-corrected):      ", round(glass_delta_corrected, 3), "\n")

# Unstandardized difference with 95% CI
t_result <- t.test(anxiety ~ group, data=data)
cat("\nUnstandardized mean difference:  ", round(M_intervention - M_control, 2), 
    " STAI points\n")
cat("95% CI for mean difference:      [", round(t_result$conf.int[1], 2), 
    ", ", round(t_result$conf.int[2], 2), "]\n")
cat("t-test: t(", round(t_result$parameter, 1), ") = ", round(t_result$statistic, 2),
    ", p = ", round(t_result$p.value, 4), "\n\n")

# ============================================================================
# STEP 8: EFFECT SIZE COMPARISON VISUALIZATION
# ============================================================================
cat("STEP 8: EFFECT SIZE COMPARISON\n")
cat("------------------------------\n\n")

effect_sizes <- data.frame(
  Metric = c("Cohen's d\n(uncorrected)", 
             "Hedges' g\n(corrected)",
             "Glass's Δ\n(control SD)"),
  Value = c(abs(cohen_d), abs(hedges_g), abs(glass_delta)),
  CI_lower = c(abs(cohen_result$conf.int[1]), abs(hedges_ci_lower), NA),
  CI_upper = c(abs(cohen_result$conf.int[2]), abs(hedges_ci_upper), NA)
)

p3 <- ggplot(effect_sizes, aes(x=Metric, y=Value, fill=Metric)) +
  geom_bar(stat="identity", alpha=0.8, width=0.6) +
  geom_errorbar(aes(ymin=CI_lower, ymax=CI_upper), width=0.2, linewidth=1) +
  geom_hline(yintercept=c(0.2, 0.5, 0.8), linetype="dashed", 
             color="gray50", alpha=0.7) +
  annotate("text", x=3.3, y=0.2, label="Small(0.2)", hjust=0, size=3) +
  annotate("text", x=3.3, y=0.5, label="Medium(0.5)", hjust=0, size=3) +
  annotate("text", x=3.3, y=0.8, label="Large(0.8)", hjust=0, size=3) +
  labs(title="Effect Size Comparison: Cohen's d vs Hedges' g",
       subtitle=paste0("Small sample(N=", total_n, ") → ", 
                       round(bias_percent, 1), "% bias reduction with Hedges' g"),
       x="", y="Effect Size(absolute value)") +
  ylim(0, max(effect_sizes$Value, na.rm=TRUE) * 1.2) +
  scale_fill_brewer(palette="Set2") +
  theme_classic() +
  theme(legend.position="none",
        axis.text.x = element_text(size=10))
print(p3)

# ============================================================================
# STEP 9: COMPREHENSIVE SUMMARY
# ============================================================================
cat("\n======================================================================\n")
cat("COMPREHENSIVE SUMMARY\n")
cat("======================================================================\n\n")

cat("Sample: N =", total_n, "(Intervention n=", n_intervention, 
    ", Control n=", n_control, ")\n")
cat("Outcome: STAI Anxiety(20-80, higher = more anxiety)\n\n")

cat("DESCRIPTIVE STATISTICS:\n")
cat("Intervention: M =", round(M_intervention, 1), ", SD =", round(SD_intervention, 1), "\n")
cat("Control:      M =", round(M_control, 1), ", SD =", round(SD_control, 1), "\n")
cat("Difference:   M =", round(M_intervention - M_control, 1), " points\n\n")

cat("EFFECT SIZES:\n")
cat("Cohen's d(uncorrected):  ", round(cohen_d, 3), " (", d_interpretation, ")\n")
cat("Hedges' g(corrected):    ", round(hedges_g, 3), " (", g_interpretation, ")\n")
cat("Bias reduction:           ", round(bias, 4), " (", round(bias_percent, 1), "%)\n")
cat("95% CI for Hedges' g:     [", round(hedges_ci_lower, 2), ", ", 
    round(hedges_ci_upper, 2), "]\n\n")

cat("STATISTICAL SIGNIFICANCE:\n")
cat("t(", round(t_result$parameter, 0), ") = ", round(t_result$statistic, 2),
    ", p = ", round(t_result$p.value, 4))
if (t_result$p.value < 0.001) {
  cat(" ***\n")
} else if (t_result$p.value < 0.01) {
  cat(" **\n")
} else if (t_result$p.value < 0.05) {
  cat(" *\n")
} else {
  cat(" (ns)\n")
}

cat("\nINTERPRETATION:\n")
cat("The mindfulness intervention showed", 
    ifelse(abs(M_intervention - M_control) > 5, "substantially", "moderately"),
    "lower anxiety\n")
cat("compared to control(Hedges' g =", round(hedges_g, 2), 
    ", 95% CI [", round(hedges_ci_lower, 2), ", ", round(hedges_ci_upper, 2), "]).\n")
cat("This represents a", tolower(g_interpretation), "effect(Cohen, 1988).\n")
cat("The bias correction(J =", round(J, 3), ") reduced the uncorrected Cohen's d\n")
cat("by", round(bias_percent, 1), "%, which is IMPORTANT in this small sample(N=", 
    total_n, ").\n")
cat("Hedges' g is the appropriate effect size for meta-analysis and provides\n")
cat("an unbiased estimate of the population standardized mean difference.\n\n")

# ============================================================================
# STEP 10: APA-STYLE REPORTING
# ============================================================================
cat("======================================================================\n")
cat("APA-STYLE REPORT\n")
cat("======================================================================\n\n")

cat("Hedges' g was calculated to quantify the effect of mindfulness\n")
cat("intervention on anxiety, with bias correction applied due to small sample\n")
cat("size(N = ", total_n, "). The intervention group(M = ", round(M_intervention, 1),
    ", SD = ", round(SD_intervention, 1), ", n = ", n_intervention, ")\n")
cat("showed lower anxiety than the control group(M = ", round(M_control, 1),
    ", SD = ", round(SD_control, 1), ", n = ", n_control, "),\n")
cat("g = ", round(hedges_g, 2), ", 95% CI [", round(hedges_ci_lower, 2), ", ",
    round(hedges_ci_upper, 2), "]. This represents a ", tolower(g_interpretation),
    "\n")
cat("effect(Cohen, 1988). The bias correction factor(J = ", round(J, 3),
    ") reduced\n")
cat("Cohen's d by ", round(bias_percent, 1), "% (from d = ", round(cohen_d, 2),
    " to g = ", round(hedges_g, 2), "),\n")
cat("providing an unbiased estimate of the population effect size. The\n")
cat("intervention produced a clinically meaningful reduction of approximately\n")
cat(round(abs(M_intervention - M_control), 1), " points on the STAI(20-80 scale).\n\n")

cat("======================================================================\n")
cat("END OF ANALYSIS\n")
cat("======================================================================\n")
Interpretation Blueprint

Hedges' g = -1.06 (95% CI [-1.64, -0.48]), corrected from Cohen's d = -1.08. With small sample (N=28, df=26), correction factor J=0.977 reduced bias by 2.3%. The mindfulness intervention showed substantially lower anxiety (9.4 points on STAI) compared to control, representing a large effect. Small sample requires bias correction to avoid overestimating population effect. This demonstrates importance of Hedges' g in small-sample research and meta-analysis.

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 · Continuous / Ratio
Ratio
Maintain Hedges' g. The gold standard for magnitude discovery in small or unequal groups.
Peak Signal
Interval
Ideal for Pilot Scales. Neutralizes the systematic overestimation bias found in Cohen's d.
Standard Precision
Ordinal / Nominal
Abandon g. Use rank-order or categorical effect sizes to model non-continuous magnitude.
Identity Loss
Temporal Trajectory Audit Static Bias-Corrected Snapshot
Static Gap
Cross-sectional audit.
Stay with Hedges' g. Protect discovery from the 'Magnification Bias' of small samples.
Paired Shift
Trajectory growth.
Use Hedges' g_av to account for within-subject dependency while maintaining bias-correction.
Adaptive Technical Safeguards · adaptive safeguards
large sample detected
  • Cohen's d — Return to the simpler estimator once N > 50 per group, where bias is negligible.
extreme heterogeneity
  • Glass's Delta — Switch to control-only standardization if the intervention explodes the treatment variance.
non normal residuals
  • Cliff's Delta — Use the non-parametric equivalent if the magnitude is driven by rank-shifts rather than means.
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
  • Compare with uncorrected Cohen's d (difference increases with smaller n)
  • Bootstrap confidence intervals for g
  • Assess robustness using trimmed means effect sizes
  • Apply small-sample correction factor J
  • Convert to r, odds ratio, or NNT for interpretation
Interpretation Guidelines

Hedges' g is a bias-corrected effect size. Post-hoc tests are not applicable.

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

Bias-corrected standardized mean difference. Removes upward bias in Cohen's d for small samples. Use same benchmarks as Cohen's d: |g| = 0.2 small, 0.5 medium, 0.8 large. Preferred for meta-analysis and when n < 50 per group.

Correction is substantial for small samples: at n=10 per group (df=18), J≈0.92 (8% reduction); at n=25 per group (df=48), J≈0.98 (2% reduction); at n=100 per group (df=198), J≈0.996 (<1% reduction).

Always use Hedges' g for: (1) Small samples (n < 50 per group or N < 100); (2) Meta-analysis (ensures unbiased pooled estimates); (3) Reporting effect sizes for publication (best practice). Use Cohen's d only for large samples (N > 200) where correction is negligible.

Uncorrected standardized mean difference. Has positive bias in small samples but is asymptotically unbiased. Cohen's benchmarks: |d| = 0.2 small, 0.5 medium, 0.8 large.

Recommended Metric: Hedges' g for small samples (n < 50) and meta-analysis; Cohen's d acceptable for large samples (n ≥ 50); Glass's Δ if intervention affects variance
Small
0.2
Medium
0.5
Large
0.8
0.50
Hedges' g for small samples (n < 50) and meta-analysis; Cohen's d acceptable for large samples (n ≥ 50); Glass's Δ if intervention affects variance
Recommended Measure
4
Available Metrics
ReportUse Hedges' g for small samples (n < 50) and meta-analysis; Cohen's d acceptable for large samples (n ≥ 50); Glass's Δ if intervention affects variance 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 'Pilot Buffer' Minimum: Hedges' g is valid for samples as small as N=5, where Cohen's d would be dangerously biased. A minimum of 10 participants per group is recommended for basic stability.

Effect SizeParametersRequired n
Small Effectg=0.20 (Small)n ≈ 820 total
Medium Effectg=0.50 (Medium)n ≈ 135 total
Large Effectg=0.80 (Large)n ≈ 55 total
Key considerations

The 'Inflation Shield': Hedges' g applies the (N-3) based correction factor. In a sample of N=10, Cohen's d might claim 0.8 while Hedges' g correctly deflates it to 0.6. Use 'g' for all pilot study reporting to maintain elite rigor.

G*Power StrategyBenchmark: T-tests → Means: Hedges' g. Parameters: Expected g, α = .05, Power = .80. Note: Hedges' g is more conservative than Cohen's d, requiring ~5% more N to reach the same p-value threshold.
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
Hedges' g was calculated to quantify the effect of mindfulness intervention on anxiety, with bias correction applied due to small sample size (N = 28). The intervention group (M = 42.3, SD = 9.2, n = 15) showed lower anxiety than the control group (M = 51.7, SD = 8.5, n = 13), g = -1.06, 95% CI [-1.64, -0.48]. This represents a large effect (Cohen, 1988). The bias correction factor (J = 0.977) reduced Cohen's d by 2.3% (from d = -1.08 to g = -1.06), providing an unbiased estimate of the population effect size.
Reusable template

Hedges' g was calculated to quantify the magnitude of describe comparison, with bias correction applied for small sample size / for meta-analysis. The Group 1 group (M = XX.X, SD = X.X, n = XX) showed higher/lower outcome compared to the Group 2 group (M = XX.X, SD = X.X, n = XX), g = X.XX, 95% CI X.XX, X.XX. This represents a small/medium/large effect (Cohen, 1988).

Essential statistics to report
  • Hedges' g value
  • 95% confidence interval
  • Descriptive statistics per group (M, SD, n)
  • Effect size interpretation (small/medium/large with Cohen's benchmarks)
  • Note that bias correction was applied
  • Contextual interpretation (practical/clinical significance)
10Exhibit Builder

Manuscript Lab

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

Table 1: Hedges' g Effect Size for Small Samples
MetricCohen's d (Raw)Hedges' g (Corrected)95% CI (g)Bias Reduction
Effect Size0.850.78[0.12, 1.44]-8.2%
Note. Reporting bias-corrected g. N = 12 (6 per group).
g = 0.78Powerful Correction. Reporting raw d (.85) would have over-promised the treatment effect. g provides a more honest appraisal for this pilot cohort.
Header glossary

The Small Sample Guard. Cohen's d tends to overestimate effect sizes when N is small. g applies a mathematical correction factor to provide an unbiased estimate.

The 'Truth' Adjustment. The percentage by which the raw d was inflated due to low sample size.

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 Hedges' g with CI
effectsize::hedges_g(score ~ group, data = df)

# 2. Derive from Cohen's d
effsize::cohen.d(score ~ group, data = df, hedg.correction = TRUE)
Library stack
R
effsizeeffectsize
Python
pingouin
Elite Forensic Strike

Always use Hedges' g by default in psychology and clinical medicine. It is mathematically superior to Cohen's d across all sample sizes (it converges to d as N increases).

# Automated Unbiased Effect Selection
effectsize::effectsize(t.test(x, y))
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
Cohen's d has positive bias in small samples, overestimating the population effect size. This bias can be substantial (5-10% for n < 20 per group). Uncorrected d inflates effect sizes, misleading meta-analyses, power analyses, and replication studies. For n=10 per group, d overestimates by ~8%.
The correction
For n < 50 per group or total N < 100, ALWAYS use Hedges' g. Calculate correction factor J = 1 - 3/(4df-1), then g = d × J. Report: 'Hedges' g = X.XX (bias-corrected for small sample, J = X.XXX)'. For meta-analysis, always pool Hedges' g values, not Cohen's d.
Why it's wrong
Hedges' g correction (J factor) ONLY addresses small-sample bias in estimating the standardized mean difference. It does NOT correct for unequal variances across groups. If variances are unequal (variance ratio > 2-3), pooled SD is inappropriate regardless of sample size, and both d and g are biased.
The correction
Check homogeneity of variance separately (Levene's test, variance ratio). If variances unequal: (1) Use Glass's Δ (control SD only), which can also be bias-corrected (Δ × J); (2) Use Welch's t-test variant effect size; (3) Transform data to stabilize variance; (4) Report both SDs. Hedges' g addresses bias, not heterogeneity.
Why it's wrong
Meta-analyses pool studies with varying sample sizes. Using Cohen's d inflates pooled effect size because small studies (which contribute to meta-analysis) have upward bias. This leads to overoptimistic conclusions, failed replications, and inaccurate power calculations for future studies.
The correction
For meta-analysis, ALWAYS: (1) Convert all effect sizes to Hedges' g; (2) Weight by inverse variance; (3) Report pooled g with 95% CI and heterogeneity (I², τ²); (4) Assess publication bias. Use metafor package in R or Comprehensive Meta-Analysis software. Standard practice since Hedges & Olkin (1985).
Why it's wrong
Hedges' original correction (J factor) was derived for independent groups designs. For paired/within-subjects designs, Cohen's dz (dz = M_diff/SD_diff) has different bias properties and requires different correction. Applying J to dz is inappropriate and yields incorrect values.
The correction
For paired/within-subjects: Use dz = M_diff/SD_diff. Bias correction for dz: J_paired = 1 - 3/(4(n-1) - 1), where n is number of pairs. Or use more complex corrections (Morris & DeShon, 2002). For crossover/repeated measures, use appropriate within-subjects effect size formulas with matched bias corrections.
Why it's wrong
Some software (e.g., metafor in R, Stata's esize with hedges option) automatically applies Hedges' correction. If you manually calculate J and apply it to already-corrected values, you under-correct (apply J twice), yielding biased effect sizes. This is a common error when mixing manual and automated calculations.
The correction
Check software documentation carefully. If using metafor::escalc(measure='SMD'), Stata esize with hedges option, or other meta-analysis tools, Hedges' g is already corrected—do NOT apply J again. If calculating manually from means/SDs, compute d first, then apply J once. Verify by checking J value and df.
Why it's wrong
For large samples (n > 100 per group), J ≈ 0.996-0.999, making d and g nearly identical (differ by < 1%). Researchers sometimes waste effort distinguishing them or incorrectly claim large differences exist. Understanding convergence clarifies when correction matters most.
The correction
Report correction factor J and sample size. If N > 200 and J > 0.99, note 'd and g are nearly identical (differ by < 1%) due to large sample.' For small samples, emphasize correction: 'With N=28, J=0.977, reducing d by 2.3%.' Focus correction discussion on small-sample contexts where it matters most.
Why it's wrong
Point estimate of g alone doesn't convey precision or uncertainty. Small samples yield imprecise estimates. A 'large' g with wide CI (e.g., g=0.8, 95% CI [0.0, 1.6]) overlaps with null and small effects. CIs are essential for interpreting whether effect is distinguishable from zero or benchmarks, especially in small samples where g is most needed.
The correction
ALWAYS report 95% CI for Hedges' g. For approximate CI: calculate CI for d (using MBESS::ci.smd in R or manual SE formula), then apply J correction to bounds. For exact CI: use noncentral t-distribution methods. Report: 'g = 0.75, 95% CI [0.42, 1.08], indicating a medium-to-large effect with good precision.'
Why it's wrong
If some studies report Cohen's d and others Hedges' g, pooling them directly is inappropriate. They are not identical—especially for small samples—and mixing inflates heterogeneity and biases pooled estimate. Inconsistent effect size metrics undermine meta-analysis validity.
The correction
Standardize all effect sizes to Hedges' g before pooling: (1) Convert d to g using g = d × J with each study's df; (2) Use metafor::escalc to convert from various inputs (means, SDs, t-values) directly to g; (3) Document conversion in methods. Never pool d and g without conversion.
Why it's wrong
Readers need to know whether effect size is corrected (Hedges' g) or uncorrected (Cohen's d) to interpret magnitude and compare across studies. Ambiguous reporting ('standardized mean difference') without specifying d vs g creates confusion, especially for small samples where they differ substantially (5-10%).
The correction
Always specify in text and tables: 'Hedges' g (bias-corrected)' or 'Cohen's d (uncorrected)'. In methods, state: 'Effect sizes were calculated as Hedges' g with bias correction for small samples (J = 1 - 3/(4df-1)).' In APA format: 'g = 0.65 (bias-corrected Cohen's d).'
Why it's wrong
While Hedges' g corrects bias, it assumes approximate normality of sampling distribution. With extremely small n (< 10 per group), sampling distribution of g may be non-normal, CIs inaccurate, and estimates unstable. Additionally, outliers have disproportionate influence. Effect size may be imprecise and misleading.
The correction
For n < 10 per group: (1) Report Hedges' g with caveat about precision; (2) Use bootstrap CIs (1000+ resamples) instead of parametric CIs; (3) Report descriptive statistics and individual data points; (4) Consider reporting unstandardized difference; (5) Emphasize need for replication with larger sample. Acknowledge limitations explicitly.
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]
Hedges, L. V. (1981). Distribution theory for Glass's estimator of effect size and related estimators. Journal of Educational Statistics, 6(2), 107-128.
Seminal paper introducing bias correction for standardized mean difference. Derived correction factor J = 1 - 3/(4df-1) for small samples. Foundation for Hedges' g and modern meta-analysis.
doi: 10.3102/10769986006002107
[2]
Hedges, L. V., & Olkin, I. (1985). Statistical methods for meta-analysis. Academic Press.
Comprehensive text on meta-analysis methods. Establishes Hedges' g as standard effect size for pooling studies. Essential reference for meta-analysts.
[3]
Cohen, J. (1988). Statistical power analysis for the behavioral sciences (2nd ed.). Lawrence Erlbaum Associates.
Defines Cohen's d and effect size benchmarks (0.2 small, 0.5 medium, 0.8 large). Standard interpretation guidelines apply to both d and g.
[4]
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 tutorial on effect size calculation and reporting. Covers Cohen's d, Hedges' g, and conversion formulas. Highly accessible guide for researchers.
doi: 10.3389/fpsyg.2013.00863
[5]
Borenstein, M., Hedges, L. V., Higgins, J. P. T., & Rothstein, H. R. (2009). Introduction to meta-analysis. John Wiley & Sons.
Comprehensive meta-analysis textbook. Detailed coverage of Hedges' g, bias correction, and pooling methods. Essential for conducting rigorous meta-analyses.
[6]
Hofmann, S. G., Sawyer, A. T., Witt, A. A., & Oh, D. (2010). The effect of mindfulness-based therapy on anxiety and depression: A meta-analytic review. Journal of Consulting and Clinical Psychology, 78(2), 169-183.
Meta-analysis showing mindfulness interventions reduce anxiety (Hedges' g ≈ 0.55). Basis for example scenario.
doi: 10.1037/a0018555
[7]
Morris, S. B., & DeShon, R. P. (2002). Combining effect size estimates in meta-analysis with repeated measures and independent-groups designs. Psychological Methods, 7(1), 105-125.
Formulas for converting between within-subjects and between-subjects effect sizes, including bias corrections for each design.
doi: 10.1037/1082-989X.7.1.105
In a small sample, the math likes to tell tall tales. Use Hedges' g to ensure your discovery is humble enough to be true.
The Interpretive Rigor Directive
statminds · Hedges'Mind reference · v2.2 · updated 2026-01-1715 of 15 sections