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.)
American Trends Panel W45 dataset – a Pew Research Center account necessary for access.
American Trends Panel W91 dataset – a Pew Research Center account necessary for access.
Timbro Authoritarian Populism dataset - a copy of the 2020 data is in the repository.
National and District Level Party Systems datasets – use NLPS_v1_10-2018
European Audiovisual Observatory Yearbook 2018/19, “TV-AUD Public Service Audience Market Share (1999-2018)” – this dataset is accessible via purchase. The single-user access fee is €370, multi-user access costs €800.
Public-Access Data Collected by Other Scholars
Dalton (2021) data – courtesy from the author, please contact Russell J. Dalton for access.
Humprecht et al. 2022 data – see online appendix of paper, table V
Data Collected by the Author
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 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 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:
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):
EV_Labarre2024b.csv,” which is the analysis dataset
“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)
“KruskalWallis.csv”, which is used for the Kruskal-Wallis test reported in the paper
“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).
# 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
The article reports findings from two main Ordinary Least Squares (OLS) regression models.
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"))
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 |
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"))
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 |
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
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
## [1] -2.221546
## [1] 1.4471
## [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.
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
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.
# 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.
##
## 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.
##
## 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.
##
## 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.
# 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.
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
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.
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.
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
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.
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
# 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).")
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). |
# 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 = "")
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 | |
# 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 = "")
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 |
# 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 = "")
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 |
# 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"))
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 |
# 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"))
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 |
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
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
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
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)"))
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 |
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"))
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 |
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"))
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 |
# 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 = "")
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 | ||
# 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 = "")
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 |
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.
Hallin, D. C., & Mancini, P. (2004). Comparing Media Systems. Cambridge, MA: Cambridge University Press.
Hlavac, M. (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables. R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
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.
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.