You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
8.8 KiB
146 lines
8.8 KiB
---
|
|
title: Measuring Overton window shifts with parliamentary voting data
|
|
date: 2026-05-24
|
|
category: best-practices/
|
|
module: analysis/right_wing
|
|
problem_type: best_practice
|
|
component: development_workflow
|
|
severity: medium
|
|
applies_when:
|
|
- "Analyzing longitudinal shifts in political acceptability of motions"
|
|
- "Testing whether centrist parties moved toward policy extremes"
|
|
- "Distinguishing coalition-driven voting from genuine ideological repositioning"
|
|
tags:
|
|
- overton-window
|
|
- parliamentary-voting
|
|
- centrist-classification
|
|
- svd-drift
|
|
- acceptance-without-conversion
|
|
- dutch-parliament
|
|
- political-analysis
|
|
- extremity-scoring
|
|
---
|
|
|
|
# Measuring Overton Window Shifts with Parliamentary Voting Data
|
|
|
|
## Context
|
|
|
|
Dutch Tweede Kamer voting data over 2016–2026 provides a natural experiment for testing whether the political Overton window — the range of politically acceptable policy proposals — has shifted rightward. The central question: did centrist parties become more accepting of right-wing policy, and what objective indicators support or refute a genuine shift?
|
|
|
|
Initial analysis efforts ran into three structural problems before converging on a reliable methodology. (session history)
|
|
|
|
## Guidance
|
|
|
|
### 1. Define Centrist Parties by Quantitative Position
|
|
|
|
Do not assume party self-labels or media classifications. Define centrist parties by their SVD position on the primary left-right axis:
|
|
|
|
- Compute SVD scores per party per window
|
|
- A party qualifies as centrist only if its coordinate falls within ±0.5σ of the parliamentary median over the full period
|
|
- In the Dutch context, this yields **D66, CDA, CU, NSC** as centrist
|
|
- VVD and BBB are center-right, not centrist — including them inflated baseline centrist support by ~0.13 and diluted the Overton shift signal from d=0.85 to d=0.68 (session history)
|
|
|
|
### 2. Align SVD Axes with Procrustes + Validate Sign via Anchor Parties
|
|
|
|
Raw per-window SVD axes are independently computed and not comparable across years. The stability gate (Spearman correlation of party rankings) failed for 9/10 consecutive window pairs.
|
|
|
|
**Correct approach:**
|
|
- Use chained Procrustes alignment to the first chronological window
|
|
- Zero-pad vectors to max dimension across all windows
|
|
- Run global PCA on the stacked aligned matrix
|
|
- Apply flip correction per axis using canonical right/left party centroids
|
|
- **Critically:** after flip correction, axis sign may differ from raw SVD_THEMES labels. Always validate orientation against 2+ known-party anchors (e.g., PVV vs Volt on axis-2) before interpreting direction
|
|
|
|
For the Dutch parliament after flip correction:
|
|
- Axis 1 (economic): positive = pro-market, negative = welfare
|
|
- Axis 2 (cultural): **negative = nationalist** (PVV at -0.56, FVD at -0.36), **positive = kosmopolitisch** (Volt at +0.27, GL-PvdA at +0.21) — this is the **opposite** of raw `SVD_THEMES[2]` labeling
|
|
|
|
### 3. Replace Pass Rate with Centrist Support Fraction
|
|
|
|
The Dutch Tweede Kamer passes 96%+ of all motions. Pass rate is structurally useless — no signal survives the ceiling effect.
|
|
|
|
**Use instead:** `centrist_support = centrist_voor_votes / centrist_total_votes`
|
|
|
|
In the party-disciplined Dutch context, computing this as fraction-of-parties vs fraction-of-MPs produces near-identical results (r = 0.998, mean difference < 0.001), but MP-level is preferred for international comparability.
|
|
|
|
### 4. The Overton Test: Rising Support + Widening Ideological Distance
|
|
|
|
The defining signature of an Overton window widening is **acceptance without conversion**:
|
|
|
|
- Centrist voting support for right-wing motions rises (Cohen's d = +0.85 for opposition-only motions)
|
|
- **But** SVD axes show centrists moved LEFT on both dimensions (economic: -0.223, cultural: +0.081 toward kosmopolitisch)
|
|
- **And** the cultural distance between centrist and right-wing parties **widened** from 0.282 to 0.428 (+0.146)
|
|
- The combined pattern rules out ideological conversion and confirms window widening: the range of acceptable policy expanded without centrist parties themselves moving right
|
|
|
|
### 5. Opposition-Only Filter as Coalition Control
|
|
|
|
Motions submitted by government parties after they enter coalition could reflect coalition discipline, not ideological shift. Filter to motions where the lead submitter party is NOT in the ruling coalition:
|
|
|
|
- Parse submitter party from motion title prefixes
|
|
- Hardcode coalition composition per year
|
|
- If opposition-only centrist support also rises (as it did: d=+0.85, stronger than overall d=+0.65), the shift is not coalition-driven
|
|
|
|
**Fragility note:** submitter parsing covers ~87–91% of motions. Missing 10%+ are bills, amendments, and motions with non-standard titles.
|
|
|
|
### 6. Extremity-Stratified Centrist Support as Tolerance Test
|
|
|
|
Bucket right-wing motions by LLM-scored extremity (1–2, 2–3, 3–4, 4–5). Compute centrist support per bucket for pre-2024 vs post-2024:
|
|
|
|
- If high-extremity motions gained disproportionate support: centrists became more tolerant of extreme content
|
|
- If all buckets rose uniformly: the shift is about quantity, not tolerance
|
|
- If only mild motions rose: right-wing parties filed milder motions, shift is illusory
|
|
|
|
The persistence of a gradient (centrists still differentiate by extremity post-shift) confirms centrist support is not random — they vote strategically, not blindly.
|
|
|
|
### 7. Audit LLM Scores with 2D Rescoring
|
|
|
|
LLM-based extremity scores conflate two distinct dimensions:
|
|
- **Stylistic extremity:** inflammatory language, emotional charge
|
|
- **Material impact:** substantive rights restriction, institutional change
|
|
|
|
Manual audit of 5 motions per extremity bucket (20 total) found 75% agreement with systematic LLM biases: overrating anti-institutional language and migration-adjacent content. A flat content extremity trend (d=-0.09) may partially reflect these biases rather than genuine stability.
|
|
|
|
**Mitigation:** deferred two-dimensional rescoring on a stratified sample to measure correlation. If r < 0.6, the dimensions are independent and dual scoring is required.
|
|
|
|
## Why This Matters
|
|
|
|
Without this methodology, Overton window analysis produces false negatives or ambiguous results:
|
|
- Loose centrist definitions mask the signal (session history)
|
|
- Pass rate creates a false negative (no detectable change at 96%+ ceiling)
|
|
- Raw SVD mislabels axis direction, producing the wrong interpretation (centrists moving "right" when they actually moved left)
|
|
- Missing opposition control conflates coalition discipline with ideological shift
|
|
|
|
The "acceptance without conversion" finding has implications beyond Dutch politics: it demonstrates that policy acceptance can expand without ideological convergence, a pattern observable in any party-disciplined legislature with longitudinal voting data.
|
|
|
|
## When to Apply
|
|
|
|
- When analyzing longitudinal shifts in policy acceptability from voting records
|
|
- When centrist parties show increased voting alignment with fringe parties
|
|
- When distinguishing between coalition effects and genuine ideological repositioning
|
|
- When working with per-window SVD/PCA embeddings that need cross-temporal comparison
|
|
- When using LLM-scored extremity metrics as independent variables — audit first
|
|
|
|
## Examples
|
|
|
|
**Before (what didn't work):**
|
|
- Raw per-window SVD positions compared without alignment → 9/10 stability failures, uninterpretable
|
|
- Pass rate tracked as primary Overton metric → flatline at 96%+, no signal
|
|
- Loose centrist definition (VVD, D66, CDA, NSC, BBB, CU) → inflated baseline, diluted d=0.68
|
|
- Static SVD_THEMES pole labels assumed without verifying against anchor parties → wrong axis direction
|
|
|
|
**After (what works):**
|
|
- Procrustes-aligned PCA with anchor-party sign validation → interpretable cross-window drift
|
|
- Centrist support fraction as primary metric → clear pre/post shift (d=+0.65 strict, d=+0.85 opposition-only)
|
|
- Strict centrist definition (D66, CDA, CU, NSC) → unmasked the full effect size
|
|
- Runtime flip correction produces correct axis convention → centrists moved LEFT on both axes, diverging from right
|
|
|
|
## Related
|
|
|
|
- `docs/solutions/best-practices/svd-labels-voting-patterns-not-semantics.md` — foundational: SVD captures voting patterns, not semantic content
|
|
- `docs/solutions/ui-bugs/svd-axis-pole-labels-incorrect-after-flip.md` — sign convention discovery via runtime flip
|
|
- `docs/solutions/insights/quantifying-political-extremity.md` — voting extremity vs policy extremity are independent
|
|
- `docs/solutions/insights/svd-stability-vs-overtone-shift.md` — SVD stability and Overton shift are independent phenomena
|
|
- `docs/solutions/logic-errors/svd-component-labels-mismatch.md` — initial semantic-vs-voting labeling confusion
|
|
- `analysis/right_wing/overton_breakpoint_analysis.py` — reference implementation
|
|
- `analysis/right_wing/overton_svd_drift.py` — Procrustes-aligned drift computation
|
|
- `analysis/right_wing/classify_motions.py` — centrist_support computation logic
|
|
|