# Download/load required packages
if (!require(httr, quietly = TRUE)) install.packages("httr"); library(httr)
if (!require(jsonlite, quietly = TRUE)) install.packages("jsonlite"); library(jsonlite)
if (!require(dplyr, quietly = TRUE)) install.packages("dplyr"); library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
if (!require(tidyr, quietly = TRUE)) install.packages("tidyr"); library(tidyr)
if (!require(naniar, quietly = TRUE)) install.packages("naniar"); library(naniar)
#if (!require(bibliometrix, quietly = TRUE)) install.packages("bibliometrix"); library(bibliometrix)

Read CSVs into R

suicide_christ <- read.csv("suicide_christ.csv", stringsAsFactors = FALSE, na.strings = c("", "NA", " "))
suicide_jew <- read.csv("suicide_jew.csv", stringsAsFactors = FALSE, na.strings = c("", "NA", " "))
suicide_muslim <- read.csv("suicide_muslim.csv", stringsAsFactors = FALSE, na.strings = c("", "NA", " "))
suicide_abra <- read.csv("suicide_abra.csv", stringsAsFactors = FALSE, na.strings = c("", "NA", " "))
suicide_relig <- read.csv("suicide_relig.csv", stringsAsFactors = FALSE, na.strings = c("", "NA", " "))

Count number of columns in each df

ncol(suicide_christ)
## [1] 154
ncol(suicide_jew)
## [1] 152
ncol(suicide_muslim)
## [1] 151
ncol(suicide_abra)
## [1] 151
ncol(suicide_relig)
## [1] 154

Select the “useful” columns from each df

columns_to_keep <- c("id", "display_name", "publication_date", "relevance_score", "author_orcids", 
                     "is_oa", "cited_by_count", "publication_year", "referenced_works", "topics_display_name",
                     "primary_topic_field_display_name", "primary_topic_subfield_display_name", "concepts_display_name", "keywords_display_name", "title", "language", "abstract")

suicide_christ[columns_to_keep] -> suicide_christ
suicide_jew[columns_to_keep] -> suicide_jew
suicide_muslim[columns_to_keep] -> suicide_muslim
suicide_abra[columns_to_keep] -> suicide_abra
suicide_relig[columns_to_keep] -> suicide_relig

# Each has 17 columns now

Remove 2024 data

suicide_christ <- suicide_christ[suicide_christ$publication_year != 2024, ]
suicide_jew <- suicide_jew[suicide_jew$publication_year != 2024, ]
suicide_muslim <- suicide_muslim[suicide_muslim$publication_year != 2024, ]
suicide_abra <- suicide_abra[suicide_abra$publication_year != 2024, ]
suicide_relig <- suicide_relig[suicide_relig$publication_year != 2024, ]

Deduplication: Remove duplicate rows in each df based on “id” column, using dplyr.

suicide_christ <- suicide_christ %>% distinct(id, .keep_all = TRUE)
suicide_jew <- suicide_jew %>% distinct(id, .keep_all = TRUE)
suicide_muslim <- suicide_muslim %>% distinct(id, .keep_all = TRUE)
suicide_abra <- suicide_abra %>% distinct(id, .keep_all = TRUE)
suicide_relig <- suicide_relig %>% distinct(id, .keep_all = TRUE)

# Check
any(duplicated(suicide_christ$id))
## [1] FALSE
any(duplicated(suicide_jew$id))
## [1] FALSE
any(duplicated(suicide_muslim$id))
## [1] FALSE
any(duplicated(suicide_abra$id))
## [1] FALSE
any(duplicated(suicide_relig$id))
## [1] FALSE

Missingness using naniar package:

print_missing_percentage <- function(data, column_name) {
  # Calculate the percentage of missing values
  pct_miss <- function(column) {
    sum(is.na(column)) / length(column) * 100
  }
  
  # Retrieve the column using the column name
  column_data <- data[[column_name]]
  
  # Calculate missing percentage
  missing_pct <- pct_miss(column_data)
  
  # Print the result formatted to one decimal place
  message <- sprintf("Percentage of missing '%s' in %s: %.1f%%", column_name, deparse(substitute(data)), missing_pct)
  print(message)
}

# Example usage with your datasets
print_missing_percentage(suicide_christ, "abstract")
## [1] "Percentage of missing 'abstract' in suicide_christ: 78.5%"
print_missing_percentage(suicide_jew, "abstract")
## [1] "Percentage of missing 'abstract' in suicide_jew: 84.4%"
print_missing_percentage(suicide_muslim, "abstract")
## [1] "Percentage of missing 'abstract' in suicide_muslim: 72.8%"
print_missing_percentage(suicide_abra, "abstract")
## [1] "Percentage of missing 'abstract' in suicide_abra: 64.2%"
print_missing_percentage(suicide_relig, "abstract")
## [1] "Percentage of missing 'abstract' in suicide_relig: 73.0%"
# Should I run test (chi-sq?) to see whether these are different

Visualize missingness in each df

gg_miss_var(suicide_christ, show_pct = TRUE)

gg_miss_var(suicide_jew, show_pct = TRUE)

gg_miss_var(suicide_muslim, show_pct = TRUE)

gg_miss_var(suicide_abra, show_pct = TRUE)

gg_miss_var(suicide_relig, show_pct = TRUE)

I want to visualize missingness over time

library(dplyr)
library(ggplot2)

# Calculate missing data percentage for each column by publication year
missing_trends_by_year <- suicide_christ %>%
  filter(publication_year > 1980) %>%
  group_by(publication_year) %>%
  summarize(
    total = n(),
    missing_abstract = sum(is.na(abstract)),
    percent_missing_abstract = (missing_abstract / total) * 100,
    missing_referenced_works = sum(is.na(referenced_works)),
    percent_missing_referenced_works = (missing_referenced_works / total) * 100,
    missing_author_orcids = sum(is.na(author_orcids)),
    percent_missing_author_orcids = (missing_author_orcids / total) * 100
  ) %>%
  ungroup()

# Plot the missing data percentages for each column over time, without points
ggplot(missing_trends_by_year) +
  geom_line(aes(x = publication_year, y = percent_missing_abstract, color = "Abstract"), size = 1) +
  geom_line(aes(x = publication_year, y = percent_missing_referenced_works, color = "Referenced Works"), size = 1) +
  geom_line(aes(x = publication_year, y = percent_missing_author_orcids, color = "Author OrcIDs"), size = 1) +
  scale_color_manual(values = c("Abstract" = "blue", "Referenced Works" = "black", "Author OrcIDs" = "forestgreen")) +
  labs(
    title = "Comparison of Missing Data Trends Over Time",
    x = "Publication Year",
    y = "Percentage Missing (%)",
    caption = "Data from suicide_christ dataset post 1980."
  ) +
  theme_classic() +
  guides(color = guide_legend(title = "Data Column"))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

suicide_christ %>%
  filter(publication_year > 1900) %>%
  gg_miss_fct(publication_year)

See if any overlap between first four DFs.

# List of data frames
dfs <- list(suicide_christ$id, suicide_jew$id, suicide_muslim$id, suicide_abra$id)

# Find overlapping IDs across all data frames
overlap_all <- Reduce(intersect, dfs)

# Display overlapping IDs
length(overlap_all)
## [1] 21

Combine first four DFs into single DF, using bind_rows(). Add column to note original source.

combined_suicide <- bind_rows(
  mutate(suicide_christ, source = "Christianity"),
  mutate(suicide_jew, source = "Judaism"),
  mutate(suicide_muslim, source = "Islam"),
  mutate(suicide_abra, source = "General Abrahamic")
)

# So, this next step is a bit complicated. I'm going to create a new column, all_sources that will list where each article is from (there could be multiple, separated by commas), before getting rid of duplicates so that the trace remains

combined_suicide <- combined_suicide %>%
  group_by(id) %>%
  summarise(
    all_sources = paste(unique(source), collapse = ", "),
    .groups = 'drop'
  ) %>%
  left_join(combined_suicide, by = "id") %>%
  select(-source) %>%
  distinct(id, .keep_all = TRUE)
# Create source_counts, each row is a different year and religion, with the # of publications for that year as a count

source_counts <- combined_suicide %>%
  group_by(publication_year) %>%
  summarize(
    Christianity = sum(grepl("Christianity", all_sources)),
    Islam = sum(grepl("Islam", all_sources)),
    Judaism = sum(grepl("Judaism", all_sources)),
    General_Abrahamic = sum(grepl("General Abrahamic", all_sources))
  ) %>%
  pivot_longer(cols = c(Christianity, Islam, Judaism, General_Abrahamic), names_to = "source", values_to = "count")

# Plot publications by year, by source(religion)
ggplot(source_counts, aes(x = publication_year, y = count, fill = source)) +
  geom_col(width = 2) +
  scale_fill_ordinal() +
  theme_minimal() +
  labs(title = "Publication Counts by Religion",
       x = "Publication Year",
       y = "Count",
       fill = "Religion")
## Warning: `position_stack()` requires non-overlapping x intervals.

Plot top 10 concepts

# concepts_display name is separated by "|"
concepts <- unlist(strsplit(combined_suicide$concepts_display_name, "\\|"))
concepts_table <- table(concepts)

# Get top 10 most frequently occurring concepts
concepts_table_sorted <- sort(concepts_table, decreasing = TRUE)
top_concepts <- head(concepts_table_sorted, 10)
top_concepts_df <- as.data.frame(top_concepts)
names(top_concepts_df) <- c("Concept", "Frequency")

# Plot top 10
ggplot(data = top_concepts_df, aes(x = reorder(Concept, Frequency), y = Frequency)) +
  geom_col(fill = "grey") +
  coord_flip() +
  labs(title = "Top 10 Concepts in Suicide/Religion Search", x = "Concept", y = "Frequency") +
  theme_classic()

Bibliometrix! time!

@ Osiris, for some reason bibliometrix not downloading?

“Installation of package ‘bibliometrix’ had non-zero exit status”

Bibliometric analysis w/bibliometrix. Make some nice tables/figures.

Can do content analysis, trend analysis.

Identify research or methodological gaps.