11# data-raw/epigamesDiffNet.R
22# Generating the daily diffnet object from epigames using collapse_timeframes()
3- # Issue #75: Now includes vertex.dyn.attrs (mask, med, quarantine per day)
4- #
53# Run after data-raw/epigames.R has built data/epigames.rda.
64
75rm(list = ls())
86library(netdiffuseR )
97
10- # ---------------------------------------------------------------------------
11- # 1. Load the base epigames dataset (with dynamic attrs)
12- # ---------------------------------------------------------------------------
8+ # Load the base epigames dataset (with dynamic attrs)
139load(" data/epigames.rda" )
1410
15- attrs <- epigames $ attributes # 594 x 6: id, toa, qyes_total, qno_total, mask_prop, med_prop
16- edges <- epigames $ edgelist # hourly edgelist: sender, receiver, time (0-338), weight
17- dyn_long <- epigames $ dyn_attrs # long format: id, hour (0-338), mask, med, quarantine
11+ attrs <- epigames $ attributes # 594 x 6: id, toa, qyes_total, qno_total, mask_prop, med_prop
12+ edges <- epigames $ edgelist # hourly edgelist: sender, receiver, time (0-338), weight
13+ dyn_long <- epigames $ dyn_attrs # long format: id, hour (0-338), mask, med, quarantine
1814
19- # ---------------------------------------------------------------------------
20- # 2. Collapse hourly edgelist into 15 daily windows via collapse_timeframes()
21- # ---------------------------------------------------------------------------
22- WINDOW_SIZE <- 24 # hours per day
23- N_DAYS <- 15
15+ # Collapse hourly edgelist into 15 daily windows via collapse_timeframes()
16+ WINDOW_SIZE <- 24 # hours per day
17+ N_DAYS <- 15
2418
2519daily_edgelist <- collapse_timeframes(
2620 edgelist = edges ,
@@ -34,9 +28,6 @@ daily_edgelist <- collapse_timeframes(
3428 symmetric = TRUE
3529)
3630
37- cat(" Daily edgelist: " , nrow(daily_edgelist ), " rows, time range:" ,
38- range(daily_edgelist $ time ), " \n " )
39-
4031# Build adjacency matrices
4132adjmat <- edgelist_to_adjmat(
4233 daily_edgelist [, c(" sender" , " receiver" )],
@@ -46,83 +37,43 @@ adjmat <- edgelist_to_adjmat(
4637 multiple = TRUE
4738)
4839
49- # ---------------------------------------------------------------------------
50- # 3. Build vertex.dyn.attrs: one data.frame per day (15 total)
51- # Each data.frame: 594 rows, columns: mask, med, quarantine (daily means)
52- # ---------------------------------------------------------------------------
40+ # Build vertex.dyn.attrs: one data.frame per day (15 total)
41+ # Each data.frame: 594 rows, columns: mask, med, quarantine (daily means)
5342# Map hourly data to day index (day d = hours [(d-1)*24 .. d*24-1])
54- dyn_long $ day <- (dyn_long $ hour %/% WINDOW_SIZE ) + 1 # 1-based day
55- dyn_long $ day <- pmin(dyn_long $ day , N_DAYS ) # clamp hour 336-338 to day 15
43+ dyn_long $ day <- (dyn_long $ hour %/% WINDOW_SIZE ) + 1 # 1-based day
44+ dyn_long $ day <- pmin(dyn_long $ day , N_DAYS ) # clamp hour 336-338 to day 15
5645
5746vertex_dyn <- lapply(1 : N_DAYS , function (d ) {
5847 sub <- dyn_long [dyn_long $ day == d , ]
59-
48+
6049 # Aggregate per node: mean within each 24-hour window
6150 # (proportion of hours in that day where behavior was active)
6251 agg <- aggregate(
6352 cbind(mask , med , quarantine ) ~ id ,
6453 data = sub ,
6554 FUN = mean
6655 )
67-
56+
6857 # Sort by id to match the node ordering in the diffnet object
6958 agg <- agg [order(agg $ id ), ]
7059 rownames(agg ) <- NULL
71-
60+
7261 # Return only the behavior columns (not id — diffnet uses position)
7362 agg [, c(" mask" , " med" , " quarantine" )]
7463})
7564
76- # Sanity check: each element should be 594 rows x 3 cols
77- stopifnot(all(sapply(vertex_dyn , nrow ) == 594 ))
78- stopifnot(all(sapply(vertex_dyn , ncol ) == 3 ))
79-
80- cat(" vertex.dyn.attrs built: " , N_DAYS , " data.frames of" ,
81- nrow(vertex_dyn [[1 ]]), " rows x" , ncol(vertex_dyn [[1 ]]), " cols\n " )
82- cat(" Day 1 — mean mask usage:" , round(mean(vertex_dyn [[1 ]]$ mask ), 3 ),
83- " mean quarantine:" , round(mean(vertex_dyn [[1 ]]$ quarantine ), 3 ), " \n " )
84- cat(" Day 15 — mean mask usage:" , round(mean(vertex_dyn [[15 ]]$ mask ), 3 ),
85- " mean quarantine:" , round(mean(vertex_dyn [[15 ]]$ quarantine ), 3 ), " \n " )
86-
87- # ---------------------------------------------------------------------------
88- # 4. Prepare TOA vector
89- # ---------------------------------------------------------------------------
65+ # Prepare TOA vector
9066toa_vec <- stats :: setNames(attrs $ toa , as.character(attrs $ id ))
9167
92- # ---------------------------------------------------------------------------
93- # 5. Assemble diffnet object
94- # ---------------------------------------------------------------------------
68+ # Assemble diffnet object
9569epigamesDiffNet <- as_diffnet(
9670 adjmat ,
97- toa = toa_vec ,
71+ toa = toa_vec ,
9872 vertex.static.attrs = attrs ,
99- vertex.dyn.attrs = vertex_dyn ,
73+ vertex.dyn.attrs = vertex_dyn ,
10074 t0 = 1 ,
10175 t1 = N_DAYS
10276)
10377
104- cat(" \n epigamesDiffNet summary:\n " )
105- print(epigamesDiffNet )
106-
107- # ---------------------------------------------------------------------------
108- # 6. Quick validation: dynamic exposure vs static exposure
109- # ---------------------------------------------------------------------------
110- cat(" \n Validating exposure() with dynamic mask attrs...\n " )
111- expo_static <- exposure(
112- epigamesDiffNet ,
113- attrs = matrix (
114- rep(epigamesDiffNet $ vertex.static.attrs $ mask_prop , N_DAYS ),
115- nrow = 594 , ncol = N_DAYS
116- )
117- )
118- expo_dynamic <- exposure(epigamesDiffNet , attrs = " mask" )
119-
120- cor_val <- cor(as.vector(expo_static ), as.vector(expo_dynamic ), use = " complete.obs" )
121- cat(" Correlation static vs dynamic mask exposure:" , round(cor_val , 4 ), " \n " )
122- cat(" (Should be < 1.0, confirming dynamic attrs add new information)\n " )
123-
124- # ---------------------------------------------------------------------------
125- # 7. Save
126- # ---------------------------------------------------------------------------
78+ # Save
12779usethis :: use_data(epigamesDiffNet , overwrite = TRUE , compress = " xz" )
128- cat(" \n Saved: data/epigamesDiffNet.rda\n " )
0 commit comments