Labor Economics & Demographic Statistics
Duncan Dissimilarity Index & Karmel-MacLachlan Formula
Calculate the Duncan Index of Dissimilarity D = 0.5 * SUM(|a_k/A - b_k/B|) and Karmel-MacLachlan replacement-preserving index I_p = 2 * p * (1 - p) * D.
Separate group-share relocation D from margin-preserving workforce reallocation I_p
Across K occupational categories or census tracts with Group A counts a_k and Group B counts b_k (totals A = SUM(a_k) > 0, B = SUM(b_k) > 0, grand total T = A + B, Group A share p = A / T), Otis Dudley Duncan and Beverly Duncan’s (1955) Index of Dissimilarity is D = 0.5 * SUM(|a_k / A - b_k / B|) in [0, 1] — measuring the fraction of Group A (or B) who would have to change occupations to equalize distributions. However, moving only Group A changes occupation sizes! Karmel and MacLachlan (1988) proved the exact share of TOTAL workers T who must swap places while keeping BOTH group totals AND occupation headcounts fixed is I_p = 2 * p * (1 - p) * D!
Verify on 4 job families (A2:D5) with Group A counts B2:B5 = {50, 30, 15, 5} (A = 100) and Group B counts C2:C5 = {10, 20, 40, 30} (B = 100 -> T = 200, p = 0.50): absolute share gaps D2:D5 = {0.40, 0.10, 0.25, 0.25} sum to 1.0000, giving Duncan D = 0.50 * 1.0000 = 0.5000 (50.00%) and Karmel-MacLachlan I_p = 2 * 0.50 * 0.50 * 0.50 = 0.2500 (25.00%, i.e., 50 total workers swapping 25 Group A for 25 Group B positions!).
| Occupation Tier | Group A (a_k / A) vs Group B (b_k / B) | Absolute Share Gap |a_k/A - b_k/B| |
|---|---|---|
| Engineering_1 | 50 / 100 (50%) vs 10 / 100 (10%) | 0.4000 |
| Product_2 | 30 / 100 (30%) vs 20 / 100 (20%) | 0.1000 |
| Operations_3 | 15 / 100 (15%) vs 40 / 100 (40%) | 0.2500 |
| Support_4 | 5 / 100 (5%) vs 30 / 100 (30%) | 0.2500 (D = 0.5000, I_p = 0.2500) |
Duncan Index of Dissimilarity D = 0.5 * SUM(|a_k / A - b_k / B|) Formula
Compute row-level absolute share differences in D2:D5 and aggregate 0.5 * SUM(D2:D5) after validating positive group totals A > 0, B > 0 and non-negative counts.
=LET(tot_a, SUM(B2:B5), tot_b, SUM(C2:C5), IF(OR(tot_a <= 0, tot_b <= 0, MIN(B2:C5) < 0), "Invalid Group Counts", ROUND(0.5 * SUM(D2:D5), 4)))Karmel-MacLachlan Margin-Preserving Segregation Index I_p = 2 * p * (1 - p) * D Formula
Multiply 2 * (A / T) * (B / T) * D to report exact headcount-neutral swap fraction.
=LET(tot_a, SUM(B2:B5), tot_b, SUM(C2:C5), tot_all, tot_a + tot_b, IF(OR(tot_a <= 0, tot_b <= 0, MIN(B2:C5) < 0), "Invalid Group Counts", LET(p_sh, tot_a / tot_all, d_idx, 0.5 * SUM(D2:D5), ROUND(2 * p_sh * (1 - p_sh) * d_idx, 4))))Try the example
Use the original values or change them to test your understanding.