From 6c1e40fffec39a758fafa115b9ee9621819a9457 Mon Sep 17 00:00:00 2001 From: Armin Date: Mon, 15 Jun 2026 18:12:13 +0200 Subject: [PATCH] Clean public release repository --- README.md | 3 +- data-setup/R/02_build_model_inputs.R | 2 +- data-setup/R/process_manifesto.R | 2 +- data-setup/R/process_poldem.R | 2 +- data/README.md | 2 +- data/releases/SHA256SUMS | 2 +- .../party_2d_diagnostics_report_v0.pdf | Bin 245833 -> 245286 bytes data/union_mapping.csv | 214 +++---- diagnostics/generate_diagnostics.R | 10 +- .../alliance_union_harmonization.csv | 74 --- .../generated/construct_family_positions.csv | 16 +- .../construct_temporal_stability_flags.csv | 120 ++-- diagnostics/generated/diagnostics_report.pdf | Bin 245833 -> 245286 bytes .../external_validation_correlations.csv | 22 +- .../model_convergence_by_dimension.csv | 18 +- .../generated/model_convergence_summary.csv | 14 +- docs/DATA_CODING_PRINCIPLES.md | 240 -------- docs/FULL_RUN_OPERATIONS.md | 73 --- docs/RAW_DATA_SOURCES.md | 112 ---- docs/union_mapping.md | 350 ----------- src/julia/02_post_estimation.jl | 2 +- src/julia/pipeline/02_data_loading.jl | 4 +- src/julia/pipeline/04_model_execution.jl | 4 +- src/julia/pipeline/05_results_processing.jl | 6 +- src/julia/pipeline/06_save_model.jl | 2 +- src/r/00_data-management.R | 311 ---------- src/r/00a_process_manifesto.R | 178 ------ src/r/00c_process_poldem.R | 161 ----- src/r/00d_process_expert.R | 580 ------------------ src/r/00e_process_morgan.R | 388 ------------ 30 files changed, 221 insertions(+), 2691 deletions(-) delete mode 100644 docs/DATA_CODING_PRINCIPLES.md delete mode 100644 docs/FULL_RUN_OPERATIONS.md delete mode 100644 docs/RAW_DATA_SOURCES.md delete mode 100644 docs/union_mapping.md delete mode 100644 src/r/00_data-management.R delete mode 100644 src/r/00a_process_manifesto.R delete mode 100644 src/r/00c_process_poldem.R delete mode 100644 src/r/00d_process_expert.R delete mode 100644 src/r/00e_process_morgan.R diff --git a/README.md b/README.md index 0c7ff8f..e2c24c0 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ Code and processed model inputs for generating two-dimensional party-position es - `models/` — Stan model specification. - `data/` — processed party-level inputs used by the Julia/Stan model. - `metadata/` — data dictionary and source-support documentation. -- `docs/` — raw data source documentation, coding decisions, and operational notes. - `diagnostics/` — repository diagnostics report regenerated after model estimation. - `data/releases/` — release-ready data files, checksums, and diagnostics report. @@ -36,7 +35,7 @@ Two inputs require user-provided access/material: - **Manifesto Project**: users must obtain the source data through their own Manifesto Project access. - **Morgan historical expert data**: `morgan_positions_raw.csv` is not publicly downloadable; it can be provided on request and should be placed locally under `_local/raw/morgan/`. -The setup workflow never overwrites committed files in `data/`. See `data-setup/README.md` and `docs/RAW_DATA_SOURCES.md` for exact commands and source details. +The setup workflow never overwrites committed files in `data/`. See `data-setup/README.md` for exact commands and source details. Run the full source-data setup workflow with: diff --git a/data-setup/R/02_build_model_inputs.R b/data-setup/R/02_build_model_inputs.R index 2ec5ca1..99286d4 100644 --- a/data-setup/R/02_build_model_inputs.R +++ b/data-setup/R/02_build_model_inputs.R @@ -2,7 +2,7 @@ # 02_build_model_inputs.R - Master Data Pipeline Orchestrator # ============================================================ # Coordinates all data processing sub-scripts and produces -# final output files for the 4D latent trait model. By default this writes only +# final output files for the two-dimensional party-position model. By default this writes only # to local-only directories under _local/ and never overwrites committed data/. # # Sub-scripts (run conditionally based on intermediate file existence): diff --git a/data-setup/R/process_manifesto.R b/data-setup/R/process_manifesto.R index 8a7cd74..f37121b 100644 --- a/data-setup/R/process_manifesto.R +++ b/data-setup/R/process_manifesto.R @@ -1,7 +1,7 @@ # ============================================================ # process_manifesto.R - Manifesto Project Data Processing # ============================================================ -# Processes Manifesto Project data for the 4D latent trait model +# Processes Manifesto Project data for the two-dimensional party-position model # Input: $PARTY2D_RAW_DATA_DIR/manifesto/MPDataset_MPDS2025a.csv # Output: manifesto_data.csv # ============================================================ diff --git a/data-setup/R/process_poldem.R b/data-setup/R/process_poldem.R index 7883e79..45f4857 100644 --- a/data-setup/R/process_poldem.R +++ b/data-setup/R/process_poldem.R @@ -2,7 +2,7 @@ # process_poldem.R - PolDem Media Data Processing # ============================================================ # Processes PolDem (Political Deliberation in the Media) data -# for the 4D latent trait model +# for the two-dimensional party-position model # # Input: $PARTY2D_RAW_DATA_DIR/poldem/poldem-election_all.csv (sentence-level) # Output: poldem_data.csv (party-year-var aggregates) diff --git a/data/README.md b/data/README.md index 299d606..46a1b7f 100644 --- a/data/README.md +++ b/data/README.md @@ -8,6 +8,6 @@ This directory contains only the processed, model-ready inputs used by the Julia - `union_mapping.csv` - `party_families.csv` -Original raw source files and intermediate build products are not stored here. To regenerate the processed inputs, place raw files in a local directory and set `PARTY2D_RAW_DATA_DIR`; see `../data-setup/README.md` and `../docs/RAW_DATA_SOURCES.md`. +Original raw source files and intermediate build products are not stored here. To regenerate the processed inputs, place raw files in a local directory and set `PARTY2D_RAW_DATA_DIR`; see `../data-setup/README.md`. Generated outputs and temporary staging files are ignored by git. diff --git a/data/releases/SHA256SUMS b/data/releases/SHA256SUMS index b0e9e7a..534b10b 100644 --- a/data/releases/SHA256SUMS +++ b/data/releases/SHA256SUMS @@ -1,3 +1,3 @@ 6b9aeda20489000983e459e4eb19d2788ed035eaab5deb9a5e010338670b2ff1 party_2d_election_year_panel_v0.zip 8f3973011fb57818656199d020d00d9a666c9414b085a3d66feb1124b629caab party_2d_annual_model_output_v0.zip -c92a006bb931d1eb2df6e48d0fb71278c2ce92cde20b499165f37bee03a3081b party_2d_diagnostics_report_v0.pdf +b99f7ef0e8a4c821183a2a0f957752303479e78e5afb685f173fd17f60039b3e party_2d_diagnostics_report_v0.pdf diff --git a/data/releases/party_2d_diagnostics_report_v0.pdf b/data/releases/party_2d_diagnostics_report_v0.pdf index e25d46eabbc61951f86dd6538983cbe2f98d0b51..4117b5d603842de14c2b82a840196d72bc407a93 100644 GIT binary patch delta 39074 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 z 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 delta 39638 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 count(country, name = "value") %>% transmute(metric = "mappings_by_country", category = country, value), - union_mapping %>% count(relationship, name = "value") %>% transmute(metric = "mappings_by_relationship", category = relationship, value), union_mapping %>% count(status, name = "value") %>% transmute(metric = "mappings_by_status", category = status, value) ) @@ -189,11 +188,11 @@ if (is.na(convergence_summary_file) || is.na(convergence_detail_file)) { stop("Convergence diagnostics not found under ", outputs_dir, ". Run the model diagnostics before generating the report.") } model_convergence_summary <- read_if_exists(convergence_summary_file) %>% - mutate(source_file = convergence_summary_file) + identity() model_convergence_by_dimension <- read_if_exists(convergence_detail_file) %>% group_by(dimension) %>% summarise(parameters = n(), mean_rhat = mean(rhat, na.rm = TRUE), max_rhat = max(rhat, na.rm = TRUE), min_ess_bulk = min(ess_bulk, na.rm = TRUE), mean_ess_bulk = mean(ess_bulk, na.rm = TRUE), .groups = "drop") %>% - mutate(dimension = public_dimension(dimension), source_file = convergence_detail_file) %>% + mutate(dimension = public_dimension(dimension)) %>% arrange(dimension) convergent_summary_file <- latest_file(file.path(outputs_dir, "validation", "latest"), "^convergent_summary_.*\\.csv$") @@ -216,14 +215,13 @@ uncertainty_summary <- read_if_exists(uncertainty_summary_file) %>% external_validation_correlations <- read_if_exists(external_validation_file) %>% group_by(var, dimension) %>% summarise(n = n(), pearson_r = cor(expert_val, model_val, use = "complete.obs"), mean_absolute_error = mean(abs_error, na.rm = TRUE), coverage_95 = mean(covered_95, na.rm = TRUE), .groups = "drop") %>% - mutate(dimension = public_dimension(dimension), source_file = external_validation_file) %>% + mutate(dimension = public_dimension(dimension)) %>% arrange(dimension, var) construct_family_positions <- read_if_exists(construct_families_file) %>% rename(mean_cultural = mean_galtan, sd_cultural = sd_galtan) %>% - mutate(source_file = construct_families_file) %>% arrange(mean_economic) construct_temporal_stability <- read_if_exists(construct_unstable_file) %>% - mutate(dimension = public_dimension(dimension), source_file = construct_unstable_file) %>% + mutate(dimension = public_dimension(dimension)) %>% arrange(desc(annual_change)) source_composition_balance <- read_if_exists(review_file("validation", "source_composition_balance.csv")) %>% mutate(dimension = public_dimension(dimension)) diff --git a/diagnostics/generated/alliance_union_harmonization.csv b/diagnostics/generated/alliance_union_harmonization.csv index e6d7819..e2004a5 100644 --- a/diagnostics/generated/alliance_union_harmonization.csv +++ b/diagnostics/generated/alliance_union_harmonization.csv @@ -36,78 +36,4 @@ mappings_by_country,RO,6 mappings_by_country,RS,3 mappings_by_country,SK,4 mappings_by_country,UY,1 -mappings_by_relationship,Amaiur (2011) predecessor to EH Bildu; expert data 2014-2024 covers EH Bildu years,1 -mappings_by_relationship,Arab party coalition (2015-2021); Balad is constituent,1 -mappings_by_relationship,Arab party coalition (2015-2021); Hadash is core constituent,1 -mappings_by_relationship,CdL coalition constituent (1994-2008),1 -mappings_by_relationship,Communist Party of Chile was constituent of Nueva Mayoría (2013-2017) under Concertación PF ID,1 -mappings_by_relationship,DS merged into SDKÚ-DS,1 -mappings_by_relationship,HDZ-led coalition variants,1 -mappings_by_relationship,Humanist Party was Concertación constituent (2005-2009),1 -mappings_by_relationship,"LLM (bloc-centric): DIKKI was a constituent member of the SYRIZA bloc in the 2007 election, running under its banner and publishing joint manifestos.",1 -mappings_by_relationship,LLM (bloc-centric): Jaunais laiks (JL) was a founding constituent of the Unity (Vienotība) bloc in 2010 and published joint manifestos under its banner.,1 -mappings_by_relationship,LLM (bloc-centric): KDS (Christian Democratic Party) is explicitly listed as a constituent member of the 'Christian and Democratic Union - Czech People's Party' bloc in the PartyFacts comments and published joint manifestos with it.,1 -mappings_by_relationship,"LLM (bloc-centric): Latvijas Zemnieku savienība (LZS) was a core constituent member of the Greens' and Farmers’ Union (ZZS) bloc in 2002, publishing joint manifestos and running under the bloc's banner.",1 -mappings_by_relationship,"LLM (bloc-centric): New Serbia (NS) was a verified constituent member of the 'Democratic Party of Serbia/New Serbia' bloc in the 2008 elections, publishing joint manifestos with DSS.",1 -mappings_by_relationship,"LLM (bloc-centric): PDT (Partido Democrático Trabalhista) was a constituent member of this bloc in multiple elections, including joint manifestos (notably 2010, 2018, and 2022).",1 -mappings_by_relationship,"LLM (bloc-centric): PL (Partido Liberal) was a constituent member of the bloc in the 2002 election, publishing a joint manifesto.",1 -mappings_by_relationship,"LLM (bloc-centric): PR (Partido da República) was a constituent member of the bloc in the 2010 and 2014 elections, publishing joint manifestos with the bloc.",1 -mappings_by_relationship,"LLM (bloc-centric): PSB (Partido Socialista Brasileiro) was a frequent coalition partner and constituent member of this bloc, including joint manifestos in several elections (notably 2002, 2006, 2010, 2014, and 2022).",1 -mappings_by_relationship,"LLM (bloc-centric): PT (Partido dos Trabalhadores) was the leading party and consistent constituent of this left/progressive bloc across all listed elections, publishing joint manifestos under its banner.",1 -mappings_by_relationship,"LLM (bloc-centric): PTB (Partido Trabalhista Brasileiro) was a constituent member of the bloc in the 2002 and 2006 elections, participating in joint manifestos.",1 -mappings_by_relationship,"LLM (bloc-centric): The Christian Democratic Party (PDC) was a principal founding member of the Concertación/CPD, running under its banner and signing joint manifestos.",1 -mappings_by_relationship,"LLM (bloc-centric): The Justicialist Party (PJ) was the principal and founding constituent of the Front for Victory (FpV) bloc, running under its banner and publishing joint manifestos in all relevant elections.",1 -mappings_by_relationship,"LLM (bloc-centric): The Party for Democracy (PPD) was a core constituent of the Concertación/CPD, participating in all its joint electoral platforms and manifestos.",1 -mappings_by_relationship,"LLM (bloc-centric): The Radical Social Democratic Party (PRSD) was a constituent member of the Concertación/CPD, participating in joint electoral lists and manifestos.",1 -mappings_by_relationship,LLM (bloc-centric): The Serbian Progressive Party (SNS) was the leading and founding constituent of the 'Aleksandar Vučić – Serbia wins / For Our Children / Serbia Must Not Stop' bloc in all listed elections and published joint manifestos under this banner.,1 -mappings_by_relationship,"LLM (bloc-centric): The Socialist Party of Chile (PS) was a founding and continuous member of the Concertación/CPD, running on joint lists and publishing joint manifestos.",1 -mappings_by_relationship,LLM: CC (Compromís) published joint manifestos as part of Compromís–Podemos–EUPV (PF ID: 8271) in general elections.,1 -mappings_by_relationship,"LLM: CD+NVA refers to the joint electoral lists of CD&V and N-VA (mainly 2003-2007); during this period, they published joint manifestos under the CD/V (PF ID: 604) label in the text data.",1 -mappings_by_relationship,"LLM: CP was a constituent of the SLFP-led United Front and People's Alliance, publishing joint manifestos with SLFP.",1 -mappings_by_relationship,"LLM: CP/VLSSP often contested as part of the SLFP-led United Front and People's Alliance, typically under joint manifestos with SLFP, but sometimes ran separately; medium confidence due to occasional independent runs.",1 -mappings_by_relationship,"LLM: DC (Democratic Centre) was a constituent of the Kukuriku coalition, which published joint manifestos under the Kukuriku name (PF ID: 2522) in 2011 and 2015.",1 -mappings_by_relationship,LLM: DUS (Demokratická únia Slovenska) is the same as DÚS (PF ID: 6629) in the manifesto data; manifestos are published under the union name.,1 -mappings_by_relationship,"LLM: D|W|U refers to Unia Wolności (UW) and its predecessors/successors, which published manifestos under the UW name (PF ID: 8268) in the text data.",1 -mappings_by_relationship,LLM: ERP (Res Publica) published joint manifestos as 'RP' (PF ID: 685) in the text data; Res Publica is the Estonian name for the same party.,1 -mappings_by_relationship,"LLM: FPCyS (Frente Progresista, Cívico y Social) included PS and others; manifestos often under FAP or similar coalitions.",1 -mappings_by_relationship,"LLM: FR (Frente Renovador) joined FAP in some elections, but also ran independently; likely constituent in FAP manifestos.",1 -mappings_by_relationship,"LLM: Groen was a constituent party of GroenLinks (GL, PF ID: 1537), which published joint manifestos after its formation; Groen did not publish separate manifestos after joining the union.",1 -mappings_by_relationship,LLM: HGI (Croatian Civic Initiative) is a small Croatian minority party that typically runs on joint lists with DSCG (Democratic Union of Croats) in Montenegro; manifestos are published under DSCG.,1 -mappings_by_relationship,"LLM: KSII is the coalition led by NDSV (374); manifestos published under NDSV, not KSII.",1 -mappings_by_relationship,"LLM: LSSP was a core constituent of the SLFP-led United Front and People's Alliance, publishing joint manifestos with SLFP.",1 -mappings_by_relationship,"LLM: NATBLNNK is a constituent of TB-LNNK (1704), which published joint manifestos as a union.",1 -mappings_by_relationship,"LLM: NE (Nuevo Espacio) is a well-known constituent party of the Frente Amplio (FA) coalition, which publishes joint manifestos under the FA name.",1 -mappings_by_relationship,LLM: NLP (NewLabour Party) was a founding constituent of the Alliance and published joint manifestos under the Alliance name.,1 -mappings_by_relationship,LLM: Oikologoi Prasinoi (OP) ran jointly with MeRA25 in 2019 as part of the 'MeRA25-Alliance for Breakup' and did not publish a separate manifesto; their program was subsumed under MeRA25.,1 -mappings_by_relationship,"LLM: P2000 (Perú 2000) was a bloc including Cambio 90 (C90); manifestos were published under the C90/NM/P2000 bloc, which is represented as C90 (PF ID: 4219) in text data.",1 -mappings_by_relationship,LLM: PBPS (Solidarity–People Before Profit) publishes joint manifestos under PBP (PF ID: 242) in the text data; this is a union.,1 -mappings_by_relationship,"LLM: PS (Socialist Party) was a core constituent of FAP (Frente Amplio Progresista), which published joint manifestos.",1 -mappings_by_relationship,"LLM: SNK-ED ran joint lists and published manifestos together with STAN (PF ID: 1707) in parliamentary elections, notably in 2006, under the SNK-ED–STAN label.",1 -mappings_by_relationship,LLM: Sinistra Ecologia Libertà (SEL) is present in both datasets and publishes manifestos under SEL (PF ID: 1212) in text data.,1 -mappings_by_relationship,"LLM: The Liberal Party (LP, PF ID: 1998) is the predecessor and constituent of the Liberal Party of Australia (LPA, PF ID: 486); manifestos are published under LPA, not LP.",1 -mappings_by_relationship,"LLM: The National Party (NAT) is the predecessor and constituent of the National Party of Australia (NPA, PF ID: 1743), which is the name used for joint manifestos after the party's rebranding; manifestos are published under NPA, not NAT.",1 -mappings_by_relationship,LLM: UNPR was a constituent of the USL (PF ID: 5941) coalition and did not publish its own manifesto; manifestos were issued under the USL name.,1 -mappings_by_relationship,LLM: Unione di Centro (UC/UDC) is a constituent of UdC (PF ID: 201) in the text data; they publish joint manifestos under UdC.,1 -mappings_by_relationship,Nowoczesna was core constituent of Koalicja Obywatelska (KO) in 2019 under PO CMP code (progtype=8),1 -mappings_by_relationship,PASOK-dominated umbrella rebranded 2022,1 -mappings_by_relationship,PNL was a core constituent of USL coalition (2012 joint manifesto),1 -mappings_by_relationship,PRI-PVEM electoral coalition (2006-2012) under various names,2 -mappings_by_relationship,PSD was the lead constituent of USL coalition (2012 joint manifesto),1 -mappings_by_relationship,Peronist faction no independent manifesto,1 -mappings_by_relationship,UMP renamed 2015,1 -mappings_by_relationship,bloc constituent (progtype=5),1 -mappings_by_relationship,bloc constituent (progtype=8),19 -mappings_by_relationship,cartel list,1 -mappings_by_relationship,constituent,3 -mappings_by_relationship,constituent of alliance,4 -mappings_by_relationship,core coalition member joint CMP manifesto,2 -mappings_by_relationship,joint list SDP dominant,1 -mappings_by_relationship,merger,3 -mappings_by_relationship,merger constituent,2 -mappings_by_relationship,name fragment of LDP/LSV/SDS,1 -mappings_by_relationship,name fragment of LNNK-LZP,1 -mappings_by_relationship,name fragment of PSD-PC,1 -mappings_by_relationship,name fragment of PSD-PUR,1 -mappings_by_relationship,same as Les Républicains duplicate PF ID,1 -mappings_by_relationship,same party duplicate PF ID,5 mappings_by_status,implemented,106 diff --git a/diagnostics/generated/construct_family_positions.csv b/diagnostics/generated/construct_family_positions.csv index edbb63b..b3e0071 100644 --- a/diagnostics/generated/construct_family_positions.csv +++ b/diagnostics/generated/construct_family_positions.csv @@ -1,8 +1,8 @@ -family,n_parties,n_obs,mean_economic,sd_economic,mean_cultural,sd_cultural,family_name,source_file -com,49,1241,0.12001647469327872,0.0901861773223108,0.3834027613298184,0.18041637351915937,Communist/Far Left,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_families_2026-05-04_18-12-36.csv -eco,30,723,0.26720980626115975,0.11467133878653364,0.2514849926574344,0.09223964864606182,Green/Ecological,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_families_2026-05-04_18-12-36.csv -soc,86,2892,0.3305567447692131,0.1240506242334158,0.3777170994931328,0.13783788204153472,Social Democratic,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_families_2026-05-04_18-12-36.csv -chr,41,1596,0.5961213268671609,0.11930537492981286,0.5293978691891922,0.13964161332639527,Christian Democratic,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_families_2026-05-04_18-12-36.csv -right,50,975,0.6222552715406671,0.18991001824381296,0.720426765976975,0.15147355617267264,Radical Right,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_families_2026-05-04_18-12-36.csv -con,82,2425,0.6519453485719768,0.17791542785462533,0.5375091531921928,0.14258881749137706,Conservative,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_families_2026-05-04_18-12-36.csv -lib,81,2063,0.6569946895012412,0.15224833699588255,0.37069062594934565,0.13158056834168683,Liberal,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_families_2026-05-04_18-12-36.csv +family,n_parties,n_obs,mean_economic,sd_economic,mean_cultural,sd_cultural,family_name +com,49,1241,0.12001647469327872,0.0901861773223108,0.3834027613298184,0.18041637351915937,Communist/Far Left +eco,30,723,0.26720980626115975,0.11467133878653364,0.2514849926574344,0.09223964864606182,Green/Ecological +soc,86,2892,0.3305567447692131,0.1240506242334158,0.3777170994931328,0.13783788204153472,Social Democratic +chr,41,1596,0.5961213268671609,0.11930537492981286,0.5293978691891922,0.13964161332639527,Christian Democratic +right,50,975,0.6222552715406671,0.18991001824381296,0.720426765976975,0.15147355617267264,Radical Right +con,82,2425,0.6519453485719768,0.17791542785462533,0.5375091531921928,0.14258881749137706,Conservative +lib,81,2063,0.6569946895012412,0.15224833699588255,0.37069062594934565,0.13158056834168683,Liberal diff --git a/diagnostics/generated/construct_temporal_stability_flags.csv b/diagnostics/generated/construct_temporal_stability_flags.csv index 0041f61..c1fda9e 100644 --- a/diagnostics/generated/construct_temporal_stability_flags.csv +++ b/diagnostics/generated/construct_temporal_stability_flags.csv @@ -1,60 +1,60 @@ -party_id,country,dimension,year_from,year_to,val_from,val_to,change,annual_change,source_file -556,LT,cultural cosmopolitan--traditionalist,2019,2020,0.77107951125,0.5289456789999999,0.24213383225000007,0.24213383225000007,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1663,IL,cultural cosmopolitan--traditionalist,2021,2022,0.1423029388125,0.35615504375,0.2138521049375,0.2138521049375,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -455,IL,cultural cosmopolitan--traditionalist,1997,1998,0.456850958125,0.6432782493750001,0.18642729125000007,0.18642729125000007,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -455,IL,cultural cosmopolitan--traditionalist,1996,1997,0.27663313025,0.456850958125,0.180217827875,0.180217827875,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -8393,LV,cultural cosmopolitan--traditionalist,2018,2019,0.4386382122500001,0.2627366591625,0.17590155308750005,0.17590155308750005,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -281,BE,cultural cosmopolitan--traditionalist,1977,1978,0.6706878695,0.843416257375,0.172728387875,0.172728387875,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -556,LT,cultural cosmopolitan--traditionalist,2001,2002,0.318926108375,0.49125159325,0.172325484875,0.172325484875,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -964,IS,economic left-right,2016,2017,0.691268056,0.520838928125,0.17042912787499995,0.17042912787499995,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -298,NL,cultural cosmopolitan--traditionalist,2018,2019,0.760919900625,0.592874692125,0.16804520850000004,0.16804520850000004,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -901,FI,economic left-right,1992,1993,0.486145510375,0.64721287575,0.161067365375,0.161067365375,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -467,SI,cultural cosmopolitan--traditionalist,2018,2019,0.563748886625,0.4041139849999999,0.15963490162500005,0.15963490162500005,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1221,IT,economic left-right,2007,2008,0.559621162375,0.400493563,0.15912759937500004,0.15912759937500004,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -901,FI,economic left-right,1991,1992,0.327277968125,0.486145510375,0.15886754225,0.15886754225,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -455,IL,cultural cosmopolitan--traditionalist,1998,1999,0.6432782493750001,0.7970417803750001,0.15376353099999995,0.15376353099999995,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1221,IT,economic left-right,2006,2007,0.7086087693750001,0.559621162375,0.14898760700000002,0.14898760700000002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -2211,UA,economic left-right,2006,2007,0.416653024,0.5619799204999999,0.1453268964999999,0.1453268964999999,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -631,CH,economic left-right,2018,2019,0.613235049875,0.7569515025,0.143716452625,0.143716452625,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -298,NL,cultural cosmopolitan--traditionalist,2019,2020,0.592874692125,0.734536642,0.14166194987500005,0.14166194987500005,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -556,LT,cultural cosmopolitan--traditionalist,2000,2001,0.180505337875,0.318926108375,0.1384207705,0.1384207705,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1417,IL,cultural cosmopolitan--traditionalist,1968,1969,0.49841048887499995,0.635275993875,0.13686550500000003,0.13686550500000003,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -81,ES,cultural cosmopolitan--traditionalist,1999,2000,0.44213168437499994,0.30819645050000005,0.1339352338749999,0.1339352338749999,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1417,IL,cultural cosmopolitan--traditionalist,1967,1968,0.364764852,0.49841048887499995,0.13364563687499997,0.13364563687499997,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -901,FI,economic left-right,1993,1994,0.64721287575,0.78024709825,0.13303422250000008,0.13303422250000008,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -409,SE,economic left-right,2018,2019,0.4993397851250001,0.6246204093750001,0.12528062425000003,0.12528062425000003,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -48,GR,cultural cosmopolitan--traditionalist,1999,2000,0.471858772375,0.594323158,0.122464385625,0.122464385625,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -212,DK,cultural cosmopolitan--traditionalist,2014,2015,0.339423171125,0.459806116125,0.12038294500000002,0.12038294500000002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -2415,IT,cultural cosmopolitan--traditionalist,2006,2007,0.6143681051250001,0.49546903375,0.11889907137500004,0.11889907137500004,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1369,IT,cultural cosmopolitan--traditionalist,2013,2014,0.7406959332499999,0.6231419237500002,0.11755400949999972,0.11755400949999972,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -5852,IS,cultural cosmopolitan--traditionalist,2018,2019,0.336059923125,0.45280653625,0.116746613125,0.116746613125,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1417,IL,cultural cosmopolitan--traditionalist,1966,1967,0.2487840847,0.364764852,0.11598076729999995,0.11598076729999995,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -828,NL,cultural cosmopolitan--traditionalist,2019,2020,0.399398152875,0.5144400794999999,0.11504192662499996,0.11504192662499996,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -2415,IT,cultural cosmopolitan--traditionalist,2007,2008,0.49546903375,0.3804985986625,0.1149704350875,0.1149704350875,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -828,NL,cultural cosmopolitan--traditionalist,2020,2021,0.5144400794999999,0.6280684987500001,0.11362841925000022,0.11362841925000022,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -573,DE,cultural cosmopolitan--traditionalist,2024,2025,0.34241723825000003,0.4558404575,0.11342321924999998,0.11342321924999998,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1424,BE,economic left-right,1977,1978,0.7125746831249999,0.825810219125,0.11323553600000004,0.11323553600000004,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1173,NO,cultural cosmopolitan--traditionalist,2018,2019,0.353365422125,0.46349993075,0.11013450862499996,0.11013450862499996,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1651,GR,economic left-right,2013,2014,0.441388039625,0.551427035875,0.11003899624999997,0.11003899624999997,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1660,GR,cultural cosmopolitan--traditionalist,2012,2013,0.70537148075,0.8146704603749999,0.1092989796249999,0.1092989796249999,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -433,FR,economic left-right,2018,2019,0.433590134625,0.542142367875,0.10855223325000002,0.10855223325000002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1002,GB,cultural cosmopolitan--traditionalist,2014,2015,0.3184758865,0.2101810030625,0.10829488343750002,0.10829488343750002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -623,AR,economic left-right,1989,1990,0.4145806991249999,0.5228341057499999,0.10825340662499994,0.10825340662499994,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1305,RO,economic left-right,2000,2001,0.553705481625,0.446037918375,0.10766756325,0.10766756325,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -298,NL,cultural cosmopolitan--traditionalist,2020,2021,0.734536642,0.84215486075,0.10761821875,0.10761821875,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1359,PT,economic left-right,2004,2005,0.495169041875,0.602184326875,0.10701528500000002,0.10701528500000002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1651,GR,economic left-right,2012,2013,0.3355888995,0.441388039625,0.10579914012500002,0.10579914012500002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -623,AR,economic left-right,1990,1991,0.5228341057499999,0.62815575375,0.1053216480000001,0.1053216480000001,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1305,RO,economic left-right,2001,2002,0.446037918375,0.3412955855,0.104742332875,0.104742332875,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -455,IL,cultural cosmopolitan--traditionalist,1991,1992,0.5368312063749999,0.432172542875,0.10465866349999992,0.10465866349999992,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -2415,IT,cultural cosmopolitan--traditionalist,2008,2009,0.3804985986625,0.2762634036875,0.104235194975,0.104235194975,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -599,AT,economic left-right,2008,2009,0.4633838822500001,0.567595171125,0.10421128887499996,0.10421128887499996,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -669,CH,cultural cosmopolitan--traditionalist,2016,2017,0.514819538625,0.410640874875,0.10417866374999996,0.10417866374999996,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -5852,IS,cultural cosmopolitan--traditionalist,2017,2018,0.23270289265,0.336059923125,0.10335703047499996,0.10335703047499996,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -669,CH,cultural cosmopolitan--traditionalist,2015,2016,0.617986882875,0.514819538625,0.10316734425000008,0.10316734425000008,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -48,GR,cultural cosmopolitan--traditionalist,2010,2011,0.569647428,0.6723034049999999,0.10265597699999984,0.10265597699999984,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1221,IT,economic left-right,2008,2009,0.400493563,0.50303734575,0.10254378275000003,0.10254378275000003,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1651,GR,economic left-right,2014,2015,0.551427035875,0.6535508147500001,0.10212377887500013,0.10212377887500013,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -1221,IT,economic left-right,2009,2010,0.50303734575,0.604409204875,0.10137185912500002,0.10137185912500002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -975,SI,economic left-right,1990,1991,0.579305296625,0.6803467895000002,0.1010414928750002,0.1010414928750002,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv -338,AU,economic left-right,1992,1993,0.791994626125,0.6916490538750002,0.10034557224999983,0.10034557224999983,/srv/projects/party4d/archive/party2d_replication/outputs/validation/latest/construct_unstable_2026-05-04_18-12-36.csv +party_id,country,dimension,year_from,year_to,val_from,val_to,change,annual_change +556,LT,cultural cosmopolitan--traditionalist,2019,2020,0.77107951125,0.5289456789999999,0.24213383225000007,0.24213383225000007 +1663,IL,cultural cosmopolitan--traditionalist,2021,2022,0.1423029388125,0.35615504375,0.2138521049375,0.2138521049375 +455,IL,cultural cosmopolitan--traditionalist,1997,1998,0.456850958125,0.6432782493750001,0.18642729125000007,0.18642729125000007 +455,IL,cultural cosmopolitan--traditionalist,1996,1997,0.27663313025,0.456850958125,0.180217827875,0.180217827875 +8393,LV,cultural cosmopolitan--traditionalist,2018,2019,0.4386382122500001,0.2627366591625,0.17590155308750005,0.17590155308750005 +281,BE,cultural cosmopolitan--traditionalist,1977,1978,0.6706878695,0.843416257375,0.172728387875,0.172728387875 +556,LT,cultural cosmopolitan--traditionalist,2001,2002,0.318926108375,0.49125159325,0.172325484875,0.172325484875 +964,IS,economic left-right,2016,2017,0.691268056,0.520838928125,0.17042912787499995,0.17042912787499995 +298,NL,cultural cosmopolitan--traditionalist,2018,2019,0.760919900625,0.592874692125,0.16804520850000004,0.16804520850000004 +901,FI,economic left-right,1992,1993,0.486145510375,0.64721287575,0.161067365375,0.161067365375 +467,SI,cultural cosmopolitan--traditionalist,2018,2019,0.563748886625,0.4041139849999999,0.15963490162500005,0.15963490162500005 +1221,IT,economic left-right,2007,2008,0.559621162375,0.400493563,0.15912759937500004,0.15912759937500004 +901,FI,economic left-right,1991,1992,0.327277968125,0.486145510375,0.15886754225,0.15886754225 +455,IL,cultural cosmopolitan--traditionalist,1998,1999,0.6432782493750001,0.7970417803750001,0.15376353099999995,0.15376353099999995 +1221,IT,economic left-right,2006,2007,0.7086087693750001,0.559621162375,0.14898760700000002,0.14898760700000002 +2211,UA,economic left-right,2006,2007,0.416653024,0.5619799204999999,0.1453268964999999,0.1453268964999999 +631,CH,economic left-right,2018,2019,0.613235049875,0.7569515025,0.143716452625,0.143716452625 +298,NL,cultural cosmopolitan--traditionalist,2019,2020,0.592874692125,0.734536642,0.14166194987500005,0.14166194987500005 +556,LT,cultural cosmopolitan--traditionalist,2000,2001,0.180505337875,0.318926108375,0.1384207705,0.1384207705 +1417,IL,cultural cosmopolitan--traditionalist,1968,1969,0.49841048887499995,0.635275993875,0.13686550500000003,0.13686550500000003 +81,ES,cultural cosmopolitan--traditionalist,1999,2000,0.44213168437499994,0.30819645050000005,0.1339352338749999,0.1339352338749999 +1417,IL,cultural cosmopolitan--traditionalist,1967,1968,0.364764852,0.49841048887499995,0.13364563687499997,0.13364563687499997 +901,FI,economic left-right,1993,1994,0.64721287575,0.78024709825,0.13303422250000008,0.13303422250000008 +409,SE,economic left-right,2018,2019,0.4993397851250001,0.6246204093750001,0.12528062425000003,0.12528062425000003 +48,GR,cultural cosmopolitan--traditionalist,1999,2000,0.471858772375,0.594323158,0.122464385625,0.122464385625 +212,DK,cultural cosmopolitan--traditionalist,2014,2015,0.339423171125,0.459806116125,0.12038294500000002,0.12038294500000002 +2415,IT,cultural cosmopolitan--traditionalist,2006,2007,0.6143681051250001,0.49546903375,0.11889907137500004,0.11889907137500004 +1369,IT,cultural cosmopolitan--traditionalist,2013,2014,0.7406959332499999,0.6231419237500002,0.11755400949999972,0.11755400949999972 +5852,IS,cultural cosmopolitan--traditionalist,2018,2019,0.336059923125,0.45280653625,0.116746613125,0.116746613125 +1417,IL,cultural cosmopolitan--traditionalist,1966,1967,0.2487840847,0.364764852,0.11598076729999995,0.11598076729999995 +828,NL,cultural cosmopolitan--traditionalist,2019,2020,0.399398152875,0.5144400794999999,0.11504192662499996,0.11504192662499996 +2415,IT,cultural cosmopolitan--traditionalist,2007,2008,0.49546903375,0.3804985986625,0.1149704350875,0.1149704350875 +828,NL,cultural cosmopolitan--traditionalist,2020,2021,0.5144400794999999,0.6280684987500001,0.11362841925000022,0.11362841925000022 +573,DE,cultural cosmopolitan--traditionalist,2024,2025,0.34241723825000003,0.4558404575,0.11342321924999998,0.11342321924999998 +1424,BE,economic left-right,1977,1978,0.7125746831249999,0.825810219125,0.11323553600000004,0.11323553600000004 +1173,NO,cultural cosmopolitan--traditionalist,2018,2019,0.353365422125,0.46349993075,0.11013450862499996,0.11013450862499996 +1651,GR,economic left-right,2013,2014,0.441388039625,0.551427035875,0.11003899624999997,0.11003899624999997 +1660,GR,cultural cosmopolitan--traditionalist,2012,2013,0.70537148075,0.8146704603749999,0.1092989796249999,0.1092989796249999 +433,FR,economic left-right,2018,2019,0.433590134625,0.542142367875,0.10855223325000002,0.10855223325000002 +1002,GB,cultural cosmopolitan--traditionalist,2014,2015,0.3184758865,0.2101810030625,0.10829488343750002,0.10829488343750002 +623,AR,economic left-right,1989,1990,0.4145806991249999,0.5228341057499999,0.10825340662499994,0.10825340662499994 +1305,RO,economic left-right,2000,2001,0.553705481625,0.446037918375,0.10766756325,0.10766756325 +298,NL,cultural cosmopolitan--traditionalist,2020,2021,0.734536642,0.84215486075,0.10761821875,0.10761821875 +1359,PT,economic left-right,2004,2005,0.495169041875,0.602184326875,0.10701528500000002,0.10701528500000002 +1651,GR,economic left-right,2012,2013,0.3355888995,0.441388039625,0.10579914012500002,0.10579914012500002 +623,AR,economic left-right,1990,1991,0.5228341057499999,0.62815575375,0.1053216480000001,0.1053216480000001 +1305,RO,economic left-right,2001,2002,0.446037918375,0.3412955855,0.104742332875,0.104742332875 +455,IL,cultural cosmopolitan--traditionalist,1991,1992,0.5368312063749999,0.432172542875,0.10465866349999992,0.10465866349999992 +2415,IT,cultural cosmopolitan--traditionalist,2008,2009,0.3804985986625,0.2762634036875,0.104235194975,0.104235194975 +599,AT,economic left-right,2008,2009,0.4633838822500001,0.567595171125,0.10421128887499996,0.10421128887499996 +669,CH,cultural cosmopolitan--traditionalist,2016,2017,0.514819538625,0.410640874875,0.10417866374999996,0.10417866374999996 +5852,IS,cultural cosmopolitan--traditionalist,2017,2018,0.23270289265,0.336059923125,0.10335703047499996,0.10335703047499996 +669,CH,cultural cosmopolitan--traditionalist,2015,2016,0.617986882875,0.514819538625,0.10316734425000008,0.10316734425000008 +48,GR,cultural cosmopolitan--traditionalist,2010,2011,0.569647428,0.6723034049999999,0.10265597699999984,0.10265597699999984 +1221,IT,economic left-right,2008,2009,0.400493563,0.50303734575,0.10254378275000003,0.10254378275000003 +1651,GR,economic left-right,2014,2015,0.551427035875,0.6535508147500001,0.10212377887500013,0.10212377887500013 +1221,IT,economic left-right,2009,2010,0.50303734575,0.604409204875,0.10137185912500002,0.10137185912500002 +975,SI,economic left-right,1990,1991,0.579305296625,0.6803467895000002,0.1010414928750002,0.1010414928750002 +338,AU,economic left-right,1992,1993,0.791994626125,0.6916490538750002,0.10034557224999983,0.10034557224999983 diff --git a/diagnostics/generated/diagnostics_report.pdf b/diagnostics/generated/diagnostics_report.pdf index e25d46eabbc61951f86dd6538983cbe2f98d0b51..4117b5d603842de14c2b82a840196d72bc407a93 100644 GIT binary patch delta 39074 zcmV(#K;*y4fDfkp4zR8R2I_)U7eWxTv;+GB1ah;!WwWye7YPC~GMAB?11Nv3Slf2m zI23*7EBq)w;Oc&PY*Lb5NSjIMteIXG%K?XYEx^<^>EiF_9N7*e&^AQ#5RhYOYoD#H zqa$cEi)eJ-qwV*P9)oWhu}I0t2$N{aqsgN8^*fEG@c;J_O^h?qPv2`1ajFwT9kl1s zb?>j<$*A}0j8PVu#2NS+-9~>3npQ=I>%=)7ji%98vdHQ(pTvE}wWef}*4eBmH*sH3 zs>yw<97*TvEdD-v-y4jckm4+{iajMIoqY)@#uDLFLuyhit2(dO*)ryi)Z<0ETII`G z755cq92m`^Wf>!kYNQ7EeMUhc){I{-^B?PM3}3}^T$E!Nkf+N@HqL*ifWauGI~e8> z#3O*GJXUF0$AXeg3&ae4M27Aob=1c<%|Miz6fuJ-JSJ)_9T(*F6~G9khzbG0$Il1^ z%=iP4N|Zek>Etz{SVh<&fu9dE02rw(kpWSioFf-$f}}a|`Z`B+0LbavR$CUL?dcFu z6y?MQX?ywwVVDlm_RW8wl|=-A3{G*CrFd+XV?n%CtleSq0&NG^fTB4Kis$U=kZX@# zpmT3IW`nrA?eap%D!)T*Ew^F5eTTla*6d`K7f=}ih_NEj{KF64axzHUVGMRdKFZM` zeTSHHr4eEJ4r2yp`P=hhL3!%p4S+D|0<-r8+J*}gw68DzK`wt<2D#?r@c$6_I0SOEwwL}8fI}_Bz*qSA$tMUIWSA>Vn@Y2=1o zL$1hWEEw@MBPV|wq}9Jo7x^5^YokcIoHh+#W|r$o-92LedmNjU>C6}3ug-*xT;ep> zI3Y{mGO!IoP$=kO?gh+!8FS<3glxarnNO3+Jguty8-xpGK2*k4OQX!1_vqkv@CA;!$B!l=|DwXhUo6rx z&#DAZ7C}aLS;L@CZ{}^co4AkT<{smx_r&f3GFU*#n%K*11)VJ^${JY+fm*`zJ$`gE z3rUdmvT4?SM&A?7;~j&Ki^3yKvw8Detn1afZrV3q+h+WOz|CaMnB=h6s7s9a!zB)^ zZpAb1OU!?{gzol?4*b&R61Kn9cngJ;&tbK!O%E$hfYBEf$wi8xT$DUYN6L2Dy4v8aZ1M^#bwn@FrXLmkF!m4WsMbQ?^84OBOOSs-b z>0d{edEZM&`+~Mo8!kMC>!L!1H2t;G>CCGGml@VAm-0)F7>w?#d;p_b;YgqZ5jmV% zbx2K|c1T+`(j7wTG%g@703#+1BS=V7NhI|}6<(|X4XYyO_%6u)FC-=blOM6)yB~l2 zj(L>v1%;ggrx2G394!q=e^x(?fyw^^@+geOv-=eL8-HYx;*>vxLF4Nt2y1Yj>h?}z z#wR9bJT5U~7~CSZSa8uVCD;HPjvQ@m9%8c|$F=oCY-Bu&tb?1${unfQ*hKA#(P6U_ zo%F=$veYcxq zmz{H4MiyD04>`R1$)z#!Lnn0&<7FrRnYx>gEPqF1vsQN1VKVFVJOjabXZAXzv(|=1 zH(Hoyy@2|CfWGfUZ$Wk6y$%|De;CVfU=d6@Jw?{{O%)HFqZ^)eCJg{uth(u1mz|1v zn*=xeL%1Hh-iPmixA76)z7q1^ZuGX(bh87<0aq{gptI;SJ+$thY+1&AS@ilbro8I3 zZ-1eE)#Bb@a2!&%olleAcLfI*RwuZ zz8nrlI+GM(J_kaBFhmFd+M*Z{95}O>_+FmO5d0*_`bQ116 zF>APPTlXg|5GzBE*+m8{+q3-tBIMhiK+g6bA77sg^kthFckN1^JmCmhe!ScD=WA=) zzGd~QHR*Owje0%g(M5~JWJ^tt;fIQoc_;Rv&AwS@`2Dff!F}ucK9|1s?ApbL|9`c` z#UDcf*^^+uwPtJ`!i)Wt*VYlUu5qCJjG1*hADzj6^_HI(BrTU6@3Z_;M9W8dujR)F ztfPuPVzkoCM!O}glPkY>44NS)EcPBrBDhcFB+%eH=`3~es0%>#5qTB(=rxi1nJmkd4LYF)nqt(&cuA|SPRZgW<%O;io2v5s4g9j-C&}#a4`MHd= zt-u&_@yj_NR5@Lee))j|vcigwG0JFWNzux)lw2e%+lgdW!LVvs>MfK^rluqM+&Qu7 zP|c^x(?C@OdzfIGb`9eu&m?Ae1J(?$K&qjuq2A!HJdzp`z}$s#bF?~C+l8Kw{sap~ zYh{BHHHQ*40k;x00ta~!F*yn^Ol59obZ9alGch+eHkUy*0u=-^F*!Js5TYo5x@A?(Po3B|(A&znyoVeUiP;_xBD4G_!10 z)vC4D(=?Q%%4&=vX7(mPNqajNMph;kK7hP}s=ckT9S@@_(8ATm*a^VK#KOV>Pf01} z1T=O5+1rU5y8!tB+%A>?B~urFuq)Vtg@qTM5+DV%13H0~W&jgUfCA9PSl!bB$O@n_ z{s$=AJG(HN7(0X2KsyVN9gr66B4+R4=>)Q{bom{Fossc(q~G46OaNJ9Q)_#7XKN6^ z*v=2qWB^EMsHy+{sSdOQ=WoFPP*ex&fAfG1f4eJ4sEep; zD@(94|E>YR3UC8DIfH)F{#R~P;LHGjQUkl1JK5X*Lja($ba8RuV`g@DcW1J2b#`I0 zcd}q|u=yuHbxV*lz}?<|$r=EDbpqM||7nb?of){DE|$Q51^B%v0C|up(9Rk7+ey;? zUrJkWE5S}+xy%1125yAQ@0d3KG6y&Vf&W2cY3%%uue`FdJiyi%Wak33Gqy7Y8@d>~ zxHUV#ao^&R&1@ z=0D3ewYPHyIlDOjD_|FH&(;Qz=hfGz+Q0MHQt^f0w#{!RDKwEPyc z{uYDV;Op&R?*K42ws8jfg3N*77kF=HV>ckc#mN=u>;1RlKM_1DH^2;J>H;2g@MeMk zC%TNCxjlgQUt(}3|5p9a2+;hqQE9=u)Xd(_#uH!$G>2z@Rd-pSV3=D&0xXGxF;&`cTRVru!X#{Nq# z<6;b+eGxkg8z6X5{t;>X-cB~)xdop+px;LqfRXigTmM4`9!XPcJD{^OfSv0f6%gEp z|4JC#``_t*0+_XxwUlJl>Hp8n{9`6zXKHT-vaDLjpGg5QGuhd@fL#C%t}ea+b9*QF->b>R31AlaE&3PY0x*mILEHdlu|J3hz%2d; z@dB77{ugnx0GK8JAXWgg)E~qKV3z)a*a6Hke-M~|UG5J8v&;WMV0MK+2+Xed2Z7m@ z{ul9p*_HnwFrVrl1m;uwgE#=p>VFWJUE>b|vuplAU_Pxs2+XJbzlayir}GDa^ECd0 zz8}7_6N^9V2-aKtzGH!Zn}FN&hmr%_CQDBTOQ79f7GN3ZF9^=v z>MsaxiS=I)+!LEWjNqbdeoy`%J-7zjKadq{@P~>M9Lo;8WB$^E+h+eKJFv6;f2hF~ zIs8$BGjjksf$ab4J1e*Yj(be=ZD`KgZ1fJZ}7h)m)tHt$`mvX5dGyzf2U2U7SE3x-8&- z)1DP92Y>zhH~s%0p!{=D{pBqxYVYCA$N?U4MmAnH04oQ0(|{L>)Av7oP5*WC|8vuT z$Nt~=_q7WE0zH7H@GFb|fDEMtdxqTcBOaF`L;I-$o437&{T;?dZObW}AFPyGkL`t7u!#hjK5TXKluGvO)J) zM#b+WSf1{D>+*V!85?EXE3!g2XH*b^Jthn7(9?}^SY=>|E|mQ+gN5>fp&j0TOD{ri z+BJf)YAmjv3x$b2g!gWTjoSlXe+fB|{TEU$vJ6*fQrUZE$Q(>J;ukUPz#+PLHk{!k zJB3rS@-^ngNVV2R2sa#;?L&-HS*4MI&_c=)?8NF0lPw@EkwJ53Ae>Ae=N2qYb{sPn zI)gG5@(+5cZLzBRGo1-Ujj@G)QSA;F)(nCO{cM14bM+*`8&7)-q}_y&txw4pg%Hoq zSyl@3$!H&MQ0M20X+u^!kaagFr1rF#DM%DZew;1~ePvL8ef&`P_5fLz@^gJ{x^-KgH}Gv z5dmUYiE?Ui<)njZn`N9zeUlF2<<5u=Bc9)Pf2 znjxqzoRDyJzi?75oWSVrmMwQ-RG%H9T;k*l+0k;yn$ak8SU|u{R?Gfjx&5(7OzUxb3>GLQ=|dZQ~iJlGC1>d{Uwj)o5`FKt6uDuPgdl#uaZtt$j~r?2ATmBlhh zgT)h31V7I)MDnT95Iy2NWrNRcb{WaMlG(lx?>x8gPlm}TM+oLUS00mxHc@>?%t&BW z4&2f`dwVt>Z?Xu5{l?;y5FB~D+Jq2Q;2FOdW;KyL&xQQM5Y-xdx^6zaLr1_|i7a(?%|D&|&%z>w6*#hH>VguOt24WUtS5 z^Y>_f)`IMhjA21Fm5;aa*&m;YeG!<813nS1`kq3Y<1C0k!yt#7GOb%q2s z?FK|gcy0GWBJJN-UNw#dd4Nlud zE2_LfF**fJ9XYVsy-^Uep&pm~@e3tCPp1`s$sG4o^XnfPmR(gQL*~D&xxrijA4cDQ zcAH5f4&)z&6M*POj|US-u2XKvu5X*U=md@G3JxUZbEC(?EOiq}amcZ7P#p_@l`la) zKZ$tcOZg}3g!fKmmhIBZbi#qs!@TBa7`GO&e>6UE!!{fVg#IM|rnrUEg8LDM8t*5O60_?LGBE@`@yXrKO@1vP_+Hq3D+ebm#jefQ`llfi0knOfu5T zCf*{s#BHnbnG6O%(Ar+nU&6Y*c^KMc6EIiBl!58g~vf=D*_S* zJe#<-(}Osv0A?d|K|7MXgwgVrNZ_1yY^#>6IQs|&-fq6Jh`L9r0p-jw%|M8MmyBVU zrfxAdt1MMa2Ft0)-H@Ye5bEI!PO?QE%8xl=-ZZ9#eRCNZQeAH!Q2M)jp%UMUFDSK< zV)w#{341Ge-eR&3gt_g3vB)2gqb?MK+pyak&;_Ts*-II?lzN{be%_{{m_pZ+VHCoC z9q7<>Byipn#VyGdDK_K}NSR@Os$K>-k;r@9+gxsjCdVXUdZbFdbD86OyJ{5ujdxxv z#0Aszo7G})AIoc|FrYy5YXIVFGk$Q|li)Nd=5>$f(q}~BQS$qY_>#B#-{Q(z7HGPL z4Q6Y`NN6nUs?}g&S>GUd2Yjm+cZc&TSYrwd9%?WIHBZ}ruyu8qt>+tmpdZ^|ELV2m zi|bQO6R-~p!3{WnZz~oa?>ZCy+17xE!F=KcRd(W`wfdB&nGeapFU;Kj<|6>Roban_?U;P z{NL-7rIh%1j`CP*ow(Q6DFV^rn_t>WlWgdU#=^odrNb?}S?7lPqL_9wt#og{Slp3@ zA0vGrkhx7!Q zHAUAu5y>wLhfr^LI!P!}>RP2IaF#tjv{%0wFmdlGXoAcBBp4@|?iC+RHSGA{&3^F( zRC{F5fFu(jW>{$BoDxL=SJAg&CW!ok`@!G)0U`B)^jrIY`=WyObJ9WDbcr%lac=&Q(gYJaj|Af&X^i%kXK0c)odu_s!UwV~1g091g+= zm;SGEhk6%(NKgG3O_1&a8TzIJ`WkrJa4mqw6umGcE3~Uwh|7EJS?R%*fL7S&S36_Q zLL?Hz(U0%;nW3RIHfQl_TqAWfxR0udiZ`4Sms-ZgWS(=MsZca0j2v3ARb6RO$v)uU z&AhWO9!gYuS8a>5NjA<(waQ!;fg>rCr!3d4TQZP;WxZYBE!5$zCP`i8dImhHBELE-yKvX5$H<-2y z2x;$8X?`fJ`&B?|OQlbxKxJhul2$DQE>KT@sFdm^=E$&VjOi}3Ky=!q*=FQ__HLeF zU*Rg?z|5J@tq&CD9qH`|az{%a!{!d;lN+xW?pf2UuiE0yjR)qQxi;YBc9#}Mu;z5t zY_Zr(QB#kKcdLEkLhlH`;i_w!kj(9KoL4RB6~yr5!T)j&gyUJ7S%DAuaXqZ~_Nfqm zY8#X@`v$;19ZXDtbSfO8{J`|>-B9OV-gBZq&LI9PAnIYM`XhDnG;jP7lgLU z=)^;QmW*P_XZ@%#%lL>*Ok{1_m`wP8NJ8L5(UexDrSs&;%xnnx++c_=C<2=WZ%6E{ zkPtfQ=otG6MzEt@EM&rM61`asf6zUC`XGoZ(TtMq_+qOH=Nx3mr@PX@@S)@6qh-A? zlv<12`Xp}k^>?Z;)!bNZgy{fM>7tuP@*TZse+iuT&*a+snZHU?{F25he_aB9fNx7X zuE|DfWdY)J7AU`jCPb}@*)KC4yM`mI2A zM0`V_$GXgofHZQ+$8nf{n5k=-pT2E>W^i$K<{ESVj;^ zI6h%CUQt`X+E7>K3pJ`1ad>3kNBTn4+J_IEIzI$%e_&(~{6xhJyvdK(p@EK6^0~tX z{%B%;OpbN{Sb(NGc}$sgphUT(owEYFRvSV_>V!tpf$?WuKxApt*yb;PYAeW?)>aj) zG1z*6Y9r$$aMbI9lU`&hI=&b2^0hBf}(F?a4HY$drD5qoaU0{lkwtB=hR_xr;R>fw+R zUYqbo5&4>~ywm>v)5V*AU5aVXLS0^3Tj?YHwJ+YCq=JS1V;OC!}kkR9jWs> zuJ!m4Au3Cu0oYM;Qjc!5t~>JfC(Z49B#Q};y#gsRvLmjQc{KKY#O>anGWIma(ghzR zxbwV5%mLIfzMBJsoFFBH#G%}{MG}d@qb4_l!Ci+|CA?zR+mxMu$+MC|imLL~uU9h|p&?N-D|b1EiNo_BC(e^!xfT5Ea^c&^^ zQ4&qpm$}9ccTdba{LgnU0;-r1)0e|74WUA)8+a`kJNl&s3Li0>Wa^HFk*HX;A8~uV zL?)H_E01HGHV3k4eR>sIa)v-G(~c#c-zUA;q$j8SrU@RlBv++MJ=2C+C-dDP)@Zb= z!`u8#QC;u$CdX2Z=fMZY&>LVy*Dg{)`J{vM zHaW#{0lx0lI>(Mnh}gJhu1BZyod1B+KCG99Ca<5gJ_e)jPxXo&9WAIJaeOIb>rEj0 zhc4>^MURy(3*oHXw+u2iG^Vkc&2Z3B+vdrC+T+S9u!JCMxvMv77`KZHYN1~R zzhh1xcU7k*rd`?3SR(eZ4t<~7YaC(mj53&Y+V(oByP6*99yUT5@jG>Q<#k-H%9C#6 z`oy^=4o5lK2Gx@Po{?on&bzx5s$=Qf{f3Y8CRROJ<(6+>v)%WSz|t8e!1lU}PGFkm z`v=Q^=#t*<{pJoUp$X%uFcj+y0&B~k;}>;-Rv%ilI2&_`--QgBs=+l{E_<(?bgLJv ze#ke+SdsT|Uxk3rNW+E!>~*loiVjxJ({wp(Fzh5HJ4`cp}0JgdJrE+ z5J~sx?egl#Qc`2&O%;hPsxePaV{Y+r=E;}#u=1wDh{owq4`$in!5AriWq}e>x`)(% zJYvWJS2-w;7)wcRU7$XoRzQL*+FoHcI}@|lu&np!c4D_a6mX6)Lvq=oN>hD(U*$&n zCZoV{yOF?#(6)$t!1(3#V<%hiZFre(h*CBsQ>~$a^EUDMmq$qUjwMmK(PfHi_vJtb z(s13kY-q)VDh*gJ^$!t_ZQ<*&_SimuKJVDoG0%*(1^bv0IpmP8v^-4%l)q6wBH4JJ zr6rWS$7-zZNoI%g_lBJBnVOC67rFpZI~lUpBw;&g)FC;ua06ZM*-L9;3m#c8#uMR2 z>5DZE%}2Ox_%XF_X+G{xuewN_2!7DnnZo0u8U5K^VudNB&s)dSp;wjBl0}4nNLZo| z6W!(JlnoNYj+soj|jO^8a?Vl+QA|9d;swvqj9B)LA}dV^hto)EV6r zb9qEq7^8ITX1M^WZ_AyBwpyWFAgF~Jr-?#TV0~vyblSusE|_s9^A@{Y9xvd>mYLfK zbnjl)^3qgpy>DEg?5i!`1zK!>OVhY6enY--bg)KySaR9&dEG;>hw!%uY8B||dc$e_ zzQa)E%qg5&=puzdo#qSs);b;x)wiz`G6-mRm{&n{dnrhNbYz zZ3p!oI@Pf)()qpCE6N|Ykq!>A^h@Sne~LJA#y{W>5a7_-x-HgTX?bWr4v# z8^im$gy2_fwn7K&-&{@s;+P{p=DL5QIUZ9hSAosJx=+`xl~YPwitX#amt;Xrj<6?a z=63w4{N^#ISOAc_@>{;C<~BOjmRW|pFg3aj*@+~ zxcNxgNatw*r@kYNHBp9L{i^zmi(P!eji_o`DNh z$TNuT;jBRuNACHM?Mtk2UDlVci^LTc=TI2X$Rgcu%qephrse8?1kYA_!<=(`ca zb{DXxvw7zGa|fM19PEwZ(i&6HK4|7|*pajze+8V5`6-JjzG-g|)UApWMRd!rHucrpzo& zEbz*0W^InNcT>*QBe{S{#IJSzm_X-*c*58rMjI=kU6i{@zX7bFhpES;X`Xgog_`^AoFGY%H>WnNHY^8R{c(ciP{*$^=lIuq$96F(m(U|4N25? ze=v0~@?Y1WpME%SH6g!x)m241HjiokP;8?TC_U?c7d6lS7OR;XtxQ~Hc=s}=c+a@Q z+FigsW0s+~Bb7PyajoA#A}{peF(0<-s6Z`)Nd#JI!K_%9NyBQjz_qM3G;j;lBY#)c=6=7?neyxS$evn8ASg*@9cwG&`ixhH9`mq}Q6?U>8hsAok(Zn#r1D;YxS%u|{O_iH4D5u(bsSxSoyMz2or zqk`9z#U@k=MteZ%S-HtD??5lJb}u9n{8mSh!w+yhRX zlJNp}09z}sgO5a5Fo}Cz+Gz+B-wx^-H$c=4)wePbpdRK|=f2niVoPXNvy~D`)tu1j z!bgwIfyj|mB8jd0bCBlkxz6L~Nj; zq_vrCM*1K}vU_Co;N(D(cq6bXQJ*BxwL?5de1I3BFartbuLt)ouo*}m{W;qCQrb|C z<2jFgcSD%W1^Ml4TQ7e(Jb_T-Y}|nW1snIs?#W&?<2&!Eq)^7VDYM;wZjrbA9@nK1 z-G-ZbL~AEOqJ#UFUs5d?Grw9@)(Kgc`6MQOCxTzev;Ew#aO2?D#rpEmd>5gbl2;c0 zSLCEy)DSbKRyOVXt1RbJJ{qGYqlUO+Kh+izmJfgw(!+vl1m&U*fSZi4cgYR=TusV3 zX3VIWRTTelV9-~X)Kj&8pU&qLWlZbeCzZ1ktQU6sZ}-tUogI+`5>Cxzi9_B`)@j5m z@GcQ*VpdQCC#RQk(|l9-`x3Zx8#eAZ;h9G2eTT9P(mHwSls*n^RW@{MCSa->*b4^~ z5On*WCEh)~1YEDK8^K84k+5+oB{9UUJiWzQ)?I4Z_~w{5!y>wW_HxPeC=2wNOqxTx z!IxpPOFTUm8Z-@7RGDlGe_V-b!W}cc4Ds@{6JOcG^%=Uv;x+I-k00?`3#oz0ys4Ul z52;94r!bd(cBzALr_h8isa>-h5k?K#3^dKE*oBC&Edy+OW2NSU{WlQ97iF2Drs_d)rAg{<4s@FL1b&lM%misC+I^OK*$XDl;I? z{A60sAuQn?W{NsQeR7dJ)is9n%1i=fE+Co!*REl^X!k4&fO2zA!t(CEj>?MI!B3#m z$)Q;)&;MpfnfWeRYn98~8fCN{K6GwiOs%59%}m?4PorahA&ird;`__o5))_RZcRQj z-PU7E%A}wH$5*~bud#Q-+tYKu1Z;~g-xt?$7_qvsc81qe*H|l_mn;6D99DaV8K(bz}+QM8sWwS+nJn z@F5nNg-Yf;NbRHpVCEp-NhWd@j=FEASdAMLPEKV7O*2~E7rye+77LH;-B{l^>_oD) z-3hohZ>fp=S&bb%ptoNvRot5pHb{eU-uZQMKdw1{eYhx*)1zb_@os2&k2{&`ras5H zcK=i6&K&BfQeYZfF9BB+{BVBxC8bag%53jtv_*$zJ$>r9!%U3O5L3joS$EpNiaT^f zPsoUZ6`9hwYBi6#c~$Douj>I7Q3IOSWsIhyw_~*Ydgy(I-cFw+Rx-kqQDSjQ+T@qI zHB0h;kw|_GuRvGe6lxSLD<@J2h2+AKV)FM{7)na8UlPG|)cJCJjq9qWtEKV_0AVtF zZds|+kZ(ef#qSz-uHALNZxyY&?N4d;&48FJP!=2DeI-?=({?eK{SO1 z2^|ttQ@dDyjwE{<<3{Qgs?%G>XJRI7%~fRQJAEp!9PE@kph^+ns-$VQA zXDVzunbgqf^b(^lZsvj?zW*T5ddo`LXm>i2@BxVdq#_n0pny%K%FN;Ar#?ai%0t|r z64G;}IV|{AH)qhlTixA#Pmnj|#hI%iUI?md zh1g-$pd-Q|X}EugQ5>C9zE>}MQU<9`e|Nz{r0xdbbt1OjF?09`0>8D-VzZY3-QLKT z^cCZ*5us6i^C<|rEWpg21U>}CxlRqV36 z;_d#sXGUM9MI6LgMMo(s!3R_P?7jCaAaCSP$r&{PnKT@GFxpRh+#N;yRP{p4JR9wZsF#1ri-iM7;TtF_s4 zgL1l%XdnwOs4*WG&+idxX`kN-*?)VY^e#)LArrxi=Sr4!ioPpC)_qxjz%q#X!<~mj znyK4>p?A3?VcL~ zqL&9bEU~bbnD>|(rC-T^t@C$7j?11|1fvWrrp>7WOBd86*`QfAzG3kK$jTW3!S__RN3HB^%L|i z3@C@VfUVR`sItC9m1F4F6vNe?`G0(x9K_An*%H}+cVObTy;Kr^;1qX}yedtnBnNj| z_@-$gjG64C!Atc*zzEw-w#Hc+`tm-6w=XdwSs7n`E=wilPnxCx(2&(9DG)lK5pi>- zV!Z_3k8DS=&q69T*lpaR4-};b)f??+PouZ#etuq91WW8yT(BFTz0guYtC^) z*OGdPKz0ffnKqL3PI;m-gdqkI$meU-X4C{0FjHNwCG+@yxIh55y7bmcU`WB3s-+`_ z<;4!v!y)}X7JGpv07vgf>r_cm0Pa~_4?Z< z9?MIyJXgGof71%;C6CySs4`y~e%hLCMy`Rt&GzXEBoveGL(PVEwD6PM-E`f9$kJk* z35Inr=oUtQ`1YwrP6>-Oke4uU)x8$U2A4HBz9$#!SU?&#qqbT#{J!Zx`zZDymEf`> z%VguzBuw?eL4BewRcBK5TzL1O%$6w+;yUOQ{^^Kfky@v{?535Qy_MRI3u{}_0KW$3 zP!6F+cbb(#S|3qJ=fwE1gEGF%7jeI4m1R{4?Z*j!Dl50KKV0lm-tpq9Xlg{7Ky{mv zlfUq6URv4aM_)KG=EOC8QbZ7rbSkX(XIh9AmV0gBdVB`@7Xc^s4T;{2_THxG)b8hH zm(7S(5#8tl8}8V5=Tc!&!NlK>RQeL^p@@+8zb}Rf4`L{`qz9E;!W!+7-A?(1l^9tX z$xL#8?9N4p5OvFmS8MjR2zt>=^&lp{zS?W3%7>dx5|$NL*s?$8eXZi9V|J&@5y%-} zp)#YUl8dN72eCMkMmWRGm%m!|CAmKcyT{}LRo%TjkgUE*HQv^?WZB^3+MN*Qx4T_L z3uChj=X;^~Q4aK*-k_n&7gn09e?3S!EQ))7@0Qa(JfRjnCxG{U?(BtoFU@By)S};H zkQci&O?iI2J;Qv%)4>Cg8x-d~QA?|~eeT4>!>~aq9~g(=X^jYq9S6?v+_iUS`Dhb= z{%qM1d)^TV^hgnvilUnY6u-8%w^Jx^kO?#twAcfAa9@gVzB}29s>}`R%DGv#E}_vr zEl||{e99kUrELpPQ6Od47baewpqRFhXjw2aWa2Jzku^1GW4*WS^sU{D7!6XGlV$3; z85nYf^eV$AwCZRy&`FankTw`rKtF$f#}=?851W8~IPoTN}6D&aHvpypoA zx$t*<9g2@7@ZkmLR;_w9By|K_a<7)hsbB88E(RD|C9|H8b24l_wbLhG8{AbY4YLjX zEcL{1YO4spqS&;`)?hy+NYW*Z zGzvm?Zxc3RJfeQgh)`L7clQ-EP|qzFD|*7ShV9i%K+AO}tqHvD*a8}DxosrHXbs)6 zjF1R&cAqLzX6o9J`6a&tTR_p)c-OqiVrcT+5`vLr87HtD#aYz$gaH5&Wk zmP=^77i(z`)JbIc-|1vd6e@0`xaU!_rM*;Y#hxB>qPN&XN%8xC1++7fCMrQII~rAe z?Do4TsKIz#@BKsuQ=%;R8Ip~%{NU6LSv4ZUr|vK&s?#tD9hgd4l=s8%Ep{mrY{57rpT^EIPE|`qS5n4Meoh&<1oJH)w1>V}z;FjJhK*EA2Esx2ViM7km(p z)bNAFgNX1LH1HaK_30E`bI?rQgBj4-4aHtcGQ@0M14LsW++ZWoB%8S-!5f@zl6Io- z*kNn+a7_CTyq#O#SjH}h_TEzdm`nG_oWEB5SbBZ!8`L#bw&waNjV)vjk7n3Gh1n!J zJw~loYHwd8k07_@OT0*OsQk;)R~1Jt33r!%v!BbNZ`5>uqMV_Tn9oQ^BcS8dM(N>6 zx@8c1c;34}{A!dLVLnE1_*E9}0_TMy$nq1*5dKTZeT@gR6@G!x65-|Wz8|;i#|7`33hzB$Xz+HGasRR8+w?IQeN` zno)=6yBR_x$;DV^E5rQM0GNX6IenYU{8P^Ha8O;i6eoavP^UU@rYWN))r(V(O|e2L zdFPTnH$rlo1l%0{N=`;lp|osL18WS1`M+*>^(j}&UyT-dH=$$9wCiNI${(b4C7AV@ zU@hQ(Mwjn5+-B#aP-WZgu{tx8PyQc&H>Ni)*-NARr1{9wCefc7uu>l;#=9Kc1JfYW z(osA*%{^C^mC>ly^$A~hV~;E2N2${+8fw5q=2OKs-dBRl+hc{Yx^x))5FRnYZ{@5Q z?}!^wkgM+DWVkXJ%eObd^9FB7|33op_Hhhsl_K zb6p##%cB46pI&2~ysv4Z>Yta8buz7g0yDDx@QR{TH)nIJCvV57AR*-8{vQwOTS1Ru zA3a!>;mk>o@GsxLuMCs>0?kFoI$lN=gfRRd2(i)xxI6ODf4QPuYdV54Xqm5L*&UxO z-jqueJ186aR$`y@iahin8?O#R7GhfN#J|YsKg#O__W9@scd(e5U>sFzukXHp4n3u? zi@wbmt~n}~(S@N!8~-Gax9~oB^Nr(f5%1!MMdSc7zj$C17n?&nf(zaaeNv_f#0DB^ z%PFjGr7wCz(`9XzumEthzcl|oJ^E(YkZ_NQXEBC`a=2VIq0~oAyvrB{-HmeA*oM;a ziwGxqmp1%O2m$3uSX8?HxV8#^Wjr&wI@5Dmsm@ksa5m^ZAS|+q_CB$>BK>7x`k5t)0D5j=+R=Q)H=21C-;+zk3Xe$y43o@6sQPxi zdY80Wv;F+^Go}gJueO9X(y181Bp;|8Mc4abvf_0V-ui!B4->>Hb?;_>oN4YqHhE!R zGJL+fW})Fwwv|H4I$6uMdf(@#D2e8MM9tgzgNk=6i8#X1keeCvSQnOT`FUqXH`nw* z58Wf`Mm{*dkSukqoS^;HzhfG~_sm2IM_1*l8JAVC|z7*~sO8Qo6a@To16)%e}^v zKUDAGe1ey*s1~d-Z~x)Bllc%hOL3uAY`-^QZlv6(AwRjKwx+sR{c4_m7Fl_=h4w`9 zVnJ2odqDBV<{&yTNcUo*N2g~n9L1FxrXe+ci?2%Ka~tREx7@p0wsD^8>w^>%>H)c0 zb{U*%8$L{JlmcOY?@HpxCe!laEELa*5?poMt?w4Dph3wK@?Gqjoip0DXj$(>nimIZ zL8^Pb@#7CWiv{HxX?Tquwzw&K$|2D8I?F6gEz4=MP{>+MIspJSK*_&p6(5`gq0cW~ zL{)goA%h$lb9q*{tcS?ggdlZ@V`@^oEqFY=p6>kgWZ4oXssWw}e+P8PZAUZ@8}8k` zXY0h8jJ29TR_7CRRH!w%_0)*Sy=6P?CY;3c?Q)*d@2<>hiBd?5BJDWu0nDufQ*B+F z;Z41Kiq=NaA+379vX)ff1%XYd=|TgyTJaDdjQc1FU$b z3RQCG`ljBUNN|@g)shxIuK39ScT7u-?hcQ@eORm;J#<`wwY_g(5K4lMD4A@=%Ho53 z@&k$t4NKgpa8)KL(&j4!cP9N=>u6|(Z`K&30enTjp0kV*f7Mh^gQ~W{lCjTU2(K2GM~Jf zH=)9YHD-?&?1v6*lv(?}J{$Q@rB1WPc3B~{ETBR(3i{^sHv>DPI{T{+sTSAmE*|PI z$mR0P6q7$if5W2MYeU`oU~P_d5eTIg|a?4QF z3XxKQmmar6eu&dqlqQ1L+ql*X+pNo=tiHD@r~B?l)!xuv&Vn&*^9ZUW#`s{pE^g^G z;?wo6Um?p~nK|%#>HZu`y=iJVSwzcvBqbk7sR?pGf4vk8RW(Trq(%ZNU%O?3_?7e> zo6u5@1MGL=2pO{6c_oQ)6q{i^QUpFL(O*8OuihIJ%^woQRt+?yj{HfRZ;YBX%=Dwb z8z@3$Yj7N^VCx=?VGxc4`JiB}+5~Tf2;f@1CEPXFYf?VT3em674!Kak>H2t46quu} zo2BBFe^c_zLpGUK zyx?}yw}-vzXrIi8(?j~es(8?6Q`C!uSfK33e?Sx8s@^?8CJu<|r;(PG9@R*Ea*3HW z2G^yJs3__azAQ{t7YL~qZOr?nf0%yVug0}SLi{C;?0V9{pjaI-ltImi zmBZ3BxboY!e}C2?6<$#w01#k}`;k!S%fGIEJ72ixrAB2U$3U;XFbcW9Hb_9$e!5ne zf7A-Q%0M5CB6W6NEM(7TX3-;0ABaVoHTY)pKqZwRh-* z&l5$ym$W%3JEKy~o51DpD*T#1M2%!w57hS%5f>6UAo?P(fGwhx8#~)HWeNGke}>zr zoo|NXHPFXb9#-KhH4*n_<=29k0r?%TmSc7NMIOU_vh@2cb|x752Y9aG8?UuN2Y9b< z6^~)o32aF$0J{BS+rcTwCKk6euFaVb+gt?x-TF~mg-az}!J$of6z$cH)`UtTer_ya_6>FFsz6{Vf&*VI+? zU?Pp9;e@^1x1Xp{lb8JqX*?!P@nkl9v{_JQjsb?_dxYZlt~U0y%{k4~f8NT#4R!;k zCSyXLMs7sX2%+7t`c;{2^W#dDXwo*KH7+(gCR(UdYsy+Q(~KF<={7&)MxO|DU7mYDh(zk5ue|^$y&1NYJ`VRG9J9ey(u5yBTDEOL7LQNUuV+m(34g18W zZa%R_ojYPF9)!*ZhNd`6z}XEV%@twue0&#}p1{Hugc9N(l~dUDMSfb&ic_CkR-)pb z)tOWepX8V18;D@$A5K>@!0}P#U_4wS=L_%U2p1tkfv7o69*k;7f3Hszc(aU?DH@~>z+EqV{W zSz8)h4(yK?wJLL8^ovD7Z12A&8SDAfPc6ppIZHOIe>RK$0iBhQZZw-@mb}T! z5kjddxReysbO3?zfXu)()8TbPW$3P-H4ty{VqZn$aB2I74kpbcN6*)gEe(FX4w&Ub zByQrY5Cd;w{bFA?F^KcfcKJpg*(UppYC-$q11R_ztAINYK(!5-?(~Kl@0a%2E zenno_Y%X}9_Ee&EC->WsU+t$y1~cWodM^4)o#C^Aeb?!_*GnO=!XEHg!3rU!b0ce+ z8GX(Df1mxrwbAp45OQ^}f1GJc(#56*VJ3dX(aMJ**dzY&VQZ;|mOhF&x!7an+45>< zGxllzxU?nJBY?I3e(0<^U8IrQ8w)x@Mn6QA`y;#vm(|BOb_Qafa$@oCzfKG*s~7CJ znb6+V+IMEXU`oQ+o_-nJqbq4oP}lbeaHjKjf6a>@Rd!5Wj)=oK7UxD1yZP4o!;n)! zoR?d-B~)^3O=qV{Ap7xJREbM2wAJg0w0@~6_jsX9lJ!+U3^3>6AO6>u?0$(02^tGS z-p^YIrGBT>FDy?UF!Olbfxu*$W8!5>l0@uBRf!;^2s8=q0!UP0U^#s@Z_j_|E8A&t zw*fr~YH`J6i%kpOnah+^CD^uJC~A~%e{7Q~hoMaF`(DHtPdirRC5q5T*$hHjx58gT z6U4}`iUJB4AbjtBWiEtyv_FyW*7!LDXs+vSpRG_8n#dUk;AjQiBThehPAozr(~nDS z`C3nZO|djC8+G|BAwy?R@84sxt|@R2UQP~VsN9q6b8i>VBS#&XfB$l( z8auqX>4e5evG+VWrrCH*waBy6DQ$+Yu_$Q#oGAh&@a5wej+SeS+o(g`&~mxb<*WU< zh}ix^JKd{jwG4KV{$PpcbKPX!4=-phm62B(;-Bif|6d!|uq2A2;M%rr+qP}nwr#un zv~AnAZQHgvZ!^353E8BQR1%@Te*&go=jGC>%MVo0#XDs=Wc5Pu@a-twLbq~Yb?SCm z{XwOjth5~YrR{Z&KnF@lJmN7Qg0w#MPB|>A4g7uGzpDHS!K637ylh(i#4k1fHcQ!p zjJ%=7bE5scZ>{n+>kFQkFJSugj(}zGpN&}F_nE#Ss;8P|!Bn( z0njP?kyiv_@21g1p>t5PuXX?1B*1q+co`jiUB?vn*g8BgEIQRsD&@TDRSr~aRd^-S z#q{d()Yz;$K%T?-2(}F>=$;bIUs<0mmc;~?enMy0^qAEWqJkyF#&aEY)UwH zR`&u8dPOW*TT*=8X!Q?Lzl4JqQO5C)_ouUGcf9^N;*CH#sj%DHpH9jE(q5~Dx}M4! zt*!DBgk6%XXRRyn#ZO?GA!;Zm<;J+y(Qq`JaUkNCEpz7hD6$xSf1o_O8i}nUj`|!7 z&Mro<7n!RRei*ckhuLQ*mtjlzve}+0cynx^P6?mamWZqCMfUZDisbZYsGT5$1o=KBN)A zQqy~*gul>7fxB9pDQ;Ty#qWug*$Q1*r$gmlb=H#W|z^SdRd+ofV!~YR}2y{}UEZ?c!rtV1D%?&KCL;|a#vjHSS*S^Ps51G_u9-Ljqj z1%o;tBF92vP&BMqPOb^9Lg^8oHvFA{hRR;jbgC9}^X|wK6{I`P!xK7>2?iAVF)b8c zZuwYyy;-sZfAzi5y*yYdnuYEer~Js4&%oj7Hgk3;%h(&!=~e&=VUn^^tPT*N?X|gi z^7m5hGBipM@4k$E>PC(QkpRxeED+_vQv_n?I7jID?dGcT!*~iPC;q<6`tBsnim!9y zE^)C`cZ~}FJ{9+Bz+9wjU8BY0es#L46ggIptLj#we@u7SE~=D8&dF0b@{2kQs*t@X zWfz09IYO$SGqZg`rO+I1HI&2{%PY_&PUEOhsjQ`{x$bRcW<0;+Zqde~-H5w}Zh%?dkf+L9b`M={A6c7x@6}rYI;O{^eLOCvZ{PnBa_a7c^KlIOUY- zH>9_kt4J#Fs5jG=5W0!tWmVsgjytE`^+&p#|K@{^7;E}G4I4VJe57-*WqU5f2~t?HlRRgO-{1s=FCkABaeSYGw!#y z7>R9ya63;r)Xg~cM^=DP)6NhBL}0b>Aa>YdMbuu>cP#`|3pHShm_VOU^rsoW*toHB z8MZWa2NTs^cc3g--d3@NSt62W4cAgo%c^T6>B$qaRt)`x(u8JMI8Vr*Pik%1ko(m+&eA-cvX6fw` zV|rdY8vhydcZUqxY!o5oj^Ap{!J+vQf8HZfV|z9>Qnq_ly(In=R&IRR6(Xvl>dEt3 ztAC)xgpA0iYKWNq^Kp`~jP!X{h!v0qoC#4Vh+lrcs?W>Lao{l6n!H_O8iG6qa*<9o^ zON)fgcjzKK{8gx)UnVn2oQdxS4TIA@gz>NNw+U)+V_NS*7}R$+B^pN>hfk zvFG$7HjE+vLQca1sZ64sJ-e*IaSgDMVim}d#BC-zoa1rUdC7K!+!uEee^J(G@l=_q zmdjvL1Obrl06ZPGqsnsC7?`I6TcE&YOC+m!)MKJ`e%l-iv~evgm209}B=)My&1Ap1 zkl@X}u6&i`$}ltNhX7D{QDGUe3d6FE>$5pi84LJ|cSf=LQUBUW0jACfeM37WDH@jM zBch0xC=U~99WM-R)B;-#Fe+Jt@P9I=fNLVJco$MW-y zqVY7xMy;(=16?BCLEuv%Q8Y;PO4D9*JstN!A##ZQ7&aeS**4m;UfPo|!sBUAMpfkJ zLC|)A_FAE!Go>|b-*?(rd+SJO)pIsbu**gNK>68L1`65|X%7kMTHzsf%EMqv})3X@Qo&a zej5r@+Jq4Jh)U^BRu%=MP{yb!`?LC=lPpglr`*0`vpoMNi~IA;l3t>>hn5d{bj|G7 zPs13d_BEs-t1b>r%cUp-+|~0=z&D!S0DpMzVV9PiCNH6qf13GKJhGHR%W!J-U|Q%9 z{yGxM9DcTpX`0;_?DAM&>#SgSM#kU6J`C{hrBNXpFHw05s-J`&=!h)zy^bC~Biujs zjahK1C`Ne=eM&7w42pk1zi+=#Z`46EsejSXt(LG*3TlLy9T%Z!Wh*?{rk_`$<^#j& ziNkXVVekY>f3;|yuzw(uC*U{oxlbZcw63br>#V=$^)6y_X<}gW=@;JNH3|Az1l}cG z@Bs@8-o3EkX~?kpPykxL;GKMZHL71AQagnO7@)&;YBm4qxk#ftu>Baoac2C&c?S!r zwt90TCL+njo)lu4a+EaGJx(&!M@pEdQc;HVd*xi`e}|lv^4o33{&grUJ}0|$Q-!uz z&@rM}Dm}Os(#Jqco%ESf`zN3PCDG72UYH&m*4$+@9QIy52K^2pHhH?hzN!gki}_Fb zoRMLgOfZ)GWpe$*IqkWv+-ud{PNg&mI0fNyC95FrlW`SZ)%@0Zu|ZqPaf)(9i#G%_ z8wupwf4()Npx?Sar%KJAyjRg}EL$GHJf;tp!=u5xrusuvG?s_%{Z57`$0!W560pEn zc9iTzEq92VyI-YPYErS6uTk95Tz@cDtq{1?Aa95Mo_@_*uIjIo0%n~II#?s|9^3sn zAU{NNbzjI8Z_iGbu1#Y6#kGVkUBi0*nZ8=pe@^|a7?Nn8dcAY$0;m8)JUe_g^xK#Q!*chC6Y#>aFb)q{%Fe-%pB#m2-DvuGR_=R)QANptqp<+%;thp3l#m!nVt|G3ZXXh$^nTo4`Eu5Li%O>&$qUAOe{_vL zU51F+3g6~!N$z=R?0AH4qRi30gO}}<=k|O#$#zL~miW#41D3)m3qlb$XoBEgbO+8k zM@*9Z(i{p4damu3jvY)8@7eDnxEU${c38Ed%de~R9zz|3RM_bLsOo%*tj`WKgmC}y za+i~^;C=T4e7wYLBO9j`#@_aIe+j z&Y?ALA#`Qapwbu=cdgeEXC@Rnq=e}uaile65NMq!M=>23tCNck=ViA&oD_3CcgoG4 zIuvZjIU-q$02PNy@b+<&Aa>C5r|7W)bYz1;?_;?(e0Wm(6x$Qf-4W7_f54X?nppRa ztYNi+xuT6so*}*-nJElNkwZeOR~c~cWucB61p~_yEKxRB0A(8ezz?Qm^y{cnf?^7R zJ!7RD3HwJUU0yNkdKdG&iVZ_DC8&bM;*qsnQg8K_q8am#Hg4aL2U7g|zNZr&*<$G^ zQiVKMzstTqag=~<$wAK@fA8N1G5r;5d9}^xq%R%&uflx}8EIwZW4;?i76<5?plO2@ zf$W-(e(%b8=HC+^sj}wOp0WVvrV$%Vk8#CGwUjc@!X65_J8-f8##?YMyYm1f#dlU? zY*cNnbSc)sxk1$exV*0MUXtHl3+?ha##L@~5<)`Cwnkayn10Cc>*HW&#e)*bsE-Ba|v3{&6(4;wh{;TF@&>Rg_Lw?Jkp0PpQD) z;=r3x7ppSQmS#>hdIIJu=aM&<>2t!MU)i)4>Da$_G#d?nfh}o3R5PtjG zrXa)4WK_2+XBU%Ee{hLrLzuhQYRjcEqt{@!ks+0!iu{V7;w^EcOF3|_O`ovWP{R3p z1~^^WI%pTr$~P^mE(ALJ7dR(iCOnde5vZ$EE83Eha}g=lfP9Nf0~s&J2E5Zj{yt@@ z-P2l^WS+VJj(#3>!C-e%CBWLm=V<>S%}D^8ndG7Sf8wSle>l^I09UTrYupSUbfBdi z5VZ~Qv`Taf|Hh5@SfEr(ZVYsvVW9{xEug&7^Zbm_ezA#7NJKebGap5PRHBObM7zn? zOetnNwd+rOfTJ&J;LUtIBqSXXH1cYMO!KXbPx0DY5IVxlm%Vs$4X z^MPgOe}6Zi%K?!7_`-o?Nb-R4PO31OsuS}_?n<9i3rDE8*av*F$k43Q{eaA(iH`{@ zgl(o`eF8e`120CY4C(CXs)*b$^>LyaOnP(0YW4N9ya{{v+jhaOS|ThWmP<#*D#iLl z>!i=Y-6ND%*~qhn1Ld|zg1`gogQ1d77XF35e=)h^i^670P~?m~xVZ?%>Yk80D%GM7 z`5}i_F67B^mhlcspd@@oV2l2X5b;>#^|~W~x8XDDaq5eF(*LHd*0_bXIx?!*>0<`` z5T)9bfDMbQq~KGY}Svage(x{TB+V0%{wC}BUEf7kK3-9=|n>Ng=5RtOeE zfAn?cg5`?e-%mE;9xKwh>}O~dz>!NNJ7w4Ny;+;*(0so z?KS`#RK~K#)u&o2TIWasJ}OIU0`EbzSG3-~n(P(&P-w{r2UzRP37Kigt!Mav(<1h| z*a}4oIT+mOeVde%1Yu4bvpCthIJ&w|UTS+)!F}Go@i_B%h)D;e@^BGa;j!33OOXw@kK+FLk``k*fSunCjgS^2(+B| ze1vveotfXN9b&`ZcPbDj%P*UkpVuA;LP9N!Q#0O>=|yPg+=J7r!Unb>*_TcLB>29v zy@Dc5)S8<`-s%G}S^In<*PbyA%R!E3xATEf%(FN~JoX}q|5?ky1*mk(f80Nk##bQS z=<&U(vA=a@G1|7-YnxyC(VwauF0iIQ~3GcC-_86DxMtzB-&xYbpEDW4ze!VoCfBDP`0@SxHJ?2Vbl%@oFJb z-eKZ)MTc+k#!7;$`W47q+REp9J{wBr&IVF;JQB+4_a0^1t)* ztv$qha7}STB-38Ne<=CG1y~z0|KV%HWUF14%%}9)by3Sk6~~x%gwpt= zkocDfjQ3iw(>dkT=+OYl_bcmMNcEgE>2oZCt-8h)*-?;ET8N8|TYZLs=Vr!sG^q77 zYI{u(j=#j7{`+}Ala5t)GK*^$ph1vpXuA!hO-`dr>B-V0f7WL_J~w{x#!Mhz{5T(e z`ff0474ksNCp)nJL~Molnpk{SfjGIlM52#s-RL(2i!#lfO-imT6V6g{5QzU=R`@4B z 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 delta 39638 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 1.05,0,0,/srv/projects/party4d/archive/party2d_replication/outputs/diagnostics/convergence_summary_2026-06-12_12-53-24.csv -ESS > 1000,34853,98.85,/srv/projects/party4d/archive/party2d_replication/outputs/diagnostics/convergence_summary_2026-06-12_12-53-24.csv -ESS 400-1000,405,1.15,/srv/projects/party4d/archive/party2d_replication/outputs/diagnostics/convergence_summary_2026-06-12_12-53-24.csv -ESS < 400,0,0,/srv/projects/party4d/archive/party2d_replication/outputs/diagnostics/convergence_summary_2026-06-12_12-53-24.csv +metric,count,percentage +R-hat < 1.01,35258,100 +R-hat 1.01-1.05,0,0 +R-hat > 1.05,0,0 +ESS > 1000,34853,98.85 +ESS 400-1000,405,1.15 +ESS < 400,0,0 diff --git a/docs/DATA_CODING_PRINCIPLES.md b/docs/DATA_CODING_PRINCIPLES.md deleted file mode 100644 index b98f23d..0000000 --- a/docs/DATA_CODING_PRINCIPLES.md +++ /dev/null @@ -1,240 +0,0 @@ -# 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. diff --git a/docs/FULL_RUN_OPERATIONS.md b/docs/FULL_RUN_OPERATIONS.md deleted file mode 100644 index db1a4b9..0000000 --- a/docs/FULL_RUN_OPERATIONS.md +++ /dev/null @@ -1,73 +0,0 @@ -# Full model run operations - -This note describes how to launch, monitor, and summarize the long full model -run that generates the posterior estimates. - -Do not start a full run until raw-data and Stan-data preflight checks pass. - -## Hardware note for runtime reporting - -The production run should record elapsed time for this workstation as: - -```text -Hardware: 4 cores of an AMD Ryzen 9 7945HX -``` - -After the run, record the wall-time reported by `src/sh/show_run_progress.sh` or -`outputs/model_outputs/latest/run_*/diagnostics/run_metrics.json`. - -## Launch with durable logging - -From the repository root: - -```bash -mkdir -p outputs/logs -ts="$(date +%Y%m%d_%H%M%S)" -STAN_REFRESH=100 \ - nohup bash run_estimation.sh full \ - > "outputs/logs/full_run_${ts}.log" 2>&1 & -echo $! > "outputs/logs/full_run_${ts}.pid" -``` - -The wrapper configures local raw data, local R libraries, project-local temp -space, and the writable project-local CmdStan copy by default. - -## Monitor during the run - -Live log tail: - -```bash -tail -f outputs/logs/full_run_.log -``` - -Convenience progress command: - -```bash -bash src/sh/show_run_progress.sh -``` - -Stan progress is printed every `STAN_REFRESH` iterations (default `100`) and is -captured in the durable log. - -## Inspect after completion - -After a successful run, the chain CSVs are under: - -```text -outputs/model_outputs/latest/run_/chains/ -``` - -Run diagnostics and Stan logs are archived under: - -```text -outputs/model_outputs/latest/run_/diagnostics/ -``` - -Use: - -```bash -bash src/sh/show_run_progress.sh -``` - -to print the latest run status, wall time, sampler configuration, divergences, -tree-depth hits, and command-configuration verification status. diff --git a/docs/RAW_DATA_SOURCES.md b/docs/RAW_DATA_SOURCES.md deleted file mode 100644 index 61876d4..0000000 --- a/docs/RAW_DATA_SOURCES.md +++ /dev/null @@ -1,112 +0,0 @@ -# Raw data sources and local-only setup - -This repository includes model-ready inputs under `data/`, but it does not -redistribute licensed, restricted, or third-party raw source files. Raw files -needed to regenerate processed inputs should be kept in `_local/raw/` or another -directory selected with `PARTY2D_RAW_DATA_DIR`. - -The source setup scripts document how to obtain and test those files locally. -Users must use their own Manifesto Project API key and obtain the Morgan OCR/ -transcription file separately. - -The data setup workflow writes intermediates to `_local/build/`, regenerated -inputs to `_local/generated-inputs/`, and comparison reports to `_local/reports/`. -It does not overwrite committed `data/` files. - -Recommended local layout: - -```text -_local/raw/ - poldem/poldem-election_all.csv - manifesto/MPDataset_MPDS2025a.csv - partyfacts/partyfacts-external-parties.csv - ches/... - vparty/... - poppa/... - gps/... - morgan/... -``` - -The scripts read `PARTY2D_RAW_DATA_DIR` when it is set. For another location, use: - -```bash -export PARTY2D_RAW_DATA_DIR=/path/to/local/raw -``` - -## Required raw inputs - -| Source | Raw file | Local path below `$PARTY2D_RAW_DATA_DIR` | Used by | Redistribution | -| --- | --- | --- | --- | --- | -| Manifesto Project Dataset | `MPDataset_MPDS2025a.csv` | `manifesto/MPDataset_MPDS2025a.csv` | `data-setup/R/process_manifesto.R` | Not redistributed in this repo | -| PolDem Election Campaigns, all issues | `poldem-election_all.csv` | `poldem/poldem-election_all.csv` | `data-setup/R/process_poldem.R` | Not redistributed in this repo | -| CHES family | CHES aggregate and expert-level files | `ches/` | `data-setup/R/process_expert.R` | Not redistributed in this repo | -| V-Party | `V-Dem-CPD-Party-V2.rds` | `vparty/V-Dem-CPD-Party-V2.rds` | `data-setup/R/process_expert.R` | Not redistributed in this repo | -| POPPA | `poppa_integrated_v2.rds` | `poppa/poppa_integrated_v2.rds` | `data-setup/R/process_expert.R` | Not redistributed in this repo | -| Global Party Survey 2019 | `Global Party Survey by Party SPSS V2_1_Apr_2020-2.tab` | `gps/Global Party Survey by Party SPSS V2_1_Apr_2020-2.tab` | `data-setup/R/process_expert.R` | Not redistributed in this repo | -| Morgan historical expert data | `morgan_positions_raw.csv` | `morgan/morgan_positions_raw.csv` | `data-setup/R/process_morgan.R` | Not redistributed in this repo | -| PartyFacts crosswalk | `partyfacts-external-parties.csv` | `partyfacts/partyfacts-external-parties.csv` | source harmonization scripts | Not redistributed in this repo | - -## PolDem download - -Dataset: `poldem-election_all` from the PolDem Election Campaigns collection. - -- Overview: -- Download page: -- CSV URL used locally on 2026-06-11: - - -Observed checksum after download on 2026-06-11: - -```text -sha256 2cd8c9108b1b0b9c1b6594bb21acee709c70259cd02f450bc69fc09b505fc9fb -``` - -## Local source check and rebuild - -To check local raw file placement and print byte sizes/checksums directly, run: - -```bash -bash data-setup/check_raw_data.sh -``` - -Run the full source-data setup, rebuild, and comparison test with: - -```bash -bash data-setup/run_data_setup.sh -``` - -The generated files remain under `_local/generated-inputs/`. They are compared to -the committed model-ready inputs, but never copied over them automatically. - -## Processed files kept in this repository - -The committed files under `data/` are limited to the model-ready inputs used by -the Julia/Stan estimation path: - -- `data/text_data.csv` -- `data/expert.csv` -- `data/lr_data.csv` -- `data/union_mapping.csv` -- `data/party_families.csv` - -These files document the analysis-ready inputs while avoiding redistribution of -the underlying raw source data. - -See `data-setup/source_manifest.csv` for a machine-readable source checklist. - -## Scripted download status - -`data-setup/R/01_download_sources.R` downloads sources that are script-accessible -under provider terms: PolDem, PartyFacts, CHES family files where provider links -are live, POPPA from Harvard Dataverse, GPS from Harvard Dataverse, Manifesto -with user credentials, and V-Party through the provider form when -`PARTY2D_VDEM_EMAIL` is set. - -The Manifesto Project main dataset requires Manifesto Project access/API -credentials from the provider. Set `MANIFESTO_API_KEY` or -`PARTY2D_MANIFESTO_API_KEY` for scripted download. - -The Morgan historical file is a local OCR/transcription source from Morgan -(1976), not a public provider download. It can be provided on request and must be -placed locally at `$PARTY2D_RAW_DATA_DIR/morgan/morgan_positions_raw.csv` for -full rebuild tests. diff --git a/docs/union_mapping.md b/docs/union_mapping.md deleted file mode 100644 index 43e078d..0000000 --- a/docs/union_mapping.md +++ /dev/null @@ -1,350 +0,0 @@ -# Party Union Mapping - -## Individual Party Guarantee - -**Every `party_id` in the output CSV represents an individual political party, never an electoral alliance or bloc.** - -Electoral alliances and blocs are handled in one of two ways: -1. **Decomposed via mean-constituent averaging** (N=123 mappings): Shared manifesto data feeds into individual constituent party estimates. The output contains the constituents, not the alliance. -2. **Excluded with documented justification** (see "Excluded Alliance Labels" below): Alliance labels with no mappable constituents are dropped from the output. - -Post-estimation verification in `02_post_estimation.jl` hard-fails if any union/alliance PF ID appears in the output. - -## Overview - -Expert surveys often rate individual constituent parties separately, while manifesto data is published under a union/coalition/merged party name. This document maps individual party PartyFacts IDs to the union PartyFacts IDs used in `text_data.csv`. - -**Direction:** Individual party (expert data) → Union (manifesto/text data) - -## Model Integration (V4 Mean-Constituent Model) - -The V4 Stan model (`stan_model_2dim_v4.stan`) uses these mappings to produce **individual party estimates** for all constituent parties. Instead of collapsing expert data onto the union ID, V4 gives every constituent its own latent position (theta) and links shared manifesto data to the **mean** of constituent thetas. - -### How it works - -1. **Each constituent gets its own segment and random walk.** CDU (1375) and CSU (1731) each have independent theta trajectories. The union ID (211) gets NO segment. - -2. **Manifesto observations constrain the mean.** A CDU/CSU manifesto in year t enters the likelihood as: - ``` - pos = mean(theta[dim, rr_CDU_t], theta[dim, rr_CSU_t]) - ``` - The observation is counted once (no double-counting), but it pulls both constituents' thetas via their average. - -3. **Expert data constrains individuals directly.** A CHES rating of CDU in 2019 maps to `theta[dim, rr_CDU_2019]` with no averaging. This is what identifies the *difference* between constituents. - -4. **Identification depends on data availability:** - - **Periods with individual expert data** (e.g., CHES 1999-2024): Constituent estimates separate meaningfully. CSU appears more traditionalist on the cultural dimension than CDU, matching known ground truth. - - **Periods without individual expert data** (e.g., 1950s-1990s): Only the shared manifesto constrains the mean. The random walk prior pulls constituents toward similar values, so CDU ≈ CSU with wide credible intervals on the gap. The estimates gradually differentiate as expert data appears. - -5. **Backwards compatible.** With an empty `union_mapping.csv`, all observations have `n_const=1` and V4 reduces exactly to V3. - -### Data flow - -``` -Data setup pipeline (`data-setup/R/02_build_model_inputs.R`): - - text_data keeps union PF IDs (211) for manifesto rows - - expert/lr_data keeps individual PF IDs (1375, 1731) - - Expert filtering: party in text_data OR party in constituent_parties - -Julia pipeline: - 02_data_loading.jl → loads union_mapping.csv → builds union_to_constituents dict - 03_data_preparation.jl → creates segments for CONSTITUENTS (not unions) - → builds flat arrays: n_const_man[], const_offset_man[], const_rr_man[] - 04_model_execution.jl → passes constituent arrays to Stan - -Stan model (stan_model_2dim_v4.stan): - - Manifesto likelihood: averages theta over constituents per observation - - Expert likelihoods: same averaging (nc=1 for individual obs = direct lookup) - - No new parameters vs V3 — only data block and likelihood computation change -``` - -### Output - -Post-estimation produces individual party rows (CDU=1375 and CSU=1731 as separate rows) with a `union_party_id` column (= 211 for both, NA for standalone parties). The anchor party is CDU (1375) instead of CDU/CSU (211). - -### Scale impact (smoke test, post-1990 data) - -- 471 parties → 483 segments, 461 with valid segments (vs ~449 without unions) -- 708 union manifesto observations with multi-constituent averaging (3.2% of 21,991 total) -- 23,427 total constituent entries in flat arrays -- 9,870 segment-year positions (R) -- No new model parameters (theta simply covers more segment-years) -- Negligible performance impact: `nc=1` fast path for >96% of observations - -### Data quality (verified 2026-02-08) - -- **No double-counting**: No constituents appear in text_data alongside their union -- **Union IDs verified absent from output** via post-estimation check in `02_post_estimation.jl` -- **No chain mappings**: No PF ID serves as both union target and constituent of another union -- **No duplicate rows** in text_data after deduplication -- **All flagged-for-review parties** in audit script are confirmed individual parties (false positives from name patterns) - -## Detection Methodology - -`scripts/diagnose_party_mismatches.R` uses a multi-signal approach, ranked by reliability: - -### Phase 1: MARPOR `progtype` variable (definitive) - -The raw Manifesto Project data (`MPDataset_MPDS2025a.csv`) contains a `progtype` variable classifying each manifesto entry: - -| progtype | Meaning | Relevance | -|----------|---------|-----------| -| 1 | Party's own manifesto | Individual party, no union issue | -| **2** | **Programme of 2+ parties (individual tracking)** | Joint manifesto: each constituent gets its own CMP code with identical scores | -| 3 | Electoral manifesto by a single party | Individual party | -| **4** | **Estimated from another party's programme** | Party had no manifesto, inherited another party's scores | -| **5** | **Average of member parties' manifestos** | MARPOR computed average from constituent parties | -| 6 | Other | Miscellaneous | -| **8** | **Party bloc programme** | Bloc-level CMP code representing multiple parties | -| 9 | Non-standard text | Various sources | - -**Phase 1a (progtype=2):** Group by `(country, date)` where progtype=2 to find which CMP codes shared a joint manifesto at each election. Map each to PF IDs. If some are in text_data and others are expert-only, create constituent mappings. - -**Phase 1b (progtype=5):** Average-of-members entries have their own CMP code. Find constituents via PartyFacts "composed of:" comments and manifesto party names. - -**Phase 1c (progtype=8):** Bloc-level entries have their own CMP code. Find constituents via PartyFacts "composed of:" comments and manifesto party names. - -**Phase 1d (progtype=4):** Proxy entries where MARPOR estimated from another party. Currently detects 0 expert-only parties with progtype=4. - -### Phase 2: PartyFacts metadata enrichment - -**Phase 2a (comment parsing):** Search text_data party comments for "composed of:" patterns. Match mentioned abbreviations against expert-only parties using word-boundary matching. - -**Phase 2b (parlgov "+" notation):** parlgov uses "+" to denote unions (e.g., "CDU+CSU", "CCD+CDU"). Parse fragments and match against expert-only parties. - -**Phase 2c (name fragment matching):** For text_data parties with "/" or "-" in names, split into fragments and match against expert-only parties. **Bilingual disambiguation:** if all fragments resolve to the same PF ID, the "/" separates language variants (e.g., Swiss SPS/PSS), not constituents. - -### Phase 3: LLM verification (optional) - -For remaining unmatched expert-only parties, uses gpt-4.1 via GESIS OpenWebUI with enriched prompts containing: all name_short values across datasets, year ranges, PartyFacts comments, progtype history, and the full list of text_data parties in the same country. Skip with `--skip-llm` flag. - -### Matching safeguards - -- **Word-boundary matching:** Uses `\b` regex boundaries to prevent substring false positives (e.g., "DS" matching "NDSI") -- **Minimum 2-character terms:** Single-letter abbreviations (e.g., "K", "G") are excluded from matching -- **Deduplication:** When the same mapping is detected by multiple methods, the highest-reliability method is kept (manual > progtype > comments > parlgov > name_fragment > LLM) -- **Idempotent:** The script strips `detection_method` from existing mappings on re-run - -## How This Was Built - -1. **Original 36 mappings** (2026-02-06/07): String matching + LLM + RA verification + independent research -2. **Expanded with progtype** (2026-02-07): Rewrote `scripts/diagnose_party_mismatches.R` to use MARPOR progtype (types 2, 4, 5, 8), PartyFacts comments, parlgov "+", and bilingual-aware name matching -3. **LLM verification with gpt-4.1** (2026-02-07): Ran enriched prompts through gpt-4.1 via GESIS OpenWebUI for 345 remaining expert-only parties. Found 32 additional verified constituent mappings across 25 countries. -4. **Bloc-centric LLM sweep** (2026-02-07): For each of 38 unmapped progtype=8 bloc parties in text_data, sent targeted gpt-4.1 queries asking which expert-only parties are actual constituents. Found 17 new mappings (Brazil PT-led coalitions, Chilean Concertación, Serbian blocs, Latvian unions, etc.). -5. **Manual research** (2026-02-07): Verified remaining unmapped blocs. Added 4 manual mappings (PL: .N→KO; CL: PC→Concertación, PH→Concertación; ES: Amaiur→EH Bildu). Confirmed remaining 27 blocs have no mappable expert-only constituents (constituents either already in text_data, not in expert surveys, or in fluid coalitions). -6. **Temporary election coalitions** (2026-02-08): Systematic analysis of progtype=2 joint manifesto groups. Grouped by identical CMP content (all 142 per* columns) to separate left and right coalitions within the same election. Found 9 unmapped expert-only parties that shared manifestos with text_data parties (Italy 2001/2006/2013, France 2017). Added CCD→CdL from orphan analysis (1 manual). Total: 10 new mappings. -7. **Individual party guarantee cleanup** (2026-02-08): Removed 11 progtype_2/progtype_2_joint entries that mapped real individual parties as unions of zero-data coalition partners. Removed 2 chain mappings (union→union→constituent). Added 4 new mappings for genuine alliances (MX: Salvemos a México→{PRI, PVEM}; IL: Joint List→{Hadash, Balad}). Documented classification decisions for all 15 dual-progtype parties and 4 pure bloc labels. Added post-estimation verification check and audit script. - -## Mapping Table - -The canonical mapping is in `data/union_mapping.csv` with columns: -- `manifesto_pf_id` — PartyFacts ID of union (in text_data) -- `manifesto_name` — Union display name -- `expert_pf_id` — PartyFacts ID of individual constituent (in expert_raw) -- `expert_name` — Individual party display name -- `country` — ISO2 country code -- `relationship` — Description of the relationship -- `status` — `implemented` (active in pipeline) or `pending` (awaiting implementation) -- `detection_method` — How detected: `manual`, `progtype_2`, `progtype_2_joint`, `progtype_5`, `progtype_8`, `progtype_4`, `composed_comment`, `parlgov_plus`, `name_fragment`, `llm_verified` - -## Detection Method Breakdown - -| Method | Count | Description | -|--------|-------|-------------| -| llm_verified | 48 | gpt-4.1 verified (party-centric + bloc-centric) | -| manual | 45 | Hand-verified mappings (includes MX/IL bloc mappings, CCD→CdL) | -| progtype_8 | 23 | Bloc-level CMP entries matched to expert-only constituents | -| name_fragment | 4 | "/" or "-" name splitting matched to expert-only parties | -| composed_comment | 2 | PartyFacts "composed of:" comments | -| progtype_5 | 1 | Average-of-members entries (Croatia ZL) | - -**Total: 123 rows** mapping 116 unique expert parties to 87 union parties across 41 countries - -## Bloc Coverage - -Of 49 progtype=8 bloc parties in text_data, 22 (44.9%) have at least one constituent mapped. The remaining 27 have no mappable expert-only constituents because: -- Actual constituents already have their own text_data entries (e.g., KDNP, Yesh Atid, TB-LNNK) -- Actual constituents are not in expert surveys (e.g., Hadash, Ra'am, Balad, VS, DKP) -- Coalition membership is too fluid for static mapping (Panama, Colombia, Israel shifting coalitions) -- The entry is a single party coded as a bloc (e.g., German Minority, Red-Green Unity List) - -## Temporary Election Coalitions (progtype=2) — REMOVED - -The progtype=2 joint manifesto mappings (Italy 2001/2006/2013, France 2017, Belgium 1971) were removed in the 2026-02-08 cleanup because they mapped real individual parties as "unions" of tiny coalition partners with zero data. See "Removed Mappings" below for details. - -The CCD(1767)→CdL(6241) mapping from orphan analysis remains, as CCD was a genuine long-term CdL constituent (progtype=1 in 1996, part of CdL bloc from 2001). - -## Unmappable Expert-Only Parties - -These parties appear in expert surveys but have no manifesto union to map to. Verified against `text_data_unfiltered.csv` (pre-temporal-filter, 1238 parties) on 2026-02-07. - -**Filter retest results:** 54 of the 80 original RA task parties have manifesto data in the unfiltered text_data, but all were dropped by the temporal continuity filter (requires ≥3 years with gaps ≤6). These parties have their own CMP data but too few observations. They are correctly handled via union mapping (where applicable) or excluded (where standalone). See `scripts/party_mismatch_ra_task.csv` for full year-level detail. - -| Expert PF ID | Name | Country | Manifesto years (unfiltered) | Expert years | Why unmappable | -|-------------|------|---------|------------------------------|--------------|----------------| -| 5623 | Compromís | ES | 0 (CMP codes map to different PF IDs) | 2 (2018, 2023) | No manifesto data under PF ID 5623. CMP codes 33098/33093/33914 are separate PartyFacts entries. | -| 4363 | FDG (Front de Gauche) | FR | 1 (2012) | 1 (2014) | 1 CMP year only. PCF (1251) already has its own expert data. | -| 5731 | NNP | ZA | 0 | 1 (1999) | Apartheid party that dissolved into ANC 2005. Ideologically incompatible mapping. | -| 5553 | FREPASO | AR | 1 (1995) | 4 (1995-2001) | 1 CMP year only. Independent party; Alianza (1999) was separate CMP entity. | -| 8122 | CF (Consenso Federal) | AR | 1 (2019) | 2 (2019-2020) | 1 CMP year only. One-off coalition. | -| 4182 | FPL+UCeDé | AR | 1 (2003) | 3 (1987-1991) | 1 CMP year only. Incoherent entity (UCeDé 1987 ≠ FPL coalition 2003). | -| 6160 | FR (Frente Renovador) | AR | 0 | 4 (2013-2019) | No CMP code at all. Major ideological shift 2013→2019. | -| 5879 | CD (Centro Democrático) | CO | 1 (2014) | 3 (2014-2019) | 1 CMP year only. Uribe's party, independent. | -| 4411 | PNI/PPN | CR | 0 | 1 (1974) | No CMP code. Defunct 1970s party. | -| 7412 | EK/DEK | CY | 0 | 1 (1970) | No CMP code. Defunct 1970 far-right party. | -| 3935 | United Opposition | GE | 1 (2008) | 1 (2008) | 1 CMP year only. Was anti-UNM alliance (not led by UNM). | - -## Rejected Mappings - -These were proposed by the RA but found incorrect during independent research: - -| Individual PF ID | Name | Proposed target | Why wrong | -|-----------------|------|-----------------|-----------| -| 5623 | CC/Compromís | 81 (CCa-PNC-NC) | Name coincidence. Compromís is a Valencian left party; CCa is a Canarian right party. | -| 4363 | FDG | 1251 (PCF) | FDG was a multi-party alliance (PCF + Parti de Gauche). PCF already has its own 2014 expert data. Mapping FDG→PCF would double-count. | -| 5731 | NNP | 1219 (ANC) | The NNP (ex-apartheid National Party) dissolved into ANC in 2005 as political capitulation. NNP positions are diametrically opposed to ANC on every dimension. | - -## Completeness Audit (2026-02-08) - -Systematic analysis of 631 orphan expert parties (with 4+ observations) across 46 countries (excluding FPTP systems like UK, US, Canada where party unions are not a meaningful concept). Cross-referenced with MARPOR progtype data and PartyFacts metadata. - -### Methodology - -1. **Progtype=2 sweep**: Identified all 93 MARPOR entries with progtype=2. Grouped into 27 content-identical subgroups. Found 12 expert-only parties with progtype=2 data; 10 were mappable (mapped above), 2 had no matching text_data party in their coalition. - -2. **Orphan analysis**: For each of 46 countries, identified expert-only parties not in text_data and not already mapped. Examined PartyFacts metadata (names, comments, ideology tags) and MARPOR progtype history for each. - -3. **Coalition verification**: For Italian orphans specifically, checked each party's MARPOR entries for progtype=2/8 membership and ideological alignment with existing text_data coalition parties. - -### Major standalone orphan parties (not coalition members) - -These are significant parties with substantial expert data but no manifesto/union data. They are genuinely standalone — not missed union constituents. - -| Country | Party | PF ID | Expert obs | Why standalone | -|---------|-------|-------|-----------|----------------| -| AT | BZÖ | 599 | 7 | Splinter from FPÖ; own CMP data filtered out | -| BE | PTB/PVDA | 1753 | 14 | Independent far-left; never part of any coalition | -| CZ | ANO | 2141 | 13 | Babiš party; own CMP data exists but too recent | -| CZ | Piráti | 2047 | 10 | Standalone; own CMP data exists | -| FR | REM/R | 5857 | 10 | Macron's party; too new for sufficient CMP data | -| FR | FI | 5858 | 8 | Mélenchon's party; standalone | -| IT | M5S | 2046 | 13 | Five Star Movement; progtype=1 only, standalone | -| IT | FDI | 2280 | 10 | Fratelli d'Italia; progtype=1 only, standalone | -| RO | USD | 120 | 23 | Social democratic bloc; own CMP code exists | -| SK | OĽaNO | 2130 | 13 | Populist party; standalone | -| CO | PCC | 1577 | 19 | Conservative party; own CMP code exists but filtered | -| BR | PSDB | 225 | 13 | Social democrats; standalone (not PT coalition) | - -### Inactive union mappings - -These union targets exist in `union_mapping.csv` but are NOT in text_data, making their constituent mappings inactive: - -| Union PF ID | Name | Country | Constituents | Why inactive | -|-------------|------|---------|-------------|--------------| -| 1212 | SEL | IT | SEL(7031) | 1212 not in text_data | -| 1737 | Olive Tree | IT | PCI(34), DS(878) | 1737 not in text_data; only 2 MARPOR years | - -Note: 962 (CCD+CDU→CDU-Italy) was removed from the mapping entirely because it created a chain (962 is both a constituent of UdC and a union target). See "Removed Mappings" below. - -### Conclusion - -The 123 mappings comprehensively cover: (1) all permanent unions with separate expert data, (2) all progtype=8 bloc parties with mappable expert-only constituents, and (3) CCD as an additional Italian coalition member identified through orphan analysis. Remaining orphan expert parties are genuinely standalone parties whose manifesto data was either filtered out by temporal continuity requirements or does not exist. - -## Removed Mappings (2026-02-08) - -### 11 progtype=2 joint manifesto entries removed - -These entries mapped real individual parties (with substantial text and expert data) as "unions" of temporary coalition partners that had zero text data AND zero expert data. Every constituent had no information to contribute, making the mapping harmful (it reduced real parties to averages with phantom partners). - -| Union PF ID | Union Name | Constituent PF ID | Constituent | Country | Why removed | -|---|---|---|---|---|---| -| 8054 | DS | 279 | M-DL | IT | M-DL has 0 text, 0 expert data; DS has 120 text, 3 expert | -| 1404 | PRC | 1635 | PdCI | IT | PdCI has 0 text, 0 expert data; PRC has 58 text, 15 expert | -| 1404 | PRC | 1711 | RnP | IT | RnP has 0 text, 0 expert data | -| 6241 | CdL | 888 | NPSI | IT | NPSI has 0 text, 0 expert data; CdL's progtype_8 mappings (AN, CeD, FI) remain | -| 6241 | CdL | 2415 | ALD | IT | ALD has 0 text, 0 expert data | -| 768 | IdV | 115 | P-UDEUR | IT | P-UDEUR has 0 text, 0 expert data; IdV has 26 text, 8 expert | -| 768 | IdV | 1369 | SVP | IT | SVP has 0 text, 0 expert data (under this PF ID) | -| 1221 | Lega | 365 | PdL | IT | PdL has 0 text, 0 expert data; Lega has 77 text, 24 expert | -| 1595 | UMP | 3229 | UDI | FR | UDI has 0 text, 0 expert data; UMP has 66 text, 18 expert | -| 49 | openVLD | 622 | CD&V | BE | CD&V is a large party (own PF ID); mapping created false dependency | -| 554 | PRL | 622 | CD&V | BE | Same issue: CD&V already has its own data pipeline | - -### 2 chain mapping entries removed - -These created chain dependencies (union A → union B → constituents), which the pipeline does not support: - -| Union PF ID | Union Name | Constituent PF ID | Constituent | Country | Why removed | -|---|---|---|---|---|---| -| 962 | CCD+CDU | 763 | CDU (Italy) | IT | 962 is itself a constituent of UdC (201). CDU-Italy (763) has 0 data. Chain: 201→962→763. | -| 5939 | PàF | 1742 | AD | PT | 5939 is itself a constituent of CDS-PP (1308). AD (1742) has 0 data. Chain: 1308→5939→1742. | - -## New Mappings Added (2026-02-08) - -| Union PF ID | Union Name | Constituent PF ID | Constituent | Country | Rationale | -|---|---|---|---|---|---| -| 3979 | Salvemos a México | 1474 | PRI | MX | PRI-PVEM electoral coalition (2006-2012); PRI has extensive text + expert data | -| 3979 | Salvemos a México | 446 | PVEM | MX | PVEM is second constituent; has its own text + expert data | -| 7912 | Joint List | 421 | Hadash | IL | Arab party coalition (2015-2021); Hadash has CHES 2022 data | -| 7912 | Joint List | 1663 | Balad | IL | Balad is constituent; has CHES 2022 data | - -## Excluded Alliance Labels - -These party IDs appear in text_data as bloc/alliance labels but are NOT decomposed via union mapping because no constituent has data in the pipeline: - -| PF ID | Name | Country | Text data | Expert data | Why excluded | -|---|---|---|---|---|---| -| 3995 | Alianza Acción Opositora | PA | 48 obs | 0 | No expert survey coverage for Panama. No constituents identifiable in pipeline. | - -Note: Several other progtype=8 bloc parties in text_data also have no mapped constituents (see "Bloc Coverage" below), but they remain in the output either because (a) they have their own expert data (e.g., 2988 Georgian Dream, 3916 Alianza Grande) or (b) they function as individual parties despite bloc coding (e.g., 1527 Enhedslisten, 1439 German Minority). - -## Classification Decisions - -### Dual-progtype parties (both progtype=1 and progtype=8) - -These 15 parties have MARPOR entries under both individual (progtype=1/3) and bloc (progtype=8) codes. Each was individually reviewed. - -**Classified as individual parties (no action needed):** - -| PF ID | Name | Country | Evidence | -|---|---|---|---| -| 57 | SLD | PL | Dominant Polish left party; bloc coding reflects coalition leadership, not alliance status | -| 81 | CCa | ES | Canarian regionalist party; single party with local coalition leadership | -| 1056 | SC | LV | Latvian party; dual coding reflects different election formats | -| 1150 | SDE | EE | Estonian Social Democrats; individual party | -| 1396 | Samfylkingin | IS | Icelandic Social Democratic Alliance; merged into single party | -| 1439 | MN | PL | German Minority in Poland; single ethnic party coded as bloc | -| 1527 | Enhedslisten | DK | Red-Green Alliance; functions as single party since 1989 | -| 1691 | FiDeSz-KDNP | HU | FiDeSz dominant; KDNP (1412) has separate PF ID and data | -| 2172 | ENM | GE | United National Movement; single party with bloc-era coding | -| 2228 | BYuT | UA | Tymoshenko bloc; functions as single Ukrainian party | -| 2252 | Yabloko | RU | Russian liberal party; individual entity | - -**Classified as individual parties after research:** - -| PF ID | Name | Country | Decision | Evidence | -|---|---|---|---|---| -| 506 | VL-TB/LNNK | LV | Individual (merger party) | National Alliance formed 2010 by merger of VL and TB/LNNK. Post-merger, functions as single party. MARPOR data 2010-2022. TB/LNNK (1704) has separate pre-merger data (1998-2014). Not mapped as union because 1704 is already a union target with its own constituents; mapping would create a chain. | -| 1586 | sp.a-SPIRIT | BE | Already handled | Already mapped as constituent of sp.a (1680) in union_mapping.csv. 0 text, 0 expert data under this PF ID. | -| 7599 | Kahol Lavan | IL | Individual party | Short-lived centrist party (2019-2020). Has own expert data (CHES 2021, V-Party 2019). Unified entity, not a multi-party alliance. | -| 2988 | Georgian Dream | GE | Individual party | Despite progtype=8 coding, functions as a single party-movement. Has own expert data (GPS 2019, V-Party 2012/2016). | -| 3916 | Alianza Grande | CO | Individual party (catch-all PF ID) | PF ID covers multiple Colombian coalitions. Has own expert data (CHES 2020). No separate constituent expert data exists. | - -**Classified as alliance and mapped:** - -| PF ID | Name | Country | Decision | Evidence | -|---|---|---|---|---| -| 7912 | Joint List | IL | Alliance → mapped to Hadash (421), Balad (1663) | Arab party coalition (2015-2021). GPS explicitly names 4 constituents. Hadash and Balad have separate CHES 2022 data and their own text_data. | -| 3979 | Salvemos a México | MX | Alliance → mapped to PRI (1474), PVEM (446) | PRI-PVEM electoral coalition. Both constituents have extensive text and expert data. | - -## Audit Methodology - -The union-mapping audit checks every party in the output CSV: - -1. **Union mapping check**: Verifies no `manifesto_pf_id` from `union_mapping.csv` appears in output (hard fail). -2. **Constituent check**: Identifies parties that are `expert_pf_id` in the mapping (expected: these are individual constituents of unions). -3. **Expert data check**: Flags parties with no expert survey data (text-only entities). -4. **Name pattern check**: Scans PartyFacts names for alliance indicators (keywords: alliance, coalition, bloc, front, union, alianza, frente; characters: +, /, &). -5. **Classification**: Each party gets one of: `individual_party`, `flagged_for_review`, `error_union_in_output`. - -**Post-estimation verification** (`02_post_estimation.jl`): After extracting estimates, loads all `manifesto_pf_id` values from `union_mapping.csv` and checks none appear in the output `party_id` column. If any do, the script errors with a hard fail. diff --git a/src/julia/02_post_estimation.jl b/src/julia/02_post_estimation.jl index 892f056..7239dc0 100644 --- a/src/julia/02_post_estimation.jl +++ b/src/julia/02_post_estimation.jl @@ -918,7 +918,7 @@ end function main() println("="^60) - println("POST-ESTIMATION: 4D Latent Trait Model (V10)") + println("POST-ESTIMATION: Party-position model") println("="^60) println("Started: $(Dates.format(now(), "yyyy-mm-dd HH:MM:SS"))") diff --git a/src/julia/pipeline/02_data_loading.jl b/src/julia/pipeline/02_data_loading.jl index cc11deb..6c91025 100644 --- a/src/julia/pipeline/02_data_loading.jl +++ b/src/julia/pipeline/02_data_loading.jl @@ -95,7 +95,7 @@ const EXPERT_VAR_TO_DIM = Dict( ) function load_and_preprocess_4dim_data(start_year=1950; data_dir::String=".") - println("Loading 4D latent trait data files...") + println("Loading party-position data files...") println("Start year filter: $start_year") data_dir != "." && println("Data directory: $data_dir") @@ -274,4 +274,4 @@ end if abspath(PROGRAM_FILE) == @__FILE__ text_data, expert_dim, expert_lr, year0, u2c, c2u = load_and_preprocess_4dim_data() println("4D data loading test completed successfully") -end \ No newline at end of file +end diff --git a/src/julia/pipeline/04_model_execution.jl b/src/julia/pipeline/04_model_execution.jl index ed2c924..29d84f0 100644 --- a/src/julia/pipeline/04_model_execution.jl +++ b/src/julia/pipeline/04_model_execution.jl @@ -1,7 +1,7 @@ #!/usr/bin/env julia ############################################################################# ## 04_model_execution_4dim.jl -## Stan model compilation and execution for 4D latent trait model +## Stan model compilation and execution for the party-position model ## Based on v9 execution but adapted for four dimensions ############################################################################# @@ -601,7 +601,7 @@ function create_4dim_init_function(dat_4dim, J, P, R, T_year, N_ciy; model_versi # SOLUTION: Use explicit Vector{Vector} to guarantee correct JSON structure # V10: theta_init_raw has S rows (segments), not J rows (parties) base_init = Dict{String, Any}( - # 4D latent trait parameters - Vector of Vectors for correct JSON + # Four-trait legacy initialization branch - Vector of Vectors for correct JSON "theta_ncp" => [zeros(R) for _ in 1:4], # 4 rows of R elements "theta_init_raw" => [zeros(S) for _ in 1:4], # 4 rows of S elements (V10: segments) "sigma_theta_init" => ones(4), # SD per dimension diff --git a/src/julia/pipeline/05_results_processing.jl b/src/julia/pipeline/05_results_processing.jl index 20916d8..71ba6c6 100644 --- a/src/julia/pipeline/05_results_processing.jl +++ b/src/julia/pipeline/05_results_processing.jl @@ -2,14 +2,14 @@ ############################################################################# ## 05_results_processing.jl ## Extract and process 4D model results with diagnostics -## Adapted from old_project for latent traits only (no election effects) +## Extract and process model results without election effects ############################################################################# using StanSample, DataFrames, Statistics function extract_model_results_4dim(stanmodel) """ - Extract model results for 4D latent trait model + Extract model results for the party-position model Simplified version - no election effects (pure latent traits) """ println("Extracting 4D model results...") @@ -17,7 +17,7 @@ function extract_model_results_4dim(stanmodel) try println("Model completed successfully - extracting results") - # For 4D latent trait model, we save the full stanmodel object + # Save the full stanmodel object for downstream processing # Post-estimation will extract specific parameters later return ( diff --git a/src/julia/pipeline/06_save_model.jl b/src/julia/pipeline/06_save_model.jl index 3d52c05..f09c9ae 100644 --- a/src/julia/pipeline/06_save_model.jl +++ b/src/julia/pipeline/06_save_model.jl @@ -294,7 +294,7 @@ function generate_readme( open(filepath, "w") do f write(f, "=" ^ 78 * "\n") - write(f, "4D LATENT TRAIT MODEL - MODEL RUN RESULTS\n") + write(f, "PARTY-POSITION MODEL - MODEL RUN RESULTS\n") write(f, "=" ^ 78 * "\n\n") write(f, "Run ID: $run_id\n") diff --git a/src/r/00_data-management.R b/src/r/00_data-management.R deleted file mode 100644 index 1fc905d..0000000 --- a/src/r/00_data-management.R +++ /dev/null @@ -1,311 +0,0 @@ -# ============================================================ -# 00_data-management.R - Master Data Pipeline Orchestrator -# ============================================================ -# Coordinates all data processing sub-scripts and produces -# final output files for the 4D latent trait model. -# -# Sub-scripts (run conditionally based on intermediate file existence): -# 00a_process_manifesto.R -> manifesto_data.csv -# 00c_process_poldem.R -> poldem_data.csv -# 00d_process_expert.R -> expert_raw.csv, lr_data_raw.csv -# 00e_process_morgan.R -> morgan_data.csv, morgan_lr.csv -# -# Final outputs: -# text_data.csv - Combined manifesto + PolDem -# expert.csv - Expert survey data (CHES, V-Party, POPPA, GPS) -# lr_data.csv - General left-right anchoring data -# ============================================================ - -library(tidyverse) -library(countrycode) - -# Set working directory (works both in RStudio and command line) -if (interactive() && requireNamespace("rstudioapi", quietly = TRUE)) { - try(setwd(dirname(rstudioapi::getActiveDocumentContext()$path)), silent = TRUE) -} - -cat("============================================================\n") -cat("Data Management Pipeline\n") -cat("============================================================\n\n") - -# ============================================================ -# Configuration: Set to TRUE to force re-run of sub-scripts -# ============================================================ - -FORCE_RERUN_MANIFESTO <- FALSE -FORCE_RERUN_POLDEM <- FALSE -FORCE_RERUN_EXPERT <- FALSE -FORCE_RERUN_MORGAN <- FALSE - -# ============================================================ -# Step 1: Manifesto Data -# ============================================================ - -cat("Step 1: Manifesto data\n") -if (!file.exists("manifesto_data.csv") || !file.exists("election_data.csv") || FORCE_RERUN_MANIFESTO) { - cat(" Running 00a_process_manifesto.R...\n") - source("../src/r/00a_process_manifesto.R") -} else { - cat(" Loading cached manifesto_data.csv and election_data.csv...\n") -} -manifesto <- read_csv("manifesto_data.csv", show_col_types = FALSE) -election_data <- read_csv("election_data.csv", show_col_types = FALSE) -cat(sprintf(" Loaded manifesto: %d rows, %d parties\n", nrow(manifesto), n_distinct(manifesto$party))) -cat(sprintf(" Loaded election: %d rows, %d parties\n\n", nrow(election_data), n_distinct(election_data$party))) - -# ============================================================ -# Step 2: PolDem Media Data -# ============================================================ - -cat("Step 2: PolDem media data\n") -if (!file.exists("poldem_data.csv") || FORCE_RERUN_POLDEM) { - cat(" Running 00c_process_poldem.R...\n") - source("../src/r/00c_process_poldem.R") -} else { - cat(" Loading cached poldem_data.csv...\n") -} -poldem_data <- read_csv("poldem_data.csv", show_col_types = FALSE) -cat(sprintf(" Loaded: %d rows, %d parties\n\n", nrow(poldem_data), n_distinct(poldem_data$party))) - -# ============================================================ -# Step 4: Expert Survey Data -# ============================================================ - -cat("Step 3: Expert survey data\n") -if (!file.exists("expert_raw.csv") || !file.exists("lr_data_raw.csv") || FORCE_RERUN_EXPERT) { - cat(" Running 00d_process_expert.R...\n") - source("../src/r/00d_process_expert.R") -} else { - cat(" Loading cached expert_raw.csv and lr_data_raw.csv...\n") -} -expert_raw <- read_csv("expert_raw.csv", show_col_types = FALSE) -lr_data_raw <- read_csv("lr_data_raw.csv", show_col_types = FALSE) -cat(sprintf(" Expert: %d rows, LR: %d rows\n\n", nrow(expert_raw), nrow(lr_data_raw))) - -# ============================================================ -# Step 3b: Morgan (1976) Historical Expert Data -# ============================================================ - -cat("Step 3b: Morgan (1976) historical L-R data\n") - -# First run to generate morgan_data.csv if needed -if (!file.exists("morgan_data.csv") || FORCE_RERUN_MORGAN) { - cat(" Running 00e_process_morgan.R (initial processing)...\n") - source("../src/r/00e_process_morgan.R") -} - -# morgan_lr.csv depends on text_data.csv, so we need to check if it needs regeneration -# It will be generated/regenerated below after text_data is created - -# ============================================================ -# Step 4: Combine Text Data Sources -# ============================================================ - -cat("Step 4: Combining text data sources\n") -text_data <- bind_rows(manifesto, poldem_data) -cat(sprintf(" Combined text_data: %d rows\n", nrow(text_data))) - -# Save unfiltered text_data for reproducible mismatch diagnosis -write_csv(text_data, "text_data_unfiltered.csv") -cat(sprintf(" Saved unfiltered text_data: %d rows, %d parties\n", nrow(text_data), n_distinct(text_data$party))) - -# ============================================================ -# Step 4b: Party Renames (applied before filtering) -# ============================================================ -# Renames must happen BEFORE the relevance filter so that party IDs -# match across text_data and expert_raw when computing expert coverage. - -# Simple renames only (organizational continuity: same leadership/members) -simple_renames <- c( - `10` = 1816L, # DE: Greens -> Bündnis90/Grüne - `276` = 120L, # RO: FDSN/PDSR -> PSD (renamed 2001) - `8054` = 878L, # IT: PDS -> DS (renamed 1998) - `1696` = 813L, # IT: MSI -> AN (refounded 1995) - `553` = 1968L, # BE: Vlaams Blok -> Vlaams Belang (refounded 2004) - `8058` = 1626L # IT: Forza Italia (refounded 2013) -> Forza Italia (same party, Berlusconi) -) - -apply_simple_renames <- function(df) { - for (old_id in names(simple_renames)) { - df <- df %>% - mutate(party = ifelse(party == as.integer(old_id), simple_renames[[old_id]], party)) - } - df -} - -cat("\nStep 4b: Party renames\n") -text_data <- apply_simple_renames(text_data) -cat(sprintf(" Applied %d renames to text_data\n", length(simple_renames))) - -# ============================================================ -# Step 4c: Relevance Filter -# ============================================================ -# Design: R pipeline filters for RELEVANCE (is this party worth modeling?). -# Julia pipeline handles INTERPOLATION QUALITY (MAX_GAP=7 segment splitting, MIN_OBS=2). -# Expert survey coverage is a relevance signal: CHES only covers parties with >1% vote share. - -cat("\nStep 4c: Relevance filter\n") -parties_before <- n_distinct(text_data$party) - -# Compute expert coverage per party (with renames applied for consistent matching) -expert_year_counts <- bind_rows( - expert_raw %>% select(party, year), - lr_data_raw %>% select(party, year) -) %>% distinct() %>% - apply_simple_renames() %>% - distinct() %>% - count(party, name = "expert_years") - -expert_party_ids <- unique(expert_year_counts$party) -cat(sprintf(" Parties with expert data: %d\n", length(expert_party_ids))) - -# Three-tier relevance filter: -# Tier 1: 3+ text data years (always include, regardless of expert data) -# Tier 2: 2 text years + any expert data (major newer parties like M5S, ANO, LREM) -# Tier 3: 1 text year + 3+ expert survey years (parties with rich expert coverage) -text_data <- text_data %>% - group_by(country, party) %>% - mutate(n_years = n_distinct(year)) %>% - ungroup() %>% - left_join(expert_year_counts, by = "party") %>% - mutate(expert_years = replace_na(expert_years, 0L)) %>% - mutate( - tier = case_when( - n_years >= 3 ~ 1L, - n_years >= 2 & party %in% expert_party_ids ~ 2L, - n_years >= 1 & expert_years >= 3 ~ 3L, - TRUE ~ 0L - ) - ) %>% - filter(tier > 0) %>% - select(-n_years, -expert_years, -tier) - -parties_after <- n_distinct(text_data$party) -cat(sprintf(" Parties before filter: %d\n", parties_before)) -cat(sprintf(" Parties after filter: %d\n", parties_after)) -cat(sprintf(" Parties removed: %d\n\n", parties_before - parties_after)) - -# ============================================================ -# Step 5: Party Harmonization -# ============================================================ - -cat("Step 5: Party harmonization (union-aware)\n") - -# Load union mapping to identify constituent parties -union_map <- read_csv("union_mapping.csv", show_col_types = FALSE) - -# Build set of constituent parties whose union is in text_data -constituent_parties <- union_map %>% - filter(manifesto_pf_id %in% unique(text_data$party)) %>% - pull(expert_pf_id) - -cat(sprintf(" Union mappings loaded: %d rows covering %d unions\n", - nrow(union_map), n_distinct(union_map$manifesto_pf_id))) -cat(sprintf(" Constituent parties with unions in text_data: %d\n", - length(unique(constituent_parties)))) - -# Deduplicate union manifesto rows: where multiple CMP codes map to the same -# union PF ID with identical content, keep only one set per (party, year, var) -text_data_before_dedup <- nrow(text_data) -text_data <- text_data %>% - distinct(country, party, year, var, .keep_all = TRUE) -cat(sprintf(" Text data: %d unique parties after harmonization\n", n_distinct(text_data$party))) -cat(sprintf(" Text data: deduplicated %d -> %d rows\n", text_data_before_dedup, nrow(text_data))) - -# Filter expert data: keep parties in text_data OR constituent parties of unions in text_data -expert <- expert_raw %>% - apply_simple_renames() %>% - group_by(country, party, var, year) %>% - summarise( - val = mean(val, na.rm = TRUE), - val_int = first(val_int), - n_scale = first(n_scale), - n_experts = first(n_experts), - project = first(project), - type_low = first(type_low), - type_high = first(type_high), - .groups = "drop" - ) %>% - filter(party %in% unique(text_data$party) | party %in% constituent_parties) - -lr_data <- lr_data_raw %>% - apply_simple_renames() %>% - group_by(country, party, var, year) %>% - summarise( - val = mean(val, na.rm = TRUE), - val_int = first(val_int), - n_scale = first(n_scale), - n_experts = first(n_experts), - project = first(project), - .groups = "drop" - ) %>% - filter(party %in% unique(text_data$party) | party %in% constituent_parties) - -cat(sprintf(" Expert data: %d rows (filtered to text_data parties)\n", nrow(expert))) -cat(sprintf(" LR data (CHES/POPPA): %d rows (filtered to text_data parties)\n", nrow(lr_data))) - -# ============================================================ -# Step 5b: Integrate Morgan L-R Data -# ============================================================ - -cat("\nStep 5b: Morgan L-R data integration\n") - -# Generate morgan_lr.csv (requires text_data.csv to exist) -# We need to regenerate it if text_data changed or if forced -if (!file.exists("morgan_lr.csv") || FORCE_RERUN_MORGAN) { - cat(" Generating morgan_lr.csv...\n") - # Write text_data first so morgan script can use it - write_csv(text_data, "text_data.csv") - source("../src/r/00e_process_morgan.R") -} - -# Load and integrate Morgan L-R data -if (file.exists("morgan_lr.csv")) { - morgan_lr <- read_csv("morgan_lr.csv", show_col_types = FALSE) %>% - apply_simple_renames() %>% - filter(party %in% unique(text_data$party) | party %in% constituent_parties) - - cat(sprintf(" Morgan L-R: %d rows (filtered to text_data parties)\n", nrow(morgan_lr))) - cat(sprintf(" Morgan parties: %d\n", n_distinct(morgan_lr$party))) - cat(sprintf(" Morgan year range: %d-%d\n", min(morgan_lr$year), max(morgan_lr$year))) - - # Combine with existing lr_data - lr_data_before <- nrow(lr_data) - lr_data <- bind_rows(lr_data, morgan_lr) %>% - arrange(country, party, year, var) - - cat(sprintf(" Combined LR data: %d rows (+%d from Morgan)\n", - nrow(lr_data), nrow(lr_data) - lr_data_before)) -} else { - cat(" Warning: morgan_lr.csv not found, skipping Morgan integration\n") -} - -cat("\n") - -# ============================================================ -# Step 6: Write Final Outputs -# ============================================================ - -cat("Step 6: Writing final outputs\n") - -write_csv(text_data, "text_data.csv") -write_csv(expert, "expert.csv") -write_csv(lr_data, "lr_data.csv") - -cat("\n============================================================\n") -cat("Pipeline Complete!\n") -cat("============================================================\n\n") - -cat("Output files written:\n") -cat(sprintf(" text_data.csv: %d rows\n", nrow(text_data))) -cat(sprintf(" - Manifesto: %d rows\n", sum(grepl("_manifesto", text_data$var)))) -cat(sprintf(" - PolDem: %d rows\n", sum(grepl("_poldem", text_data$var)))) -cat(sprintf(" expert.csv: %d rows\n", nrow(expert))) -cat(sprintf(" lr_data.csv: %d rows\n", nrow(lr_data))) -cat(sprintf(" - CHES: %d rows\n", sum(lr_data$var == "lr_ches"))) -cat(sprintf(" - POPPA: %d rows\n", sum(lr_data$var == "lr_poppa"))) -cat(sprintf(" - Morgan: %d rows\n", sum(lr_data$var == "lr_morgan"))) - -cat("\nUnique parties in text_data:", n_distinct(text_data$party), "\n") -cat("Countries:", paste(sort(unique(text_data$country)), collapse = ", "), "\n") -cat("Year range:", min(text_data$year, na.rm = TRUE), "-", max(text_data$year, na.rm = TRUE), "\n") diff --git a/src/r/00a_process_manifesto.R b/src/r/00a_process_manifesto.R deleted file mode 100644 index f54aa37..0000000 --- a/src/r/00a_process_manifesto.R +++ /dev/null @@ -1,178 +0,0 @@ -# ============================================================ -# 00a_process_manifesto.R - Manifesto Project Data Processing -# ============================================================ -# Processes Manifesto Project data for the 4D latent trait model -# Input: $PARTY2D_RAW_DATA_DIR/manifesto/MPDataset_MPDS2025a.csv -# Output: manifesto_data.csv -# ============================================================ - -library(tidyverse) -library(countrycode) -library(purrr) - -# Set working directory (works both in RStudio and command line) -if (interactive() && requireNamespace("rstudioapi", quietly = TRUE)) { - try(setwd(dirname(rstudioapi::getActiveDocumentContext()$path)), silent = TRUE) -} - -cat("Processing Manifesto Project data...\n") - -raw_data_dir <- Sys.getenv( - "PARTY2D_RAW_DATA_DIR", - unset = file.path("..", "..", "_local", "raw") -) -manifesto_raw_path <- file.path(raw_data_dir, "manifesto", "MPDataset_MPDS2025a.csv") - -# ============================================================ -# PartyFacts Linkage -# ============================================================ - -partyfacts_raw <- read_csv('partyfacts-external-parties.csv', show_col_types = FALSE) -manifesto_link <- partyfacts_raw %>% - filter(dataset_key == "manifesto") %>% - transmute(id = dataset_party_id, - country = countrycode(country, origin = 'iso3c', destination = "iso2c"), - party = partyfacts_id, - party = ifelse(party == 622, 604, party)) - -# ============================================================ -# Load Manifesto Data -# ============================================================ - -manifesto_data <- read_csv(manifesto_raw_path, show_col_types = FALSE) - -# ============================================================ -# CMP Code Mapping to 4 Dimensions -# ============================================================ - -vars <- tribble( - ~type, ~subtype, ~per_var, ~stance, ~label, - # pro_market - "pro_market", "Market Regulation", "per401", "Positive", "Free Market Economy", - "pro_market", "Economic Liberalization","per402", "Positive", "Incentives: Positive", - "pro_market", "Market Regulation", "per407", "Positive", "Protectionism: Negative", - "pro_market", "Economic Liberalization","per414", "Positive", "Economic Orthodoxy", - "pro_market", "Economic Liberalization","per505", "Positive", "Welfare State Limitation", - "pro_market", "Economic Liberalization","per507", "Positive", "Education Limitation", - "pro_market", "Economic Liberalization","per702", "Positive", "Labour Groups: Negative", - "pro_market", "Market Regulation", "per406", "Negative", "Protectionism: Positive", - "pro_market", "Market Regulation", "per412", "Negative", "Controlled Economy", - "pro_market", "Economic Liberalization","per504", "Negative", "Welfare State Expansion", - # pro_welfare - "pro_welfare", "Economic Intervention", "per403", "Positive", "Market Regulation", - "pro_welfare", "Economic Intervention", "per404", "Positive", "Economic Planning", - "pro_welfare", "Economic Intervention", "per412", "Positive", "Controlled Economy", - "pro_welfare", "Economic Intervention", "per413", "Positive", "Nationalisation", - "pro_welfare", "Social Services", "per504", "Positive", "Welfare State Expansion", - "pro_welfare", "Social Services", "per506", "Positive", "Education Expansion", - "pro_welfare", "Economic Intervention", "per701", "Positive", "Labour Groups: Positive", - "pro_welfare", "Economic Intervention", "per401", "Negative", "Free Market Economy", - "pro_welfare", "Social Services", "per505", "Negative", "Welfare State Limitation", - # cosmopolitan - "cosmopolitan", "Internationalism", "per107", "Positive", "Internationalism: Positive", - "cosmopolitan", "Internationalism", "per108", "Positive", "European Community/Union: Positive", - "cosmopolitan", "Multiculturalism", "per607", "Positive", "Multiculturalism: Positive", - "cosmopolitan", "Multiculturalism", "per201", "Positive", "Freedom and Human Rights", - "cosmopolitan", "Multiculturalism", "per604", "Positive", "traditional Morality: Negative", - "cosmopolitan", "Internationalism", "per109", "Negative", "Internationalism: Negative", - "cosmopolitan", "Multiculturalism", "per601", "Negative", "National Way of Life: Positive", - # traditional - "traditional", "National Identity", "per109", "Positive", "Internationalism: Negative", - "traditional", "Conservative Morality", "per110", "Positive", "European Community/Union: Negative", - "traditional", "National Identity", "per601", "Positive", "National Way of Life: Positive", - "traditional", "Conservative Morality", "per603", "Positive", "traditional Morality: Positive", - "traditional", "Conservative Morality", "per608", "Positive", "Multiculturalism: Negative", - "traditional", "Conservative Morality", "per605", "Positive", "Law and Order: Positive", - "traditional", "National Identity", "per107", "Negative", "Internationalism: Positive", - "traditional", "Conservative Morality", "per607", "Negative", "Multiculturalism: Positive" -) - -# ============================================================ -# Process Manifesto Data -# ============================================================ - -manifesto <- vars %>% - pmap_dfr(~ manifesto_data %>% - transmute(country = countrycode(countryname, origin = 'country.name', destination = 'iso2c'), - year = as.numeric(format(as.Date(edate, format = "%d/%m/%Y"), "%Y")), - id = as.character(party), - count = round(.data[[..3]]), - var = ..3, - label = ..5, - type = ..1, - subtype = ..2, - stance = ..4, - project = 'Manifesto Project') %>% - left_join(manifesto_link, by = c("id", "country")) %>% - select(-id)) %>% - group_by(party, country, year, subtype) %>% - summarise( - positive = sum(count[stance == "Positive"], na.rm = TRUE), - sample = sum(count, na.rm = TRUE), - type = first(type), - project = first(project), - .groups = "drop" - ) %>% - na.omit() %>% - rename(var = subtype) %>% - # Convert to bipolar bridge structure (type_high/type_low) - mutate( - type_high = case_when( - type == "pro_welfare" ~ "pro_welfare", - type == "pro_market" ~ "pro_market", - type == "cosmopolitan" ~ "cosmopolitan", - type == "traditional" ~ "traditional" - ), - type_low = case_when( - type %in% c("pro_welfare", "pro_market") ~ ifelse(type == "pro_welfare", "pro_market", "pro_welfare"), - type %in% c("cosmopolitan", "traditional") ~ ifelse(type == "cosmopolitan", "traditional", "cosmopolitan") - ) - ) %>% - select(-type) %>% - # Add _manifesto suffix to variable names - mutate(var = paste0(tolower(gsub(" ", "_", var)), "_manifesto")) - -# ============================================================ -# NOTE: Temporal continuity filter moved to 00_data-management.R -# This allows exempting parties that appear in parliamentary data -# (parties in parliament are by definition not fringe parties) -# ============================================================ - -cat("Skipping temporal filter (applied in 00_data-management.R after combining with parl data)\n") -cat(sprintf(" Parties: %d\n", n_distinct(manifesto$party))) - -# ============================================================ -# Write Output -# ============================================================ - -write_csv(manifesto, "manifesto_data.csv") -cat(sprintf("Output: manifesto_data.csv (%d rows, %d parties)\n", - nrow(manifesto), n_distinct(manifesto$party))) - -# ============================================================ -# Election Data Extraction (vote shares) -# ============================================================ - -cat("\nExtracting election data (pervote)...\n") - -election_data <- manifesto_data %>% - transmute( - country = countrycode(countryname, origin = 'country.name', destination = 'iso2c'), - year = as.numeric(format(as.Date(edate, format = "%d/%m/%Y"), "%Y")), - id = as.character(party), - pervote = pervote - ) %>% - left_join(manifesto_link, by = c("id", "country")) %>% - select(-id) %>% - filter(!is.na(party), !is.na(pervote)) %>% - # Keep one row per (party, country, year) — take max pervote if duplicates - group_by(party, country, year) %>% - summarise(pervote = max(pervote, na.rm = TRUE), .groups = "drop") %>% - arrange(country, party, year) - -write_csv(election_data, "election_data.csv") -cat(sprintf("Output: election_data.csv (%d rows, %d parties)\n", - nrow(election_data), n_distinct(election_data$party))) - -# Export manifesto_link for use by other scripts -# (poldem also needs it for CMP linkage) diff --git a/src/r/00c_process_poldem.R b/src/r/00c_process_poldem.R deleted file mode 100644 index 8909876..0000000 --- a/src/r/00c_process_poldem.R +++ /dev/null @@ -1,161 +0,0 @@ -# ============================================================ -# 00c_process_poldem.R - PolDem Media Data Processing -# ============================================================ -# Processes PolDem (Political Deliberation in the Media) data -# for the 4D latent trait model -# -# Input: $PARTY2D_RAW_DATA_DIR/poldem/poldem-election_all.csv (sentence-level) -# Output: poldem_data.csv (party-year-var aggregates) -# ============================================================ - -library(tidyverse) -library(countrycode) - -# Set working directory (works both in RStudio and command line) -if (interactive() && requireNamespace("rstudioapi", quietly = TRUE)) { - try(setwd(dirname(rstudioapi::getActiveDocumentContext()$path)), silent = TRUE) -} - -cat("Processing PolDem media data...\n") - -raw_data_dir <- Sys.getenv( - "PARTY2D_RAW_DATA_DIR", - unset = file.path("..", "..", "_local", "raw") -) -poldem_raw_path <- file.path(raw_data_dir, "poldem", "poldem-election_all.csv") - -# ============================================================ -# PartyFacts Linkage (via CMP party IDs) -# ============================================================ - -partyfacts_raw <- read_csv('partyfacts-external-parties.csv', show_col_types = FALSE) -manifesto_link <- partyfacts_raw %>% - filter(dataset_key == "manifesto") %>% - transmute(cmp = as.numeric(dataset_party_id), # Convert to numeric for join - country_pf = countrycode(country, origin = 'iso3c', destination = "iso2c"), - party = partyfacts_id, - party = ifelse(party == 622, 604, party)) - -# ============================================================ -# Issue Category Mapping to 4 Dimensions -# ============================================================ -# For positive direction: type_high is the active trait -# For negative direction: we flip (same data, just contributes to the opposite trait) - -poldem_mapping <- tribble( - ~issue_cat, ~dimension, ~type_high, ~type_low, - # Economic dimension - "ecolib", "economic", "pro_market", "pro_welfare", # Economic liberalization - "welfare", "economic", "pro_welfare", "pro_market", # Welfare state - # Final exclusion: the PolDem economic-reform category is intentionally - # omitted because item-response diagnostics showed that it did not load - # substantively onto the economic latent trait. - # Cultural dimension - "immig", "cultural", "cosmopolitan", "traditional", # Immigration (pro = cosmopolitan) - "cultlib", "cultural", "cosmopolitan", "traditional", # Cultural liberalism - "nationalism", "cultural", "traditional", "cosmopolitan", # Nationalism (pro = traditional) - "europe", "cultural", "cosmopolitan", "traditional", # EU integration (pro = cosmopolitan) - "euro", "cultural", "cosmopolitan", "traditional", # Euro currency (pro = cosmopolitan) - "defense", "cultural", "traditional", "cosmopolitan", # Defense (pro = traditional) - "security", "cultural", "traditional", "cosmopolitan" # Security/law-order (pro = traditional) -) - -cat(sprintf(" Using %d issue categories\n", nrow(poldem_mapping))) - -# ============================================================ -# Load and Clean PolDem Data -# ============================================================ - -poldem_raw <- read_csv(poldem_raw_path, show_col_types = FALSE) -cat(sprintf(" Raw PolDem data: %d rows\n", nrow(poldem_raw))) - -poldem <- poldem_raw %>% - # Fix country codes - mutate(country = case_when( - iso2code == "AU" ~ "AT", # Austria (PolDem uses AU instead of AT) - iso2code == "UK" ~ "GB", # United Kingdom - TRUE ~ iso2code - )) %>% - # Extract year from article date (format: YYYY-MM-DD) - mutate(year = suppressWarnings(as.numeric(substr(date_art, 1, 4)))) %>% - # Filter to valid issue categories only - filter(issue_cat %in% poldem_mapping$issue_cat) %>% - # Convert direction to numeric and filter out neutral/NA - mutate(direction = as.numeric(direction)) %>% - filter(!is.na(direction) & direction != 0) %>% - # Remove rows with invalid years - filter(!is.na(year)) - -cat(sprintf(" After filtering: %d rows (valid issues, non-neutral)\n", nrow(poldem))) - -# ============================================================ -# Link to PartyFacts via CMP codes -# ============================================================ - -poldem <- poldem %>% - mutate(cmp = as.numeric(cmp)) %>% - left_join(manifesto_link, by = "cmp") %>% - filter(!is.na(party)) - -# Report linkage -n_linked <- nrow(poldem) -n_unlinked <- nrow(poldem_raw %>% - filter(issue_cat %in% poldem_mapping$issue_cat) %>% - mutate(direction = as.numeric(direction)) %>% - filter(!is.na(direction) & direction != 0)) - n_linked - -cat(sprintf(" Linked to PartyFacts: %d rows\n", n_linked)) -if (n_unlinked > 0) { - cat(sprintf(" Warning: %d rows could not be linked (missing CMP mapping)\n", n_unlinked)) -} - -# ============================================================ -# Aggregate to Party-Year-Issue Level -# Using round(sum()) for weak direction values (0.5, -0.5) -# ============================================================ - -poldem_agg <- poldem %>% - left_join(poldem_mapping, by = "issue_cat") %>% - group_by(party, country, year, issue_cat, type_high, type_low) %>% - summarise( - # Sum positive directions (0.5 and 1), then round - positive = round(sum(direction[direction > 0])), - # Sum absolute directions for sample (all non-neutral), then round - sample = round(sum(abs(direction))), - n_obs = n(), - .groups = "drop" - ) %>% - # Minimum 3 observations per group - filter(n_obs >= 3) %>% - select(-n_obs) - -cat(sprintf(" After aggregation: %d party-year-issue observations\n", nrow(poldem_agg))) - -# ============================================================ -# Format Output (matching manifesto structure) -# ============================================================ - -poldem_data <- poldem_agg %>% - mutate( - var = paste0(issue_cat, "_poldem"), - project = "PolDem" - ) %>% - select(party, country, year, var, positive, sample, type_high, type_low, project) - -# ============================================================ -# Write Output -# ============================================================ - -write_csv(poldem_data, "poldem_data.csv") - -cat(sprintf("\nOutput: poldem_data.csv\n")) -cat(sprintf(" Total rows: %d\n", nrow(poldem_data))) -cat(sprintf(" Unique parties: %d\n", n_distinct(poldem_data$party))) -cat(sprintf(" Countries: %s\n", paste(sort(unique(poldem_data$country)), collapse = ", "))) -cat(sprintf(" Year range: %d-%d\n", min(poldem_data$year, na.rm = TRUE), max(poldem_data$year, na.rm = TRUE))) -cat("\n Rows by issue category:\n") -poldem_data %>% - group_by(var) %>% - summarise(n = n(), .groups = "drop") %>% - arrange(desc(n)) %>% - print() diff --git a/src/r/00d_process_expert.R b/src/r/00d_process_expert.R deleted file mode 100644 index 7771269..0000000 --- a/src/r/00d_process_expert.R +++ /dev/null @@ -1,580 +0,0 @@ -# ============================================================ -# 00d_process_expert.R - Expert Survey Data Processing -# ============================================================ -# Processes expert survey data from multiple sources: -# - Chapel Hill Expert Survey (CHES) -# - V-Party Dataset -# - POPPA -# - GPS (Norris) -# -# Outputs: expert_raw.csv, lr_data_raw.csv -# -# V5 changes: -# - val_int (integer rounded to nearest scale point) and n_scale columns -# - n_experts column preserved (not dropped) -# - V-Party cultural expansion: 5 native items replace GPS ep_v6_lib_cons -# - V-Party economic expansion: v2pawelf added -# - Reverse-coding for V-Party cultural + welfare items -# ============================================================ - -library(tidyverse) -library(countrycode) -library(haven) -library(foreign) - -# Set working directory (works both in RStudio and command line) -if (interactive() && requireNamespace("rstudioapi", quietly = TRUE)) { - try(setwd(dirname(rstudioapi::getActiveDocumentContext()$path)), silent = TRUE) -} - -cat("Processing expert survey data...\n") - -# ============================================================ -# PartyFacts Linkage for CHES -# ============================================================ - -partyfacts_raw <- read_csv('partyfacts-external-parties.csv', show_col_types = FALSE) -ches_link <- partyfacts_raw %>% - filter(dataset_key == "ches") %>% - transmute(id = dataset_party_id, - country = countrycode(country, origin = 'iso3c', destination = "iso2c"), - party = partyfacts_id) - -# ============================================================ -# Expert Count Tables (from individual response files) -# ============================================================ - -cat(" Loading expert count tables from individual response files...\n") - -# CHES 2024: dual lookup (party_id primary, country+name fallback for ID mismatches) -ches24_exp_raw <- read_csv('~/data/ches/CHES_2024_expert_level.csv', show_col_types = FALSE) -ches24_exp_by_id <- ches24_exp_raw %>% - group_by(party_id) %>% - summarise(n_experts_id = as.integer(n_distinct(id)), .groups = "drop") -ches24_exp_by_name <- ches24_exp_raw %>% - mutate(country_iso2 = countrycode(cname, origin = "country.name", destination = "iso2c")) %>% - group_by(country_iso2, party_name) %>% - summarise(n_experts_name = as.integer(n_distinct(id)), .groups = "drop") - -ches_ca_expert_counts <- read_csv('~/data/ches/CHES_CA2023_expert_level.csv', show_col_types = FALSE) %>% - group_by(party_id) %>% - summarise(n_experts = as.integer(n_distinct(expert)), .groups = "drop") - -ches_la_expert_counts <- read_csv('~/data/ches/CHES_LA2020_expert_level.csv', show_col_types = FALSE) %>% - group_by(party_id) %>% - summarise(n_experts = as.integer(n_distinct(expert_id)), .groups = "drop") - -ches_il_expert_counts <- read_csv('~/data/ches/CHES_IL_expert_level.csv', show_col_types = FALSE) %>% - group_by(party_id, year) %>% - summarise(n_experts = as.integer(n_distinct(id)), .groups = "drop") - -# ============================================================ -# Chapel Hill Expert Survey (CHES) - 1999-2019 -# ============================================================ - -cat(" Processing CHES 1999-2019...\n") - -ches <- read_csv('~/data/ches/1999-2019_CHES_dataset_means(v3).csv', show_col_types = FALSE) %>% - rename(country_id = country) %>% - left_join(readRDS('~/data/ches/link.rds'), by = "country_id") %>% - transmute(country = countrycode(country, origin = 'country.name', destination = 'iso2c'), - vote = vote, - year = year, - id = as.character(party_id), - project = 'CHES', - n_experts = as.integer(expert), - lrecon_ches = lrecon/10, - galtan_ches = galtan/10) %>% - pivot_longer(cols = lrecon_ches:galtan_ches, names_to = 'var', values_to = 'val') %>% - mutate(n_scale = 10L) %>% - left_join(ches_link, by = c("id", "country")) %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) %>% - mutate(type_low = ifelse(var == "lrecon_ches", "pro_welfare", "cosmopolitan"), - type_high = ifelse(var == "lrecon_ches", "pro_market", "traditional")) - -# ============================================================ -# CHES 2024 Update -# ============================================================ - -cat(" Processing CHES 2024...\n") - -# Country code lookup for CHES 2024 format -country_lookup <- c( - "be" = "BE", "dk" = "DK", "ge" = "DE", "gr" = "GR", "esp" = "ES", - "fr" = "FR", "irl" = "IE", "it" = "IT", "nl" = "NL", "uk" = "GB", - "por" = "PT", "aus" = "AT", "fin" = "FI", "sv" = "SE", "bul" = "BG", - "cz" = "CZ", "est" = "EE", "hun" = "HU", "lat" = "LV", "lith" = "LT", - "pol" = "PL", "rom" = "RO", "slo" = "SK", "sle" = "SI", "cro" = "HR", - "tur" = "TR", "nor" = "NO", "swi" = "CH", "mal" = "MT", "cyp" = "CY", - "ice" = "IS" -) - -convert_country_codes <- function(codes) { - result <- country_lookup[codes] - result[is.na(result)] <- codes[is.na(result)] - return(unname(result)) -} - -ches24 <- read_csv('~/data/ches/CHES_2024_final_v2.csv', show_col_types = FALSE) %>% - mutate(country_iso2 = convert_country_codes(country)) %>% - left_join(ches24_exp_by_id, by = "party_id") %>% - left_join(ches24_exp_by_name, by = c("country_iso2", "party" = "party_name")) %>% - transmute(country = country_iso2, - vote = vote, - year = 2024, - id = as.character(party_id), - project = 'CHES', - n_experts = coalesce(n_experts_id, n_experts_name), - lrecon_ches = lrecon/10, - galtan_ches = galtan/10) %>% - pivot_longer(cols = lrecon_ches:galtan_ches, names_to = 'var', values_to = 'val') %>% - mutate(n_scale = 10L) %>% - left_join(ches_link, by = c("id", "country")) %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) %>% - mutate(type_low = ifelse(var == "lrecon_ches", "pro_welfare", "cosmopolitan"), - type_high = ifelse(var == "lrecon_ches", "pro_market", "traditional")) - -ches <- bind_rows(ches, ches24) - -# ============================================================ -# CHES Canada 2023 -# ============================================================ - -cat(" Processing CHES Canada 2023...\n") - -ches_ca <- read_csv('~/data/ches/CHES_CA2023.csv', show_col_types = FALSE) %>% - filter(!is.na(partyfacts_id)) %>% - left_join(ches_ca_expert_counts, by = "party_id") %>% - transmute(country = "CA", - year = 2023, - party = partyfacts_id, - project = 'CHES', - n_experts = n_experts, - lrecon_ches = lrecon/10, - galtan_ches = galtan/10) %>% - pivot_longer(cols = lrecon_ches:galtan_ches, names_to = 'var', values_to = 'val') %>% - mutate(n_scale = 10L) %>% - filter(!is.na(val), !is.na(party)) %>% - mutate(type_low = ifelse(var == "lrecon_ches", "pro_welfare", "cosmopolitan"), - type_high = ifelse(var == "lrecon_ches", "pro_market", "traditional")) - -ches <- bind_rows(ches, ches_ca) -cat(sprintf(" CHES Canada: %d observations\n", nrow(ches_ca))) - -# ============================================================ -# CHES Latin America 2020 -# ============================================================ - -cat(" Processing CHES Latin America 2020...\n") - -ches_la_link <- read_csv('~/data/ches/ches_la_link.csv', show_col_types = FALSE) %>% - transmute(id = as.character(ches_party_id), - party = partyfacts_id) - -ches_la <- read_csv('~/data/ches/ches_la_2020_aggregate_level_v01.csv', show_col_types = FALSE) %>% - left_join(ches_la_expert_counts, by = "party_id") %>% - transmute(country = country_abb, - year = 2020, - id = as.character(party_id), - project = 'CHES', - n_experts = n_experts, - lrecon_ches = lrecon/10, - galtan_ches = galtan/10) %>% - pivot_longer(cols = lrecon_ches:galtan_ches, names_to = 'var', values_to = 'val') %>% - mutate(n_scale = 10L) %>% - left_join(ches_la_link, by = "id") %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) %>% - mutate(type_low = ifelse(var == "lrecon_ches", "pro_welfare", "cosmopolitan"), - type_high = ifelse(var == "lrecon_ches", "pro_market", "traditional")) - -ches <- bind_rows(ches, ches_la) -cat(sprintf(" CHES Latin America: %d observations\n", nrow(ches_la))) - -# ============================================================ -# CHES Israel 2021-2022 -# ============================================================ - -cat(" Processing CHES Israel 2021-2022...\n") - -ches_il_link <- read_csv('~/data/ches/ches_israel_link.csv', show_col_types = FALSE) %>% - transmute(id = as.character(ches_party_id), - party = partyfacts_id) - -ches_il <- read_csv('~/data/ches/CHES_ISRAEL_means_2021_2022.csv', show_col_types = FALSE) %>% - left_join(ches_il_expert_counts, by = c("party_id", "year")) %>% - transmute(country = "IL", - year = year, - id = as.character(party_id), - project = 'CHES', - n_experts = n_experts, - lrecon_ches = lrecon/10, - galtan_ches = galtan/10) %>% - pivot_longer(cols = lrecon_ches:galtan_ches, names_to = 'var', values_to = 'val') %>% - mutate(n_scale = 10L) %>% - left_join(ches_il_link, by = "id") %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) %>% - mutate(type_low = ifelse(var == "lrecon_ches", "pro_welfare", "cosmopolitan"), - type_high = ifelse(var == "lrecon_ches", "pro_market", "traditional")) - -ches <- bind_rows(ches, ches_il) -cat(sprintf(" CHES Israel: %d observations\n", nrow(ches_il))) - -cat(sprintf(" CHES total: %d observations\n", nrow(ches))) - -# ============================================================ -# CHES General Left-Right (for anchoring) -# ============================================================ - -cat(" Processing CHES LR anchoring data...\n") - -ches_lr <- read_csv('~/data/ches/1999-2019_CHES_dataset_means(v3).csv', show_col_types = FALSE) %>% - rename(country_id = country) %>% - left_join(readRDS('~/data/ches/link.rds'), by = "country_id") %>% - transmute(country = countrycode(country, origin = 'country.name', destination = 'iso2c'), - vote = vote, - year = year, - id = as.character(party_id), - project = 'CHES', - n_experts = as.integer(expert), - val = lrgen/10, - var = 'lr_ches', - n_scale = 10L) %>% - left_join(ches_link, by = c("id", "country")) %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) - -ches24_lr <- read_csv('~/data/ches/CHES_2024_final_v2.csv', show_col_types = FALSE) %>% - mutate(country_iso2 = convert_country_codes(country)) %>% - left_join(ches24_exp_by_id, by = "party_id") %>% - left_join(ches24_exp_by_name, by = c("country_iso2", "party" = "party_name")) %>% - transmute(country = country_iso2, - vote = vote, - year = 2024, - id = as.character(party_id), - project = 'CHES', - n_experts = coalesce(n_experts_id, n_experts_name), - val = lrgen/10, - var = 'lr_ches', - n_scale = 10L) %>% - left_join(ches_link, by = c("id", "country")) %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) - -# CHES Canada LR -ches_ca_lr <- read_csv('~/data/ches/CHES_CA2023.csv', show_col_types = FALSE) %>% - filter(!is.na(partyfacts_id)) %>% - left_join(ches_ca_expert_counts, by = "party_id") %>% - transmute(country = "CA", - year = 2023, - party = partyfacts_id, - project = 'CHES', - n_experts = n_experts, - val = lrgen/10, - var = 'lr_ches', - n_scale = 10L) %>% - filter(!is.na(val), !is.na(party)) - -# CHES Latin America LR -ches_la_lr <- read_csv('~/data/ches/ches_la_2020_aggregate_level_v01.csv', show_col_types = FALSE) %>% - left_join(ches_la_expert_counts, by = "party_id") %>% - transmute(country = country_abb, - year = 2020, - id = as.character(party_id), - project = 'CHES', - n_experts = n_experts, - val = lrgen/10, - var = 'lr_ches', - n_scale = 10L) %>% - left_join(ches_la_link, by = "id") %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) - -# CHES Israel LR -ches_il_lr <- read_csv('~/data/ches/CHES_ISRAEL_means_2021_2022.csv', show_col_types = FALSE) %>% - left_join(ches_il_expert_counts, by = c("party_id", "year")) %>% - transmute(country = "IL", - year = year, - id = as.character(party_id), - project = 'CHES', - n_experts = n_experts, - val = lrgen/10, - var = 'lr_ches', - n_scale = 10L) %>% - left_join(ches_il_link, by = "id") %>% - filter(!is.na(val), !is.na(party), !is.na(country)) %>% - select(-id) - -ches_lr <- bind_rows(ches_lr, ches24_lr, ches_ca_lr, ches_la_lr, ches_il_lr) - -# ============================================================ -# V-Party Dataset (V5: expanded to 7 variables) -# ============================================================ - -cat(" Processing V-Party...\n") - -vparty_raw <- readRDS('~/data/v-party/V-Dem-CPD-Party-V2.rds') - -# Economic 1: v2pariglef_osp (0-6 scale, higher = more right, NO reverse) -vparty_econ1 <- vparty_raw %>% - transmute( - country = countrycode(country_name, origin = "country.name", destination = "iso2c"), - year = year, - party = pf_party_id, - project = "V-Party", - n_experts = as.integer(v2pariglef_nr), - val = v2pariglef_osp / 6, - val_int = as.integer(round(v2pariglef_osp)), - n_scale = 6L, - var = "lrecon_vparty", - type_low = "pro_welfare", - type_high = "pro_market" - ) %>% - na.omit() - -# Economic 2 (NEW): v2pawelf_osp (0-5 scale, higher = more welfare = LEFT, REVERSE) -vparty_econ2 <- vparty_raw %>% - transmute( - country = countrycode(country_name, origin = "country.name", destination = "iso2c"), - year = year, - party = pf_party_id, - project = "V-Party", - n_experts = as.integer(v2pawelf_nr), - val = 1 - v2pawelf_osp / 5, - val_int = 5L - as.integer(round(v2pawelf_osp)), - n_scale = 5L, - var = "welf_vparty", - type_low = "pro_welfare", - type_high = "pro_market" - ) %>% - na.omit() - -# Cultural 1 (NEW): v2paimmig_osp (0-4 scale, higher = more pro-immigration = GAL, REVERSE) -vparty_cult1 <- vparty_raw %>% - transmute( - country = countrycode(country_name, origin = "country.name", destination = "iso2c"), - year = year, - party = pf_party_id, - project = "V-Party", - n_experts = as.integer(v2paimmig_nr), - val = 1 - v2paimmig_osp / 4, - val_int = 4L - as.integer(round(v2paimmig_osp)), - n_scale = 4L, - var = "immig_vparty", - type_low = "cosmopolitan", - type_high = "traditional" - ) %>% - na.omit() - -# Cultural 2 (NEW): v2palgbt_osp (0-4 scale, higher = more pro-LGBT = GAL, REVERSE) -vparty_cult2 <- vparty_raw %>% - transmute( - country = countrycode(country_name, origin = "country.name", destination = "iso2c"), - year = year, - party = pf_party_id, - project = "V-Party", - n_experts = as.integer(v2palgbt_nr), - val = 1 - v2palgbt_osp / 4, - val_int = 4L - as.integer(round(v2palgbt_osp)), - n_scale = 4L, - var = "lgbt_vparty", - type_low = "cosmopolitan", - type_high = "traditional" - ) %>% - na.omit() - -# Cultural 3 (NEW): v2paculsup_osp (0-4 scale, higher = less cultural superiority = GAL, REVERSE) -vparty_cult3 <- vparty_raw %>% - transmute( - country = countrycode(country_name, origin = "country.name", destination = "iso2c"), - year = year, - party = pf_party_id, - project = "V-Party", - n_experts = as.integer(v2paculsup_nr), - val = 1 - v2paculsup_osp / 4, - val_int = 4L - as.integer(round(v2paculsup_osp)), - n_scale = 4L, - var = "culsup_vparty", - type_low = "cosmopolitan", - type_high = "traditional" - ) %>% - na.omit() - -# Cultural 4 (NEW): v2parelig_osp (0-4 scale, higher = less religious = GAL, REVERSE) -vparty_cult4 <- vparty_raw %>% - transmute( - country = countrycode(country_name, origin = "country.name", destination = "iso2c"), - year = year, - party = pf_party_id, - project = "V-Party", - n_experts = as.integer(v2parelig_nr), - val = 1 - v2parelig_osp / 4, - val_int = 4L - as.integer(round(v2parelig_osp)), - n_scale = 4L, - var = "relig_vparty", - type_low = "cosmopolitan", - type_high = "traditional" - ) %>% - na.omit() - -# Cultural 5 (NEW): v2pagender_osp (0-4 scale, higher = more pro-gender equality = GAL, REVERSE) -vparty_cult5 <- vparty_raw %>% - transmute( - country = countrycode(country_name, origin = "country.name", destination = "iso2c"), - year = year, - party = pf_party_id, - project = "V-Party", - n_experts = as.integer(v2pagender_nr), - val = 1 - v2pagender_osp / 4, - val_int = 4L - as.integer(round(v2pagender_osp)), - n_scale = 4L, - var = "gender_vparty", - type_low = "cosmopolitan", - type_high = "traditional" - ) %>% - na.omit() - -vparty <- bind_rows(vparty_econ1, vparty_econ2, - vparty_cult1, vparty_cult2, vparty_cult3, - vparty_cult4, vparty_cult5) - -cat(sprintf(" V-Party: %d observations (7 variables)\n", nrow(vparty))) -cat(sprintf(" lrecon: %d, welf: %d\n", nrow(vparty_econ1), nrow(vparty_econ2))) -cat(sprintf(" immig: %d, lgbt: %d, culsup: %d, relig: %d, gender: %d\n", - nrow(vparty_cult1), nrow(vparty_cult2), nrow(vparty_cult3), - nrow(vparty_cult4), nrow(vparty_cult5))) - -# ============================================================ -# POPPA Dataset -# ============================================================ - -cat(" Processing POPPA...\n") - -poppa <- readRDS('~/data/POPPA/poppa_integrated_v2.rds') %>% - transmute(country = countrycode(country_short, origin = "iso3c", destination = "iso2c"), - party = partyfacts_id, - val = lrecon/10, - var = "lrecon_poppa", - type_low = "pro_welfare", - type_high = "pro_market", - n_experts = as.integer(n_experts), - n_scale = 10L, - year = as.numeric(sub(".*-\\s*(\\d+)", "\\1", wave)), - project = "POPPA") %>% - na.omit() - -cat(sprintf(" POPPA: %d observations\n", nrow(poppa))) - -# POPPA General LR -poppa_lr <- readRDS('~/data/POPPA/poppa_integrated_v2.rds') %>% - transmute(country = countrycode(country_short, origin = "iso3c", destination = "iso2c"), - party = partyfacts_id, - val = lroverall/10, - var = "lr_poppa", - n_experts = as.integer(n_experts), - n_scale = 10L, - year = as.numeric(sub(".*-\\s*(\\d+)", "\\1", wave)), - project = "POPPA") %>% - na.omit() - -# ============================================================ -# GPS (Norris) Survey -# ============================================================ - -cat(" Processing GPS...\n") - -gps <- read.delim("~/data/GPS_norris/Global Party Survey by Party SPSS V2_1_Apr_2020-2.tab") %>% - transmute(n_experts = as.integer(Experts), - lrecon_gps = as.numeric(V4_Scale)/10, - libcon_gps = as.numeric(V6_Scale)/10, - party = ID_PartyFacts, - country = countrycode(ifelse(ISO == "MAC", "MKD", ISO), origin = "iso3c", destination = "iso2c"), - year = 2019, - n_scale = 10L, - project = "GPS") %>% - pivot_longer(cols = lrecon_gps:libcon_gps, names_to = 'var', values_to = 'val') %>% - mutate(type_low = ifelse(var == "lrecon_gps", "pro_welfare", "cosmopolitan"), - type_high = ifelse(var == "lrecon_gps", "pro_market", "traditional")) %>% - na.omit() - -cat(sprintf(" GPS: %d observations\n", nrow(gps))) - -# ============================================================ -# Combine Expert Data -# ============================================================ - -cat(" Combining expert surveys...\n") - -expert_raw <- select(ches, -vote) %>% - bind_rows(vparty) %>% - bind_rows(gps) %>% - bind_rows(poppa) %>% - unique() %>% - arrange(country, party, year, var) %>% - filter(!is.na(val), !is.na(party), !is.na(country), !is.na(var)) - -# Compute val_int for datasets that don't have it pre-computed -# V-Party already has val_int; CHES/GPS/POPPA need it computed from val * n_scale -expert_raw <- expert_raw %>% - mutate( - val_int = ifelse(is.na(val_int), as.integer(round(val * n_scale)), val_int), - val_int = pmin(pmax(val_int, 0L), n_scale) - ) - -# Boundary adjustments for continuous val (avoid exact 0 or 1 for Stan prior means) -expert_raw <- expert_raw %>% - mutate( - val = case_when( - val == 0 ~ val + 1e-4, - val == 1 ~ val - 1e-4, - TRUE ~ val - )) - -# ============================================================ -# Combine LR Data -# ============================================================ - -lr_data_raw <- ches_lr %>% - bind_rows(poppa_lr) %>% - select(-any_of("vote")) - -# Boundary adjustments for continuous val (avoid exact 0 or 1) -lr_data_raw <- lr_data_raw %>% - mutate( - val = case_when( - val == 0 ~ val + 1e-4, - val == 1 ~ val - 1e-4, - TRUE ~ val - )) - -# Compute val_int for LR data -lr_data_raw <- lr_data_raw %>% - mutate( - val_int = as.integer(round(val * n_scale)), - val_int = pmin(pmax(val_int, 0L), n_scale) - ) - -# ============================================================ -# Write Outputs -# ============================================================ - -write_csv(expert_raw, "expert_raw.csv") -write_csv(lr_data_raw, "lr_data_raw.csv") - -cat(sprintf("\nOutputs written:\n")) -cat(sprintf(" expert_raw.csv: %d rows\n", nrow(expert_raw))) -cat(sprintf(" lr_data_raw.csv: %d rows\n", nrow(lr_data_raw))) - -cat("\n Expert data by source:\n") -expert_raw %>% - group_by(project) %>% - summarise(n = n(), .groups = "drop") %>% - print() - -cat("\n New columns check:\n") -cat(sprintf(" val_int range: %d - %d\n", min(expert_raw$val_int), max(expert_raw$val_int))) -cat(sprintf(" n_scale values: %s\n", paste(sort(unique(expert_raw$n_scale)), collapse = ", "))) -cat(sprintf(" n_experts non-NA: %d / %d\n", sum(!is.na(expert_raw$n_experts)), nrow(expert_raw))) diff --git a/src/r/00e_process_morgan.R b/src/r/00e_process_morgan.R deleted file mode 100644 index c2f3993..0000000 --- a/src/r/00e_process_morgan.R +++ /dev/null @@ -1,388 +0,0 @@ -# 00e_process_morgan.R -# Process Morgan (1976) expert party position data -# -# Source: Morgan, Michael-John (1976). "The Modelling of Governmental -# Coalition Formation: A Policy-Based Approach with Interval Measurement." -# PhD dissertation, University of Michigan. -# -# Data extracted from Appendix B.3 (Tables B.3.1-B.3.12) via OCR. -# Position scores are 25%-truncated means (midmeans) from expert surveys. -# Scale: 0-100 (left-right) - -library(tidyverse) - -cat("Processing Morgan (1976) expert party position data...\n") - -# Load raw extracted data -morgan_raw <- read_csv("morgan_positions_raw.csv", show_col_types = FALSE) - -cat(sprintf("Loaded %d party-period observations from %d countries\n", - nrow(morgan_raw), n_distinct(morgan_raw$country))) - -# Load PartyFacts linkage data -partyfacts <- read_csv("partyfacts-external-parties.csv", show_col_types = FALSE) - -# Filter to Morgan dataset entries -morgan_pf <- partyfacts %>% - filter(dataset_key == "morgan") %>% - select(country, name_short, name_english, year_first, year_last, - external_id, partyfacts_id) %>% - rename(party_abbrev_pf = name_short) - -cat(sprintf("Found %d Morgan parties in PartyFacts\n", nrow(morgan_pf))) - -# Map extracted abbreviations to PartyFacts abbreviations -# Some adjustments needed due to OCR/transcription differences -abbrev_map <- tribble( - ~country, ~party_abbrev, ~party_abbrev_pf, - # Denmark - "DNK", "SOCd", "SOCD", - "DNK", "SOCL", "SOCL", - "DNK", "COMM", "COMM", - "DNK", "RAD", "RAD", - "DNK", "LIB", "LIB", - "DNK", "CONS", "CONS", - "DNK", "LS", "LS", - "DNK", "LC", "LC", - "DNK", "JUST", "JUST", - # Finland - "FIN", "SKDL", "SKDL", - "FIN", "SOCd", "SOCD", - "FIN", "PROG", "PROG", - "FIN", "AGR", "AGR", - "FIN", "SWPP", "SWPP", - "FIN", "CONS", "CONS", - "FIN", "NPF", "NPF", - "FIN", "PDEM", "PDEM", - "FIN", "SDWS", "SDWS", - "FIN", "CENT", "CENT", - "FIN", "FRP", "FRP", - "FIN", "LIB", "LIB", - # Iceland - "ISL", "COMM", "COMM", - "ISL", "SOCd", "SOCD", - "ISL", "PROG", "PROG", - "ISL", "LIB", "LIB", - "ISL", "INDP", "INDP", - "ISL", "CONS", "CONS", - "ISL", "LLIB", "LLIB", - # Norway - "NOR", "LAB", "LAB", - "NOR", "LIB", "LIB", - "NOR", "AGR", "AGR", - "NOR", "CONS", "CONS", - "NOR", "COMM", "COMM", - "NOR", "SOCL", "SOCL", - "NOR", "CHPP", "CHPP", - "NOR", "CENT", "CENT", - # Sweden - "SWE", "COMM", "COMM", - "SWE", "SOCd", "SOCD", - "SWE", "AGR", "AGR", - "SWE", "LIB", "LIB", - "SWE", "CONS", "CONS", - "SWE", "CENT", "CENT", - # Netherlands - "NLD", "CPN", "CPN", - "NLD", "SOCd", "SOCD", - "NLD", "RAD", "RAD", - "NLD", "KVP", "KVP", - "NLD", "CHU", "CHU", - "NLD", "LIB", "LIB", - "NLD", "ARP", "ARP", - "NLD", "SGP", "SGP", - "NLD", "NSB", "NSB", - "NLD", "PVDA", "PVDA", - "NLD", "VVD", "VVD", - "NLD", "PSP", "PSP", - "NLD", "PPR", "PPR", - "NLD", "D66", "D66", - "NLD", "DS70", "DS70", - "NLD", "GPV", "GPV", - "NLD", "BP", "BP", - # Belgium - "BEL", "COMM", "COMM", - "BEL", "POB", "POB", - "BEL", "CATH", "CATH", - "BEL", "LIB", "LIB", - "BEL", "FNAT", "FNAT", - "BEL", "REX", "REX", - "BEL", "PSB", "PSB", - "BEL", "RW", "RW", - "BEL", "PSC", "PSC", - "BEL", "FDF", "FDF", - "BEL", "VOLK", "VOLK", - "BEL", "PLP", "PLP", - # France (Fourth Republic) - "FRA", "PCF", "PCF", - "FRA", "SFIO", "SFIO", - "FRA", "MRP", "MRP", - "FRA", "RDA", "RDA", - "FRA", "UDSR", "UDSR", - "FRA", "RAD", "RAD", - "FRA", "RS", "RS", - "FRA", "RPF", "RPF", - "FRA", "AR", "AR", - "FRA", "ARS", "ARS", - "FRA", "RI", "RI", - "FRA", "CNIP", "CNIP", - "FRA", "PUS", "PUS", - "FRA", "PAYS", "PAYS", - "FRA", "AP", "AP", - "FRA", "PRL", "PRL", - "FRA", "POUJ", "POUJ", - # Weimar Germany - "DEU", "KPD", "KPD", - "DEU", "SDAP", "SDAP", - "DEU", "DDP", "DDP", - "DEU", "DZP", "DZP", - "DEU", "BVP", "BVP", - "DEU", "DVP", "DVP", - "DEU", "RDMW", "RDMW", - "DEU", "LVP", "LVP", - "DEU", "DNVP", "DNVP", - "DEU", "NAZI", "NAZI", - # Italy - "ITA", "PCI", "PCI", - "ITA", "PSIU", "PSIU", - "ITA", "PSI", "PSI", - "ITA", "PSDI", "PSDI", - "ITA", "PRI", "PRI", - "ITA", "DC", "DC", - "ITA", "PLI", "PLI", - "ITA", "MON", "MON", - "ITA", "MSI", "MSI", - # Luxembourg - "LUX", "COMM", "COMM", - "LUX", "SOCd", "SOCD", - "LUX", "CSOC", "CSOC", - "LUX", "GRPD", "GRPD", - # Israel - "ISR", "RAKA", "RAKA", - "ISR", "MAKI", "MAKI", - "ISR", "MAPM", "MAPM", - "ISR", "MADT", "MADT", - "ISR", "ADUT", "ADUT", - "ISR", "MAAR", "MAAR", - "ISR", "LAB", "LAB", - "ISR", "MAPI", "MAPI", - "ISR", "PAUG", "PAUG", - "ISR", "RAFI", "RAFI", - "ISR", "PROG", "PROG", - "ISR", "ILIB", "ILIB", - "ISR", "NRP", "NRP", - "ISR", "URF", "URF", - "ISR", "LIB", "LIB", - "ISR", "NATL", "NATL", - "ISR", "TORA", "TORA", - "ISR", "LIKD", "LIKD", - "ISR", "ZION", "ZION", - "ISR", "GHAL", "GHAL", - "ISR", "AGDT", "AGDT", - "ISR", "HRUT", "HRUT" -) - -# Some parties in raw data that don't have exact matches - need special handling -# (e.g., parties that only exist in one period in PartyFacts but appear in both) -# We'll join using the period-based matching - -# Expand periods to years for matching -morgan_expanded <- morgan_raw %>% - mutate( - year_start = as.integer(str_extract(period, "^\\d{4}")), - year_end = as.integer(str_extract(period, "\\d{4}$")) - ) - -# Join with abbreviation map -morgan_mapped <- morgan_expanded %>% - left_join(abbrev_map, by = c("country", "party_abbrev")) - -# Check for unmatched abbreviations -unmatched_abbrev <- morgan_mapped %>% - filter(is.na(party_abbrev_pf)) %>% - distinct(country, party_abbrev) - -if (nrow(unmatched_abbrev) > 0) { - cat("\nWarning: Unmatched abbreviations:\n") - print(unmatched_abbrev) -} - -# Join with PartyFacts -morgan_joined <- morgan_mapped %>% - left_join(morgan_pf, by = c("country", "party_abbrev_pf")) %>% - # For parties with overlapping periods, use period overlap - mutate( - period_overlap = pmax(0, - pmin(year_end, year_last) - pmax(year_start, year_first) + 1) - ) %>% - # Keep best match per party-period (max overlap) - group_by(country, party_abbrev, period) %>% - slice_max(period_overlap, n = 1, with_ties = FALSE) %>% - ungroup() - -# Check for unmatched parties -unmatched <- morgan_joined %>% - filter(is.na(partyfacts_id)) %>% - distinct(country, party_abbrev, party_name, period) - -if (nrow(unmatched) > 0) { - cat(sprintf("\n%d party-periods without PartyFacts match:\n", nrow(unmatched))) - print(unmatched) -} - -# Dedup: when multiple abbreviations map to the same PF ID, keep only one -matched <- morgan_joined %>% - filter(!is.na(partyfacts_id)) %>% - group_by(country, partyfacts_id, period) %>% - slice(1) %>% - ungroup() - -cat(sprintf("\nMatched %d of %d party-period observations (%.1f%%)\n", - nrow(matched), nrow(morgan_raw), - 100 * nrow(matched) / nrow(morgan_raw))) - -# Normalize position to [0,1] scale -# Original scale: 0-100 -# Apply boundary adjustments like other expert data -eps <- 0.005 -morgan_processed <- matched %>% - mutate( - # Normalize to [0,1] - lr_morgan = position / 100, - # Apply boundary adjustments - lr_morgan = case_when( - lr_morgan <= 0 ~ eps, - lr_morgan >= 1 ~ 1 - eps, - TRUE ~ lr_morgan - ), - # Calculate standard error (sd / sqrt(n)) - lr_morgan_se = (sd / 100) / sqrt(n_surveys), - # Set minimum SE for extreme parties (sd=0) - lr_morgan_se = pmax(lr_morgan_se, 0.01) - ) %>% - select( - country, - partyfacts_id, - period, - year_start, - year_end, - party_abbrev, - party_name, - lr_morgan, - lr_morgan_se, - n_surveys - ) %>% - arrange(country, year_start, lr_morgan) - -# Summary statistics -cat("\nSummary of processed Morgan data:\n") -cat(sprintf(" Countries: %d\n", n_distinct(morgan_processed$country))) -cat(sprintf(" Parties: %d\n", n_distinct(morgan_processed$partyfacts_id))) -cat(sprintf(" Observations: %d\n", nrow(morgan_processed))) - -# Distribution of positions -cat("\nPosition distribution:\n") -print(summary(morgan_processed$lr_morgan)) - -# Write output -write_csv(morgan_processed, "morgan_data.csv") -cat(sprintf("\nWrote morgan_data.csv with %d rows\n", nrow(morgan_processed))) - -# Also provide a summary by country and period -summary_by_country <- morgan_processed %>% - group_by(country, period) %>% - summarise( - n_parties = n(), - mean_pos = mean(lr_morgan), - sd_pos = sd(lr_morgan), - .groups = "drop" - ) - -cat("\nSummary by country and period:\n") -print(summary_by_country, n = 50) - -# ============================================================ -# Generate lr_data-compatible output for pipeline integration -# ============================================================ - -cat("\n============================================================\n") -cat("Generating lr_data-compatible output (postwar only)\n") -cat("============================================================\n") - -# Load text_data to get party-years with manifesto/PolDem coverage -text_data <- read_csv("text_data.csv", show_col_types = FALSE) - -# Convert Morgan ISO3 country codes to ISO2 (matching text_data format) -iso3_to_iso2 <- c( - "DNK" = "DK", "FIN" = "FI", "ISL" = "IS", "NOR" = "NO", "SWE" = "SE", - "NLD" = "NL", "BEL" = "BE", "DEU" = "DE", "FRA" = "FR", "ITA" = "IT", - "LUX" = "LU", "ISR" = "IL" -) - -# Filter to postwar periods only (1945+) -morgan_postwar <- morgan_processed %>% - filter(year_end >= 1945) %>% - mutate(country_iso2 = iso3_to_iso2[country]) - -cat(sprintf("Postwar Morgan observations: %d party-periods\n", nrow(morgan_postwar))) -cat(sprintf("Countries: %s\n", paste(unique(morgan_postwar$country_iso2), collapse = ", "))) - -# Get unique party-years from text_data -text_party_years <- text_data %>% - select(party, country, year) %>% - distinct() - -cat(sprintf("Unique party-years in text_data: %d\n", nrow(text_party_years))) - -# For each Morgan party-period, expand to all years where that party has text data -# within the Morgan period range (1945-1973 for postwar) -morgan_lr <- morgan_postwar %>% - # Join with text_data party-years - # Many-to-many is expected: one Morgan party-period maps to multiple years - inner_join( - text_party_years, - by = c("partyfacts_id" = "party", "country_iso2" = "country"), - relationship = "many-to-many" - ) %>% - # Keep only years within the Morgan period - filter(year >= year_start & year <= year_end) %>% - # Format for lr_data.csv compatibility - transmute( - country = country_iso2, - party = partyfacts_id, - var = "lr_morgan", - year = year, - val = lr_morgan, - project = "Morgan", - # Morgan's continuous 0-100 scale is discretized to 10 points (matching CHES - # resolution) with the actual number of experts. The reconstructed sum - # round(mean × K × 10) is analogous to how CHES means are handled. - # See docs/k_scaling_validation.md Section 4. - n_scale = 10L, - val_int = as.integer(round(lr_morgan * 10)), - n_experts = as.integer(n_surveys) - ) %>% - distinct() %>% - arrange(country, party, year) - -cat(sprintf("\nGenerated %d lr_morgan observations\n", nrow(morgan_lr))) -cat(sprintf(" Unique parties: %d\n", n_distinct(morgan_lr$party))) -cat(sprintf(" Year range: %d-%d\n", min(morgan_lr$year), max(morgan_lr$year))) - -# Summary by country -morgan_lr_summary <- morgan_lr %>% - group_by(country) %>% - summarise( - n_parties = n_distinct(party), - n_obs = n(), - year_min = min(year), - year_max = max(year), - .groups = "drop" - ) - -cat("\nMorgan L-R data by country:\n") -print(morgan_lr_summary, n = 20) - -# Write morgan_lr.csv -write_csv(morgan_lr, "morgan_lr.csv") -cat(sprintf("\nWrote morgan_lr.csv with %d rows\n", nrow(morgan_lr)))