Load libraries and set working directory.

# R markdown link: http://rpubs.com/jasohosk/1432621

# Load libraries
packages <- c("ideanet", "kableExtra", "tidyverse", "psych", "purrr")

installed <- packages %in% rownames(installed.packages())
if (any(!installed)) {
  install.packages(packages[!installed])
}
lapply(packages, library, character.only = TRUE)

# Set working directory
setwd(
  "/Users/jasonhoskin/Library/CloudStorage/OneDrive-IndianaUniversity/faith"
)

Read in Network Canvas data.

dir.create("networkcanvas-merged", showWarnings = FALSE)
nc_merge("networkcanvas-data", "networkcanvas-merged")

networks <- nc_read(
  path = "networkcanvas-merged")

# Exclude ego_id = 1 (missing data, excluded from analysis)
networks$egos             <- networks$egos             |> filter(ego_id != 1)
networks$alters           <- networks$alters           |> filter(ego_id != 1)
networks$alter_edgelists  <- networks$alter_edgelists  |> filter(ego_id != 1)

res <- ego_netwrite(networks$egos, 
            ego_id = "ego_id",
            networks$alters,
            alter_id = "alter_id",
            alter_ego = "ego_id",
            max_alters = Inf,
            alter_alter = networks$alter_edgelists,
            aa_ego = "ego_id",
            i_elements = "from",
            j_elements = "to")

Prepare for descriptive tables.

# Find ego IDs for the smallest and largest networks by network size
ego_ids_in_igraph <- sapply(res$igraph_objects, \(x) x$ego)

smallest_ego_id <- res$summaries |> slice_min(network_size, n = 1) |> pull(ego_id)
largest_ego_id  <- res$summaries |> slice_max(network_size, n = 1) |> pull(ego_id)

idx_smallest <- which(ego_ids_in_igraph == smallest_ego_id)
idx_largest  <- which(ego_ids_in_igraph == largest_ego_id)

smallest_n <- res$summaries |> filter(ego_id == smallest_ego_id) |> pull(network_size)
largest_n  <- res$summaries |> filter(ego_id == largest_ego_id)  |> pull(network_size)

# Descrptive tables
summary_vars <- res$summaries |>
  select(ego_id, network_size, mean_degree, density, effective_size)

alter_vars_cont <- res$alters |>
  select(ego_id, alter_id, alterage)

alterrel_cols <- paste0("alterrel_", 1:23)

alter_vars_cat <- res$alters |>
  select(ego_id, alter_id, altersex, alterrace)

alterrel <- res$alters |>
  select(ego_id, alter_id, all_of(alterrel_cols)) |>
  pivot_longer(
    cols      = all_of(alterrel_cols),
    names_to  = "alterrel_type",
    values_to = "marked"
  ) |>
  filter(marked) |>
  mutate(alterrel_type = as.integer(str_remove(alterrel_type, "alterrel_"))) |>
  select(ego_id, alter_id, alterrel_type)

Create descriptive tables and plot smallest and largest networks.

psych::describe(summary_vars |> select(-ego_id)) |>
  as.data.frame() |>
  select(n, mean, sd, median, min, max, skew)
##                 n       mean        sd    median       min    max      skew
## network_size   42 15.9285714 8.2444153 14.000000 4.0000000 40.000 1.0026508
## mean_degree    42  9.2258694 5.1432445  8.585714 2.1818182 25.000 1.3719184
## density        42  0.6666072 0.2335067  0.664591 0.2181818  1.000 0.1008816
## effective_size 42  6.7027021 5.4539546  5.114286 1.0000000 21.875 0.8968624
alterrel |> count(alterrel_type) |> mutate(prop = n / sum(n))
## # A tibble: 19 × 3
##    alterrel_type     n    prop
##            <int> <int>   <dbl>
##  1             1    17 0.0184 
##  2             2    14 0.0151 
##  3             3    83 0.0897 
##  4             4    90 0.0973 
##  5             6    48 0.0519 
##  6             7     7 0.00757
##  7             8    30 0.0324 
##  8             9    99 0.107  
##  9            10    48 0.0519 
## 10            11    48 0.0519 
## 11            12   245 0.265  
## 12            13     8 0.00865
## 13            14     2 0.00216
## 14            15    13 0.0141 
## 15            16     5 0.00541
## 16            20     4 0.00432
## 17            21    74 0.08   
## 18            22    62 0.0670 
## 19            23    28 0.0303
alter_vars_cat |>
  count(altersex) |>
  mutate(prop = n / sum(n))
##   altersex   n        prop
## 1        1 230 0.343796712
## 2        2 435 0.650224215
## 3        3   4 0.005979073
alter_vars_cat |>
  count(alterrace) |>
  mutate(prop = n / sum(n))
##   alterrace   n        prop
## 1         1   2 0.002989537
## 2         2 584 0.872944694
## 3         3  17 0.025411061
## 4         4  53 0.079222720
## 5         5  13 0.019431988
psych::describe(alter_vars_cont |> select(-ego_id, -alter_id)) |>
  as.data.frame() |>
  select(n, mean, sd, median, min, max, skew)
##            n     mean       sd median min max       skew
## alterage 669 49.16442 19.91749     51   1  89 -0.4073565
# Plot side by side
plot(
  res$igraph_objects[[idx_smallest]]$igraph_ego,
  main = paste0("Ego ", smallest_ego_id, " — Smallest (n = ", smallest_n, ")")
)

plot(
  res$igraph_objects[[idx_largest]]$igraph_ego,
  main = paste0("Ego ", largest_ego_id, " — Largest (n = ", largest_n, ")")
)

# Create CSV file
res$summaries |>
  select(ego_id, network_size, mean_degree, density, effective_size) |>
  write_csv("faith-network-summaries.csv")

```