library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
library(reshape2)
library(scales)
## Warning: package 'scales' was built under R version 4.2.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
library(forecast)
library(TSA)
library(tidyr)
library(stargazer)
library(tibble)
library(rdrobust)
# Create the data frame
search_data <- tribble(
~Day, ~Antisemitism, ~Islamophobia,
'9/14/23', 17, 2,
'9/15/23', 14, 2,
'9/16/23', 13, 2,
'9/17/23', 15, 1,
'9/18/23', 22, 1,
'9/19/23', 25, 2,
'9/20/23', 23, 2,
'9/21/23', 23, 2,
'9/22/23', 18, 1,
'9/23/23', 16, 0,
'9/24/23', 15, 2,
'9/25/23', 20, 2,
'9/26/23', 19, 1,
'9/27/23', 21, 1,
'9/28/23', 20, 1,
'9/29/23', 17, 1,
'9/30/23', 11, 1,
'10/1/23', 11, 1,
'10/2/23', 19, 1,
'10/3/23', 17, 0.5,
'10/4/23', 17, 2,
'10/5/23', 17, 1,
'10/6/23', 19, 1,
'10/7/23', 19, 2,
'10/8/23', 31, 2,
'10/9/23', 53, 1,
'10/10/23', 70, 4,
'10/11/23', 94, 5,
'10/12/23', 100, 5,
'10/13/23', 96, 5,
'10/14/23', 73, 4,
'10/15/23', 72, 4,
'10/16/23', 70, 10,
'10/17/23', 73, 9,
'10/18/23', 78, 6,
'10/19/23', 74, 5,
'10/20/23', 72, 8,
'10/21/23', 58, 2,
'10/22/23', 72, 2,
'10/23/23', 69, 4,
'10/24/23', 74, 6,
'10/25/23', 68, 4,
'10/26/23', 75, 5,
'10/27/23', 71, 3,
'10/28/23', 56, 3,
'10/29/23', 63, 3
)
# Convert Day to Date type
search_data <- search_data %>%
mutate(Day = as.Date(Day, format="%m/%d/%y"),
PostWar = as.numeric(Day >= as.Date("2023-10-07")))
# T-test for Antisemitism
t_test_antisemitism <- t.test(Antisemitism ~ PostWar, data = search_data)
# T-test for Islamophobia
t_test_islamophobia <- t.test(Islamophobia ~ PostWar, data = search_data)
# Print the t-test results
print(t_test_antisemitism)
##
## Welch Two Sample t-test
##
## data: Antisemitism by PostWar
## t = -13.35, df = 23.863, p-value = 1.458e-12
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -58.83692 -43.07612
## sample estimates:
## mean in group 0 mean in group 1
## 17.78261 68.73913
print(t_test_islamophobia)
##
## Welch Two Sample t-test
##
## data: Islamophobia by PostWar
## t = -6.3452, df = 25.007, p-value = 1.215e-06
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -4.117713 -2.099678
## sample estimates:
## mean in group 0 mean in group 1
## 1.326087 4.434783
# Regression Discontinuity Design (RDD) using linear regression
# Adding interaction term for PostWar period to allow different slopes
search_data$rdd_day <- as.numeric(search_data$Day) # Numeric transformation for regression
search_data$interaction_term <- search_data$PostWar * search_data$rdd_day
# Model for Antisemitism
model_antisemitism <- lm(Antisemitism ~ rdd_day + PostWar + interaction_term, data = search_data)
# Model for Islamophobia
model_islamophobia <- lm(Islamophobia ~ rdd_day + PostWar + interaction_term, data = search_data)
# Summary of the RDD models
stargazer(model_antisemitism, model_islamophobia, type = "text",
title = "Google Searches for Antisemitism and Islamophobia Over Time",
subtitle = "Source: Google Trends | Author :Mohamed Dhia Hammami",
align = TRUE)
##
## Google Searches for Antisemitism and Islamophobia Over Time
## ==========================================================
## Dependent variable:
## ----------------------------
## Antisemitism Islamophobia
## (1) (2)
## ----------------------------------------------------------
## rdd_day -0.064 -0.039
## (0.411) (0.053)
##
## PostWar -9,402.681 -1,122.076
## (11,423.390) (1,473.073)
##
## interaction_term 0.481 0.057
## (0.582) (0.075)
##
## Constant 1,278.282 757.625
## (8,072.828) (1,041.009)
##
## ----------------------------------------------------------
## Observations 46 46
## R2 0.807 0.486
## Adjusted R2 0.793 0.449
## Residual Std. Error (df = 42) 13.086 1.687
## F Statistic (df = 3; 42) 58.476*** 13.227***
## ==========================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
##
## Google Searches for Antisemitism and Islamophobia Over Time
## ====================================================
## Source: Google Trends | Author :Mohamed Dhia Hammami
## ----------------------------------------------------
# Visualization for Antisemitism and Islamophobia
ggplot(search_data, aes(x = Day)) +
geom_line(aes(y = Antisemitism, color = "Antisemitism")) +
geom_line(aes(y = Islamophobia, color = "Islamophobia")) +
geom_vline(xintercept = as.Date("2023-10-07"), linetype="dashed") +
labs(title = "Google Searches for Antisemitism and Islamophobia Over Time",
subtitle = "Source: Google Trends | Author :Mohamed Dhia Hammami",
x = "Date", y = "Search Frequency") +
scale_color_manual(values = c("Antisemitism" = "blue", "Islamophobia" = "red")) +
theme_minimal()
##News Data Preparation
# Create a data frame with the data about the number of articles covering Antisemitism and/or Islamophobia by outlet from October 7th to March 9th, 2024
# Data Source: NexisUni (NPR, Politico, LAT) & Factiva
news_data <- tribble(
~NewsSource, ~Antisemitism, ~Islamophobia, ~Both, ~Language, ~Location,
"NY Times", 977, 17, 68, "English", "USA",
"USA Today", 205, 16, 37, "English", "USA",
"Fox News", 1819, 27, 85, "English", "USA",
"NPR (Nexis)", 83, 12, 21, "English", "USA",
"Politico (Nexis)", 88, 5, 23, "English", "USA",
"LA Times (Nexis)", 175, 5, 34, "English", "USA",
"CBS Network", 534, 15, 70, "English", "USA",
"Axios", 108, 6, 30, "English", "USA",
"Washington Post", 357, 13, 69, "English", "USA",
"The Independent", 1244, 112, 192, "English", "UK",
"CNN", 880, 66, 160, "English", "USA",
"Reuters", 429, 29, 86, "English", "Global",
"AFP", 34, 44, 3, "French", "France",
"The Economist", 4, 1, 0, "English", "UK",
"The Times (UK)", 1174, 40, 59, "English", "UK",
"TRT World", 49, 81, 13, "English", "Turkey",
"NBC News", 86, 9, 22, "English", "USA",
"Daily Mail", 864, 182, 140, "English", "UK",
"CNBC", 21, 0, 1, "English", "USA",
"BILD", 2161, 0, 8, "German", "Germany",
"NY Post", 473, 3, 25, "English", "USA",
"The Hill", 75, 0, 11, "English", "USA",
"Press Trust of India", 31, 12, 9, "English", "India",
"Corriere della Sera", 324, 11, 13, "Italian", "Italy",
"PBS NewsHour", 13, 2, 6, "English", "USA",
"ABC News", 144, 4, 29, "English", "USA",
"MSNBC", 86, 11, 22, "English", "USA",
"Times of India", 205, 24, 26, "English", "India",
"ANSA", 2038, 30, 55, "Italian", "Italy",
"La Repubblica", 581, 9, 14, "Italian", "Italy",
"Internazionale", 581, 9, 14, "Italian", "Italy",
"SCMP", 27, 4, 5, "English", "Hong Kong",
"Financial Times", 81, 3, 10, "English", "UK",
"AJ English", 19, 55, 13, "English", "Qatar",
"EFE Agencia", 493, 38, 38, "Spanish", "Spain",
"Die Welt (ENG & GER)", 4528, 16, 26, "German", "Germany",
"DW English", 179, 55, 13, "English", "Germany",
"The Guardian", 657, 99, 222, "English", "UK",
"Mail & Guardian", 3, 3, 1, "English", "South Africa",
"Vox", 2, 1, 2, "English", "USA",
"New Yorker", 9, 0, 1, "English", "USA",
"The Toronto Star", 222, 30, 86, "English", "Canada",
"The National (UAE)", 17, 73, 3, "English", "UAE",
"JPost", 1254, 9, 45, "English", "Israel",
"AP", 373, 10, 45, "English", "Global",
"Xinhua", 12, 2, 5, "Chinese", "China",
"Haaretz", 357, 8, 41, "English", "Israel",
"The Australian", 868, 13, 66, "English", "Australia"
)
# Remove the last two columns
news_data <- news_data[, -c(5, 6)]
# Melt the data for use with ggplot2
news_data_long <- reshape2::melt(news_data, id.vars = 'NewsSource')
# Summarize the data to get total counts for each category
total_counts <- news_data_long %>%
group_by(variable) %>%
summarise(Total = sum(value))
# Calculate the percentages for labels
total_counts <- total_counts %>%
mutate(Percentage = Total / sum(Total),
Label = scales::percent(Percentage))
###News Data Visualization
# Create the bar chart
ggplot(news_data_long, aes(x = NewsSource, y = value, fill = variable)) +
geom_bar(stat = 'identity', position = 'stack', width = 0.3) +
scale_fill_manual(values = c("Antisemitism" = "darkblue",
"Islamophobia" = "green",
"Both" = "red")) +
labs(title = "Coverage of Islamophobia and Antisemitism",
subtitle = "Source: NexisUni (NPR, Politico, LAT) & Factiva (Oct 7 - Mar 9, 2024) | Author :Mohamed Dhia Hammami",
x = "News Source",
y = "Number of Articles") +
theme_minimal() +
theme(legend.position = "bottom",
axis.text.x = element_text(angle = 90, hjust = 1))
# Create the histogram (dodged bar chart)
ggplot(news_data_long, aes(x = NewsSource, y = value, fill = variable)) +
geom_bar(stat = 'identity', position = 'dodge', width = 0.3) +
scale_fill_manual(values = c("Antisemitism" = "darkblue",
"Islamophobia" = "green",
"Both" = "red")) +
labs(title = "Coverage of Islamophobia and Antisemitism since Oct 7, 2023",
subtitle = "Source: NexisUni (NPR, Politico, LAT) & Factiva (Oct 7 - Mar 9, 2024) | Author :Mohamed Dhia Hammami",
x = "News Source",
y = "Number of Articles") +
theme_minimal() +
theme(legend.position = "bottom",
axis.text.x = element_text(angle = 90, hjust = 1))
# Create the stacked bar chart with proportions
ggplot(news_data_long, aes(x = NewsSource, y = value, fill = variable)) +
geom_bar(stat = 'identity', position = 'fill', width = 0.3) +
scale_fill_manual(values = c("Antisemitism" = "darkblue",
"Islamophobia" = "green",
"Both" = "red")) +
scale_y_continuous(labels = percent_format(scale = 100)) +
labs(title = "Coverage of Islamophobia and Antisemitism since Oct 7, 2023",
subtitle = "Source: NexisUni (NPR, Politico, LAT) & Factiva (Oct 7 - Mar 9, 2024) | Author :Mohamed Dhia Hammami",
x = "News Source",
y = "Proportion of Articles") +
theme_minimal() +
theme(legend.position = "bottom",
axis.text.x = element_text(angle = 90, hjust = 1, size = 6)) # Increase size here
# Create the pie chart with percentages
ggplot(total_counts, aes(x = "", y = Total, fill = variable, label = Label)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
geom_text(aes(label = Label), position = position_stack(vjust = 0.5)) +
scale_fill_manual(values = c("Antisemitism" = "darkblue",
"Islamophobia" = "green",
"Both" = "red")) +
labs(title = "Distribution of Coverage on Islamophobia and Antisemitism",
subtitle = "Source: NexisUni (NPR, Politico, LAT) & Factiva (Oct 7 - Mar 9, 2024) | Author :Mohamed Dhia Hammami",
fill = "Category") +
theme_void() +
theme(legend.position = "bottom")
# FBI data with occurence of wars (=1 if deaths >100, =0 if deaths<100)
fbi_data <- data.frame(
Year = c(2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, 1999, 1998, 1997, 1996, 1995, 1994, 1993, 1992, 1991),
War = as.factor(c(1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0)),
Jewish = c(1124, 824, 854, 1053, 851, 953, 646, 666, 613, 632, 868, 769, 827, 932, 1032, 972, 967, 935, 965, 931, 938, 1051, 1121, 1112, 1087, 1088, 1109, 1059, 919, 1140, 1020, 837),
Arabs = c(92, 103, 82, 101, 80, 104, 51, 39, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 80, 254, 38, 24, 25, 34, 40, 55, 52, 55, 60, 73),
Muslim = c(158, 153, 129, 181, 192, 277, 310, 258, 156, 138, 162, 160, 160, 107, 165, 115, 158, 138, 158, 148, 156, 499, 29, 32, 21, 28, 27, 29, 17, 13, 15, 10)
)
# Creating a new column that combines Arabs and Muslims
fbi_data$Arabs_Muslim <- fbi_data$Arabs + fbi_data$Muslim
# Create a dataframe for plotting
plot_data <- fbi_data %>%
select(Year, War, Jewish, Arabs_Muslim) %>%
pivot_longer(cols = c(Jewish, Arabs_Muslim), names_to = "Group", values_to = "Crimes")
# Identify the war years for shading
war_years <- fbi_data %>%
filter(War == 1) %>%
distinct(Year)
# Plot with shaded war years
ggplot(plot_data, aes(x = Year, y = Crimes, color = Group, group = Group)) +
geom_rect(data = war_years, aes(xmin = Year - 0.5, xmax = Year + 0.5, ymin = -Inf, ymax = +Inf),
inherit.aes = FALSE, fill = "grey", alpha = 0.2) +
geom_line() +
geom_point(aes(shape = factor(War))) +
geom_smooth(method = "lm", se = TRUE, aes(group = Group, color = Group)) + # Add regression line with color by group
scale_color_manual(values = c("Jewish" = "blue", "Arabs_Muslim" = "red")) + # Define colors for each group
labs(title = "Evolution of Reported Hate Crimes",
subtitle = "Source: FBI’s Uniform Crime Reporting (UCR) Program | Author :Mohamed Dhia Hammami",
x = "Year",
y = "Number of Hate Crimes",
color = "Group",
shape = "War Year") +
theme_minimal() +
theme(plot.subtitle = element_text(hjust = 0.5), # Center the subtitle
legend.position = "bottom")
## `geom_smooth()` using formula = 'y ~ x'
## War effect on anti-Jewish and anti-Muslim/Arab hate crimes
plot_data <- fbi_data %>%
mutate(Group = case_when(
War == 1 ~ "War Years",
War == 0 ~ "Non-War Years"
)) %>%
group_by(Group) %>%
summarise(Jewish_mean = mean(Jewish),
Arabs_Muslim_mean = mean(Arabs + Muslim),
.groups = 'drop') %>%
pivot_longer(cols = c(Jewish_mean, Arabs_Muslim_mean), names_to = "Crime Type", values_to = "Mean Crimes")
# Rename the levels for the plot
plot_data$`Crime Type` <- recode(plot_data$`Crime Type`,
Jewish_mean = "Anti-Jewish",
Arabs_Muslim_mean = "Anti-Arabs/Muslim")
# Create the grouped bar chart
ggplot(plot_data, aes(x =`Crime Type` , y = `Mean Crimes`, fill = `Group`)) +
geom_bar(stat = "identity", position = position_dodge()) +
labs(title = "Average Hate Crimes During War and Non-War Years",
subtitle = "Source: FBI’s Uniform Crime Reporting (UCR) Program | Author :Mohamed Dhia Hammami",
x = "Crime Type",
y = "Average Number of Hate Crimes",
fill = "Year Group") +
scale_fill_brewer(palette = "Pastel1") +
theme_minimal() +
theme(plot.subtitle = element_text(hjust = 0.5)) +
geom_text(aes(label = round(`Mean Crimes`, 1)), position = position_dodge(width = 0.9), vjust = -0.25)
# Perform t-test for the Jewish group
t_test_Jewish <- t.test(Jewish ~ War, data = fbi_data)
# Perform t-test for the Arab/Muslim group
# First, create a combined Arab/Muslim column
fbi_data$Arabs_Muslim <- fbi_data$Arabs + fbi_data$Muslim
t_test_Arabs_Muslim <- t.test(Arabs_Muslim ~ War, data = fbi_data)
# Output the results of the t-tests
print(t_test_Jewish)
##
## Welch Two Sample t-test
##
## data: Jewish by War
## t = 0.29189, df = 29.182, p-value = 0.7724
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -95.91434 127.85944
## sample estimates:
## mean in group 0 mean in group 1
## 941.7059 925.7333
print(t_test_Arabs_Muslim)
##
## Welch Two Sample t-test
##
## data: Arabs_Muslim by War
## t = 0.82611, df = 22.012, p-value = 0.4176
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -58.74265 136.53088
## sample estimates:
## mean in group 0 mean in group 1
## 198.2941 159.4000
# Add a binary indicator for post-2016 years
fbi_data <- fbi_data %>%
mutate(post_2016 = ifelse(Year > 2016, 1, 0),
year_since_cutoff = Year - 2016) # Create a year-since-cutoff variable
# Plotting with ggplot2
ggplot(fbi_data, aes(x = Year)) +
geom_line(aes(y = Jewish, color = "Jewish")) + # Line for Jewish crimes
geom_line(aes(y = Arabs_Muslim, color = "Arabs_Muslim")) + # Line for Arab/Muslim crimes
scale_color_manual(values = c("Jewish" = "blue", "Arabs_Muslim" = "green")) +
geom_vline(xintercept = 2016.5, linetype = "dashed", color = "red", linewidth = 1) +
# Add regression lines for Jewish crimes pre and post-2016
geom_smooth(data = subset(fbi_data, post_2016 == 0 & !is.na(Jewish)), aes(y = Jewish, x = Year, color = "Pre-2016"), method = "lm", se = T) +
geom_smooth(data = subset(fbi_data, post_2016 == 1 & !is.na(Jewish)), aes(y = Jewish, x = Year, color = "Post-2016"), method = "lm", se = T) +
# Add regression lines for Arab/Muslim crimes pre and post-2016
geom_smooth(data = subset(fbi_data, post_2016 == 0 & !is.na(Arabs_Muslim)), aes(y = Arabs_Muslim, x = Year, color = "Pre-2016"), method = "lm", se = T) +
geom_smooth(data = subset(fbi_data, post_2016 == 1 & !is.na(Arabs_Muslim)), aes(y = Arabs_Muslim, x = Year, color = "Post-2016"), method = "lm", se = T) +
labs(title = "Effect of Trump's Election on Reported Hate Crimes",
subtitle = "Source: FBI’s Uniform Crime Reporting (UCR) Program
Author : Mohamed Dhia Hammami",
x = "Year", y = "Reported Hate Crimes") +
theme_minimal() +
theme(legend.position = "bottom", legend.title = element_blank(),
axis.text.x = element_text(angle = 45, vjust = 0.5))
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
# Fit a linear regression model for Jewish hate crimes
model_jewish <- lm(Jewish ~ post_2016 * year_since_cutoff, data = fbi_data)
# Fit a linear regression model for Arab/Muslim hate crimes
model_arabs_muslim <- lm(Arabs_Muslim ~ post_2016 * year_since_cutoff, data = fbi_data)
# Output the results using stargazer
stargazer(model_jewish, model_arabs_muslim, type = "text",
title = "RDD Analysis of Hate Crimes Reporting Before and After 2016",
align = TRUE)
##
## RDD Analysis of Hate Crimes Reporting Before and After 2016
## ==========================================================
## Dependent variable:
## ----------------------------
## Jewish Arabs_Muslim
## (1) (2)
## ----------------------------------------------------------
## post_2016 145.991 117.426
## (114.426) (129.041)
##
## year_since_cutoff -15.398*** 6.178*
## (2.974) (3.354)
##
## post_2016:year_since_cutoff 31.827 -28.293
## (27.353) (30.847)
##
## Constant 739.675*** 235.308***
## (43.359) (48.896)
##
## ----------------------------------------------------------
## Observations 32 32
## R2 0.493 0.222
## Adjusted R2 0.439 0.139
## Residual Std. Error (df = 28) 113.748 128.275
## F Statistic (df = 3; 28) 9.071*** 2.662*
## ==========================================================
## Note: *p<0.1; **p<0.05; ***p<0.01