241 lines
8.5 KiB
Markdown
241 lines
8.5 KiB
Markdown
# 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_high` and `type_low` columns replace single `type`
|
|
- ✅ Stan model: Unified `Gamma_man` matrix 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 pole
|
|
- `positive/sample` ratio 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:
|
|
|
|
1. **Both poles are already captured**: The bipolar structure means low cosmopolitan (anti-immigration) is automatically measured
|
|
2. **Avoids double-counting**: Each mention/quasi-sentence contributes to exactly ONE item
|
|
3. **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
|
|
4. **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 coded
|
|
- `direction < 0`: Opposition to the issue
|
|
- `direction == 0`: Ambivalent (exclude from analysis)
|
|
|
|
**Aggregation**:
|
|
```r
|
|
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:
|
|
```r
|
|
issue_cat == "immig" & direction > 0 → positive for cosmopolitan
|
|
issue_cat == "immig" & direction < 0 → negative for cosmopolitan
|
|
```
|
|
|
|
If interpretation B is correct:
|
|
```r
|
|
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**:
|
|
```r
|
|
"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:
|
|
```r
|
|
"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
|
|
|
|
1. **Bipolar items load on one dimension only** - the ratio captures both poles
|
|
2. **Each manifesto code appears in exactly one item** - no double-counting
|
|
3. **Correlations between dimensions are estimated, not imposed** - more flexible model
|
|
4. **Direction reversals are handled within items** - via stance assignment (Manifesto) or direction sign (PolDem)
|
|
5. **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.
|