Eta squared vs partial eta squared: which to report
Eta squared, partial eta squared and omega squared differ only in the denominator. A two-way ANOVA in R shows which to report and the interval to give.
Updated . Written by Matt Gencer.
On this page
Eta squared and partial eta squared both describe how much of the variation in an outcome goes with a factor in an ANOVA, and they differ in one thing: what they divide by. In a one-way ANOVA they are the same number. In any model with more than one term they are not, and reporting one under the other’s name is an error that has appeared in published papers.
This post gives the three formulas side by side (eta squared, partial eta squared and omega squared), works a two-way ANOVA on R’s warpbreaks data through a deterministic engine, and ends with a decision rule and a reporting sentence. For where eta squared sits among the other effect sizes, see the effect sizes guide.
Three formulas, one difference: the denominator
An ANOVA splits the total variation in the outcome into sums of squares: one for each factor, one for each interaction and one for the error that is left over.
- Eta squared divides an effect’s sum of squares by the total sum of squares: SS effect / SS total. It is the proportion of all the variation in the sample that goes with that effect. The values for every term in one model share the same denominator, so together with the error they add up to 1.
- Partial eta squared divides by the effect plus the error only: SS effect / (SS effect + SS error). The variation due to the other terms is removed from the denominator, so the value answers a narrower question: of the variation not explained by the other terms, how much goes with this one?
- Omega squared starts from eta squared and subtracts an estimate of how much the effect’s sum of squares would be by chance alone: (SS effect - df effect x MS error) / (SS total + MS error). Eta squared describes the sample and tends to overestimate the population value; omega squared corrects for that. Lakens notes the difference is usually small and shrinks as the sample grows. A partial omega squared exists too, with the same relationship to partial eta squared.
By hand, read the sum of squares column of the ANOVA table: divide a term’s value by the total sum of squares (the Total row, where the software prints one) for eta squared, or by that term plus the error row for the partial version.
With one factor, SS total is exactly SS effect plus SS error, which is why the one-way ANOVA gives the same eta squared either way. Add a second factor and the total also contains that factor’s sum of squares, so partial eta squared is larger than eta squared for every term whenever the other terms explain any variation.
Partial eta squared has one practical property the others lack: it can be computed from an F statistic and its two degrees of freedom alone, as F x df effect / (F x df effect + df error). That is what lets you check any published value against its F.
Worked example: a two-way ANOVA on warpbreaks
R’s built-in warpbreaks data come from a textile experiment reported by Tippett in 1950. Each of 54 looms wove a fixed length of yarn and the number of warp breaks was counted. The looms used one of two wool types (A or B) at one of three tension levels (low, medium, high), with 9 looms in each of the six combinations. Every observation is a different loom, so this is a balanced, between-subjects two-way design.
The analysis was a two-way ANOVA with wool, tension and their interaction, seeded and run in R; the method was chosen before the run. Each term was tested with Type II sums of squares, which test each main effect adjusted for the other main effect but not for the interaction, and the interaction adjusted for both. Because every cell has 9 looms, the factors are uncorrelated and Type II gives the same tests as sequential (Type I) sums of squares here. Each term’s partial eta squared was computed from that term’s own F and degrees of freedom, with a two-sided 95% interval.
| Term | F | df | p | Partial eta squared | 95% interval |
|---|---|---|---|---|---|
| Wool | 3.765 | 1, 48 | 0.0582 | 0.07274 | 0 to 0.2433 |
| Tension | 8.498 | 2, 48 | < 0.001 | 0.2615 | 0.06229 to 0.4394 |
| Wool by tension | 4.189 | 2, 48 | 0.021 | 0.1486 | 0.002144 to 0.3236 |
The cell means show what the interaction is about. With wool A, looms at low tension averaged 44.56 breaks against 24.00 at medium and 24.56 at high. With wool B the means were 28.22, 28.78 and 18.78. For wool A, breaks fall sharply from low to medium tension; for wool B they barely change from low to medium and fall at high tension. That difference in pattern is what the interaction term measures.
You can rebuild each partial value from the table. For wool, 3.765 x 1 / (3.765 x 1 + 48) gives 0.07274. The same formula with F = 4.189 and 2 and 48 degrees of freedom gives the interaction’s 0.1486. If a paper’s value does not match its F this way, one is wrong or it is a different statistic.
Reading it
Read the interaction first, as the two-way ANOVA guide explains. Its partial eta squared is 0.1486 with an interval from 0.002144 to 0.3236. The interval sits just above zero and reaches values several times the estimate, so the data say the effect of wool depends on tension but pin down its size only loosely.
The wool main effect has the widest relative uncertainty: 0.07274 with an interval from 0 to 0.2433. The data are compatible with no wool effect at all, averaged over tension, and with a sizeable one. With the interaction present, that average describes no tension level in particular.
Tension has the largest partial value, 0.2615 (0.06229 to 0.4394).
Lakens notes that partial and generalized eta squared are identical when all factors are manipulated between participants, as wool and tension were here, so Cohen’s benchmarks for eta squared (0.01, 0.06 and 0.14) apply, with the caveat below. By them wool is roughly medium and tension and the interaction are large. Treat that as a first label only.
Why these are not shares of the variance
It is tempting to read 0.2615 as “tension explains 26% of the variation in breaks”. That sentence is true of classical eta squared, and wrong here. Each partial value divides by its own effect plus the error, so the three values above are three ratios with three different denominators. They are not slices of one total, and in a model with strong effects partial values can add up to more than 1. Pierce, Block and Aguinis documented the error of reporting partial values as if they were classical eta squared, with examples from articles in leading psychology journals.
The same denominator explains why partial eta squared does not travel between designs. A study that measures wool alone leaves the tension variation in its error term, so its eta squared for wool will be smaller than the partial value from this two-factor study, even when the true wool effect is identical. Olejnik and Algina pointed out that design features alone can have a large effect on these statistics, and proposed generalized eta and omega squared, defined so that values are comparable across a variety of designs.
Which one to report
- One factor, no covariates: eta squared. It equals the partial value, so either label is correct, but say which.
- Several factors, and you want effects within this study compared on one scale: classical eta squared, which shares one denominator across terms.
- Several factors, and you want each effect with the other manipulated factors held out: partial eta squared, labelled as partial. This is what SPSS prints, and Levine and Hullett found that the SPSS version they examined reported it under the plain name “eta squared”.
- Repeated measures, mixed designs or results meant for meta-analysis: generalized eta squared, which Lakens recommends for within-subjects and mixed designs. The repeated measures guide covers those designs.
- A small sample: consider omega squared, or its partial form, to reduce the upward bias.
The interval to report, and what it assumes
Report a 95% interval with every partial eta squared. The usual interval comes from inverting the noncentral F distribution. Steiger set out these exact intervals for the balanced, between-subjects, fixed-effects ANOVA, which is the warpbreaks design. The engine computes them with the R package effectsize, and the lower bound is truncated at zero, which is why wool’s interval starts at exactly 0.
The interval inherits the ANOVA’s assumptions: independent observations, roughly normal errors and equal variance across cells. The Shapiro-Wilk test on the residuals gave W = 0.987 (p = 0.816), so no departure from normality was detected, which is not the same as showing the errors are normal. Levene’s test (the median-centred version) across the six cells gave F = 2.891 (p = 0.0232), so unequal variances were detected, and the engine flagged it.
That flag fits the outcome. Breaks are counts, and the spread of counts often grows with their mean, so read the F tests and intervals above as approximate. A count model fits this outcome type more directly; the Poisson or negative binomial guide explains the choice. Its effect sizes are on a different scale and cannot be compared with the partial eta squared values here.
Getting each one in R
The engine reports partial eta squared for two-way ANOVA. To compute the other two on the same model, use the effectsize package:
library(effectsize)
fit <- lm(breaks ~ wool * tension, data = warpbreaks)
tab <- car::Anova(fit, type = 2)
two_sided <- "two.sided"
eta_squared(tab, partial = TRUE, alternative = two_sided) # partial eta squared, Type II
eta_squared(tab, partial = FALSE, alternative = two_sided) # classical eta squared
omega_squared(tab, partial = FALSE, alternative = two_sided) # omega squared
Two details change the numbers. First, pass the Type II table, not the lm fit: called on the fit, the functions use sequential (Type I) sums of squares. In this balanced design Type I and Type II agree, but with unequal cell sizes they differ, and so do the effect sizes. Second, effectsize gives a one-sided interval by default, with the upper bound fixed at 1. The intervals in the table above are two-sided, so the code asks for that explicitly.
How to report it
For the worked example, a results sentence would read:
A two-way ANOVA with Type II sums of squares found a wool by tension interaction, F(2, 48) = 4.19, p = 0.021, partial eta squared = 0.15 (95% CI 0.002 to 0.32). The main effect of tension was F(2, 48) = 8.50, p < 0.001, partial eta squared = 0.26 (95% CI 0.06 to 0.44), and the main effect of wool was F(1, 48) = 3.77, p = 0.058, partial eta squared = 0.07 (95% CI 0 to 0.24).
Then describe the pattern of cell means, since the interaction is the main finding. For cell comparisons, see the multiple comparisons guide.
Common mistakes
Calling a partial value “eta squared”. The label decides the denominator. Write “partial eta squared” whenever the model has more than one term.
Applying the 0.01, 0.06 and 0.14 benchmarks to any partial value. Lakens, following Olejnik and Algina, notes that they were developed for comparisons between unrestricted populations, so they do not fit partial values from designs with covariates or repeated measures.
Rerunning the example
Below the article are the R script the engine generated, with its seed, and its output. On the same package versions it recomputes the ANOVA table, the cell means and the partial eta squared values with their intervals; the classical and omega squared code above is not part of it. The two-way ANOVA method reference lists what the engine reports for this method.
Worked example
Data: Tippett LHC (1950). Technological Applications of Statistics. New York: Wiley, p. 106. https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/warpbreaks.html. Seed: 20261021.
Run on Celeus engine 0.30.0, seed 20261021, public data.
Output
# Results - Test: Two-way ANOVA (factorial) - n: 54 - statistic: 4.189 - p-value: 0.021 - effect size: partial eta-squared = 0.1486 (95% CI 0.002144 to 0.3236) (two-sided CI at the run's confidence level) - seed: 20261021 ## Assumption checks - normality (Shapiro-Wilk): passed=TRUE (no evidence against normality) - variance homogeneity (Levene): passed=FALSE (evidence of unequal variances) - sample size: passed=TRUE (adequate n) ## Term tests | Term | Test | Statistic | df | Residual df | p-value | Partial eta-squared (95% CI) | |---|---|---|---|---|---|---| | wool | F | 3.765 | 1 | 48 | 0.0582 | 0.07274 (0 to 0.2433) | | tension | F | 8.498 | 2 | 48 | < 0.001 | 0.2615 (0.06229 to 0.4394) | | wool:tension | F | 4.189 | 2 | 48 | 0.021 | 0.1486 (0.002144 to 0.3236) | ## Power - Power is not calculated for this test.
R script
# Celeus - reproduce.R (run from this package folder; bundled data in data/)
# Test: Two-way ANOVA (factorial) | engine 0.30.0 | catalog c39-d3cd
# Research context: not provided for this run.
# Reproduces the recorded result deterministically.
set.seed(20261021)
.data_path <- "data/eta-squared.csv"
if (!file.exists(.data_path)) stop("Run reproduce.R from the package folder (the bundled data is in data/).")
data <- readr::read_csv(.data_path, show_col_types = FALSE) # needs the readr package
clean_cells <- function (df)
{
ctrl_collapse <- "[\r\n\t\v\f]+"
zero_width_chars <- intToUtf8(c(8203L, 65279L), multiple = TRUE)
uni_space_chars <- intToUtf8(c(160L, 8239L, 8199L), multiple = TRUE)
clean_text <- function(x) {
out <- x
for (ch in zero_width_chars) out <- gsub(ch, "", out,
fixed = TRUE)
out <- gsub(ctrl_collapse, " ", out)
for (ch in uni_space_chars) out <- gsub(ch, " ", out,
fixed = TRUE)
trimws(gsub(" +", " ", out))
}
changed_cols <- character(0)
cells_cleaned <- 0L
retyped <- character(0)
for (j in seq_along(df)) {
col <- df[[j]]
if (!is.character(col))
next
cleaned <- clean_text(col)
n_changed <- sum(!is.na(col) & !is.na(cleaned) & col !=
cleaned, na.rm = TRUE)
if (n_changed > 0L) {
changed_cols <- c(changed_cols, names(df)[j])
cells_cleaned <- cells_cleaned + n_changed
}
df[[j]] <- cleaned
non_blank <- cleaned[!is.na(cleaned) & nzchar(cleaned)]
if (length(non_blank) && all(grepl("^[+-]?(0|[1-9][0-9]*)([.][0-9]+)?$",
non_blank))) {
parsed <- suppressWarnings(as.numeric(cleaned))
was_blank <- is.na(cleaned) | !nzchar(cleaned)
lost <- (is.na(parsed) | is.infinite(parsed)) & !was_blank
if (!any(lost)) {
finite <- parsed[!is.na(parsed)]
all_whole <- all(finite == floor(finite))
in_range <- all(abs(finite) <= .Machine$integer.max)
df[[j]] <- if (all_whole && in_range)
as.integer(parsed)
else parsed
retyped <- c(retyped, names(df)[j])
}
}
}
names(df) <- clean_text(names(df))
if (length(changed_cols)) {
attr(df, "ingest_clean_columns") <- changed_cols
attr(df, "ingest_clean_cells_cleaned") <- cells_cleaned
}
if (length(retyped))
attr(df, "ingest_clean_retyped") <- retyped
df
}
data <- clean_cells(data)
# Complete-case analysis: drop rows missing any analysis value.
.acols <- c("breaks", "wool", "tension")
data <- data[stats::complete.cases(data[, .acols, drop = FALSE]), , drop = FALSE]
result <- { .d <- data; .d[["wool"]] <- as.factor(.d[["wool"]]); .d[["tension"]] <- as.factor(.d[["tension"]]); .fit <- stats::lm(`breaks` ~ `wool` * `tension`, data = .d); .an <- car::Anova(.fit, type = 2); .em <- emmeans::emmeans(.fit, specs = c("wool", "tension")); list(anova = .an, emmeans = summary(.em)) }
print(result)
# Effect size (partial_eta_sq) and its confidence interval.
effect <- { .es_d <- data; .es_d[["wool"]] <- as.factor(.es_d[["wool"]]); .es_d[["tension"]] <- as.factor(.es_d[["tension"]]); .es_an <- car::Anova(stats::lm(`breaks` ~ `wool` * `tension`, data = .es_d), type = 2); effectsize::F_to_eta2(.es_an[["F value"]][seq_len(nrow(.es_an) - 1L)], .es_an[["Df"]][seq_len(nrow(.es_an) - 1L)], .es_an[["Df"]][nrow(.es_an)], ci = 0.95, alternative = "two.sided") }
print(effect)Common questions
Is eta squared the same as partial eta squared in a one-way ANOVA?
Yes. With one factor the only sources of variation are the effect and the error, so the total sum of squares equals the effect plus the error and the two formulas give the same number. They separate as soon as a second factor, an interaction or a covariate enters the model.
Why do partial eta squared values not add up to 1?
Each partial value has its own denominator, the effect's sum of squares plus the error sum of squares. Because every term uses a different denominator, the values are not shares of one total, and in a model with strong effects they can add up to more than 1. Classical eta squared values share the total sum of squares, so they cannot.
Can I compare partial eta squared across studies?
Only when the designs match. Partial eta squared removes the variance due to the other factors in the model, so the same effect looks larger in a study that measured more factors or used a covariate. Across different designs, generalized eta squared is the version built to be comparable.
What counts as a large eta squared?
Cohen's conventional benchmarks are 0.01, 0.06 and 0.14 for small, medium and large, stated for eta squared. They were developed for comparisons between unrestricted populations, so applying them to a partial value from a design with covariates or repeated measures is not consistent with how they were built. In a design where every factor is manipulated between units, partial and generalized eta squared coincide and the benchmarks can be applied with that caveat. Judge size against effects known in your own field as well.
Should I report omega squared instead of eta squared?
Omega squared corrects the upward bias of eta squared, which estimates explained variance from the sample. The correction matters most in small samples and shrinks as the sample grows. Either is acceptable if you name it; what matters more is reporting which version you used and its confidence interval.
Sources
- Levine TR, Hullett CR (2002). Eta squared, partial eta squared, and misreporting of effect size in communication research. Human Communication Research 28(4):612-625. doi:10.1111/j.1468-2958.2002.tb00828.x
- Pierce CA, Block RA, Aguinis H (2004). Cautionary note on reporting eta-squared values from multifactor ANOVA designs. Educational and Psychological Measurement 64(6):916-924. doi:10.1177/0013164404264848
- Olejnik S, Algina J (2003). Generalized eta and omega squared statistics: measures of effect size for some common research designs. Psychological Methods 8(4):434-447. doi:10.1037/1082-989X.8.4.434
- 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. doi:10.3389/fpsyg.2013.00863
- Steiger JH (2004). Beyond the F test: effect size confidence intervals and tests of close fit in the analysis of variance and contrast analysis. Psychological Methods 9(2):164-182. doi:10.1037/1082-989X.9.2.164
- Ben-Shachar MS, Ludecke D, Makowski D (2020). effectsize: estimation of effect size indices and standardized parameters. Journal of Open Source Software 5(56):2815. doi:10.21105/joss.02815
Methods discussed
Try it on your own data
Upload a dataset and Celeus suggests a method, checks its assumptions, runs it in R, and gives you the script to rerun it.
Try it in Celeus