Data Sources

This study relies almost exclusively on previously-published data collected by other scholars and institutions, with the one exception being a point estimate of the PBS audience size in the US that was collected by a research team associated with the current author. Note that there are fifteen raw datasets. Scholars wishing to replicate this study therefore have the option of starting at the very beginning by obtaining the publicly available data from its original collectors.

Institutional Datasets (These are either directly available to the public or are available to scholars upon request.)

Public-Access Data Collected by Other Scholars

Data Collected by the Author

  • ReCitCom Survey (2022) dataset – the data from this survey are under embargo, please contact Karolina Koc-Michalska for access.

Data Pre-Processing Instructions

The analysis dataset, “EV_Labarre2024b.csv”, was built from the fifteen raw datasets listed above. These datasets are highly heterogenous in structure and units of analysis, including large-N survey data as well as country-level fixed effects data. Due to the need for cleaning and preparation that is highly individualized to each dataset, pre-processing was done manually via spreadsheet. Scholars wishing to replicate pre-processing of the datasets can follow these instructions manually or can implement them in R. See the README.txt file for repository file names.

For EV index scores:

  • Download Flash Eurobarometer 464, American Trends Panel W45, and American Trends Panel W91. You will need to calculate country-level measures from the individual-level survey data. Make sure to separate the respondents from different countries when following the instructions below.

  • Compute average response on variables Q1_1, Q1_2, Q1_4, and Q1_5 from Flash Eurobarometer 464 into distrust_professional_media.For the US, use GROUP_TRUST_a_W91 from American Trends Panel W91. The variable is then Z-standardized into Z_professional_media.

  • Compute average response on q2 from Flash Eurobarometer 464 and MADEUPOFT_W45 from American Trends Panel W45 into average_frequency_exposure_disinformation. The variable is then Z-standardized into Z_average_frequency_exposure_disinformation.

  • For each country, compute percentage_disorientated from q3 from Flash Eurobarometer 464 and INFOOWN_W45 from American Trends Panel W45

    • Recode q3 into dichotomous variable (1->0, 2->0, 3->1, 4->1, 5->system missing)

    • Recode INFOOWN_W45 into dichotomous variable (1->1, 2->0, 99->system missing)

    • Calculate percentage of respondents in each country with a value of 1.

    • The variable is then Z-standardized into Z_percentage_disoriented.

  • You should end up with three variables: Z_percentage_disoriented, Z_average_frequency_exposure_disinformation, and Z_professional_media. Each country should have its own value on these three. The three dimensions are then added into a single country score: epistemic_vulnerability.

For Populism variables:

  • left_wing_populism: country scores obtained from Timbro Authoritarian Populism Dataset (spreadsheet “Figure 4 - right wing populism”)

  • right_wing_populism: country scores obtained from Timbro Authoritarian Populism Dataset (spreadsheet “Figure 5 - left wing populism”)

  • all_populism: country scores obtained from Timbro Authoritarian Populism Dataset (spreadsheet “Figure 1 - populism vote share”)

  • Note: Election years vary by country. I selected election closest to 2017/2018. For presidential systems (France, Poland, Portugal and Romania), I replaced vote shares from Timbro with presidential election results, retrieved from the applicable electoral commission from each country.

For Size of Party System variable:

  • For European countries, use enep from WhoGoverns.Eu. For each country, I selected the election year that was closest to 2018. If the only observations available were equidistant from 2018, e.g. 2017 and 2019, I chose the earlier observation, i.e. 2017. For the US, use enp_elections_US from the National and District Level Party Systems dataset.

For Ideological Polarization variables:

  • Download CSES Module IV and V. Each country needs to be treated separately.

  • The following variables correspond to party positions on a left-right scale. For CSES Module IV: D5017 (from D5017_A to D5017_I). For Module V: E5018 (from E5018_A to E5018_I). The number of parties considered varies by country. Use as applicable.

  • The score of each party in the lower house election is recorded in D5001 (from D5001_A to D5001_I) for CSES Module IV and E5001 (from E5001_A to E5001_I) for Module V. The number of parties considered varies by country. Use as applicable.

  • For each country:

    • Calculate the center of gravity of all parties–by taking the average of all parties on D5017 or E5018 (as applicable), weighted by the size of each party (in D5001 or E5001).

    • Calculate the distance of each party from the aforementioned center of gravity by subtracting the position of each party (D5017 or E5018), and square that distance for each party

    • Tally the squared distances (weighted by D5017 or E5018).

  • Note: France, Poland, Portugal and Romania are presidential systems. I weighted parties by their results in the presidential election instead (D5005 and E5005). If left-right scores were missing for leaders, I replaced them with the scores of their current or former party (see appendix 5).

  • The analysis dataset includes alternative measures used as robustness checks, obtained from Emmanuele and Marino (2023) and Dalton (2021) – the latter was shared by courtesy of the author, please contact Russell J. Dalton directly for access to source database.

    • For Emmanuele and Marino, I used the variable called Polarization_votes. For Dalton, the variable is simply called Polarization.

For Affective Polarization variables:

  • Download CSES Module III, IV and V. Each country needs to be treated separately.

  • In-party and out-party evaluations are recorded in CSES III-V in the following variables: C3009 (C3009_A to C3009_I) for Module III, D3011 (D3011_A to D3011_I) for Module IV, and E3017 (E3017_A to E3017_I) for Module V. The number of parties considered varies by country. Use as applicable.

  • The score of each party in the lower house election is recorded in D5001 (from D5001_A to D5001_I) for CSES Module IV and E5001 (from E5001_A to E5001_I) for Module V. The number of parties considered varies by country. Use as applicable. The number of parties considered varies by country. Use as applicable.

  • The United States AP score was calculated on the basis of leader evaluations, i.e., Trump and Biden. Leader evaluations are recorded in variable E3018_A. Similarly, the AP score for France was calculated using party evaluations weighted by scores in first round of the presidential election (D5005 and E5005). All other figures were weighted using party evaluations in the lower house election (first round, when applicable).

  • For all respondents

    • identify the party they report being closest to, i.e., their in-party, in C3020_3 for Module III, D3018_3 for Module IV, and E3024_3 for Module V.

    • Calculate the distance between the in-party and out-party evaluation (in C3009, D3011 or E3017) for all parties that the respondent evaluated.

    • Sum up all these distances, weighted by the size of the out-parties and you get a respondent AP score.

    • Take the average for all country respondents, and you get the country AP score.

  • Consider this example:

    • Respondent in-party is party C.

    • There are 4 parties: party A, B, C and D.

    • Respondent gives party A an evaluation of 2, party B an evaluation of 2, party C an evaluation of 10, and party D an evaluation of 0.

    • Party A received 30% of the vote, party B 10%, party C 20%, and party D 40%.

    • The respondent AP score is calculated as ((10-2)*(30/100))+((10-2)*(20/100))+((10-0)*(40/100))

    • Repeat this for all respondents, and you get the country AP score.

For Daily PBS Viewership variable:

  • Data were obtained from the European Audiovisual Observatory (EAO) Yearbook 2018/2019. The dataset is not publicly available and access must be purchased from the EAO. The single-user access fee is €370, multi-user access costs €800. Once access is purchased, a spreadsheet can be download containing all values (except the US observation). The relevant spreadsheet should be titled: “TV-AUD Public Service Audience Market Share (1999-2018).”

  • For the US, data was obtained from the ReCitCom Survey dataset (Wave 2022). The dataset is under embargo. Please contact Karolina Koc-Michalska for access inquiries.

For Political Parallelism/Media Parallelism variables:

  • Data were obtained from European Media Systems Survey 2010. The file is titled: “EMSS2010_countries.sav.” The variables of interest are the following:
    • partnews: this is parallelism in newspapers, or ParallelismNewspaper in the analysis dataset.
    • parttv: this is parallelism in television, or ParallelismTelevision in the analysis dataset.
  • The other measure of parallelism used in the paper, Parallelism_Humprecht2022 in the analysis dataset, comes from Humprecht et al. 2022’s online appendix, table 5.

Analysis Code

Below are the R packages necessary for the analysis. I used R Studio. Be sure it is up to date.

Before starting, you should have 4 datasets in the working directory (available in Data>Processed):

  1. EV_Labarre2024b.csv,” which is the analysis dataset

  2. “EV_Labarre2024_appendix.csv,” which contains some columns of text that are not used in the main analysis but are used to generate tables and maps for the online appendix)

  3. “KruskalWallis.csv”, which is used for the Kruskal-Wallis test reported in the paper

  4. SpearmanHumprecht.csv”, which is used to calculate the Spearman correlation coefficient between my results and those from a previous study by Humprecht et al. (2020).

Packages and Definitions

# Load all the necessary packages 
library(ggplot2)
library(jtools)
library(car)
library(dplyr)
library(tidyverse)
library(countrycode)
library(janitor)
library(haven)
library(readxl)
library(hrbrthemes)
library(viridis)
library(igraph)
library(corrplot)
library(leaps)
library(lmtest)
library(fmsb)
library(radar)
library(RColorBrewer)
library(scales)
library(rnaturalearth)
library(sf) 
library(rnaturalearthdata)
library(patchwork)
library(stargazer)

Start by loading in the main analysis dataset. You may find it helpful to deactivate scientific notation, though this is optional.

# Load the dataset
df <-read.csv("Data/Processed/EV_Labarre2024b.csv")

# Disable scientific notation
options(scipen=999)

The next bit of code defines the variables in the analysis dataset.

Country <- df$country 
LeftWingPopulism <- df$left_wing_populism
RightWingPopulism <- df$right_wing_populism
AllPopulism <- df$all_populism
PBS_DailyViewership <- df$pbs_audience_size
IdeologicalPolarization <- df$ideological_polarization 
AffectivePolarization <- df$affective_polarization 
EffectiveNumberParties <- df$effective_number_parties
ParallelismTelevision <- df$parallelism_television
ParallelismNewspapers <- df$parallelism_newspapers
ParallelismHumprecht2022 <- df$Parallelism_Humprecht2022
EpistemicVulnerability <-df$epistemic_vulnerability

Analyses From the Main Article

The article reports findings from two main Ordinary Least Squares (OLS) regression models.

Model 1

Dependent variable: the EV index.
Explanatory variables: affective polarization, ideological polarization, the effective number of parties, left-wing populism, right-wing populism, daily viewership of PBS, and political parallelism index.

The following code will specify the model, and print the regression table in your R console.

# Specify Model 1
Model1 <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization + EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + PBS_DailyViewership + ParallelismHumprecht2022)

# Format Regression Table
stargazer(Model1, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Epistemic Vulnerability Index"), title = "Model 1 Regression Results", covariate.labels = c("Affective Polarization", "Ideological Polarization", "Effective Number of Parties", "Left-Wing Populism", "Right-Wing Populism", "Daily Viewership of PBS", "Political Parallelism"))
Model 1 Regression Results
Dependent variable:
Epistemic Vulnerability Index
Affective Polarization 0.118 (0.492)
p = 0.816
Ideological Polarization 0.364 (0.157)
p = 0.040*
Effective Number of Parties -0.499 (0.193)
p = 0.024*
Left-Wing Populism 0.055 (0.023)
p = 0.038*
Right-Wing Populism 0.020 (0.019)
p = 0.323
Daily Viewership of PBS -0.044 (0.024)
p = 0.094.
Political Parallelism 1.266 (0.561)
p = 0.044*
Constant 0.404 (3.154)
p = 0.901
Observations 20
R2 0.853
Adjusted R2 0.766
Residual Std. Error 1.235 (df = 12)
F Statistic 9.910*** (df = 7; 12)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Model 2

Dependent variable: the EV index. Explanatory variables: affective polarization, ideological polarization, the effective number of parties, all populism, daily viewership of PBS, and political parallelism index.

Once again, the following code will specify the model, and print the regression table in your R console.

# Specify Model 2
Model2 <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization + EffectiveNumberParties + AllPopulism + PBS_DailyViewership + ParallelismHumprecht2022)

# Format Regression Table
stargazer(Model2, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Epistemic Vulnerability Index"), title = "Model 2 Regression Results", covariate.labels = c("Affective Polarization", "Ideological Polarization", "Effective Number of Parties", "All Populism", "Daily Viewership of PBS", "Political Parallelism"))
Model 2 Regression Results
Dependent variable:
Epistemic Vulnerability Index
Affective Polarization -0.059 (0.478)
p = 0.904
Ideological Polarization 0.378 (0.160)
p = 0.034*
Effective Number of Parties -0.483 (0.196)
p = 0.029*
All Populism 0.034 (0.016)
p = 0.055.
Daily Viewership of PBS -0.048 (0.024)
p = 0.069.
Political Parallelism 1.353 (0.566)
p = 0.033*
Constant 1.212 (3.137)
p = 0.706
Observations 20
R2 0.834
Adjusted R2 0.758
Residual Std. Error 1.257 (df = 13)
F Statistic 10.925*** (df = 6; 13)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Interpreting Regression Coefficients By Predicting EV Index Scores

The EV Index is difficult to interpret. In the article, I made the decision to interpret the effect of each variable in terms of its effect on the country rankings. The following code allows you to replicate the examples found in the paper.

First, we need to extract coefficients from the main regression models, Model 1 and Model 2.

# Extract coefficients from Model 1
AffectivePolarizationCoefficient_Model1 = coef(Model1)["AffectivePolarization"]
IdeologicalPolarizationCoefficient_Model1 = coef(Model1)["IdeologicalPolarization"]
ENEPCoefficient_Model1 = coef(Model1)["EffectiveNumberParties"]
LWPCoefficient_Model1 = coef(Model1)["LeftWingPopulism"]
RWPCoefficient_Model1 = coef(Model1)["RightWingPopulism"]
PBSCoefficient_Model1 = coef(Model1)["PBS_DailyViewership"]
ParallelismCoefficient_Model1 = coef(Model1)["ParallelismHumprecht2022"]


# Extract coefficients from Model 2
AffectivePolarizationCoefficient_Model2 = coef(Model2)["AffectivePolarization"]
IdeologicalPolarizationCoefficient_Model2 = coef(Model2)["IdeologicalPolarization"]
ENEPCoefficient_Model2 = coef(Model2)["EffectiveNumberParties"]
PopulismCoefficient_Model2 = coef(Model2)["AllPopulism"]
PBSCoefficient_Model2 = coef(Model2)["PBS_DailyViewership"]
ParallelismCoefficient_Model2 = coef(Model2)["ParallelismHumprecht2022"]

We now can use these coefficients to calculate predicted EV scores under a number of hypothetical situations. These are all the examples found in the manuscript.

# EV score predicted by Model 2 if the UK had same level of ideological polarization as Ireland
unname(subset(df, country == "GB")$epistemic_vulnerability[1]-(IdeologicalPolarizationCoefficient_Model2*(subset(df, country == "GB")$ideological_polarization[1]-subset(df, country == "IE")$ideological_polarization[1])))
## [1] -2.499671
# EV score predicted by Model 2 if the UK had same level of ideological polarization as Poland
unname(subset(df, country == "GB")$epistemic_vulnerability[1]-(IdeologicalPolarizationCoefficient_Model2*(subset(df, country == "GB")$ideological_polarization[1]-subset(df, country == "PL")$ideological_polarization[1])))
## [1] -2.916293
# EV score predicted by Model 1 if the US had same number of parties as the Netherlands
unname(subset(df, country == "US")$epistemic_vulnerability[1]-(ENEPCoefficient_Model1*(subset(df, country == "US")$effective_number_parties[1]-subset(df, country == "NL")$effective_number_parties[1])))
## [1] -0.3193315
# EV score predicted by Model 2 if Romania's populists went up to EU average (27.98%)
unname(subset(df, country == "RO")$epistemic_vulnerability[1]-(PopulismCoefficient_Model2*(subset(df, country == "RO")$all_populism[1]-27.98)))
## [1] 0.5961335
# EV score predicted by Model 2 if Hungary's populists fell to the EU average (27.98%)
unname(subset(df, country == "HU")$epistemic_vulnerability[1]-(PopulismCoefficient_Model2*(subset(df, country == "HU")$all_populism[1]-27.98)))
## [1] 2.542563
# EV score predicted by Model 1 if left-wing populists in Greece fell to 10%
unname(subset(df, country == "GR")$epistemic_vulnerability[1]-(LWPCoefficient_Model1*(subset(df, country == "GR")$left_wing_populism[1]-10)))
## [1] 1.902288
# EV score predicted by Model 2 if the daily audience of Italian public TV was the same as in the US
unname(subset(df, country == "IT")$epistemic_vulnerability[1]-(PBSCoefficient_Model2*(subset(df, country == "IT")$pbs_audience_size[1]-subset(df, country == "US")$pbs_audience_size[1])))
## [1] 1.958126
# EV score predicted by Model 2 if the daily audience of British public TV was the same as in the US
unname(subset(df, country == "GB")$epistemic_vulnerability[1]-(PBSCoefficient_Model2*(subset(df, country == "GB")$pbs_audience_size[1]-subset(df, country == "US")$pbs_audience_size[1])))
## [1] 1.283032
# EV score predicted by Model 2 if the daily audience of Denmark's parallelism was the same as in Spain
unname(subset(df, country == "DK")$epistemic_vulnerability[1]-(ParallelismCoefficient_Model2*(subset(df, country == "DK")$Parallelism_Humprecht2022[1]-subset(df, country == "ES")$Parallelism_Humprecht2022[1])))
## [1] -1.681524

The paper also briefly discusses the findings of an alternative model. This alternative model substitutes the political parallelism index used in Model 1 and Model 2 with measures of media-party parallelism (television and newspapers) from the 2010 European Media Systems Survey (EMSS). To replicate those predicted EV scores, you will need to specify that alternative model first.

# Specify Alternative Model (Appendix 11.A.)
AltModel_Appendix11A <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                            EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + 
                            PBS_DailyViewership + ParallelismNewspapers + ParallelismTelevision)

# Extract coefficient from alternative model
NewspaperParallelismCoefficient_AltModel = coef(AltModel_Appendix11A)["ParallelismNewspapers"]

Now that the alternative model is specified, you can proceed with the last example found in the paper.

# EV score predicted by alternative model (Model1_NEW_EMSS2010) if newspaper parallelism in the UK was the same as in Slovakia
unname(subset(df, country == "GB")$epistemic_vulnerability[1]-(NewspaperParallelismCoefficient_AltModel*(subset(df, country == "GB")$parallelism_newspapers[1]-subset(df, country == "SK")$parallelism_newspapers[1])))
## [1] -5.135447

Reproducing Figures

Figure 1: Internal Consistency and EV Index Scores in Ascending Order.

In order to produce Figure 1, we first need to define the color palette used for the radar charts, and assign a color to each country based on its value on the EV index.

# Define color palette
get_color_for_value <- function(value, min_val = min(df$epistemic_vulnerability), max_val = max(df$epistemic_vulnerability)) { # These are the minimum and maximum EV country scores
  # Normalize the value to a scale of 0 to 1
  normalized_value <- (value - min_val) / (max_val - min_val)
  # Use a color scale - here, I use a yellow-to-red scale
  color <- col_numeric(palette = c("yellow", "red"), domain = c(0, 1))(normalized_value)
  return(color)
}

# Assign colors to countries based on their EV index values
finland_color <- get_color_for_value(-5.19)
denmark_color <- get_color_for_value(-4.72)
netherlands_color <- get_color_for_value(-2.91)
ireland_color <- get_color_for_value(-2.40)
sweden_color <- get_color_for_value(-1.83)
germany_color <- get_color_for_value(-1.22)
austria_color <- get_color_for_value(-0.80)
uk_color <- get_color_for_value(-0.48)
romania_color <- get_color_for_value(-0.33)
portugal_color <- get_color_for_value(0.02)
france_color <- get_color_for_value(0.55)
slovakia_color <- get_color_for_value(0.58)
italy_color <- get_color_for_value(0.68)
czech_color <- get_color_for_value(1.07)
poland_color <- get_color_for_value(1.44)
bulgaria_color <- get_color_for_value(2.44)
unitedstates_color <- get_color_for_value(2.47)
spain_color <- get_color_for_value(2.89)
greece_color <- get_color_for_value(3.82)
hungary_color <- get_color_for_value(3.92)

Then, we need to determine the minimum and maximum values on the three dimensions of the EV index score, in order to define the scale on the 3 dimensions of the radar charts.

# For disinformation, determine max and min value 
max(df$Z_average_frequency_exposure_disinformation) # 1.404763
## [1] 1.404763
min(df$Z_average_frequency_exposure_disinformation) # -2.221546
## [1] -2.221546
# For disorientation, determine max and min value 
max(df$Z_percentage_disoriented) # 1.4471
## [1] 1.4471
min(df$Z_percentage_disoriented) # -1.946383
## [1] -1.946383
# For distrust, determine max and min value max(df$Z_distrust_professional_media) # 1.852526
min(df$Z_distrust_professional_media) # -1.856514
## [1] -1.856514

These values will be plugged into each radar chart below. We can now reproduce the country ranking. Here you will need to run the following line of code to start a device that will save the graphical output of the code below as a jpeg file in your working directory. You MUST run everything between this line and the line that reads #dev.off() in the exact order specified below. Otherwise, the figure will not be exported correctly.

# You MUST run everything between this line of code and dev.off()
jpeg("Output/Figure1.jpeg", width = 11000, height = 13000, res = 600) 

# The following line sets the graphical output to a 4 x 5 grid
par(mfrow = c(5, 5), mar=c(5.1, 4.1, 4.1, 2.1)) 

plot.new() # Add blank plot
plot.new() # Add blank plot

# ------- Internal Consistency Plot ---------

dataNA <- data.frame(
  Disinformation = c(0,0,0),
  Disorientation = c(0,0,0),
  Distrust = c(0,0,0)
)

plotInternalConsistency <- radarchart(
  dataNA,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 0,
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  text(x = 0, y = 1.2, labels = "Perceived disinfo\n(average)", font=3, cex = 1.6, col = "black")+  # Adjust 'line' and 'cex' as needed
  text(x = -0.8, y = -0.8, labels = "Disorientation\n(average)", font=3, cex = 1.6, col = "black")+  # Adjust 'line' and 'cex' as needed
  text(x = 0.8, y = -0.8, labels = "Distrust\n(average)", font=3, cex = 1.6, col = "black")+  # Adjust 'line' and 'cex' as needed
  text(x = -1, y = 0.3, labels = ".463*", font=3, cex = 2, col = "black")+
  text(x = 1, y = 0.3, labels = ".814**", font=3, cex = 2, col = "black")+
  text(x = 0, y = -0.8, labels = ".489*", font=3, cex = 2, col = "black")+
  text(x = 0, y = 0.05, labels = "α = .811", font=3, cex = 2, col = "black")

plot.new() # Add blank plot
plot.new() # Add blank plot


# ------- Finland Plot ---------

dataFI <- data.frame(
  Disinformation = c(1.404763, -2.221546, -2.22154607),
  Disorientation = c(1.4471, -1.946383, -1.36200695),
  Distrust = c(1.852525791, -1.856514006, -1.610153393)
)

plotFI <- radarchart(
  dataFI,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(finland_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-5.19", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("FINLAND", side = 3, line = -1, cex = 1.5, font=2)+  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed



# ------- Denmark Plot ---------

dataDK <- data.frame(
  Disinformation = c(1.404763, -2.221546, -0.92185262),
  Disorientation = c(1.4471, -1.946383, -1.94638329),
  Distrust = c(1.852525791, -1.856514006, -1.856514006)
)

plotDK <- radarchart(
  dataDK,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(denmark_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-4.72", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("DENMARK", side = 3, line = -1, cex = 1.5, font=2)+  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed



# ------- Netherlands Plot ---------

dataNL <- data.frame(
  Disinformation = c(1.404763, -2.221546, -1.00147981),
  Disorientation = c(1.4471, -1.946383, -0.41880304),
  Distrust = c(1.852525791, -1.856514006, -1.488992436)
)

plotNL <- radarchart(
  dataNL,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(netherlands_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-2.91", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("NETHERLANDS", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Ireland Plot ---------

dataIE <- data.frame(
  Disinformation = c(1.404763, -2.221546, -0.38309478),
  Disorientation = c(1.4471, -1.946383, -1.22872814),
  Distrust = c(1.852525791, -1.856514006, -0.784744374)
)

plotIE <- radarchart(
  dataIE,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(ireland_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-2.40", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("IRELAND", side = 3, line = -1, cex = 1.5, font=2)+  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as neededd




# ------- Sweden Plot ---------

dataSE <- data.frame(
  Disinformation = c(1.404763, -2.221546, -1.46553550),
  Disorientation = c(1.4471, -1.946383, 0.84221958),
  Distrust = c(1.852525791, -1.856514006, -1.208807723)
)

plotSE <- radarchart(
  dataSE,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(sweden_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-1.83", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("SWEDEN", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Germany Plot ---------

dataDE <- data.frame(
  Disinformation = c(1.404763, -2.221546, -1.12247043),
  Disorientation = c(1.4471, -1.946383, -0.02921882),
  Distrust = c(1.852525791, -1.856514006, -0.064846354)
)

plotDE <- radarchart(
  dataDE,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(germany_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-1.22", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("GERMANY", side = 3, line = -1, cex = 1.5, font=2)+  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Austria Plot ---------

dataAT <- data.frame(
  Disinformation = c(1.404763, -2.221546, -0.39353035),
  Disorientation = c(1.4471, -1.946383, -0.16249763),
  Distrust = c(1.852525791, -1.856514006, -0.240529742)
)

plotAT <- radarchart(
  dataAT,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(austria_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-0.80", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("AUSTRIA", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- United Kingdom Plot ---------

dataGB <- data.frame(
  Disinformation = c(1.404763, -2.221546, 0.05840217),
  Disorientation = c(1.4471, -1.946383, -0.72636953),
  Distrust = c(1.852525791, -1.856514006, 0.184038445)
)

plotGB <- radarchart(
  dataGB,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(uk_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-0.48", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("UNITED KINGDOM", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed



# ------- Romania Plot ---------

dataRO <- data.frame(
  Disinformation = c(1.404763, -2.221546, 0.45626259),
  Disorientation = c(1.4471, -1.946383, -1.31074587),
  Distrust = c(1.852525791, -1.856514006, 0.519755264)
)

plotRO <- radarchart(
  dataRO,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(romania_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("-0.33", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
mtext("ROMANIA", side = 3, line = -1, cex = 1.5, font=2)  +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Portugal Plot ---------

dataPT <- data.frame(
  Disinformation = c(1.404763, -2.221546, -0.41467702),
  Disorientation = c(1.4471, -1.946383, 1.20104715),
  Distrust = c(1.852525791, -1.856514006, -0.770608929)
)

plotPT <- radarchart(
  dataPT,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(portugal_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("0.02", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("PORTUGAL", side = 3, line = -1, cex = 1.5, font=2)  +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- France Plot ---------

dataFR <- data.frame(
  Disinformation = c(1.404763, -2.221546, 0.46916068),
  Disorientation = c(1.4471, -1.946383, -0.20350650),
  Distrust = c(1.852525791, -1.856514006, 0.283996235)
)

plotFR <- radarchart(
  dataFR,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(france_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("0.55", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("FRANCE", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed



# ------- Slovakia Plot ---------

dataSK <- data.frame(
  Disinformation = c(1.404763, -2.221546, 0.49056565),
  Disorientation = c(1.4471, -1.946383, -0.36754196),
  Distrust = c(1.852525791, -1.856514006, 0.454631249)
)

plotSK <- radarchart(
  dataSK,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(slovakia_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("0.58", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("SLOVAKIA", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Italy Plot ---------

dataIT <- data.frame(
  Disinformation = c(1.404763, -2.221546, -0.01592113),
  Disorientation = c(1.4471, -1.946383, -0.20350650),
  Distrust = c(1.852525791, -1.856514006, 0.896868742)
)

plotIT <- radarchart(
  dataIT,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(italy_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("0.68", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("ITALY", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Czech Republic Plot ---------

dataCZ <- data.frame(
  Disinformation = c(1.404763, -2.221546, 0.37577438),
  Disorientation = c(1.4471, -1.946383, 0.370808525),
  Distrust = c(1.852525791, -1.856514006, 0.430903895)
)

plotCZ <- radarchart(
  dataCZ,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(czech_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("1.07", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("CZECH REPUBLIC", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Poland Plot ---------

dataPL <- data.frame(
  Disinformation = c(1.404763, -2.221546, 0.79450594),
  Disorientation = c(1.4471, -1.946383, 0.02204227),
  Distrust = c(1.852525791, -1.856514006, 0.628295288)
)

plotPL <- radarchart(
  dataPL,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(poland_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("1.44", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("POLAND", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed





# ------- Bulgaria Plot ---------

dataBG <- data.frame(
  Disinformation = c(1.404763, -2.221546, 0.05568134),
  Disorientation = c(1.4471, -1.946383, 1.43684813),
  Distrust = c(1.852525791, -1.856514006, 0.945837963)
)

plotBG <- radarchart(
  dataBG,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(bulgaria_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("2.44", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
mtext("BULGARIA", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- United States Plot ---------

dataUS <- data.frame(
  Disinformation = c(1.404763, -2.221546, 1.40476294),
  Disorientation = c(1.4471, -1.946383, -0.136284141),
  Distrust = c(1.852525791, -1.856514006, 0.369818579)
)

plotUS <- radarchart(
  dataUS,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(unitedstates_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("2.47", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
mtext("UNITED STATES", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed



# ------- Spain Plot ---------

dataES <- data.frame(
  Disinformation = c(1.404763, -2.221546, 1.21795590),
  Disorientation = c(1.4471, -1.946383, 1.44710035),
  Distrust = c(1.852525791, -1.856514006, 0.225435106)
)

plotES <- radarchart(
  dataES,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(spain_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("2.89", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
mtext("SPAIN", side = 3, line = -1, cex = 1.5, font=2) +  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Greece Plot ---------

dataGR <- data.frame(
  Disinformation = c(1.404763, -2.221546, 1.28329014),
  Disorientation = c(1.4471, -1.946383, 0.68843633),
  Distrust = c(1.852525791, -1.856514006, 1.852525791)
)

plotGR <- radarchart(
  dataGR,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(greece_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
) +
  mtext("3.82", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
mtext("GREECE", side = 3, line = -1, cex = 1.5, font=2)+  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=-0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed




# ------- Hungary Plot ---------

dataHU <- data.frame(
  Disinformation = c(1.404763, -2.221546, 1.33374595),
  Disorientation = c(1.4471, -1.946383, 1.35483040),
  Distrust = c(1.852525791, -1.856514006, 1.233090398)
)

plotHU <- radarchart(
  dataHU,
  axistype = ,
  pty=32,
  pcol = "gray26",
  seg = 3,
  pfcol = scales::alpha(hungary_color, 0.5),
  plwd = 2,
  cglty = 1,
  cglwd = 2,
  cglcol = "darkgray",
  vlcex = 1.1,
  vlabels = c(" ", " ", " ")
)  +
  mtext("3.92", side = 1, line=-5, adj = 0.5, font=2, cex=2, col="gray26")+
  mtext("HUNGARY", side = 3, line = -1, cex = 1.5, font=2)+  # Adjust 'line' and 'cex' as needed
  mtext("disinfo", side = 3, line = -3, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("disorient", side = 1, adj=0.1, line = -6.5, cex = 1, font=3)+  # Adjust 'line' and 'cex' as needed
  mtext("distrust", side = 1, adj=0.9, line = -6.5, cex = 1, font=3)  # Adjust 'line' and 'cex' as needed


dev.off() # This line of code will save the graphical output in your working directory as a jpeg file named "Figure1.jpeg"
## quartz_off_screen 
##                 2

At this point, you should see a file titled “Figure1.jpeg” in your working directory. The figure should look like this.

Figure 2: Comparison of Scaled Estimates From Models 1 and 2.

Reproducing Figure 2 is a little easier. This part of the code assumes you have already run the code above that specifies Model 1 and Model 2 above.

# Generate comparative summary plot for Model 1 and Model 2
plotsumm <- plot_summs(Model1, Model2, scale = TRUE, legend.title = "Model",
                       coefs = rev(c("Affective\nPolarization" = "AffectivePolarization",
                                     "Ideological\nPolarization" = "IdeologicalPolarization",
                                     "Effective\nNumber of\nParties" = "EffectiveNumberParties",
                                     "Vote Share\nAll Populists\n(%)" = "AllPopulism",
                                     "Vote Share\nLWP\n(%)" = "LeftWingPopulism",
                                     "Vote Share\nRWP\n(%)" = "RightWingPopulism",
                                     "Audience\nDuplication" = "AudienceDuplication",
                                     "Audience\nPolarization" = "AudiencePolarization",
                                     "Daily\nViewership\nPBS (%)" = "PBS_DailyViewership",
                                     "Political\nParallelism" = "ParallelismHumprecht2022")),
                       model.names = c("Model 1", "Model 2"))
## Registered S3 methods overwritten by 'broom':
##   method            from  
##   tidy.glht         jtools
##   tidy.summary.glht jtools
## Loading required namespace: broom.mixed
# Customize output and plot the figure
Figure2 <- plotsumm + labs(
  caption = "Model 1: Left- and right- wing populism disaggregated. Model 2: Populism collapsed\nNote: Green areas show hypothesized directions.", xlab="", ylab="") +
  theme(
    plot.caption = element_text( face = "plain", hjust = 0.5, size = 12),
    legend.position = "bottom",
    legend.text = element_text( size = 12),
    axis.text.x = element_text( size = 12),
    axis.text.y = element_text( size = 12)) +
  coord_flip() +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 0, ymax = 2.5),
    fill = "aquamarine", # This shows the hypothesized direction for affective and ideological polarization in green
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 3.5, ymax = 6.5),
    fill = "aquamarine", # This shows the hypothesized direction for populism variables in green
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 7.5, ymax = 8.5),
    fill = "aquamarine", # This shows the hypothesized direction for political parallelism in green
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 2.5, ymax = 3.5),
    fill = "aquamarine", # This shows the hypothesized direction for effective number of parties in green
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)+
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 6.5, ymax = 7.5),
    fill = "aquamarine", # This shows the hypothesized direction for Daily PBS viewership in green
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)

# Print the figure
Figure2 

# Save the plot, the file should appear in your working directory as "Figure2.jpeg"
ggsave("Output/Figure2.jpeg", device="jpeg", plot = Figure2, width = 9.5, height = 5, dpi = 300, bg="white") # for color reproduction
ggsave("Output/Figure2_forgrayscale.jpeg", device="jpeg", plot = Figure2, width = 9.5, height = 5, dpi = 600, bg="white") # for grayscale reproduction

Comparison With Previous Typologies of Media Sytems

This part of the code is replicating figures reported in the paper, comparing the EV Index country scores and previous classifications of media systems (Hallin & Mancini, 2004; Brüggeman et al., 2014; Humprecht et al., 2020, 2022).

For this part of the analysis, you need to read in two additional datasets. The first one allows us to conduct Kruskal-Wallis tests with Hallin & Mancini (2004), Brüggeman et al. (2014), and Humprecht et al. (2022). The second dataset is used to calculate the Spearman’s rank correlation rho for the EV Index country ranking and Humprecht et al.’s (2020) country ranking of resilience to online disinformation.

Kruskal-Wallis tests with Hallin & Mancini (2004), Brüggeman et al. (2014), and Humprecht et al. (2022)

# Load dataset with typologies of media systems
df2 <-read.csv("Data/Processed/KruskalWallis.csv") 

# Make sure variables are correctly formatted
df2$Country <- as.factor(df2$Country)
df2$EVRank <- as.numeric(df2$EVRank)
df2$Bruggeman <- as.factor(df2$Bruggeman)
df2$HallinMancini <- as.factor(df2$HallinMancini)
df2$Humprecht2022 <- as.factor(df2$Humprecht2022)

# Conduct Kruskal-Wallist Test between EV Ranking and classification by Brüggeman et al. (2014)
kruskal_bruggeman <- kruskal.test(EVRank ~ Bruggeman, data = df2)

# Conduct Kruskal-Wallist Test between EV Ranking and classification by Hallin and Mancini (2004)
kruskal_hallinmancini <- kruskal.test(EVRank ~ HallinMancini, data = df2)

# Conduct Kruskal-Wallist Test between EV Ranking and classification by Brüggeman et al. (2014)
kruskal_humprecht2022 <- kruskal.test(EVRank ~ Humprecht2022, data = df2)

We are now ready to print test results.

# See results for the groups from Brüggeman et al. (2014):
print(kruskal_bruggeman)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  EVRank by Bruggeman
## Kruskal-Wallis chi-squared = 10.021, df = 4, p-value = 0.04008

The Kruskal-Wallis chi-squared statistic is 10.021. The degrees of freedom (df) are 4. The p-value is 0.04008. Since the p-value is less than 0.05, this suggests that there is a statistically significant difference in the EV rankings among the groups classified by Brüggeman and colleagues.

# See results for the groups from Hallin and Mancini (2004):
print(kruskal_hallinmancini)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  EVRank by HallinMancini
## Kruskal-Wallis chi-squared = 11.777, df = 3, p-value = 0.008187

The Kruskal-Wallis chi-squared statistic is 11.777. The degrees of freedom (df) are 3. The p-value is 0.008187. Here, the p-value is also less than 0.05. This suggests that there are statistically significant differences in the central tendencies of the EV rankings across the different categories defined in Hallin and Mancini’s study.

# See results for the groups from Humprecht et al. (2022):
print(kruskal_humprecht2022)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  EVRank by Humprecht2022
## Kruskal-Wallis chi-squared = 11.376, df = 2, p-value = 0.003387

Turning to the last typology considered, the Kruskal-Wallis chi-squared statistic is 11.376. The degrees of freedom (df) are 2. The p-value is 0.003387. Here again, the p-value is also less than 0.05, which indicates a statistically significant difference in the EV rankings among the groups classified by Humprecht and colleagues.

Calculating Spearman’s rank correlation rho with Humprecht et al. (2022)

# Load dataset, run the following line of code
df3 <-read.csv("Data/Processed/SpearmanHumprecht.csv")

# Replace 'Ranking1' and 'Ranking2' with the actual column names
spearman_test <- cor.test(df3$EVRank, df3$Humprecht, method = "spearman")

# Print the results
print(spearman_test)
## 
##  Spearman's rank correlation rho
## 
## data:  df3$EVRank and df3$Humprecht
## S = 38, p-value < 0.00000000000000022
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.9164835

The test results show Spearman’s rank correlation coefficient (rho) is 0.9164835. The sum of the differences between ranks squared (S) is 38. The p-value is less than 2.2e-16. These figures are indicative of a very strong positive association between the two sets of country rankings. The p-value being much lower than 0.05 indicates that the correlation observed is highly statistically significant.

Appendix Material

The appendix for this article contains a lot of material. Much of that material is just tables reporting country scores on independent variables used in Model 1 and Model 2. This part of the code will help you replicate other appendix materials, such as maps, graphical comparisons of models using alternative measures as robustness checks, and regression tables for all alternative models that are reported on. The results below are not reported in the paper manuscript.

At this point, please load in the dataset called “EV_Labarre2024_appendix.csv.”

# Load the dataset
df <-read.csv("Data/Processed/EV_Labarre2024_appendix.csv")

# Disable scientific notation
options(scipen=999)

The next bit of code defines the variables in the dataset like earlier.

Country <- df$country 
LeftWingPopulism <- df$left_wing_populism
RightWingPopulism <- df$right_wing_populism
AllPopulism <- df$all_populism
PBS_DailyViewership <- df$pbs_audience_size
IdeologicalPolarization <- df$ideological_polarization 
IdeologicalPolarizationEmanueleMarino2023 <- df$ideological_polarization_Emanuele_Marino2023
Dalton2021 <- df$Dalton2021
AffectivePolarization <- df$affective_polarization 
AffpolVDEM <- df$v2cacamps
IdeopolVDEM <- df$v2smpolsoc
EffectiveNumberParties <- df$effective_number_parties
AudiencePolarization <- df$audience_polarization 
AudienceDuplication <- df$audience_duplication
ParallelismTelevision <- df$parallelism_television
ParallelismNewspapers <- df$parallelism_newspapers
ParallelismHumprecht2022 <- df$Parallelism_Humprecht2022
EpistemicVulnerability <-df$epistemic_vulnerability

Appendix 1: Maps of Epistemic Vulnerability and Populist Strongholds.

In order to replicate this map, it is important that you run the code below in the exact order specified below. If you run this code in a different order, you might make errors in specifying the Coordinate Reference System (CRS), and the map might show the wrong geographical area.

First we need to download world geographic data.

# Fetch geographic data
world <- ne_countries(scale="medium", returnclass="sf") %>%
  filter(admin != "Antarctica")

The map shown in Appendix 1 is actually several maps combined together. First, we need to plot the epistemic vulnerability map for European countries.

# Setting and transforming the map projection of world
EU_crs <- "+proj=wintri"

EU_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0") # The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.


# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-12, 30)), # Left, bottom -- essentially the coordinates of the lower left corner of the map
  st_point(c(60, 70)), # Right, top -- essentially the coordinates of the upper right corner of the map
  crs = 4326 # the EPSG identifier of WGS84 (used in GPS)
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0") %>%
  st_coordinates() # Retrieve coordinates

# Plot epistemic vulnerability map for European countries
EU_EVmap <-EU_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = epistemic_vulnerability)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(panel.background = element_rect(fill = "aliceblue")) +
  labs(
    fill = "Epistemic Vulnerability"
  )

Let’s do the same thing for the US.

# Setting and transforming the map projection of world
US_crs <- "+proj=wintri"

US_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") # The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.

# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-115, 10)), #left, bottom
  st_point(c(-30, 80)), #right, top
  crs = 4326 #the EPSG identifier of WGS84 (used in GPS)
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") %>%
  st_coordinates() # Retrieve coordinates

# Plot epistemic vulnerability map for the US
US_EVmap <- US_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = epistemic_vulnerability)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(
    panel.background = element_rect(fill = "aliceblue"),
    legend.position = "none"  # This line removes the legend
  ) +
  labs(
    title = "Epistemic Vulnerability"
  )

Now, we can combine the two maps together.

# Combine the EV maps for the EU and the US 
EV_map <- US_EVmap+ EU_EVmap 

Let’s do the same thing for the variable “all populism.”

# Setting and transforming the map projection of world
EU_crs <- "+proj=wintri"

EU_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0") # The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.

# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-12, 30)), #left, bottom
  st_point(c(60, 70)), #right, top
  crs = 4326 #the EPSG identifier of WGS84 (used in GPS)
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0") %>%
  st_coordinates() # retrieve coordinates

# Plot all populism map for the European countries
EUpopulism_map <-EU_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = all_populism)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1, limits = c(0, 70)) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(panel.background = element_rect(fill = "aliceblue")) +
  labs(
    fill = "Vote Share (%)",
    caption = "Data from Labarre (2024)" 
  )

Doing the same thing for the US.

# Setting and transforming the map projection of world
US_crs <- "+proj=wintri"

US_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") # The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.

# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-115, 10)), #left, bottom
  st_point(c(-30, 80)), #right, top
  crs = 4326 #the EPSG identifier of WGS84 (used in GPS) 
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") %>%
  st_coordinates() # retrieve coordinates

# Plot all populism map for the US
USpopulism_map <- US_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = all_populism)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1, limits = c(0, 70)) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(
    panel.background = element_rect(fill = "aliceblue"),
    legend.position = "none"  # This line removes the legend
  ) +
  labs(title = "Populist Strongholds"
  )

Now, we can combine the two maps together.

# Combine the EV maps for the EU and the US 
allpop_map <- USpopulism_map + EUpopulism_map

Finally, let’s stack the two sets of maps.

# Stack the maps for all populism and epistemic vulnerability
EV_populism_map <- EV_map / allpop_map 
print(EV_populism_map)

# Save the figure, the file should appear in your working directory as "Appendix1.jpeg"
ggsave("Output/Appendix1.jpeg",device="jpeg",  plot = EV_populism_map, width = 11, height = 13, dpi = 300, bg="white") # for color reproduction
ggsave("Output/Appendix1.jpeg", device="jpeg",  plot = EV_populism_map, width = 11, height = 13, dpi = 600, bg="white") # for grayscale reproduction

Appendix 2: Geographical Distribution of Left- and Right-Wing Populism.

The process is essentially the same for the maps in Appendix 2. In order to replicate this map, it is important that you run the code below in the exact order specified below. If you run this code in a different order, you might make errors in specifying the Coordinate Reference System (CRS), and the map might show the wrong geographical area.

If you haven’t run the code for Appendix 1, you should run the following code to fetch world geographical data first.

# Fetch geographic data
world <- ne_countries(scale="medium", returnclass="sf") %>%
  filter(admin != "Antarctica")

You can now proceed with the maps for both left- and right-wing populism. The figure shown in Appendix 2 is actually several maps combined together. First, we need to plot the map for left-wing populism in European countries.

# Setting and transforming the map projection of world
EU_crs <- "+proj=wintri"

EU_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0")# The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.

# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-12, 30)), #left, bottom
  st_point(c(60, 70)), #right, top
  crs = 4326 #the EPSG identifier of WGS84 (used in GPS)
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0") %>%
  st_coordinates() # retrieve coordinates

# Plot the map for left-wing populism for European countries
EUlwp_map <-EU_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = left_wing_populism)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1, limits = c(0, 70)) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(panel.background = element_rect(fill = "aliceblue")) +
  labs(
    fill = "Vote Share (%)"
  )

Let’s do the same thing for the US.

# Setting and transforming the map projection of world
US_crs <- "+proj=wintri"

US_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") #The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.

# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-115, 10)), #left, bottom
  st_point(c(-30, 80)), #right, top
  crs = 4326 #the EPSG identifier of WGS84 (used in GPS)
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") %>%
  st_coordinates() # retrieve coordinates

# Plot the map for left-wing populism for the US
USlwp_map <- US_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = left_wing_populism)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1, limits = c(0, 70)) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(
    panel.background = element_rect(fill = "aliceblue"),
    legend.position = "none"  # This line removes the legend
  ) +
  labs(
    title = "Electoral Strength of Left-Wing Populists"
  )

We can now combine maps for left-wing populism.

# Combine the maps for left-wing populism for the US and European countries
lwp_map <- USlwp_map + EUlwp_map

We repeat the exact same process for right-wing populism.

# Setting and transforming the map projection of world
EU_crs <- "+proj=wintri"

EU_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0") #The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.

# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-12, 30)), #left, bottom
  st_point(c(60, 70)), #right, top
  crs = 4326 #the EPSG identifier of WGS84 (used in GPS)
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=0 +lat_0=0") %>%
  st_coordinates() # Retrieve coordinates

# Plot the map for right-wing populism for the European countries
EUrwp_map <-EU_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = right_wing_populism)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1, limits = c(0, 70)) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(panel.background = element_rect(fill = "aliceblue")) +
  labs(
    fill = "Vote Share (%)",
    caption = "Data from Labarre (2024)" 
  )

Let’s do this one more time, for right-wing populism in the US.

# Setting and transforming the map projection of world

US_crs <- "+proj=wintri"

US_wintri <- world %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") #The string here defines a Lambert Azimuthal Equal-Area (LAEA) projection. The parameters set the center and offsets for the projection.

# Create and transforming bounding box to define the spatial extent of the map
window_coord <- st_sfc(
  st_point(c(-115, 10)), #left, bottom
  st_point(c(-30, 80)), #right, top
  crs = 4326 #the EPSG identifier of WGS84 (used in GPS)
)

window_coord_sf <- window_coord %>%
  st_transform(crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=-74 +lat_0=40") %>%
  st_coordinates() # retrieve coordinates

# Plot the map for right-wing populism in the US 
USrwp_map <- US_wintri %>%
  left_join(df, by = c("iso_a3" = "country_code")) %>% 
  ggplot() + 
  geom_sf(aes(fill = right_wing_populism)) +
  # window of the map
  coord_sf(
    xlim = window_coord_sf[, "X"],
    ylim = window_coord_sf[, "Y"],
    expand = FALSE
  ) + scale_fill_viridis(option="rocket", direction=-1, limits = c(0, 70)) +
  scale_x_continuous(
    labels = function(x) paste0(x, '\u00B0', "W")
  ) +
  scale_y_continuous(
    labels = function(x) paste0(x, '\u00B0', "N")
  ) +
  theme_bw() +
  theme(
    panel.background = element_rect(fill = "aliceblue"),
    legend.position = "none"  # This line removes the legend
  ) +
  labs(
    title = "Electoral Strength of Right-Wing Populists"
  )

The next step is to combine maps for the European countries and the US.

# Combine maps for right-wing populism in the EU and the US
rwp_map <- USrwp_map + EUrwp_map

We can now stack the maps for left- and right-wing populism and export the file.

# Stack maps for left-wing and right-wing populism 
combinedpopulism_map <- lwp_map / rwp_map 
print(combinedpopulism_map)

# Save the figure, the file should appear in your working directory as "Appendix1.jpeg"
ggsave("Output/Appendix2.jpeg", device="jpeg", plot = combinedpopulism_map, width = 11, height = 13, dpi = 300, bg="white") # for color reproduction
ggsave("Output/Appendix2.jpeg", device="jpeg",  plot = combinedpopulism_map, width = 11, height = 13, dpi = 600, bg="white") # for grayscale reproduction

Appendix 4. Affective Polarization Scores.

# Order alphabetically per country
sorted_df_AP <- df[order(df[, 3]), c(3, 22, 21)]

# Now use stargazer on the sorted dataframe and make table with affective polarization and election year
stargazer(sorted_df_AP, 
          type = "html", 
          title = "Affective Polarization Scores", 
          summary = FALSE, 
          rownames = FALSE, 
          covariate.labels = c("Country", "Election Year", "AP Score"),
          digits = 1, digit.separator = "", notes ="Note: In-party and out-party evaluations were collected by CSES (III-V) on a scale from 0 to 10, where 10 is the most positive evaluation and 0 the most negative. The theoretical maximum average difference in in-party and out-party evaluations is thus 10, and the minimum is 0. The United States AP score was calculated on the basis of leader evaluations, i.e., Trump and Biden. The AP score for France was calculated using party evaluations in the first round of the presidential election. All other figures were calculated using party evaluations in the lower house election (first round, when applicable).")
Affective Polarization Scores
Country Election Year AP Score
Austria 2017 4.5
Bulgaria 2014 6.9
Czech Republic 2013 5.3
Denmark 2019 4.7
Finland 2019 4.8
France 2017 5.1
Germany 2017 3.9
Greece 2015 5.3
Hungary 2018 6.7
Ireland 2016 4.7
Italy 2018 5.3
Netherlands 2017 3.5
Poland 2011 5.3
Portugal 2019 4.6
Romania 2014 5.5
Slovakia 2020 5.9
Spain 2008 5.1
Sweden 2018 5.2
United Kingdom 2017 4.3
United States 2020 6.9
Note: In-party and out-party evaluations were collected by CSES (III-V) on a scale from 0 to 10, where 10 is the most positive evaluation and 0 the most negative. The theoretical maximum average difference in in-party and out-party evaluations is thus 10, and the minimum is 0. The United States AP score was calculated on the basis of leader evaluations, i.e., Trump and Biden. The AP score for France was calculated using party evaluations in the first round of the presidential election. All other figures were calculated using party evaluations in the lower house election (first round, when applicable).

Appendix 5. Ideological Polarization Scores.

# Order alphabetically per country
sorted_df_IP <- df[order(df[, 3]), c(3, 14, 15, 16)]

# Now use stargazer on the sorted dataframe and make table with election year, ideological polarization, and fixes
stargazer(sorted_df_IP, 
          type = "html", 
          title = "Ideological Polarization Scores", 
          summary = FALSE, 
          rownames = FALSE, 
          covariate.labels = c("Country", "Election Year", "IP Score", "Fixes Performed"),
          digits = 1, digit.separator = "")
Ideological Polarization Scores
Country Election Year IP Score Fixes Performed
Austria 4.7 2017
Bulgaria 4.0 2017 Updated the electoral size of parties in 2014 with 2017 results.
Czech Republic 6.6 2017 Updated the electoral size of parties in 2013 with 2017 results.
Denmark 6.6 2019
Finland 4.0 2019
France 7.7 2017
Germany 3.6 2017
Greece 5.7 2015
Hungary 6.4 2018
Ireland 2.8 2016
Italy 4.3 2018
Netherlands 8.5 2017
Poland 1.7 2015 Presidential election data missing. Estimated L-R position of all candidates using ratings given to their current or former party by CSES experts for the legislative elections
Portugal 6.4 2016 Presidential election data missing. Estimated the L-R position of all candidates using the ratings given to their current or former party by CSES experts for the 2019 elections.
Romania 2.0 2019 Presidential election data missing. Estimated L-R position of all candidates using ratings given to their current or former party by CSES experts for the legislative elections.
Slovakia 7.6 2020
Spain 6.3 2019 Data entirely missing. Estimated the L-R position of parties using a SocioMétrica poll of Spanish voters and 2019 election results for weights.
Sweden 4.9 2018
United Kingdom 8.1 2017
United States 4.2 2016

Appendix 6. Electoral Strength of Populist Organizations.

# Order alphabetically per country
sorted_df_Pop <- df[order(df[, 3]), c(3, 10, 11, 12)]

# Now use stargazer on the sorted dataframe and make table with left-wing populism, right-wing populism, and all populism
stargazer(sorted_df_Pop, 
          type = "html", 
          title = "Electoral Strength of Populist Organizations", 
          summary = FALSE, 
          rownames = FALSE, 
          covariate.labels = c("Country", "Left-Wing Populism (%)", "Right-Wing Populism (%)", "All Populism (%)"),
          digits = 1, digit.separator = "")
Electoral Strength of Populist Organizations
Country Left-Wing Populism (%) Right-Wing Populism (%) All Populism (%)
Austria 0.7 27.6 28.3
Bulgaria 0.3 14.4 14.7
Czech Republic 8.2 12 20.2
Denmark 7.8 21.1 28.9
Finland 0.3 17.9 18.2
France 19.6 26 45.6
Germany 9.3 13 22.3
Greece 45.1 11.9 57
Hungary 0.3 68.6 68.9
Ireland 4.1 0 4.1
Italy 33.9 22.8 56.7
Netherlands 9.1 16.9 26
Poland 0.1 50.5 50.6
Portugal 4.0 11.9 15.9
Romania 0.4 0 0.4
Slovakia 0.6 23.2 23.8
Spain 21.2 0.2 21.4
Sweden 8 17.8 25.8
United Kingdom 0 2.9 2.9
United States 21.6 46.1 67.7

Appendix 8. Daily Viewership of Public Broadcasting.

# Order alphabetically per country
sorted_df_PBS <- df[order(df[, 3]), c(3, 23)]

# Now use stargazer on the sorted dataframe and make table with daily viewership of PBS
stargazer(sorted_df_PBS, 
          type = "html", 
          title = "Daily Viewership of Public Broadcasting", 
          summary = FALSE, 
          rownames = FALSE, 
          covariate.labels = c("Country", "Daily Viewership of PBS (%)"),
          digits = 1, digit.separator = "")
Daily Viewership of Public Broadcasting
Country Daily Viewership of PBS (%)
Austria 31.9
Bulgaria 6.7
Czech Republic 30.2
Denmark 76
Finland 43.7
France 31.3
Germany 47.8
Greece 9.1
Hungary 12.7
Ireland 27.4
Italy 36.2
Netherlands 32
Poland 28.3
Portugal 14.6
Romania 4.1
Slovakia 14
Spain 23.7
Sweden 34.9
United Kingdom 46.3
United States 9.6

Appendix 9.A. Model 1.

# Format Regression Table
stargazer(Model1, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Epistemic Vulnerability Index"), title = "Model 1 Regression Results", covariate.labels = c("Affective Polarization", "Ideological Polarization", "Effective Number of Parties", "Left-Wing Populism", "Right-Wing Populism", "Daily Viewership of PBS", "Political Parallelism"))
Model 1 Regression Results
Dependent variable:
Epistemic Vulnerability Index
Affective Polarization 0.118 (0.492)
p = 0.816
Ideological Polarization 0.364 (0.157)
p = 0.040*
Effective Number of Parties -0.499 (0.193)
p = 0.024*
Left-Wing Populism 0.055 (0.023)
p = 0.038*
Right-Wing Populism 0.020 (0.019)
p = 0.323
Daily Viewership of PBS -0.044 (0.024)
p = 0.094.
Political Parallelism 1.266 (0.561)
p = 0.044*
Constant 0.404 (3.154)
p = 0.901
Observations 20
R2 0.853
Adjusted R2 0.766
Residual Std. Error 1.235 (df = 12)
F Statistic 9.910*** (df = 7; 12)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Appendix 9.B. Model 2.

# Format Regression Table
stargazer(Model2, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Epistemic Vulnerability Index"), title = "Model 2 Regression Results", covariate.labels = c("Affective Polarization", "Ideological Polarization", "Effective Number of Parties", "All Populism", "Daily Viewership of PBS", "Political Parallelism"))
Model 2 Regression Results
Dependent variable:
Epistemic Vulnerability Index
Affective Polarization -0.059 (0.478)
p = 0.904
Ideological Polarization 0.378 (0.160)
p = 0.034*
Effective Number of Parties -0.483 (0.196)
p = 0.029*
All Populism 0.034 (0.016)
p = 0.055.
Daily Viewership of PBS -0.048 (0.024)
p = 0.069.
Political Parallelism 1.353 (0.566)
p = 0.033*
Constant 1.212 (3.137)
p = 0.706
Observations 20
R2 0.834
Adjusted R2 0.758
Residual Std. Error 1.257 (df = 13)
F Statistic 10.925*** (df = 6; 13)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Appendix 10.A: Models Comparing Measures of Affective Polarization.

To replicate this figure from the appendix, you will first need to specify the alternative models, which substitute the measure of affective polarization used in the main models, Model 1 and Model 2, with an alternative measure from the V-DEM dataset (year 2018).

# Specify the alternative models using data from V-DEM
AltModel1_VDEM <- lm(EpistemicVulnerability ~ AffpolVDEM + IdeologicalPolarization +
                        EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + 
                        PBS_DailyViewership + ParallelismHumprecht2022)

AltModel2_VDEM <- lm(EpistemicVulnerability ~ AffpolVDEM + IdeologicalPolarization +
                        EffectiveNumberParties + AllPopulism + 
                        PBS_DailyViewership +
                        ParallelismHumprecht2022)

We can now reproduce the graphical comparison of Models 1 and 2 with the two alternative models.

# Generate comparative summary plot for the mains models and the alternative models using V-DEM data
plotsumm <- plot_summs(Model1, AltModel1_VDEM, Model2, AltModel2_VDEM, scale = TRUE, legend.title = "Model",
                       coefs = rev(c("Affective\nPolarization" = "AffectivePolarization",
                                     "Affective\nPolarization" = "AffpolVDEM",
                                     "Ideological\nPolarization" = "IdeologicalPolarization",
                                     "Effective\nNumber of\nParties" = "EffectiveNumberParties",
                                     "Vote Share\nAll Populists\n(%)" = "AllPopulism",
                                     "Vote Share\nLWP\n(%)" = "LeftWingPopulism",
                                     "Vote Share\nRWP\n(%)" = "RightWingPopulism",
                                     "Daily\nViewership\nPBS (%)" = "PBS_DailyViewership",
                                     "Parallelism\n(Humprecht et\nal. 2022)" = "ParallelismHumprecht2022")),
                       model.names = c("Model 1\n(original measure)", "Model 1\n(V-DEM measure)", "Model 2\n(original measure)", "Model 2\n(V-DEM measure)"))

# Customize the output and plot the figure
Appendix10A <- plotsumm + labs(
  title = "",
  caption = ""
) +
  theme(
    plot.title = element_text( face = "plain", hjust = 0.5),
    plot.caption = element_text( face = "plain", hjust = 0.5, size = 12),
    legend.position = "bottom",
    legend.text = element_text( size = 12),
    axis.text.x = element_text( size = 12),
    axis.text.y = element_text( size = 12))  +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 0, ymax = 1.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Affective Polarization
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 3.5, ymax = 6.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Populism
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 6.5, ymax = 7.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Public Media
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)+
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 1.5, ymax = 2.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Ideological Polarization
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)+
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 2.5, ymax = 3.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Effective Number of Parties
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)+
  geom_rect(
    aes(xmin = Inf, xmax = 0, ymin = 7.5, ymax = 8.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Parallelism
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)

# Print the figure
Appendix10A

# Save the plot, the file should appear in your working directory as "Appendix10A.jpeg"
ggsave("Output/Appendix10A.jpeg", device="jpeg", plot = Appendix10A, width = 9.5, height = 13, dpi = 300, bg="white") # for color reproduction
ggsave("Output/Appendix10A.jpeg", device="jpeg", plot = Appendix10A, width = 9.5, height = 13, dpi = 600, bg="white") # for grayscale reproduction

Appendix 10.B: Models Comparing Measures of Ideological Polarization.

To replicate this figure from the appendix, you need to specify the alternative models, which substitute the measure of ideological polarization used in the main models, Model 1 and Model 2, with alternative measures from Emanuele & Marino (2023) and Dalton (2021). Note that the recent figures from Emanuele & Marino are only available for 13 countries out of the 20 countries considered in my study. This is expected to have an important effect on significance levels.

# Specify the alternative models using data from Emanuele & Marino (2023) and Dalton (2021)
AltModel1_EmanueleMarino2023 <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarizationEmanueleMarino2023 +
                         EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + 
                         PBS_DailyViewership +
                         ParallelismHumprecht2022)

AltModel2_EmanueleMarino2023 <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarizationEmanueleMarino2023 +
                         EffectiveNumberParties + AllPopulism + 
                         PBS_DailyViewership +
                         ParallelismHumprecht2022)

AltModel1_Dalton2021 <- lm(EpistemicVulnerability ~ AffectivePolarization + Dalton2021 +
                             EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + 
                             PBS_DailyViewership +
                             ParallelismHumprecht2022)

AltModel2_Dalton2021 <- lm(EpistemicVulnerability ~ AffectivePolarization + Dalton2021 +
                             EffectiveNumberParties + AllPopulism + 
                             PBS_DailyViewership +
                             ParallelismHumprecht2022)

We can now reproduce the graphical comparison of Models 1 and 2 with the four alternative models.

# Generate comparative summary plot for the mains models and the alternative models using data from Emanuele & Marino (2023) and Dalton (2021)
plotsumm <- plot_summs(Model1, AltModel1_EmanueleMarino2023, AltModel1_Dalton2021, Model2, AltModel2_EmanueleMarino2023, AltModel2_Dalton2021, scale = TRUE, legend.title = "Model",
                       coefs = rev(c("Affective\nPolarization" = "AffectivePolarization",
                                     "Ideological\nPolarization" = "IdeologicalPolarization",
                                     "Ideological\nPolarization" = "IdeologicalPolarizationEmanueleMarino2023",
                                     "Ideological\nPolarization" = "Dalton2021",
                                     "Effective\nNumber of\nParties" = "EffectiveNumberParties",
                                     "Vote Share\nAll Populists\n(%)" = "AllPopulism",
                                     "Vote Share\nLWP\n(%)" = "LeftWingPopulism",
                                     "Vote Share\nRWP\n(%)" = "RightWingPopulism",
                                     "Daily\nViewership\nPBS (%)" = "PBS_DailyViewership",
                                     "Parallelism\n(Humprecht et\nal. 2022)" = "ParallelismHumprecht2022")),
                       model.names = c("Model 1\n(original measure)", "Model 1\n(Emmanuele and Marino 2023)", "Model 1\n(Dalton 2021)", "Model 2\n(original measure)", "Model 2\n(Emmanuele and Marino 2023)", "Model 2\n(Dalton 2021)"))

# Customize the output and plot the figure
Appendix10B <- plotsumm + labs(
  title = "",
  caption = ""
) +
  theme(
    plot.title = element_text( face = "plain", hjust = 0.5),
    plot.caption = element_text( face = "plain", hjust = 0.5, size = 12),
    legend.position = "bottom",
    legend.text = element_text( size = 12),
    axis.text.x = element_text( size = 12),
    axis.text.y = element_text( size = 12)
  )  +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 0, ymax = 2.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Ideological and Affective Polarization
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")
    ),
    inherit.aes = FALSE
  ) +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 3.5, ymax = 6.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Populism
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")
    ),
    inherit.aes = FALSE
  ) +
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 6.5, ymax = 7.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Public Media
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")
    ),
    inherit.aes = FALSE
  )+
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 2.5, ymax = 3.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Effective Number of Parties
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")
    ),
    inherit.aes = FALSE)+
  geom_rect(
    aes(xmin = Inf, xmax = 0, ymin = 7.5, ymax = 8.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Parallelism
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")
    ),
    inherit.aes = FALSE)

# Print the figure
Appendix10B

# Save the plot, the file should appear in your working directory as "Appendix10B.jpeg"
ggsave("Output/Appendix10B.jpeg", device="jpeg", plot = Appendix10B, width = 9.5, height = 13, dpi = 300, bg="white") # for color reproduction
ggsave("Output/Appendix10B.jpeg", device="jpeg", plot = Appendix10B, width = 9.5, height = 13, dpi = 600, bg="white") # for grayscale reproduction

Appendix 10.C: Models Comparing Measures of Political Parallelism.

To replicate this figure from the appendix, you need to specify the alternative models, which substitute the measure of political parallelism used in the main models, Model 1 and Model 2, with alternative measures for newspaper parallelism and television parallelism from the European Media Systems Survey (2010).

# Specify the alternative models using data from Emanuele & Marino (2023) and Dalton (2021)
AltModel1_EMSS2010 <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                            EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + 
                            PBS_DailyViewership + ParallelismNewspapers + ParallelismTelevision)

AltModel2_EMSS2010 <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                            EffectiveNumberParties + AllPopulism + 
                            PBS_DailyViewership + ParallelismNewspapers + ParallelismTelevision)

We can now reproduce the graphical comparison of Models 1 and 2 with the two alternative models.

# Generate comparative summary plot for the mains models and the alternative models using data from Emanuele & Marino (2023) and Dalton (2021)
plotsumm <- plot_summs(Model1, Model2, AltModel1_EMSS2010, AltModel2_EMSS2010, scale = TRUE, legend.title = "Model",
                       coefs = rev(c("Affective\nPolarization" = "AffectivePolarization",
                                     "Ideological\nPolarization" = "IdeologicalPolarization",
                                     "Effective\nNumber of\nParties" = "EffectiveNumberParties",
                                     "Vote Share\nAll Populists\n(%)" = "AllPopulism",
                                     "Vote Share\nLWP\n(%)" = "LeftWingPopulism",
                                     "Vote Share\nRWP\n(%)" = "RightWingPopulism",
                                     "Daily\nViewership\nPBS (%)" = "PBS_DailyViewership",
                                     "Parallelism\nTelevision\n(EMSS 2010)" = "ParallelismTelevision",
                                     "Parallelism\nNewspapers\n(EMSS 2010)" = "ParallelismNewspapers",
                                     "Parallelism\n(Humprecht et\nal. 2022)" = "ParallelismHumprecht2022")),
                       model.names = c("Model 1\n(Humprecht et al. 2022)", "Model 2\n(Humprecht et al. 2022)", "Model 1\n(EMSS 2010)", "Model 2\n(EMSS 2010)"))

# Customize output and plot the figure
Appendix10C <- plotsumm + labs(
  title = "",
  caption = "") +
  theme(
    plot.title = element_text( face = "plain", hjust = 0.5),
    plot.caption = element_text( face = "plain", hjust = 0.5, size = 12),
    legend.position = "bottom",
    legend.text = element_text( size = 12),
    axis.text.x = element_text( size = 12),
    axis.text.y = element_text( size = 12))  +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 0, ymax = 2.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Ideological and Affective Polarization
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 3.5, ymax = 6.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Populism
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = 0, xmax = Inf, ymin = 7.5, ymax = 10.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Parallelism variables
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE) +
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 2.5, ymax = 3.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for the Effective Number of Parties
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)+
  geom_rect(
    aes(xmin = -Inf, xmax = 0, ymin = 6.5, ymax = 7.5),
    fill = "aquamarine", #the fill here is showing hypothesized direction for Daily PBS Viewership
    alpha = 0.3,
    data = data.frame(
      variable = c(""),
      hypothesized_direction = c("")),
    inherit.aes = FALSE)

# Plot the figure
Appendix10C

# Save the plot, the file should appear in your working directory as "Appendix10C.jpeg"
ggsave("Output/Appendix10C.jpeg", device="jpeg", plot = Appendix10C, width = 9.5, height = 13, dpi = 300, bg="white") # for color reproduction
ggsave("Output/Appendix10C.jpeg", device="jpeg", plot = Appendix10C, width = 9.5, height = 13, dpi = 600, bg="white") # for grayscale reproduction

Appendix 11.A: Alternative Models Using Parallelism From EMSS (2010).

The following two models substitute the political parallelism measure used in the main models, Model 1 and Model 2, with an alternative measure from the European Media Systems Survey (2010). These models allow us to differentiate between the effects of newspaper parallelism and television parallelism, though the data are older and maybe less reliable.

# Specify alternative models
# Using media-party parallelism from EMSS (2010)
AltModel_Appendix11A <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                             EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + 
                             PBS_DailyViewership + ParallelismNewspapers + ParallelismTelevision)

# Using media-party parallelism from EMSS (2010), populism collapsed
AltModel_Appendix11B <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                             EffectiveNumberParties + AllPopulism + 
                             PBS_DailyViewership + ParallelismNewspapers + ParallelismTelevision)

# Format Regression Table
stargazer(AltModel_Appendix11A, AltModel_Appendix11B, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Epistemic Vulnerability Index"), title = "Alternative Models Regression Results", covariate.labels = c("Affective Polarization", "Ideological Polarization", "Effective Number of Parties", "Left-Wing Populism", "Right-Wing Populism", "All Populism", "Daily Viewership of PBS", "Newspaper Parallelism (EMSS 2010)", "Television Parallelism (EMSS 2010)"))
Alternative Models Regression Results
Dependent variable:
Epistemic Vulnerability Index
(1) (2)
Affective Polarization 0.846 (0.483) 0.863 (0.468)
p = 0.111 p = 0.093.
Ideological Polarization 0.242 (0.176) 0.223 (0.167)
p = 0.198 p = 0.210
Effective Number of Parties -0.036 (0.253) -0.103 (0.219)
p = 0.890 p = 0.647
Left-Wing Populism 0.019 (0.036)
p = 0.620
Right-Wing Populism 0.042 (0.021)
p = 0.071.
All Populism 0.037 (0.019)
p = 0.070.
Daily Viewership of PBS -0.065 (0.024) -0.066 (0.023)
p = 0.022* p = 0.016*
Newspaper Parallelism (EMSS 2010) 0.590 (0.223) 0.513 (0.177)
p = 0.025* p = 0.015*
Television Parallelism (EMSS 2010) 0.116 (0.173) 0.067 (0.147)
p = 0.517 p = 0.659
Constant -12.276 (5.367) -10.614 (4.456)
p = 0.046* p = 0.037*
Observations 19 19
R2 0.888 0.884
Adjusted R2 0.798 0.810
Residual Std. Error 1.150 (df = 10) 1.116 (df = 11)
F Statistic 9.876*** (df = 8; 10) 11.933*** (df = 7; 11)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Appendix 11.B: Alternative Models Using Affective Polarization From V-DEM (2018).

The following two models substitute the affective polarization measure used in the main models, Model 1 and Model 2, with an alternative measure from V-DEM (2018).

# Specify alternative models
# Using affective polarization from V-DEM (2018)
AltModel_Appendix11C <- lm(EpistemicVulnerability ~ AffpolVDEM + IdeologicalPolarization +
                             EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + 
                             PBS_DailyViewership + ParallelismHumprecht2022)

# Using affective polarization from V-DEM (2018), populism collapsed
AltModel_Appendix11D <- lm(EpistemicVulnerability ~ AffpolVDEM + IdeologicalPolarization +
                             EffectiveNumberParties + AllPopulism + 
                             PBS_DailyViewership + ParallelismHumprecht2022)

# Format Regression Table
stargazer(AltModel_Appendix11C, AltModel_Appendix11D, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Epistemic Vulnerability Index"), title = "Alternative Models Regression Results", covariate.labels = c("Affective Polarization (V-DEM)", "Ideological Polarization", "Effective Number of Parties", "Left-Wing Populism", "Right-Wing Populism", "All Populism", "Daily Viewership of PBS", "Political Paralellism"))
Alternative Models Regression Results
Dependent variable:
Epistemic Vulnerability Index
(1) (2)
Affective Polarization (V-DEM) 0.205 (0.322) 0.020 (0.302)
p = 0.538 p = 0.948
Ideological Polarization 0.356 (0.155) 0.378 (0.160)
p = 0.041* p = 0.034*
Effective Number of Parties -0.467 (0.196) -0.471 (0.202)
p = 0.035* p = 0.037*
Left-Wing Populism 0.052 (0.023)
p = 0.046*
Right-Wing Populism 0.012 (0.024)
p = 0.628
All Populism 0.032 (0.019)
p = 0.110
Daily Viewership of PBS -0.045 (0.022) -0.047 (0.023)
p = 0.064. p = 0.060.
Political Paralellism 1.136 (0.595) 1.326 (0.598)
p = 0.081. p = 0.045*
Constant 1.186 (1.240) 0.859 (1.256)
p = 0.358 p = 0.507
Observations 20 20
R2 0.857 0.834
Adjusted R2 0.773 0.758
Residual Std. Error 1.218 (df = 12) 1.257 (df = 13)
F Statistic 10.244*** (df = 7; 12) 10.914*** (df = 6; 13)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Appendix 11.C: Alternative Models Using Audience Polarization and Duplication, Parallelism From EMSS (2010)

The following three models are early iterations that included measures for audience polarization and audience duplication. Empirical evidence does not support their inclusion in the models. However, out of transparency regarding the process this research went through, the models are displayed in the table below. Two of the models below also use the measure of media-party parallelism from the European Media Systems Survey (2010), which distinguishes newspaper parallelism and television parallelism. The other does not include the variable at all.

# Specify alternative models
# Using audience polarization, Audience duplication, no parallelism
AltModel_Appendix11E <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                   EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + AudiencePolarization + 
                     AudienceDuplication + PBS_DailyViewership)

# Using audience polarization, audience duplication, parallelism data from EMSS (2010)
AltModel_Appendix11F <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                   EffectiveNumberParties + LeftWingPopulism + RightWingPopulism + AudiencePolarization + 
                     AudienceDuplication + PBS_DailyViewership + ParallelismNewspapers + ParallelismTelevision)

# Using audience polarization, audience duplication, parallelism data from EMSS (2010), populism collapsed
AltModel_Appendix11G <- lm(EpistemicVulnerability ~ AffectivePolarization + IdeologicalPolarization +
                   EffectiveNumberParties + AllPopulism + AudiencePolarization + AudienceDuplication +
                   PBS_DailyViewership + ParallelismNewspapers + ParallelismTelevision)


# Format Regression Table
stargazer(AltModel_Appendix11E, AltModel_Appendix11F, AltModel_Appendix11G, column.sep.width = "5pt", report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Epistemic Vulnerability Index"), title = "Alternative Models Regression Results", covariate.labels = c("Affective Polarization", "Ideological Polarization", "Effective Number of Parties", "Left-Wing Populism", "Right-Wing Populism", "All Populism", "Audience Polarization", "Audience Duplication", "Daily Viewership of PBS"))
Alternative Models Regression Results
Dependent variable:
Epistemic Vulnerability Index
(1) (2) (3)
Affective Polarization 0.426 (0.619) 0.832 (0.508) 0.844 (0.495)
p = 0.506 p = 0.140 p = 0.123
Ideological Polarization 0.247 (0.216) 0.302 (0.192) 0.275 (0.184)
p = 0.279 p = 0.155 p = 0.170
Effective Number of Parties -0.532 (0.254) 0.047 (0.277) -0.039 (0.245)
p = 0.061. p = 0.869 p = 0.877
Left-Wing Populism 0.070 (0.032) 0.019 (0.038)
p = 0.051. p = 0.637
Right-Wing Populism 0.024 (0.025) 0.050 (0.024)
p = 0.351 p = 0.066.
All Populism 0.042 (0.021)
p = 0.069.
Audience Polarization -1.669 (3.540) -0.970 (5.570) 0.013 (5.278)
p = 0.647 p = 0.867 p = 0.999
Audience Duplication -1.749 (4.624) 3.890 (4.763) 3.943 (4.645)
p = 0.713 p = 0.438 p = 0.418
Daily Viewership of PBS -0.068 (0.029) -0.057 (0.028) -0.061 (0.027)
p = 0.038* p = 0.075. p = 0.049*
ParallelismNewspapers 0.738 (0.283) 0.610 (0.219)
p = 0.032* p = 0.022*
ParallelismTelevision 0.096 (0.192) 0.026 (0.163)
p = 0.632 p = 0.878
Constant 1.674 (5.283) -17.289 (7.356) -14.877 (6.447)
p = 0.758 p = 0.047* p = 0.047*
Observations 20 19 19
R2 0.795 0.903 0.896
Adjusted R2 0.646 0.781 0.792
Residual Std. Error 1.520 (df = 11) 1.196 (df = 8) 1.166 (df = 9)
F Statistic 5.336** (df = 8; 11) 7.425** (df = 10; 8) 8.609** (df = 9; 9)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Appendix 12. Typologies of Media Systems.

# Use stargazer on the sorted dataframe and make table of past media systems typologies
stargazer(df2, 
          type = "html", 
          title = "Typologies of Media Systems", 
          summary = FALSE, 
          rownames = FALSE, 
          covariate.labels = c("Country", "EV Index Rank", "Brüggeman et al. (2014)", "Hallin and Mancini (2004)", "Humprecht et al. (2022)"),
          digits = 1, digit.separator = "")
Typologies of Media Systems
Country EV Index Rank Brüggeman et al. (2014) Hallin and Mancini (2004) Humprecht et al. (2022)
Finland 1 Northern Democratic Corporatist Democratic Corporatist
Denmark 2 Northern Democratic Corporatist Democratic Corporatist
Netherlands 3 Western Democratic Corporatist Democratic Corporatist
Ireland 4 Liberal Hybrid
Sweden 5 Northern Democratic Corporatist Democratic Corporatist
Germany 6 Central Democratic Corporatist Democratic Corporatist
Austria 7 Central Democratic Corporatist Democratic Corporatist
United Kingdom 8 Central Liberal Hybrid
Romania 9 Polarized Pluralist
Portugal 10 Western Polarized Pluralist Polarized Pluralist
France 11 Southern Polarized Pluralist Polarized Pluralist
Slovakia 12 Polarized Pluralist
Italy 13 Southern Polarized Pluralist Polarized Pluralist
Czech Republic 14 Hybrid
Poland 15 Polarized Pluralist
Bulgaria 16 Polarized Pluralist
United States 17 Western Liberal Hybrid
Spain 18 Southern Polarized Pluralist Polarized Pluralist
Greece 19 Southern Polarized Pluralist Polarized Pluralist
Hungary 20 Polarized Pluralist

Appendix 13. Comparison EV Index & Humprecht et al. (2020) Country Rankings.

# Use stargazer on the sorted dataframe and make table comparing EV Index rank and results from Humprecht et al., (2020)
stargazer(df3, 
          type = "html", 
          title = "Comparison EV Index & Humprecht et al. (2020) Country Rankings", 
          summary = FALSE, 
          rownames = FALSE, 
          covariate.labels = c("Country", "EV Index Rank", "Resilience to Disinformation Rank (Humprecht et al., 2020)"),
          digits = 1, digit.separator = "")
Comparison EV Index & Humprecht et al. (2020) Country Rankings
Country EV Index Rank Resilience to Disinformation Rank (Humprecht et al., 2020)
Finland 1 1
Denmark 2 2
Netherlands 3 3
Ireland 4 7
Sweden 5 6
Germany 6 4
Austria 7 9
United Kingdom 8 5
Portugal 9 8
France 10 10
Italy 11 12
United States 12 14
Spain 13 11
Greece 14 13

References

  1. Brüggeman, M., Engesser, S., Büchel, F., Humprecht, E., & Castro, L. (2014). Hallin and Mancini Revisited: Four Empirical Types of Western Media Systems. Journal of Communication, 64(6), 1037-1065. https://doi.org/10.1111/jcom.12127.

  2. Hallin, D. C., & Mancini, P. (2004). Comparing Media Systems. Cambridge, MA: Cambridge University Press.

  3. Hlavac, M. (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables. R package version 5.2.3. https://CRAN.R-project.org/package=stargazer

  4. Humprecht, E., Castro Herrero, L., Blassnig, S., Brüggeman, M., & Engesser, S. (2022). Media Systems in the Digital Age: An Empirical Comparison of 30 Countries. Journal of Communication, 00, 1-20. https://doi.org/10.1093/joc/jqab054.

  5. Humprecht, E., Esser, F., & Van Aelst, P. (2020). Resilience to Online Disinformation: A Framework for Cross-National Comparative Research. The International Journal of Press/Politics, 1-24. https://doi.org/10.1177/1940161219900126.