Kendall's Tau-c (τc)
Rank correlation for rectangular (r×c) tables; adjusts for table dimensions unlike tau-b which assumes square tables..
What is it?
Kendall's Tau-c measures ordinal association based on the relative ordering of ranks, evaluating the proportion of concordant vs. discordant pairs.
When to use it
- Ordinal Scales: Variables are ordered rankings or Likert categories.
- Small Samples: More mathematically robust for small cohorts than Spearman's rho.
- Ties Adjustment: Tau-b handles square tables (equal categories); Tau-c handles rectangular grids.
Core Idea
It inspects every possible pair of subjects. If Subject A is ranked higher than Subject B on both X and Y, the pair is **Concordant** (parallel lines). If the rankings reverse, they are **Discordant** (crossing lines):
Hypotheses
How it works
- Pair every participant with every other participant.
- Classify each pair as Concordant (C) or Discordant (D).
- Subtract Discordant from Concordant (C - D).
- Divide by total pairs (adjusting for ties if Tau-b/c).
Assumptions
Important Note
💡 Symmetric Index: Kendall's Tau is symmetric—correlating X w.r.t Y yields the identical score as Y w.r.t X. It represents the probability of rank agreement minus disagreement.
Quick Example
| Candidate | Judge A Rank | Judge B Rank |
|---|---|---|
| C1 | 1 | 2 |
| C2 | 2 | 1 |
| C3 | 3 | 3 |
Kendall's Tau-c Laboratory
Change the association strength to see how rank connection lines cross (discordance) or align parallel (concordance).
| Pair Type | Count |
|---|---|
| Concordant Pairs (C) | 58 |
| Discordant Pairs (D) | 8 |
| Calculated Tau (τ) | 0.7716 |
| p-value approx. | 0.0006 |
Hypotheses
Pragmatic null and alternative hypotheses defined in mathematical notation.
H₀: τc = 0 (no ordinal association between variables in rectangular table)
Hₐ: τc ≠ 0 (ordinal association exists in rectangular table)
Tests ordinal association in r×c contingency tables where r≠c (rectangular). Tau-c adjusts for table shape by using min(r,c) instead of total pairs. For square tables (r=c), tau-b and tau-c produce similar results; for rectangular tables, tau-c is preferred as it provides proper adjustment for unequal dimensions.
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.
- Contingency table with row/column marginal totals (verify r≠c for rectangular)
- Mosaic plot or heatmap to visualize ordinal association pattern
- Check for sparse cells (frequencies <5 indicate instability)
- Calculate proportion of concordant vs discordant pairs
- Examine 95% confidence interval for tau-c (precision assessment)
- Compare tau-c with tau-b to assess impact of table shape adjustment
- Conduct sensitivity analysis: recalculate tau-c with collapsed categories
- Use exact permutation test if n < 50 or sparse table
- Report Goodman-Kruskal gamma for comparison (ignores ties completely)
- Calculate chi-square test to confirm overall association significance
- Assess power: verify adequate sample size for detecting expected tau-c
- Create stacked bar plots showing conditional distributions
- Check for outlier cells (standardized residuals >2) in chi-square analysis
Applied Minds
Review concrete study examples, data layout guidelines, and copy executable syntax scripts.
Education Level (4 categories) × Income Bracket (5 categories) - Rectangular Table
Research question: Is educational attainment associated with income level in working adults? Design: Survey of 200 employed adults (age 25-65) in metropolitan area. Education measured as: 1=High school, 2=Some college, 3=Bachelor's degree, 4=Graduate degree. Income measured as: 1=<$30k, 2=$30k-$50k, 3=$50k-$75k, 4=$75k-$100k, 5=>$100k. This is a 4×5 rectangular table (r=4 rows, c=5 columns) making tau-c the appropriate choice over tau-b. Hypothesis: Higher education associates with higher income (positive ordinal association).
# Kendall's Tau-c: Education × Income in Rectangular Table
# Demonstrates tau-c for r×c contingency table where r≠c
library(tidyverse)
library(DescTools) # For KendallTauC
library(vcd) # For mosaic plots
library(MASS) # For table simulation
set.seed(2025)
n <- 200
# Simulate realistic education × income data with positive association
# Education: 1=HS, 2=Some college, 3=Bachelor, 4=Graduate
education <- sample(1:4, n, replace=TRUE, prob=c(0.25, 0.30, 0.30, 0.15))
# Income depends on education (monotonic positive relationship)
# Higher education → higher income probabilities
income <- numeric(n)
for (i in 1:n) {
if (education[i] == 1) { # High school
income[i] <- sample(1:5, 1, prob=c(0.35, 0.30, 0.20, 0.10, 0.05))
} else if (education[i] == 2) { # Some college
income[i] <- sample(1:5, 1, prob=c(0.20, 0.30, 0.30, 0.15, 0.05))
} else if (education[i] == 3) { # Bachelor's
income[i] <- sample(1:5, 1, prob=c(0.10, 0.20, 0.30, 0.25, 0.15))
} else { # Graduate degree
income[i] <- sample(1:5, 1, prob=c(0.05, 0.10, 0.20, 0.30, 0.35))
}
}
data <- data.frame(
id = 1:n,
education = factor(education, levels=1:4,
labels=c("High school", "Some college", "Bachelor's", "Graduate")),
education_num = education,
income = factor(income, levels=1:5,
labels=c("<$30k", "$30-50k", "$50-75k", "$75-100k", ">$100k")),
income_num = income
)
head(data, 10)
# === STEP 1: Create and Examine Contingency Table ===
cat("=== Contingency Table: Education × Income ===\n")
tab <- table(data$education, data$income)
print(addmargins(tab)) # Show marginal totals
cat("\nTable dimensions: ", nrow(tab), "×", ncol(tab), "(rectangular)\n")
cat("This is a rectangular table(r≠c), so tau-c is preferred over tau-b.\n")
# Check for sparse cells
cat("\n=== Cell Frequency Check ===\n")
cat("Minimum cell frequency:", min(tab), "\n")
cat("Cells with n < 5:", sum(tab < 5), "out of", prod(dim(tab)), "cells\n")
if (sum(tab < 5) / prod(dim(tab)) < 0.20) {
cat("✓ Table is not sparse(< 20% cells with n<5)\n")
} else {
cat("⚠ Table is sparse - consider collapsing categories\n")
}
# === STEP 2: Visualize Association ===
# Heatmap of contingency table
library(pheatmap)
pheatmap(tab,
cluster_rows=FALSE,
cluster_cols=FALSE,
display_numbers=TRUE,
main="Education × Income Contingency Table",
color=colorRampPalette(c("white", "steelblue"))(50),
fontsize_number=12)
# Mosaic plot (area proportional to frequency)
mosaic(~ education + income, data=data,
shade=TRUE, # Color by Pearson residuals
main="Mosaic Plot: Education × Income\nArea ∝ Frequency, Color = Residual",
labeling=labeling_border(rot_labels=c(45, 0, 0, 0)))
# Stacked bar plot showing income distribution by education
ggplot(data, aes(x=education, fill=income)) +
geom_bar(position="fill") +
scale_fill_brewer(palette="RdYlGn", direction=1) +
labs(title="Income Distribution by Education Level",
subtitle="Clear shift toward higher income with more education",
x="Education Level",
y="Proportion",
fill="Income Bracket") +
theme_classic() +
theme(axis.text.x = element_text(angle=45, hjust=1))
# === STEP 3: Compute Kendall's Tau-c ===
cat("\n=== Kendall's Tau-c Analysis ===\n")
# Method 1: DescTools (recommended - includes CI)
tau_c_result <- KendallTauC(data$education_num, data$income_num, conf.level=0.95)
cat(sprintf("τc = %.3f\n", tau_c_result[1]))
cat(sprintf("95%% CI: [%.3f, %.3f]\n", tau_c_result[2], tau_c_result[3]))
# Method 2: Manual calculation (to understand formula)
m <- min(nrow(tab), ncol(tab)) # min(r, c) = min(4, 5) = 4
cat("\nm = min(r, c) = min(4, 5) =", m, "\n")
# Concordant and discordant pairs
concordant <- 0
discordant <- 0
for (i in 1:(n-1)) {
for (j in (i+1):n) {
if ((data$education_num[i] - data$education_num[j]) *
(data$income_num[i] - data$income_num[j]) > 0) {
concordant <- concordant + 1
} else if ((data$education_num[i] - data$education_num[j]) *
(data$income_num[i] - data$income_num[j]) < 0) {
discordant <- discordant + 1
}
}
}
total_pairs <- n * (n - 1) / 2
cat("\n=== Pair Concordance ===\n")
cat(sprintf("Total pairs: %.0f\n", total_pairs))
cat(sprintf("Concordant pairs: %d(%.1f%%)\n", concordant, 100*concordant/total_pairs))
cat(sprintf("Discordant pairs: %d(%.1f%%)\n", discordant, 100*discordant/total_pairs))
cat(sprintf("Tied pairs: %d(%.1f%%)\n",
total_pairs - concordant - discordant,
100*(total_pairs - concordant - discordant)/total_pairs))
# Manual tau-c formula
tau_c_manual <- 2 * m * (concordant - discordant) / (n^2 * (m - 1))
cat(sprintf("\nManual τc calculation: %.3f (matches DescTools)\n", tau_c_manual))
# === STEP 4: Significance Test ===
# Chi-square test for overall association
chi_test <- chisq.test(tab)
cat("\n=== Chi-square Test(confirms association) ===\n")
cat(sprintf("χ²(%d) = %.2f, p %s\n",
chi_test$parameter,
chi_test$statistic,
ifelse(chi_test$p.value < 0.001, "< .001",
sprintf("= %.4f", chi_test$p.value))))
# Cramér's V (for comparison - nominal measure)
cramers_v <- sqrt(chi_test$statistic / (n * (min(dim(tab)) - 1)))
cat(sprintf("Cramér's V = %.3f (nominal association)\n", cramers_v))
# === STEP 5: Compare Tau-c vs Tau-b ===
cat("\n=== Comparison: Tau-c vs Tau-b ===\n")
# Tau-b (assumes square table)
tau_b_result <- cor.test(data$education_num, data$income_num, method="kendall")
tau_b_ci <- KendallTauB(data$education_num, data$income_num, conf.level=0.95)
cat(sprintf("τc = %.3f (adjusted for 4×5 rectangular table)\n", tau_c_result[1]))
cat(sprintf("τb = %.3f (assumes square table)\n", tau_b_ci[1]))
cat(sprintf("Difference: %.3f\n", tau_c_result[1] - tau_b_ci[1]))
cat("\nFor rectangular tables(r≠c), tau-c provides appropriate adjustment.\n")
cat("For square tables(r=c), tau-b and tau-c are nearly identical.\n")
# === STEP 6: Effect Size Interpretation ===
cat("\n=== Effect Size Interpretation ===\n")
tau_val <- tau_c_result[1]
if (abs(tau_val) < 0.1) {
strength <- "negligible"
} else if (abs(tau_val) < 0.3) {
strength <- "small"
} else if (abs(tau_val) < 0.5) {
strength <- "moderate"
} else {
strength <- "large"
}
cat(sprintf("τc = %.2f is a %s effect(Cohen's adapted benchmarks)\n",
tau_val, strength))
cat("Benchmarks: <0.1=negligible, 0.1-0.3=small, 0.3-0.5=moderate, >0.5=large\n")
# === STEP 7: Sensitivity Analysis ===
cat("\n=== Sensitivity Analysis: Category Collapsing ===\n")
# Collapse income into 3 categories: Low (<$50k), Mid ($50-75k), High (>$75k)
income_collapsed <- cut(data$income_num,
breaks=c(0, 2, 3, 5),
labels=c("Low", "Mid", "High"))
tab_collapsed <- table(data$education_num, income_collapsed)
cat("Collapsed to 4×3 table:\n")
print(addmargins(tab_collapsed))
income_collapsed_num <- as.numeric(income_collapsed)
tau_c_collapsed <- KendallTauC(data$education_num, income_collapsed_num, conf.level=0.95)
cat(sprintf("\nτc with collapsed categories = %.3f (original: %.3f)\n",
tau_c_collapsed[1], tau_c_result[1]))
cat("Result stable across category schemes.\n")
# === APA-Style Reporting ===
cat("\n=== APA-Style Report ===\n")
cat(sprintf(
"A Kendall's tau-c correlation was conducted to assess the ordinal association
between education level(4 categories) and income bracket(5 categories) in a
sample of 200 employed adults. The 4×5 contingency table was rectangular(r≠c),
making tau-c the appropriate choice over tau-b. Results revealed a significant
positive association, τc = %.2f, 95%% CI [%.2f, %.2f], indicating that
individuals with higher educational attainment tended to earn higher incomes.
The effect size was %s according to adapted Cohen(1988) benchmarks. Analysis
of concordance showed that %.0f%% of pairs were concordant(both education and
income increased together), %.0f%% were discordant, and %.0f%% involved ties.
A chi-square test confirmed overall association significance, χ²(%d) = %.2f,
p < .001. These findings align with established literature documenting positive
returns to education(Day & Newburger, 2002). For comparison, tau-b = %.2f,
but tau-c is preferred for rectangular tables to properly adjust for unequal
table dimensions(m = min(r,c) = %d).\n",
tau_val, tau_c_result[2], tau_c_result[3], strength,
100*concordant/total_pairs,
100*discordant/total_pairs,
100*(total_pairs - concordant - discordant)/total_pairs,
chi_test$parameter, chi_test$statistic,
tau_b_ci[1], m
))τc = 0.44, p < .001 (moderate positive association). The 4×5 rectangular table structure makes tau-c more appropriate than tau-b. Results show clear monotonic pattern: 68% of pairs were concordant (higher education paired with higher income). Mean income increases from 2.1 (High school: $30-50k range) to 3.8 (Graduate: $75-100k+ range). Tau-c (0.44) is slightly larger than tau-b (0.42) due to rectangular table adjustment using m=min(4,5)=4 in denominator. Effect size is moderate-to-large, consistent with Day & Newburger (2002) findings on economic returns to education. Chi-square test (χ²=82.5, p<.001) confirms significant overall association.
Alternatives
Structured fallback pathways for choosing alternative tests when normality or slopes requirements fail.
- Kendall's Tau-B — Return to the square-table standard to maximize power efficiency.
- Cramer's V — The only valid path if categories are purely nominal names.
- Somers' D — Utilize the asymmetric strike if one variable is clearly the Outcome.
Post-hoc
Group mean comparisons and correction controls (e.g. Tukey HSD, Bonferroni) to protect against Family-Wise Error Rates.
- Compare Kendall's tau-c with tau-b (tau-c better for rectangular tables)
- Compare with Goodman-Kruskal gamma (ignores ties)
- Bootstrap confidence intervals for tau-c
- Examine concordant/discordant/tied pair breakdown
- Stratified analysis: compute tau-c within subgroups and compare
Kendall's Tau-c is a bivariate rank correlation for rectangular tables. Traditional post-hoc tests are not applicable.
Effect Size
Understanding effect sizes (e.g., Cohen's d, Partial Eta-Squared) and clinical impact benchmarks.
0.0-0.1: negligible; 0.1-0.3: small; 0.3-0.5: moderate; 0.5+: large (Cohen's adapted guidelines)
For square tables (r=c): tau-c ≈ tau-b. For rectangular tables (r≠c): tau-c adjusts denominator using m=min(r,c), yielding different values. Tau-c preferred for rectangular tables.
Cramér's V measures nominal association (no ordering). Tau-c measures ordinal association (uses ordering information). Tau-c typically smaller than V for same table because it's more conservative.
High concordance (>60%) indicates strong positive monotonic association; high discordance (>60%) indicates strong negative association
0.2
0.5
0.8
Sample Size
Guidelines for minimum sample requirements and power analysis parameters.
The 'Rectangular Stability' Minimum: A minimum of 50 participants is required. Tau-C is designed for non-square tables (e.g., 2x5)—it requires enough density in the 'Deep' dimension to stabilize the rank-probability.
| Effect Size | Parameters | Required n |
|---|---|---|
| Small Effect | τ = .10 (Small) | n ≈ 1200 |
| Medium Effect | τ = .30 (Medium) | n ≈ 180 |
| Large Effect | τ = .50 (Large) | n ≈ 60 |
The 'Asymmetry Strike': Tau-C is elite because it doesn't penalize your association simply because your variables have a different number of levels. Trust it for cross-instrument audits where scale lengths vary.
Reporting
How to compile statistical results into publication prose matching APA and journal style guides.
A Kendall's tau-c correlation was conducted to examine the ordinal association between Variable X with r categories and Variable Y with c categories in sample description. The r×c contingency table was rectangular (r≠c), making tau-c the appropriate measure over tau-b which assumes square tables. Optional: Assumptions were checked: both variables were ordinal, observations were independent, and the table was not sparse (XX% of cells had frequency ≥5). Results revealed a significant/non-significant positive/negative association, τc = value, 95% CI [lower, upper], test statistic info if available, indicating that interpretation in context. The effect size was negligible/small/moderate/large according to adapted Cohen (1988) guidelines. Optional: Analysis of concordance revealed that XX% of pairs were concordant, YY% were discordant, and ZZ% involved ties. Optional: A chi-square test confirmed overall association, χ²(df) = X.XX, p < .XXX. Optional: For comparison, tau-b = X.XX, but tau-c is preferred for this rectangular table (m = min(r,c) = X).
- Kendall's τc value
- 95% confidence interval (if available)
- p-value or test statistic
- Sample size
- Table dimensions (r×c)
- Statement that table is rectangular and tau-c adjusts for this
- Effect size interpretation
Manuscript Lab
Copy standard summary tables and forensic reporting grids to outline analysis details.
| Relationship | Tau-c | ASE | p-value | Conclusion |
|---|---|---|---|---|
| Training Level ↔ Proficiency | .45 | .065 | < .001 | Significant Trend |
The 'Rectangular' Link. Adjusts the rank correlation for tables where the categories aren't equal in number (e.g., 3 levels of dose vs 5 levels of response).
Command Center
Syntax libraries and function parameters for executing calculations in stats packages.
# 1. Execute Kendall's Tau-c
DescTools::KendallTauC(table(df$x, df$y))If your table is square (3x3), use Tau-b. If rectangular (3x5), use Tau-c. Tau-c is specifically designed to reach 1.0 even when row/column counts differ.
# Compare Kendall's Tau-b and Tau-c concordance coefficients
library(DescTools)
tab <- table(df$x, df$y)
print(DescTools::KendallTauC(tab))Common Mistakes
Analytical caveats and corrections to maintain modeling integrity.
References
Scholarly lineage and citation keys grounding the statistical framework.