# 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.
