8.5 KiB
Data Coding Principles for 4D Latent Trait Model
V4 Implementation (Current Version)
As of V4 (2025-11-18), manifesto items implement the bipolar bridge structure described in this document.
Key Changes from V3.x:
- ✅ Manifesto items now load on TWO dimensions (bipolar bridges)
- ✅ Data format:
type_highandtype_lowcolumns replace singletype - ✅ Stan model: Unified
Gamma_manmatrix replaces per-dimension arrays - ✅ Measurement consistency: Manifesto items match expert data structure
Why V4?
- Better identification (each observation informs two dimensions)
- Estimated correlations (not imposed by construction)
- No double-counting (each quasi-sentence counted once)
See CHANGELOG.md for full V4 migration details.
Model Structure Overview
The model estimates four unipolar latent dimensions:
- pro_market: Support for market liberalization
- pro_welfare: Support for welfare state expansion
- cosmopolitan: Support for internationalism, diversity, openness
- traditional: Support for nationalism, security, traditional values
These are separate dimensions, not two bipolar scales. Correlations between dimensions (e.g., cosmopolitan-traditional) are estimated empirically, not imposed by construction.
Item Types and Loading Structure
1. Bipolar Bridge Items
Definition: Items where the sample includes mentions of BOTH sides of an issue, and "positive" counts mentions favoring one pole.
Structure:
sample= mentions of issue (any direction)positive= mentions favoring one polepositive/sampleratio varies from 0 to 1
Loading: Should load on ONE dimension only
Examples:
Manifesto Data:
var: "Multiculturalism"
type: "cosmopolitan"
sample: per607 (pro-multiculturalism) + per608 (anti-multiculturalism)
positive: per607 (pro-multiculturalism)
- High ratio → high cosmopolitan (party favors multiculturalism)
- Low ratio → low cosmopolitan (party opposes multiculturalism)
- Anti-multiculturalism is implicitly measured as (sample - positive)
PolDem Data:
var: "Immigration (Media)"
type: "cosmopolitan"
sample: all immigration mentions (direction != 0)
positive: pro-immigration mentions (direction > 0)
- High ratio → high cosmopolitan (media coverage shows party supporting immigration)
- Low ratio → low cosmopolitan (media coverage shows party opposing immigration)
2. Why One Loading Suffices for Bipolar Items
Question: Shouldn't anti-immigration also load on traditional?
Answer: No, because:
- Both poles are already captured: The bipolar structure means low cosmopolitan (anti-immigration) is automatically measured
- Avoids double-counting: Each mention/quasi-sentence contributes to exactly ONE item
- Empirical correlations emerge naturally: If anti-immigration parties also score high on nationalism/law-and-order, the posterior correlation between cosmopolitan and traditional will reflect this
- More flexible model: Cosmopolitan-traditional relationship is estimated, not imposed
Imposed vs. Estimated Correlation:
- If we double-load immigration on both cosmopolitan (negative) and traditional (positive), we force them to be opposites
- By loading only on cosmopolitan, we let the data reveal whether anti-immigration parties are also nationalist (empirical question)
Coding Decision Rules
Rule 1: Each Manifesto Code Appears in ONE Item Only
Good (current structure):
"Multiculturalism" (cosmopolitan):
- per607 (Positive), per608 (Negative)
"National Identity" (traditional):
- per601 (Positive), per107 (Negative)
- per607/per608 only in cosmopolitan
- per601/per107 only in traditional
- Correlation between dimensions is empirical
Bad (double-loading):
"Multiculturalism" (cosmopolitan):
- per607 (Positive), per601 (Negative)
"National Identity" (traditional):
- per601 (Positive), per607 (Negative)
- per601 and per607 counted twice
- Imposes perfect negative correlation between cosmopolitan/traditional
Rule 2: Stance Assignment Within Items
Within each item (var), codes are assigned stance based on:
- Positive: Codes indicating support for the item's construct
- Negative: Codes indicating opposition to the item's construct
Example - "Internationalism" (cosmopolitan):
- per107 (Internationalism positive): stance = "Positive"
- per109 (Internationalism negative): stance = "Negative"
- Result: High per107 / low per109 → high cosmopolitan score
Rule 3: PolDem Direction Mapping
PolDem uses direction variable (-1, 0, +1):
direction > 0: Support for the issue as codeddirection < 0: Opposition to the issuedirection == 0: Ambivalent (exclude from analysis)
Aggregation:
poldem_processed %>%
filter(direction != 0) %>% # exclude neutral
group_by(party, year, country, issue_cat) %>%
summarise(
sample = n(), # all non-neutral mentions
positive = sum(direction > 0) # supportive mentions only
)
Special Cases
Immigration (Direction Ambiguity)
Codebook says: "Opposition to restrictive immigration"
Interpretation needed: Does direction = +1 mean:
- A) Support for "opposition to restrictions" → pro-immigration (cosmopolitan)
- B) Support for "restrictions" → anti-immigration (traditional)
Resolution: Must manually inspect sample sentences before finalizing coding.
If interpretation A is correct:
issue_cat == "immig" & direction > 0 → positive for cosmopolitan
issue_cat == "immig" & direction < 0 → negative for cosmopolitan
If interpretation B is correct:
issue_cat == "immig" & direction > 0 → negative for cosmopolitan
issue_cat == "immig" & direction < 0 → positive for cosmopolitan
# (REVERSED)
Europe/Euro Items
EU integration naturally maps to cosmopolitan-traditional dimension:
Manifesto Data:
- Add new items using per108 (EU integration positive) and per106 (EU integration negative)
- Create separate vars: "EU Integration Support" (cosmopolitan), "Euroskepticism" (traditional)
PolDem Data:
"EU Integration Support (Media)" (cosmopolitan):
issue_cat = "europe" or "euro"
sample = all mentions
positive = direction > 0 (pro-EU)
"Euroskepticism (Media)" (traditional):
issue_cat = "europe" or "euro"
sample = all mentions
positive = direction < 0 (anti-EU)
Note: Same sentences contribute to BOTH items, but counting opposite directions. This creates natural negative correlation between cosmopolitan/traditional.
Alternative approach (cleaner, recommended): Load only on cosmopolitan:
"EU Position (Media)" (cosmopolitan):
issue_cat = "europe" or "euro"
sample = all mentions
positive = direction > 0
This is sufficient if we treat EU as a bipolar cosmopolitan item.
Data Structure Requirements
Manifesto Data Format (party-year-var level)
Each row represents one item for one party-year:
| party | country | year | var | type | sample | positive | project |
|---|---|---|---|---|---|---|---|
| 211 | DE | 2013 | Multiculturalism | cosmopolitan | 45 | 23 | Manifesto |
| 211 | DE | 2013 | National Identity | traditional | 67 | 58 | Manifesto |
| 211 | DE | 2013 | Economic Intervention | pro_welfare | 102 | 78 | Manifesto |
- var: Item name (e.g., "Multiculturalism", "Economic Intervention")
- type: Dimension it loads on (pro_market, pro_welfare, cosmopolitan, traditional)
- sample: Total quasi-sentences mentioning this issue
- positive: Quasi-sentences with positive stance toward this item
PolDem Data Format (same structure)
| party | country | year | var | type | sample | positive | project |
|---|---|---|---|---|---|---|---|
| 211 | DE | 2013 | Immigration (Media) | cosmopolitan | 23 | 8 | PolDem |
| 211 | DE | 2013 | Nationalism (Media) | traditional | 15 | 12 | PolDem |
Combined using bind_rows() to create unified dataset.
Summary
- Bipolar items load on one dimension only - the ratio captures both poles
- Each manifesto code appears in exactly one item - no double-counting
- Correlations between dimensions are estimated, not imposed - more flexible model
- Direction reversals are handled within items - via stance assignment (Manifesto) or direction sign (PolDem)
- All items must allow varying positive/sample ratios - mix of positive and negative stances required
This structure preserves the conceptual independence of the four dimensions while allowing the data to reveal their empirical relationships.