While the standard Wolfson Polarization Index calculates middle-class hollowing-out around the exact median (50th percentile), structural economic analysis frequently requires evaluating polarization across flexible, policy-relevant quantile cutoffs (such as lower-middle vs upper-middle thresholds at the 40th or 60th percentiles). James Foster and Michael Wolfson formulated extended polarization indices that measure distance between subgroup clusters relative to an arbitrary cut-off threshold. In modern Microsoft Excel, dynamic array formulas combining LAMBDA, LET, MAP, and VSTACK enable economists to author flexible Foster-Wolfson polarization models dynamically without legacy macros.
Mathematical Foundations of the Foster-Wolfson Metric
Given an income distribution (Y) and an arbitrary income cutoff threshold (z) (such as median income (m) or a policy threshold), the population divides into a lower group (L = {y le z}) and an upper group (U = {y > z}). The generalized polarization index (P(z)) is formulated as:
[ P(z) = rac{mu_U – mu_L}{z} imes left[ 1 – (G_L cdot p_L + G_U cdot p_U) ight] ]Where:
- (mu_L, mu_U): The mean incomes of the lower and upper cohorts respectively.
- (p_L, p_U): The population proportions belonging to the lower and upper cohorts.
- (G_L, G_U): The internal Gini inequality coefficients within the lower and upper cohorts.
- Between-Group Distance (((mu_U – mu_L) / z)): Captures alienation between the two societal poles.
- Within-Group Identification ((1 – (G_L p_L + G_U p_U))): Measures the internal cohesion of each group; higher cohesion strengthens bipolar clustering.
Authoring the Dynamic Foster-Wolfson Model in Excel
Place your raw household income or salary sample in column range B2:B50. In cell D2, enter this dynamic array formula:
=LET(
incomes, B2:B50,
clean_data, FILTER(incomes, ISNUMBER(incomes) * (incomes > 0)),
n_total, ROWS(clean_data),
/* Overall Moments */
mean_all, AVERAGE(clean_data),
med_all, MEDIAN(clean_data),
/* Helper LAMBDA to compute Gini for any vector */
calc_gini, LAMBDA(vec,
LET(
n, ROWS(vec),
mu, AVERAGE(vec),
s, SORT(vec, 1, 1),
r, SEQUENCE(n),
IF(mu = 0, 0, (2 / (n * mu)) * SUM(r * s) - (n + 1) / n)
)
),
/* Function to calculate Foster-Wolfson Polarization at arbitrary threshold z */
calc_fw, LAMBDA(cutoff_z,
LET(
low_group, FILTER(clean_data, clean_data <= cutoff_z),
up_group, FILTER(clean_data, clean_data > cutoff_z),
n_l, ROWS(low_group),
n_u, ROWS(up_group),
p_l, n_l / n_total,
p_u, n_u / n_total,
mu_l, AVERAGE(low_group),
mu_u, AVERAGE(up_group),
gini_l, calc_gini(low_group),
gini_u, calc_gini(up_group),
alienation, (mu_u - mu_l) / cutoff_z,
within_ineq, (gini_l * p_l) + (gini_u * p_u),
identification, 1 - within_ineq,
fw_index, alienation * identification,
HSTACK(TEXT(cutoff_z, "£#,##0"), TEXT(fw_index, "0.0000"), TEXT(alienation, "0.00"), TEXT(identification, "0.000"), TEXT(p_l, "0.0%"))
)
),
/* Calculate across multiple threshold cutoffs */
cut_40, PERCENTILE.INC(clean_data, 0.40),
cut_50, med_all,
cut_60, PERCENTILE.INC(clean_data, 0.60),
headers, HSTACK("Cutoff Threshold (z)", "Polarization Score P(z)", "Alienation Gap", "Internal Identification", "Lower Cohort Share"),
r_40, VSTACK(HSTACK("40th Percentile Cutoff", "", "", "", ""), calc_fw(cut_40)),
r_50, VSTACK(HSTACK("Median Cutoff (50th)", "", "", "", ""), calc_fw(cut_50)),
r_60, VSTACK(HSTACK("60th Percentile Cutoff", "", "", "", ""), calc_fw(cut_60)),
summary_head, HSTACK("Structural Factor", "Value", "Description"),
s1, HSTACK("Overall Population Mean", TEXT(mean_all, "£#,##0"), "Baseline central tendency"),
s2, HSTACK("Overall Population Median", TEXT(med_all, "£#,##0"), "Median income benchmark"),
s3, HSTACK("Overall Gini Coefficient", TEXT(calc_gini(clean_data), "0.0000"), "Baseline aggregate inequality"),
VSTACK(headers, calc_fw(cut_40), calc_fw(cut_50), calc_fw(cut_60), HSTACK("", "", "", "", ""), summary_head, s1, s2, s3)
)
Core Advantages of the Formulaic Implementation
- Multi-Threshold Sensitivity: Allows researchers to test polarization robustness across different definitions of the middle class (e.g., 40th vs 50th vs 60th percentiles).
- Analytical Factor Decomposition: Decomposes polarization into the “alienation” gap between poles and the “identification” cohesion within groups.
- Audit-Ready Portability: Native dynamic array construction ensures spreadsheet calculations remain fully verifiable without relying on external macros or compiled add-ins.