Agenda-setting theory expects issues that appear more often in media coverage to hold greater prominence in the public mind, especially when large segments of the public take interest in, and feel uncertainty about, those issues. The theory assumes limitations on the informational capacity of both the public mind and media coverage. Questions remain, however, about how those limitations operate. Based on empirical analysis of data drawn from a comprehensive cable news content archive using custom code developed by the authors, this paper documents how the volume of coverage between early 2022 and late 2024 by MSNBC, CNN, and Fox News about the war in Ukraine dropped when the networks scrambled to report on the outbreak of war between Israel and Hamas, then subsequently rebounded, although only somewhat, as the volume of coverage about the Israel-Hamas conflict moderated. The findings offer theoretical insights into how issues compete for shares of the cable news content stream’s limited capacity. Download a .pdf of the full paper.
| Descriptive Statistics | ||||||
| Period | count | mean | sd | min | max | med |
|---|---|---|---|---|---|---|
| Period 1 | 336 | 296.41667 | 189.62240 | 2 | 850 | 272.5 |
| Period 2 | 1464 | 62.13525 | 67.63695 | 0 | 826 | 44.0 |
| Period 3 | 321 | 22.05919 | 19.02612 | 0 | 153 | 18.0 |
| Period 4 | 792 | 39.35606 | 46.96791 | 0 | 375 | 25.0 |
(Note: Kruskal-Wallis test & Dunn’s post hoc test were comparable)
| ANOVA Results | |||||
| term | df | sumsq | meansq | statistic | p.value |
|---|---|---|---|---|---|
| Period | 3.000 | 18,584,024.925 | 6,194,674.975 | 874.810 | 0.000 |
| Residuals | 2,909.000 | 20,599,120.354 | 7,081.169 | NA | NA |
| Tukey HSD Post-Hoc Test | ||||
| Comparison | Diff | Lower | Upper | p_value |
|---|---|---|---|---|
| Period 2-Period 1 | −234.281 | −247.366 | −221.197 | 0.000 |
| Period 3-Period 1 | −274.357 | −291.240 | −257.475 | 0.000 |
| Period 4-Period 1 | −257.061 | −271.144 | −242.978 | 0.000 |
| Period 3-Period 2 | −40.076 | −53.407 | −26.745 | 0.000 |
| Period 4-Period 2 | −22.779 | −32.321 | −13.238 | 0.000 |
| Period 4-Period 3 | 17.297 | 2.985 | 31.609 | 0.010 |
Note: “Election coverage volume” reflects the volume of segments mentioning “Donald Trump,” “Joe Biden,” or “Kamala Harris.”
# ============================================================
# Step 1. Install and Load Required Packages
# ============================================================
if (!require("tidyverse"))
install.packages("tidyverse")
if (!require("plotly"))
install.packages("plotly")
if (!require("lubridate"))
install.packages("lubridate")
if (!require("gt"))
install.packages("gt")
if (!require("gtExtras"))
install.packages("gtExtras")
if (!require("FSA"))
install.packages("FSA")
if (!require("broom"))
install.packages("broom")
library(tidyverse)
library(plotly)
library(lubridate)
library(gt)
library(gtExtras)
library(FSA)
library(broom)
# ============================================================
# Step 2. Increase Timeout for GDELT Requests
# ============================================================
options(timeout = 120)
# ============================================================
# Step 3. Define Date Range
# ============================================================
startdate <- "20220214"
enddate <- "20241114"
# ============================================================
# Step 4. Create Function to Download GDELT Data
# ============================================================
get_gdelt_topic <- function(query,
topic_name,
startdate,
enddate) {
url <- paste0(
"https://api.gdeltproject.org/api/v2/tv/tv?query=",
query,
"%20market:%22National%22",
"&mode=timelinevol",
"&format=csv",
"&datanorm=raw",
"&startdatetime=", startdate, "000000",
"&enddatetime=", enddate, "000000"
)
tempfile_name <- paste0(tempfile(), ".csv")
download.file(
url,
destfile = tempfile_name,
mode = "wb",
timeout = 120
)
Sys.sleep(2)
read_csv(
tempfile_name,
show_col_types = FALSE
) %>%
rename(
Date = 1,
!!topic_name := 3
)
}
# ============================================================
# Step 5. Download Ukraine Coverage Data
# ============================================================
Ukraine <- get_gdelt_topic(
query = "(russia%20OR%20ukrain)",
topic_name = "Ukraine",
startdate = startdate,
enddate = enddate
)
# ============================================================
# Step 6. Download Gaza Coverage Data
# ============================================================
Gaza <- get_gdelt_topic(
query = "(gaza%20OR%20israel)",
topic_name = "Gaza",
startdate = startdate,
enddate = enddate
)
# ============================================================
# Step 7. Download Election Coverage Data
# ============================================================
Election <- get_gdelt_topic(
query = "(donald%20trump%20OR%20joe%20biden%20OR%20kamala%20harris)",
topic_name = "Election",
startdate = startdate,
enddate = enddate
)
# ============================================================
# Step 8. Merge Coverage Data
# ============================================================
AllData <- Ukraine %>%
left_join(Gaza, by = c("Date", "Series")) %>%
left_join(Election, by = c("Date", "Series"))
# ============================================================
# Step 9. Keep FOXNEWS, CNN and MSNBC Only
# ============================================================
AllData <- AllData %>%
arrange(Date) %>%
filter(
Series %in% c(
"FOXNEWS",
"CNN",
"MSNBC"
)
)
# ============================================================
# Step 10. Create Weekly Date Variable
# ============================================================
AllData$WeekOf <- floor_date(
AllData$Date,
unit = "week",
week_start = 1
)
# ============================================================
# Step 11. Create Analysis Period Variable
# ============================================================
AllData <- AllData %>%
mutate(
Period = case_when(
Date < ymd("2022-06-06") ~ "Period 1",
Date < ymd("2023-10-07") ~ "Period 2",
Date < ymd("2024-01-22") ~ "Period 3",
TRUE ~ "Period 4"
)
)
# ============================================================
# Step 12. Create Weekly Totals for Ukraine, Gaza,
# and Election Coverage
# ============================================================
UkrData <- AllData %>%
group_by(WeekOf) %>%
summarize(
Volume = sum(Ukraine),
.groups = "drop"
) %>%
mutate(Topic = "Ukraine")
GazData <- AllData %>%
group_by(WeekOf) %>%
summarize(
Volume = sum(Gaza),
.groups = "drop"
) %>%
mutate(Topic = "Gaza")
ElecData <- AllData %>%
group_by(WeekOf) %>%
summarize(
Volume = sum(Election),
.groups = "drop"
) %>%
mutate(Topic = "Election")
UkrGazData <- bind_rows(
UkrData,
GazData
)
UkrGazElecData <- bind_rows(
UkrData,
GazData,
ElecData
)
# ============================================================
# Step 13. Create Boxplot of Ukraine Coverage by Period
# ============================================================
Boxplot <- ggplot(
AllData,
aes(
x = Period,
y = Ukraine
)
) +
geom_boxplot() +
stat_summary(
fun = mean,
geom = "point",
shape = 20,
size = 3,
color = "red"
) +
theme_minimal() +
labs(
y = "Coverage (15-sec. clips)",
title = "Ukraine Coverage Volume by Period",
subtitle = "(Red dots show averages)"
)
Boxplot
# ============================================================
# Step 14. Create Ukraine/Gaza Stacked Area Chart
# ============================================================
Figure1 <- ggplot(
UkrGazData,
aes(
x = WeekOf,
y = Volume,
fill = Topic
)
) +
geom_area() +
scale_fill_manual(
values = c(
"Ukraine" = "#264653",
"Gaza" = "#E76F51"
)
) +
ylab("Volume - Total") +
xlab("Week") +
geom_vline(
xintercept = as.numeric(as.Date("2022-06-06")),
linetype = "longdash"
) +
geom_vline(
xintercept = as.numeric(as.Date("2023-10-07")),
linetype = "longdash"
) +
geom_vline(
xintercept = as.numeric(as.Date("2024-01-22")),
linetype = "longdash"
) +
annotate(
"text",
x = as.Date("2022-03-15"),
y = max(UkrGazData$Volume),
label = "Per. 1",
size = 2.5,
fontface = "bold"
) +
annotate(
"text",
x = as.Date("2023-03-15"),
y = max(UkrGazData$Volume),
label = "Per. 2",
size = 2.5,
fontface = "bold"
) +
annotate(
"text",
x = as.Date("2023-12-01"),
y = max(UkrGazData$Volume),
label = "Per. 3",
size = 2.5,
fontface = "bold"
) +
annotate(
"text",
x = as.Date("2024-07-15"),
y = max(UkrGazData$Volume),
label = "Per. 4",
size = 2.5,
fontface = "bold"
) +
theme_minimal() +
labs(
title = "Coverage Volume by Week: Ukraine and Gaza",
y = "Coverage (15-sec. clips)",
x = "Week and Periods"
)
Figure1
# ============================================================
# Step 15. Create Ukraine/Gaza/Election Stacked Area Chart
# ============================================================
Figure2 <- ggplot(
UkrGazElecData,
aes(
x = WeekOf,
y = Volume,
fill = Topic
)
) +
geom_area() +
scale_fill_manual(
values = c(
"Ukraine" = "#264653",
"Gaza" = "#E76F51",
"Election" = "#2A9D8F"
)
) +
ylab("Volume - Total") +
xlab("Week") +
geom_vline(
xintercept = as.numeric(as.Date("2022-06-06")),
linetype = "longdash"
) +
geom_vline(
xintercept = as.numeric(as.Date("2023-10-07")),
linetype = "longdash"
) +
geom_vline(
xintercept = as.numeric(as.Date("2024-01-22")),
linetype = "longdash"
) +
annotate(
"text",
x = as.Date("2022-03-15"),
y = max(UkrGazElecData$Volume),
label = "Per. 1",
size = 2.5,
fontface = "bold"
) +
annotate(
"text",
x = as.Date("2023-03-15"),
y = max(UkrGazElecData$Volume),
label = "Per. 2",
size = 2.5,
fontface = "bold"
) +
annotate(
"text",
x = as.Date("2023-12-01"),
y = max(UkrGazElecData$Volume),
label = "Per. 3",
size = 2.5,
fontface = "bold"
) +
annotate(
"text",
x = as.Date("2024-07-15"),
y = max(UkrGazElecData$Volume),
label = "Per. 4",
size = 2.5,
fontface = "bold"
) +
theme_minimal() +
labs(
title = "Coverage Volume by Week: Ukraine, Gaza and Election",
y = "Coverage (15-sec. clips)",
x = "Week and Periods"
)
Figure2
# ============================================================
# Step 16. Prepare Data for Statistical Analysis
# ============================================================
mydata <- AllData
mydata$DV <- mydata$Ukraine
# ============================================================
# Step 17. Generate Descriptive Statistics
# ============================================================
Descriptives <- mydata %>%
group_by(Period) %>%
summarise(
count = n(),
mean = mean(DV, na.rm = TRUE),
sd = sd(DV, na.rm = TRUE),
min = min(DV, na.rm = TRUE),
max = max(DV, na.rm = TRUE),
med = median(DV, na.rm = TRUE),
.groups = "drop"
)
Desc_Table <- gt(Descriptives) %>%
tab_header(
title = "Descriptive Statistics"
) %>%
cols_align(align = "left") %>%
gt_theme_538()
Desc_Table
# ============================================================
# Step 18. Run Kruskal-Wallis and Dunn Tests
# ============================================================
options(scipen = 0)
kruskal.test(
DV ~ Period,
data = mydata
)
dunnTest(
DV ~ Period,
data = mydata
)
# ============================================================
# Step 19. Run ANOVA and Tukey HSD
# ============================================================
options(scipen = 999)
oneway.test(
DV ~ Period,
data = mydata,
var.equal = FALSE
)
anova_1 <- aov(
DV ~ Period,
data = mydata
)
TukeyHSD(anova_1)
# ============================================================
# Step 20. Create ANOVA Results Table
# ============================================================
anova_results <- tidy(anova_1)
anova_table <- anova_results %>%
gt() %>%
tab_header(
title = "ANOVA Results"
) %>%
fmt_number(
columns = where(is.numeric),
decimals = 3
) %>%
gt_theme_538()
anova_table
# ============================================================
# Step 21. Create Tukey HSD Results Table
# ============================================================
tukey_results <- TukeyHSD(anova_1)
tukey_df <- tidy(tukey_results)
tukey_table <- tukey_df %>%
select(
contrast,
estimate,
conf.low,
conf.high,
adj.p.value
) %>%
rename(
Comparison = contrast,
Diff = estimate,
Lower = conf.low,
Upper = conf.high,
p_value = adj.p.value
) %>%
gt() %>%
tab_header(
title = "Tukey HSD Post-Hoc Test"
) %>%
fmt_number(
columns = where(is.numeric),
decimals = 3
) %>%
data_color(
columns = "p_value",
colors = scales::col_numeric(
palette = c(
"darkgray",
"lightgray",
"white"
),
domain = c(0, 1)
)
) %>%
gt_theme_538()
tukey_table