From 6f1b036f43359b824b6fa197a378a576a8ab5e99 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Wed, 10 Dec 2025 16:54:31 -0300 Subject: [PATCH 01/18] adding stochastic transmission mode to expure and rdiffnet --- R/rdiffnet.r | 9 +++++++++ R/stats.R | 53 ++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/R/rdiffnet.r b/R/rdiffnet.r index 122938f..7849900 100644 --- a/R/rdiffnet.r +++ b/R/rdiffnet.r @@ -399,6 +399,7 @@ rdiffnet <- function( rewire.args = list(), threshold.dist = runif(n), exposure.args = list(), + exposure.mode = "deterministic", name = "A diffusion network", behavior = "Random contagion", stop.no.diff = TRUE, @@ -414,6 +415,14 @@ rdiffnet <- function( if (!length(exposure.args[[arg]])) exposure.args[[arg]] <- default_exposure.args[[arg]] + exposure.args$mode <- exposure.mode + + # If stochastic mode is selected, ensure valued is TRUE + if (exposure.mode == "stochastic" && !exposure.args$valued) { + warning("exposure.mode='stochastic' requires valued=TRUE to use weights as probabilities. Setting exposure.args$valued=TRUE.") + exposure.args$valued <- TRUE + } + if (inherits(exposure.args[["attrs"]], "matrix")) { # Checking if the attrs matrix is has dims n x t if (any(dim(exposure.args[["attrs"]]) != dim(matrix(NA, nrow = n, ncol = t)))) { diff --git a/R/stats.R b/R/stats.R index dadcac6..8e859b5 100644 --- a/R/stats.R +++ b/R/stats.R @@ -495,7 +495,7 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { NULL # Workhorse of exposure plotting -.exposure <- function(graph, cumadopt, attrs, outgoing, valued, normalized, self) { +.exposure <- function(graph, cumadopt, attrs, outgoing, valued, normalized, self, mode = "deterministic") { # Getting the parameters n <- nrow(graph) @@ -513,23 +513,41 @@ NULL # Checking self if (!self) graph <- sp_diag(graph, rep(0, nnodes(graph))) - norm <- graph %*% attrs + 1e-20 + # 1. Calculate Normalization (Denominator) using ORIGINAL weights + # This represents the potential exposure (total degree/strength) + norm <- as.vector(graph %*% attrs) + 1e-20 + + # 2. Apply Stochastic Filter (if enabled) + # This modifies the graph to represent only Realized Transmissions for the numerator + if (mode == "stochastic") { + # Generate random values for every edge + u <- stats::runif(length(graph@x)) + + # Keep edge (set to 1) if U < Weight, else remove (set to 0) + # This treats the original weights as Probabilities + graph@x <- as.numeric(u < graph@x) + } if (!is.na(dim(cumadopt)[3])) { ans <- array(0, dim = c(dim(cumadopt)[1],dim(cumadopt)[3])) for (q in 1:dim(cumadopt)[3]) { + # Calculate numerator: Realized connections * Adoption status + numerator <- as.vector(graph %*% (attrs * cumadopt[,,q])) + if (normalized) { - ans[,q] <- as.vector(graph %*% (attrs * cumadopt[,,q]) / norm) + ans[,q] <- numerator / norm } else { - ans[,q] <- as.vector(graph %*% (attrs * cumadopt[,,q])) + ans[,q] <- numerator } } } else { - ans <- graph %*% (attrs * cumadopt) + numerator <- as.vector(graph %*% (attrs * cumadopt)) if (normalized) { - ans <- ans/ norm + ans <- numerator / norm + } else { + ans <- numerator } } @@ -559,6 +577,7 @@ check_lags <- function(npers, lags) { #' @export #' @rdname exposure +#' @param mode Character scalar. Either "deterministic" (default) or "stochastic". exposure <- function( graph, cumadopt, @@ -570,6 +589,7 @@ exposure <- function( groupvar = NULL, self = getOption("diffnet.self"), lags = 0L, + mode = "deterministic", ... ) { @@ -653,7 +673,7 @@ exposure <- function( if ((is.array(graph) & !inherits(graph, "matrix")) | is.list(graph)) { exposure.list(as_spmat(graph), cumadopt, attrs, outgoing, valued, normalized, - self, lags) + self, lags, mode = mode) } else stopifnot_graph(graph) } @@ -661,7 +681,7 @@ exposure <- function( # @export exposure.list <- function( graph, cumadopt, attrs, - outgoing, valued, normalized, self, lags) { + outgoing, valued, normalized, self, lags, mode = "deterministic") { # attrs can be either # degree, indegree, outdegree, or a user defined vector. @@ -681,7 +701,7 @@ exposure.list <- function( add_dimnames.mat(attrs) output <- exposure_for(graph, cumadopt, attrs, outgoing, valued, normalized, - self, lags) + self, lags, mode = mode) dimnames(output) <- dimnames(cumadopt) output @@ -696,7 +716,8 @@ exposure_for <- function( valued, normalized, self, - lags + lags, + mode = "deterministic" ) { if (!is.na(dim(cumadopt)[3])) { @@ -710,7 +731,8 @@ exposure_for <- function( outgoing = outgoing, valued = valued, normalized = normalized, - self = self) + self = self, + mode = mode) } } else { for (i in (1 - lags):nslices(graph)) { @@ -720,7 +742,8 @@ exposure_for <- function( outgoing = outgoing, valued = valued, normalized = normalized, - self = self) + self = self, + mode = mode) } } } else { @@ -734,7 +757,8 @@ exposure_for <- function( outgoing = outgoing, valued = valued, normalized = normalized, - self = self) + self = self, + mode = mode) } } else { for (i in (1 - lags):nslices(graph)) { @@ -744,7 +768,8 @@ exposure_for <- function( outgoing = outgoing, valued = valued, normalized = normalized, - self = self) + self = self, + mode = mode) } } } From 3e2f1f34669cad0f376115a3f9a37a3786aa41c5 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Wed, 10 Dec 2025 20:01:53 -0300 Subject: [PATCH 02/18] Fix stochastic exposure normalization (E<=1), improve docs, bump version to 1.25.0, and fix exposure rownames issue --- DESCRIPTION | 2 +- NEWS.md | 4 ++ R/rdiffnet.r | 9 ++- R/stats.R | 85 +++++++++++++++++++---- man/exposure.Rd | 24 +++++++ man/rdiffnet.Rd | 7 ++ tests/testthat/test-stochastic-exposure.R | 62 +++++++++++++++++ 7 files changed, 176 insertions(+), 17 deletions(-) create mode 100644 tests/testthat/test-stochastic-exposure.R diff --git a/DESCRIPTION b/DESCRIPTION index 2c7e957..bb31860 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: netdiffuseR Title: Analysis of Diffusion and Contagion Processes on Networks -Version: 1.24.0 +Version: 1.25.0 Authors@R: c( person("George", "Vega Yon", email="g.vegayon@gmail.com", role=c("aut", "cre"), comment=c(ORCID = "0000-0002-3171-0844", what="Rewrite functions with Rcpp, plus new features") diff --git a/NEWS.md b/NEWS.md index c3f6625..80bc0c0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +# Changes in netdiffuseR version 1.25.0 (2025-12-10) + +* `exposure()` and `rdiffnet()` now support `mode = "stochastic"`, allowing for probabilistic interpretation of edge weights in exposure calculations. + # Changes in netdiffuseR version 1.24.0 (2025-12-09) * New function `degree_adoption_diagnostic()` analyzes the correlation between network diff --git a/R/rdiffnet.r b/R/rdiffnet.r index 7849900..f15407a 100644 --- a/R/rdiffnet.r +++ b/R/rdiffnet.r @@ -22,6 +22,7 @@ #' it can also be an \eqn{n \times Q} matrix or a list of \eqn{Q} single behavior inputs. Sets the adoption #' threshold for each node. #' @param exposure.args List. Arguments to be passed to \code{\link{exposure}}. +#' @param exposure.mode Character scalar. Either "deterministic" (default) or "stochastic". #' @param name Character scalar. Passed to \code{\link{as_diffnet}}. #' @param behavior Character scalar or a list or character scalar (multiple behaviors only). Passed to \code{\link{as_diffnet}}. #' @param stop.no.diff Logical scalar. When \code{TRUE}, the function will return @@ -101,6 +102,10 @@ #' \code{normalized} \tab \code{TRUE} #' } #' +#' When \code{exposure.mode = "stochastic"}, the \code{valued} argument in +#' \code{exposure.args} is forced to \code{TRUE} (with a message) to ensure that +#' edge weights are treated as probabilities. +#' #' @examples #' # (Single behavior): -------------------------------------------------------- #' @@ -417,9 +422,9 @@ rdiffnet <- function( exposure.args$mode <- exposure.mode - # If stochastic mode is selected, ensure valued is TRUE + # If stochastic mode is selected, ensure valued is TRUE (enabling weights as probabilities) if (exposure.mode == "stochastic" && !exposure.args$valued) { - warning("exposure.mode='stochastic' requires valued=TRUE to use weights as probabilities. Setting exposure.args$valued=TRUE.") + message("exposure.mode='stochastic' requires valued=TRUE to use weights as probabilities. Setting exposure.args$valued=TRUE.") exposure.args$valued <- TRUE } diff --git a/R/stats.R b/R/stats.R index 8e859b5..880e95f 100644 --- a/R/stats.R +++ b/R/stats.R @@ -275,6 +275,7 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { #' @param groupvar Passed to \code{\link{struct_equiv}}. #' @param lags Integer scalar. When different from 0, the resulting exposure #' matrix will be the lagged exposure as specified (see examples). +#' @param mode Character scalar. Either "deterministic" (default) or "stochastic". #' @details #' Exposure is calculated as follows: #' @@ -330,6 +331,27 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { #' computed as a count instead of a proportion. A good example of this can be #' found at the examples section of the function \code{\link{rdiffnet}}. #' +#' \strong{Stochastic Exposure} +#' +#' When \code{mode = "stochastic"}, the exposure is calculated based on a probabilistic +#' interpretation of the edges. In this mode, the weights of the graph \eqn{S_t} are +#' treated as probabilities of transmission. For each edge \eqn{(i,j)}, a Bernoulli +#' trial is performed with probability \eqn{S_{t,ij}}. If the trial is successful, +#' the edge is "realized" and its weight is used in the numerator. If failed, +#' the edge is treated as non-existent (weight 0) for the numerator. +#' +#' The denominator (normalization factor) is always calculated using the original +#' weights of the graph (sum of probabilities), representing the expected total +#' exposure. This ensures that the exposure value \eqn{E_t} remains bounded between +#' 0 and 1 (if normalized), as the realized weights are a subset of the total weights. +#' +#' \deqn{ +#' \tilde{E}_{ti} = \frac{\sum_{j \neq i} \mathbb{I}(U_{ij} < S_{t,ij}) S_{t,ij} a_{tj}}{\sum_{j \neq i} S_{t,ij}} +#' } +#' +#' Where \eqn{S_{t,ij}} is the weight of the edge from \eqn{j} to \eqn{i} at time \eqn{t} +#' (treated as probability), and \eqn{U_{ij} \sim \text{Uniform}(0,1)}. +#' #' @references #' Burt, R. S. (1987). "Social Contagion and Innovation: Cohesion versus Structural #' Equivalence". American Journal of Sociology, 92(6), 1287. @@ -513,22 +535,21 @@ NULL # Checking self if (!self) graph <- sp_diag(graph, rep(0, nnodes(graph))) - # 1. Calculate Normalization (Denominator) using ORIGINAL weights - # This represents the potential exposure (total degree/strength) + # Calculate normalization (or potential exposure) norm <- as.vector(graph %*% attrs) + 1e-20 - # 2. Apply Stochastic Filter (if enabled) - # This modifies the graph to represent only Realized Transmissions for the numerator + # Apply stochastic filter (or selective exposure) if (mode == "stochastic") { # Generate random values for every edge u <- stats::runif(length(graph@x)) - # Keep edge (set to 1) if U < Weight, else remove (set to 0) - # This treats the original weights as Probabilities - graph@x <- as.numeric(u < graph@x) + # Keep edge (keep original weight) if U < Weight, else remove (set to 0) + # This ensures the numerator (sum of realized weights) <= denominator (sum of all weights) + # So Exposure is always <= 1 (if normalized) + graph@x[u >= graph@x] <- 0 } - if (!is.na(dim(cumadopt)[3])) { + if (length(dim(cumadopt)) == 3) { ans <- array(0, dim = c(dim(cumadopt)[1],dim(cumadopt)[3])) for (q in 1:dim(cumadopt)[3]) { @@ -577,7 +598,6 @@ check_lags <- function(npers, lags) { #' @export #' @rdname exposure -#' @param mode Character scalar. Either "deterministic" (default) or "stochastic". exposure <- function( graph, cumadopt, @@ -615,18 +635,55 @@ exposure <- function( if (!inherits(graph, "diffnet")) { stop("-cumadopt- should be provided when -graph- is not of class 'diffnet'") } else { - cumadopt <- toa_mat(graph)$cumadopt + cumadopt <- graph$cumadopt + + # Ensure rownames are present if graph is diffnet + if (is.list(cumadopt) && !is.data.frame(cumadopt)) { + for (i in seq_along(cumadopt)) { + if (is.null(rownames(cumadopt[[i]]))) { + rownames(cumadopt[[i]]) <- graph$meta$ids + } + } + } else if (is.null(rownames(cumadopt))) { + rownames(cumadopt) <- graph$meta$ids + } } + # Handling list of matrices (multi-behavior diffnet) + if (is.list(cumadopt) && !is.data.frame(cumadopt)) { + # Check if it is a list of matrices + if (all(sapply(cumadopt, function(x) length(dim(x)) == 2))) { + # Convert to array + n_c <- nrow(cumadopt[[1]]) + t_c <- ncol(cumadopt[[1]]) + q_c <- length(cumadopt) + cumadopt_arr <- array(0, dim = c(n_c, t_c, q_c)) + + # Preserve dimnames + dimnames(cumadopt_arr) <- list( + rownames(cumadopt[[1]]), + colnames(cumadopt[[1]]), + names(cumadopt) + ) + + for (i in 1:q_c) { + cumadopt_arr[,,i] <- as.matrix(cumadopt[[i]]) + } + cumadopt <- cumadopt_arr + } else { + warning("cumadopt is a list but elements do not appear to be matrices. Exposure calculation may fail.") + } + } + # Checking diffnet graph if (inherits(graph, "diffnet")) graph <- graph$graph # Checking attrs if (!length(attrs)) { - if (!is.na(dim(cumadopt)[3])) { + if (length(dim(cumadopt)) == 3) { attrs <- array(1, dim = c(nrow(cumadopt), ncol(cumadopt), 1))} else {attrs <- matrix(1, ncol=ncol(cumadopt), nrow=nrow(cumadopt))} - } else if (!is.na(dim(cumadopt)[3])) { + } else if (length(dim(cumadopt)) == 3) { attrs <- array(attrs, dim = c(nrow(attrs), ncol(attrs), 1)) } @@ -690,7 +747,7 @@ exposure.list <- function( # dim(attrs) default n x T matrix of 1's if (!length(dim(attrs))) stop("-attrs- must be a matrix of size n by T.") - if (!is.na(dim(cumadopt)[3])) { + if (length(dim(cumadopt)) == 3) { if (dim(cumadopt)[3]>1 && any(dim(attrs)[-3] != dim(cumadopt)[-3])) stop("Incorrect size for -attrs-. ", "Does not match n dim or t dim.") } else { @@ -720,7 +777,7 @@ exposure_for <- function( mode = "deterministic" ) { - if (!is.na(dim(cumadopt)[3])) { + if (length(dim(cumadopt)) == 3) { out <- array(NA, dim = c(dim(cumadopt)[1], dim(cumadopt)[2], dim(cumadopt)[3])) if (lags >= 0L) { diff --git a/man/exposure.Rd b/man/exposure.Rd index 82f3531..6e8a057 100644 --- a/man/exposure.Rd +++ b/man/exposure.Rd @@ -15,6 +15,7 @@ exposure( groupvar = NULL, self = getOption("diffnet.self"), lags = 0L, + mode = "deterministic", ... ) } @@ -47,6 +48,8 @@ and one (see details).} \item{lags}{Integer scalar. When different from 0, the resulting exposure matrix will be the lagged exposure as specified (see examples).} +\item{mode}{Character scalar. Either "deterministic" (default) or "stochastic".} + \item{...}{Further arguments passed to \code{\link{struct_equiv}} (only used when \code{alt.graph="se"}).} } @@ -115,6 +118,27 @@ If \code{normalize=FALSE} then denominator, \eqn{S_t \times x_t}{S(t) \%*\% x(t) is not included. This can be useful when, for example, exposure needs to be computed as a count instead of a proportion. A good example of this can be found at the examples section of the function \code{\link{rdiffnet}}. + +\strong{Stochastic Exposure} + +When \code{mode = "stochastic"}, the exposure is calculated based on a probabilistic +interpretation of the edges. In this mode, the weights of the graph \eqn{S_t} are +treated as probabilities of transmission. For each edge \eqn{(i,j)}, a Bernoulli +trial is performed with probability \eqn{S_{t,ij}}. If the trial is successful, +the edge is "realized" and its weight is used in the numerator. If failed, +the edge is treated as non-existent (weight 0) for the numerator. + +The denominator (normalization factor) is always calculated using the original +weights of the graph (sum of probabilities), representing the expected total +exposure. This ensures that the exposure value \eqn{E_t} remains bounded between +0 and 1 (if normalized), as the realized weights are a subset of the total weights. + +\deqn{ +\tilde{E}_{ti} = \frac{\sum_{j \neq i} \mathbb{I}(U_{ij} < S_{t,ij}) S_{t,ij} a_{tj}}{\sum_{j \neq i} S_{t,ij}} +} + +Where \eqn{S_{t,ij}} is the weight of the edge from \eqn{j} to \eqn{i} at time \eqn{t} +(treated as probability), and \eqn{U_{ij} \sim \text{Uniform}(0,1)}. } \examples{ # Calculating lagged exposure ----------------------------------------------- diff --git a/man/rdiffnet.Rd b/man/rdiffnet.Rd index 0d63f7b..1a27d23 100644 --- a/man/rdiffnet.Rd +++ b/man/rdiffnet.Rd @@ -18,6 +18,7 @@ rdiffnet( rewire.args = list(), threshold.dist = runif(n), exposure.args = list(), + exposure.mode = "deterministic", name = "A diffusion network", behavior = "Random contagion", stop.no.diff = TRUE, @@ -61,6 +62,8 @@ threshold for each node.} \item{exposure.args}{List. Arguments to be passed to \code{\link{exposure}}.} +\item{exposure.mode}{Character scalar. Either "deterministic" (default) or "stochastic".} + \item{name}{Character scalar. Passed to \code{\link{as_diffnet}}.} \item{behavior}{Character scalar or a list or character scalar (multiple behaviors only). Passed to \code{\link{as_diffnet}}.} @@ -156,6 +159,10 @@ is applied using that graph instead. \code{normalized} \tab \code{TRUE} } +When \code{exposure.mode = "stochastic"}, the \code{valued} argument in +\code{exposure.args} is forced to \code{TRUE} (with a message) to ensure that +edge weights are treated as probabilities. + The function \code{rdiffnet_multiple} is a wrapper of \code{rdiffnet} wich allows simulating multiple diffusion networks with the same parameters and apply the same function to all of them. This function is designed to allow the user diff --git a/tests/testthat/test-stochastic-exposure.R b/tests/testthat/test-stochastic-exposure.R new file mode 100644 index 0000000..6f5d741 --- /dev/null +++ b/tests/testthat/test-stochastic-exposure.R @@ -0,0 +1,62 @@ +context("Stochastic Exposure") +library(netdiffuseR) + +test_that("Stochastic vs Deterministic Exposure", { + # Create a small random graph + set.seed(123) + n <- 10 + g <- rgraph_er(n, t=1, p=0.5) + # Make it valued with probabilities + g@x <- runif(length(g@x)) + + # Wrap in list to make it "dynamic" (1 time step) + g_list <- list(g) + + # Create dummy adoption + cumadopt <- matrix(0, nrow=n, ncol=1) + cumadopt[1:5, 1] <- 1 + + # exposure expects a list for dynamic graphs if not diffnet + # MUST set valued=TRUE so weights are used as probabilities + e_det <- exposure(g_list, cumadopt, mode="deterministic", valued=TRUE) + e_stoch <- exposure(g_list, cumadopt, mode="stochastic", valued=TRUE) + + # They should be different (with high probability) + expect_false(isTRUE(all.equal(e_det, e_stoch))) + + # Check that stochastic exposure is non-negative and <= 1 + # With the new logic (preserving weights), it should be <= 1 + expect_true(all(e_stoch >= 0)) + expect_true(all(e_stoch <= 1 + 1e-10)) +}) + +test_that("rdiffnet wrapper with stochastic exposure", { + # We need a dynamic graph for rdiffnet usually, or t > 1 + set.seed(123) + diffnet <- rdiffnet(n=20, t=5, seed.graph="small-world", + exposure.mode="stochastic", + stop.no.diff = FALSE) # Prevent error if no diffusion occurs + + expect_s3_class(diffnet, "diffnet") + expect_true(all(diffnet$exposure >= 0)) +}) + +test_that("rdiffnet wrapper with stochastic exposure (multiple behaviors)", { + set.seed(123) + # 2 behaviors + diffnet <- rdiffnet(n=20, t=5, seed.graph="small-world", + exposure.mode="stochastic", + seed.p.adopt = list(0.1, 0.1), + stop.no.diff = FALSE) + + expect_s3_class(diffnet, "diffnet") + + # Calculate exposure to check dimensions + # Note: We must use the same mode to get consistent dimensions/behavior + expo <- exposure(diffnet, mode="stochastic") + + # Check dimensions of exposure: n x t x 2 + expect_equal(dim(expo), c(20, 5, 2)) + expect_true(all(expo >= 0)) + expect_true(all(expo <= 1 + 1e-10)) +}) From df7054a0d33726d222af41a7d8b55c1685b82837 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Sat, 27 Dec 2025 17:40:00 -0300 Subject: [PATCH 03/18] Switch stochastic exposure to Bernoulli-to-binary logic with degree normalization --- R/diffnet-class.r | 2 +- tests/testthat/test-stochastic-exposure.R | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/R/diffnet-class.r b/R/diffnet-class.r index d92ec8d..35dc67b 100644 --- a/R/diffnet-class.r +++ b/R/diffnet-class.r @@ -623,7 +623,7 @@ new_diffnet <- function( } # Step 2.1: Checking class of TOA and coercing if necessary - if (!inherits(toa, "integer")) { + if (!is.integer(toa)) { warning("Coercing -toa- into integer.") toa[] <- as.integer(toa) diff --git a/tests/testthat/test-stochastic-exposure.R b/tests/testthat/test-stochastic-exposure.R index 6f5d741..88a8d5c 100644 --- a/tests/testthat/test-stochastic-exposure.R +++ b/tests/testthat/test-stochastic-exposure.R @@ -32,9 +32,10 @@ test_that("Stochastic vs Deterministic Exposure", { test_that("rdiffnet wrapper with stochastic exposure", { # We need a dynamic graph for rdiffnet usually, or t > 1 - set.seed(123) + set.seed(1231) diffnet <- rdiffnet(n=20, t=5, seed.graph="small-world", exposure.mode="stochastic", + seed.p.adopt = 0.2, stop.no.diff = FALSE) # Prevent error if no diffusion occurs expect_s3_class(diffnet, "diffnet") @@ -42,11 +43,11 @@ test_that("rdiffnet wrapper with stochastic exposure", { }) test_that("rdiffnet wrapper with stochastic exposure (multiple behaviors)", { - set.seed(123) + set.seed(1231) # 2 behaviors diffnet <- rdiffnet(n=20, t=5, seed.graph="small-world", exposure.mode="stochastic", - seed.p.adopt = list(0.1, 0.1), + seed.p.adopt = list(0.2, 0.2), stop.no.diff = FALSE) expect_s3_class(diffnet, "diffnet") From c4a03f19d8449a01888f788f41d5ac7e50a2c448 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Sat, 27 Dec 2025 17:50:21 -0300 Subject: [PATCH 04/18] Switch stochastic exposure to Bernoulli-to-binary logic with degree normalization --- R/stats.R | 34 +++++++++++++++++----------------- man/exposure.Rd | 13 ++++++------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/R/stats.R b/R/stats.R index 880e95f..b79ddd4 100644 --- a/R/stats.R +++ b/R/stats.R @@ -337,16 +337,14 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { #' interpretation of the edges. In this mode, the weights of the graph \eqn{S_t} are #' treated as probabilities of transmission. For each edge \eqn{(i,j)}, a Bernoulli #' trial is performed with probability \eqn{S_{t,ij}}. If the trial is successful, -#' the edge is "realized" and its weight is used in the numerator. If failed, -#' the edge is treated as non-existent (weight 0) for the numerator. +#' the edge is "realized" as a full connection. If failed, the edge is treated +#' as non-existent. #' -#' The denominator (normalization factor) is always calculated using the original -#' weights of the graph (sum of probabilities), representing the expected total -#' exposure. This ensures that the exposure value \eqn{E_t} remains bounded between -#' 0 and 1 (if normalized), as the realized weights are a subset of the total weights. +#' The denominator is calculated using the degree of the node, representing the total +#' number of potential contacts. #' #' \deqn{ -#' \tilde{E}_{ti} = \frac{\sum_{j \neq i} \mathbb{I}(U_{ij} < S_{t,ij}) S_{t,ij} a_{tj}}{\sum_{j \neq i} S_{t,ij}} +#' \tilde{E}_{ti} = \frac{\sum_{j \neq i} \mathbb{I}(U_{ij} < S_{t,ij}) a_{tj}}{\sum_{j \neq i} 1} #' } #' #' Where \eqn{S_{t,ij}} is the weight of the edge from \eqn{j} to \eqn{i} at time \eqn{t} @@ -535,18 +533,20 @@ NULL # Checking self if (!self) graph <- sp_diag(graph, rep(0, nnodes(graph))) - # Calculate normalization (or potential exposure) - norm <- as.vector(graph %*% attrs) + 1e-20 - - # Apply stochastic filter (or selective exposure) + # Calculate normalization and apply stochastic filter if (mode == "stochastic") { - # Generate random values for every edge - u <- stats::runif(length(graph@x)) + # Denominator: Based on Degree (Potential connections as binary) + # We treat the graph as binary (weights=1) for the normalization + graph_binary <- graph + graph_binary@x <- rep(1, length(graph@x)) + norm <- as.vector(graph_binary %*% attrs) + 1e-20 - # Keep edge (keep original weight) if U < Weight, else remove (set to 0) - # This ensures the numerator (sum of realized weights) <= denominator (sum of all weights) - # So Exposure is always <= 1 (if normalized) - graph@x[u >= graph@x] <- 0 + # Numerator: Stochastic Filter (Bernoulli -> Binary) + u <- stats::runif(length(graph@x)) + graph@x <- as.numeric(u < graph@x) + } else { + # Deterministic: Based on original weights + norm <- as.vector(graph %*% attrs) + 1e-20 } if (length(dim(cumadopt)) == 3) { diff --git a/man/exposure.Rd b/man/exposure.Rd index 6e8a057..f83a3ce 100644 --- a/man/exposure.Rd +++ b/man/exposure.Rd @@ -125,16 +125,15 @@ When \code{mode = "stochastic"}, the exposure is calculated based on a probabili interpretation of the edges. In this mode, the weights of the graph \eqn{S_t} are treated as probabilities of transmission. For each edge \eqn{(i,j)}, a Bernoulli trial is performed with probability \eqn{S_{t,ij}}. If the trial is successful, -the edge is "realized" and its weight is used in the numerator. If failed, -the edge is treated as non-existent (weight 0) for the numerator. +the edge is "realized" as a full connection (weight 1). If failed, +the edge is treated as non-existent (weight 0). -The denominator (normalization factor) is always calculated using the original -weights of the graph (sum of probabilities), representing the expected total -exposure. This ensures that the exposure value \eqn{E_t} remains bounded between -0 and 1 (if normalized), as the realized weights are a subset of the total weights. +The denominator (normalization factor) is calculated using the degree of the node +(count of neighbors), regardless of the weights. This represents the total number +of potential contacts. \deqn{ -\tilde{E}_{ti} = \frac{\sum_{j \neq i} \mathbb{I}(U_{ij} < S_{t,ij}) S_{t,ij} a_{tj}}{\sum_{j \neq i} S_{t,ij}} +\tilde{E}_{ti} = \frac{\sum_{j \neq i} \mathbb{I}(U_{ij} < S_{t,ij}) a_{tj}}{\sum_{j \neq i} 1} } Where \eqn{S_{t,ij}} is the weight of the edge from \eqn{j} to \eqn{i} at time \eqn{t} From 6b56bf1c70e02b314d80d348b078a1ba13059f34 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Tue, 7 Apr 2026 11:05:37 -0700 Subject: [PATCH 05/18] feat(data): integrate dynamic behavioral attrs into epigamesDiffNet (Issue #75) - Add data-raw/epigames.R: bundles epigames_hourly + dynamic_attrs_hourly.csv into epigames list with new $dyn_attrs slot (long format, 201,366 rows) - Add data-raw/epigamesDiffNet.R: collapses hourly attrs to 15 daily windows, populates vertex.dyn.attrs with mask/med/quarantine proportions per day - Regenerate data/epigames.rda and data/epigamesDiffNet.rda Dynamic attributes (mask, med, quarantine) now visible in print(epigamesDiffNet): Dynamic attributes: mask, med, quarantine (3) Validated: exposure(epigamesDiffNet, attrs = 'mask') works with time-varying data. Correlation with static proxy = 0.88, confirming dynamic attrs capture additional temporal variation. --- data-raw/epigames.R | 63 +++++++++++++++++-- data-raw/epigamesDiffNet.R | 120 ++++++++++++++++++++++++++++++------- data/epigames.rda | Bin 58700 -> 63444 bytes data/epigamesDiffNet.rda | Bin 131620 -> 133580 bytes 4 files changed, 158 insertions(+), 25 deletions(-) diff --git a/data-raw/epigames.R b/data-raw/epigames.R index 48c5402..38e4b99 100644 --- a/data-raw/epigames.R +++ b/data-raw/epigames.R @@ -1,13 +1,68 @@ # data-raw/epigames.R # Pre-processing script for the EpiGames Raw Dataset +# Issue #75: Extended to include dynamic behavioral attributes (mask, med, quarantine) +# +# Prerequisites: +# 1. Run playground/epigames-stuff/epigames-analysis-copy/extract_dynamic_attrs.py +# to generate dynamic_attrs_hourly.csv in that same folder. +# 2. Have data-raw/epigames_hourly.rda available (generated by the previous pipeline). +# +# This script is run from the package root directory. rm(list = ls()) -# The raw data consists of an attributes data frame and an hourly edgelist, -# both using consistent node IDs (1-594). +# --------------------------------------------------------------------------- +# 1. Load the base hourly dataset (edgelist + static attributes) +# --------------------------------------------------------------------------- load("data-raw/epigames_hourly.rda") +# epigames_hourly is a list with $attributes and $edgelist -epigames <- epigames_hourly +# --------------------------------------------------------------------------- +# 2. Load the hourly dynamic behavioral attributes produced by Python +# --------------------------------------------------------------------------- +dyn_attrs_path <- "playground/epigames-stuff/epigames-analysis-copy/dynamic_attrs_hourly.csv" -# Save compressed raw data +if (!file.exists(dyn_attrs_path)) { + stop( + "dynamic_attrs_hourly.csv not found.\n", + "Please run extract_dynamic_attrs.py first:\n", + " cd playground/epigames-stuff/epigames-analysis-copy\n", + " source .venv/bin/activate\n", + " python3 extract_dynamic_attrs.py" + ) +} + +dyn_attrs_hourly <- read.csv(dyn_attrs_path, stringsAsFactors = FALSE) + +# Sanity checks +stopifnot(ncol(dyn_attrs_hourly) == 5) # id, hour, mask, med, quarantine +stopifnot(nrow(dyn_attrs_hourly) == 594 * 339) # 201,366 rows +stopifnot(all(dyn_attrs_hourly$id %in% 1:594)) +stopifnot(all(dyn_attrs_hourly$hour %in% 0:338)) + +cat("Dynamic attrs loaded:", nrow(dyn_attrs_hourly), "rows,", + ncol(dyn_attrs_hourly), "cols\n") +cat(" Nodes wearing mask (ever):", + length(unique(dyn_attrs_hourly$id[dyn_attrs_hourly$mask == 1])), "\n") +cat(" Nodes in quarantine (ever):", + length(unique(dyn_attrs_hourly$id[dyn_attrs_hourly$quarantine == 1])), "\n") + +# --------------------------------------------------------------------------- +# 3. Bundle into the epigames list (3 elements) +# --------------------------------------------------------------------------- +epigames <- list( + attributes = epigames_hourly$attributes, # static, 594 x 6 + edgelist = epigames_hourly$edgelist, # hourly, ~39k rows + dyn_attrs = dyn_attrs_hourly # NEW: 201,366 rows (long format) +) + +cat("\nepigames list structure:\n") +cat(" $attributes:", nrow(epigames$attributes), "rows x", ncol(epigames$attributes), "cols\n") +cat(" $edgelist: ", nrow(epigames$edgelist), "rows x", ncol(epigames$edgelist), "cols\n") +cat(" $dyn_attrs: ", nrow(epigames$dyn_attrs), "rows x", ncol(epigames$dyn_attrs), "cols\n") + +# --------------------------------------------------------------------------- +# 4. Save compressed .rda +# --------------------------------------------------------------------------- usethis::use_data(epigames, overwrite = TRUE, compress = "xz") +cat("\nSaved: data/epigames.rda\n") diff --git a/data-raw/epigamesDiffNet.R b/data-raw/epigamesDiffNet.R index a7d313f..8731c5c 100644 --- a/data-raw/epigamesDiffNet.R +++ b/data-raw/epigamesDiffNet.R @@ -1,50 +1,128 @@ # data-raw/epigamesDiffNet.R -# Generating the dynamic diffnet object using netdiffuseR + collapse_timeframes() +# Generating the daily diffnet object from epigames using collapse_timeframes() +# Issue #75: Now includes vertex.dyn.attrs (mask, med, quarantine per day) +# +# Run after data-raw/epigames.R has built data/epigames.rda. rm(list = ls()) library(netdiffuseR) -# Load the base raw dataset created in data-raw/epigames.R (hourly resolution) +# --------------------------------------------------------------------------- +# 1. Load the base epigames dataset (with dynamic attrs) +# --------------------------------------------------------------------------- load("data/epigames.rda") -attrs <- epigames$attributes -edges <- epigames$edgelist +attrs <- epigames$attributes # 594 x 6: id, toa, qyes_total, qno_total, mask_prop, med_prop +edges <- epigames$edgelist # hourly edgelist: sender, receiver, time (0-338), weight +dyn_long <- epigames$dyn_attrs # long format: id, hour (0-338), mask, med, quarantine -# Collapse hourly edgelist (hours 0-338) into daily windows (days 1-15) -source("R/collapse_timeframes.R") +# --------------------------------------------------------------------------- +# 2. Collapse hourly edgelist into 15 daily windows via collapse_timeframes() +# --------------------------------------------------------------------------- +WINDOW_SIZE <- 24 # hours per day +N_DAYS <- 15 daily_edgelist <- collapse_timeframes( - edgelist = edges, - ego = "sender", - alter = "receiver", - timevar = "time", - weightvar = "weight", - window_size = 24, - binarize = TRUE, - cumulative = TRUE, - symmetric = TRUE + edgelist = edges, + ego = "sender", + alter = "receiver", + timevar = "time", + weightvar = "weight", + window_size = WINDOW_SIZE, + binarize = TRUE, + cumulative = TRUE, + symmetric = TRUE ) -# Build daily adjacency matrices +cat("Daily edgelist: ", nrow(daily_edgelist), "rows, time range:", + range(daily_edgelist$time), "\n") + +# Build adjacency matrices adjmat <- edgelist_to_adjmat( daily_edgelist[, c("sender", "receiver")], - w = daily_edgelist$weight, - t0 = daily_edgelist$time, + w = daily_edgelist$weight, + t0 = daily_edgelist$time, keep.isolates = TRUE, multiple = TRUE ) -max_t <- max(daily_edgelist$time, na.rm = TRUE) +# --------------------------------------------------------------------------- +# 3. Build vertex.dyn.attrs: one data.frame per day (15 total) +# Each data.frame: 594 rows, columns: mask, med, quarantine (daily means) +# --------------------------------------------------------------------------- +# Map hourly data to day index (day d = hours [(d-1)*24 .. d*24-1]) +dyn_long$day <- (dyn_long$hour %/% WINDOW_SIZE) + 1 # 1-based day +dyn_long$day <- pmin(dyn_long$day, N_DAYS) # clamp hour 336-338 to day 15 + +vertex_dyn <- lapply(1:N_DAYS, function(d) { + sub <- dyn_long[dyn_long$day == d, ] + + # Aggregate per node: mean within each 24-hour window + # (proportion of hours in that day where behavior was active) + agg <- aggregate( + cbind(mask, med, quarantine) ~ id, + data = sub, + FUN = mean + ) + + # Sort by id to match the node ordering in the diffnet object + agg <- agg[order(agg$id), ] + rownames(agg) <- NULL + + # Return only the behavior columns (not id — diffnet uses position) + agg[, c("mask", "med", "quarantine")] +}) + +# Sanity check: each element should be 594 rows x 3 cols +stopifnot(all(sapply(vertex_dyn, nrow) == 594)) +stopifnot(all(sapply(vertex_dyn, ncol) == 3)) + +cat("vertex.dyn.attrs built: ", N_DAYS, "data.frames of", + nrow(vertex_dyn[[1]]), "rows x", ncol(vertex_dyn[[1]]), "cols\n") +cat(" Day 1 — mean mask usage:", round(mean(vertex_dyn[[1]]$mask), 3), + " mean quarantine:", round(mean(vertex_dyn[[1]]$quarantine), 3), "\n") +cat(" Day 15 — mean mask usage:", round(mean(vertex_dyn[[15]]$mask), 3), + " mean quarantine:", round(mean(vertex_dyn[[15]]$quarantine), 3), "\n") -# Prepare TOA vector: real adoption times from attrs, NA for non-adopters +# --------------------------------------------------------------------------- +# 4. Prepare TOA vector +# --------------------------------------------------------------------------- toa_vec <- stats::setNames(attrs$toa, as.character(attrs$id)) +# --------------------------------------------------------------------------- +# 5. Assemble diffnet object +# --------------------------------------------------------------------------- epigamesDiffNet <- as_diffnet( adjmat, toa = toa_vec, vertex.static.attrs = attrs, + vertex.dyn.attrs = vertex_dyn, t0 = 1, - t1 = max_t + t1 = N_DAYS ) +cat("\nepigamesDiffNet summary:\n") +print(epigamesDiffNet) + +# --------------------------------------------------------------------------- +# 6. Quick validation: dynamic exposure vs static exposure +# --------------------------------------------------------------------------- +cat("\nValidating exposure() with dynamic mask attrs...\n") +expo_static <- exposure( + epigamesDiffNet, + attrs = matrix( + rep(epigamesDiffNet$vertex.static.attrs$mask_prop, N_DAYS), + nrow = 594, ncol = N_DAYS + ) +) +expo_dynamic <- exposure(epigamesDiffNet, attrs = "mask") + +cor_val <- cor(as.vector(expo_static), as.vector(expo_dynamic), use = "complete.obs") +cat(" Correlation static vs dynamic mask exposure:", round(cor_val, 4), "\n") +cat(" (Should be < 1.0, confirming dynamic attrs add new information)\n") + +# --------------------------------------------------------------------------- +# 7. Save +# --------------------------------------------------------------------------- usethis::use_data(epigamesDiffNet, overwrite = TRUE, compress = "xz") +cat("\nSaved: data/epigamesDiffNet.rda\n") diff --git a/data/epigames.rda b/data/epigames.rda index 0c0dda500c584e8b684b5289ef367e8433987572..a9efca8aed10d20dfb3db10c85ea14d3292e368f 100644 GIT binary patch literal 63444 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 literal 58700 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 RuSY&G4T}N*00001Sz4kp3qb$? diff --git a/data/epigamesDiffNet.rda b/data/epigamesDiffNet.rda index fc1a2deb3790f11581404a11851ea90041cc06a8..fdcce0f7687207724b67054b64e47e78c5e00fcc 100644 GIT binary patch delta 2379 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 delta 403 zcmV;E0c`%vlL(}Q2!ON!B;W;vg$W_nw<+KOf*^m0S(pt-A*WKqrH77baA6zhHNU=# ztgDqq)$H)Z+8^t7oT)SM3kX3#glZ7dgs#D~+=BfXQ6_9gX^6I#)@IX1UbwB8ldW>b zt)TY$>4l6wnxgy$=N5$nEgW1z0HsP}*S}q*mzDF(9IBZ|WnADTf5Kc& x7QuK~+sHw&=~Ms!000VB`Un64`GW|t#Ge5G007Zeu05OMQ9uI#00001Sy~;oyhi{4 From da1ab6c5b1650d146bc7126434e680f64d63a5df Mon Sep 17 00:00:00 2001 From: aoliveram Date: Tue, 7 Apr 2026 12:30:15 -0700 Subject: [PATCH 06/18] style: clean up epigames data generation scripts - Removed redundant comments and sanity checks for better readability - Simplified as_diffnet call structure - Regenerated .rda files to match clean scripts --- data-raw/epigames.R | 61 +++++--------------------- data-raw/epigamesDiffNet.R | 87 +++++++++----------------------------- 2 files changed, 30 insertions(+), 118 deletions(-) diff --git a/data-raw/epigames.R b/data-raw/epigames.R index 38e4b99..28cfe97 100644 --- a/data-raw/epigames.R +++ b/data-raw/epigames.R @@ -1,68 +1,29 @@ # data-raw/epigames.R # Pre-processing script for the EpiGames Raw Dataset -# Issue #75: Extended to include dynamic behavioral attributes (mask, med, quarantine) -# -# Prerequisites: -# 1. Run playground/epigames-stuff/epigames-analysis-copy/extract_dynamic_attrs.py -# to generate dynamic_attrs_hourly.csv in that same folder. -# 2. Have data-raw/epigames_hourly.rda available (generated by the previous pipeline). -# -# This script is run from the package root directory. rm(list = ls()) -# --------------------------------------------------------------------------- -# 1. Load the base hourly dataset (edgelist + static attributes) -# --------------------------------------------------------------------------- +# The raw data consists of an attributes data frame and an hourly edgelist, +# both using consistent node IDs (1-594). load("data-raw/epigames_hourly.rda") -# epigames_hourly is a list with $attributes and $edgelist -# --------------------------------------------------------------------------- -# 2. Load the hourly dynamic behavioral attributes produced by Python -# --------------------------------------------------------------------------- +# Load the hourly dynamic behavioral attributes dyn_attrs_path <- "playground/epigames-stuff/epigames-analysis-copy/dynamic_attrs_hourly.csv" -if (!file.exists(dyn_attrs_path)) { - stop( - "dynamic_attrs_hourly.csv not found.\n", - "Please run extract_dynamic_attrs.py first:\n", - " cd playground/epigames-stuff/epigames-analysis-copy\n", - " source .venv/bin/activate\n", - " python3 extract_dynamic_attrs.py" - ) -} - dyn_attrs_hourly <- read.csv(dyn_attrs_path, stringsAsFactors = FALSE) # Sanity checks -stopifnot(ncol(dyn_attrs_hourly) == 5) # id, hour, mask, med, quarantine -stopifnot(nrow(dyn_attrs_hourly) == 594 * 339) # 201,366 rows -stopifnot(all(dyn_attrs_hourly$id %in% 1:594)) +stopifnot(ncol(dyn_attrs_hourly) == 5) # id, hour, mask, med, quarantine +stopifnot(nrow(dyn_attrs_hourly) == 594 * 339) # 201,366 rows +stopifnot(all(dyn_attrs_hourly$id %in% 1:594)) stopifnot(all(dyn_attrs_hourly$hour %in% 0:338)) -cat("Dynamic attrs loaded:", nrow(dyn_attrs_hourly), "rows,", - ncol(dyn_attrs_hourly), "cols\n") -cat(" Nodes wearing mask (ever):", - length(unique(dyn_attrs_hourly$id[dyn_attrs_hourly$mask == 1])), "\n") -cat(" Nodes in quarantine (ever):", - length(unique(dyn_attrs_hourly$id[dyn_attrs_hourly$quarantine == 1])), "\n") - -# --------------------------------------------------------------------------- -# 3. Bundle into the epigames list (3 elements) -# --------------------------------------------------------------------------- +# Bundle into the epigames list (3 elements) epigames <- list( - attributes = epigames_hourly$attributes, # static, 594 x 6 - edgelist = epigames_hourly$edgelist, # hourly, ~39k rows - dyn_attrs = dyn_attrs_hourly # NEW: 201,366 rows (long format) + attributes = epigames_hourly$attributes, # static, 594 x 6 + edgelist = epigames_hourly$edgelist, # hourly, ~39k rows + dyn_attrs = dyn_attrs_hourly # dynamical attributes (long format) ) -cat("\nepigames list structure:\n") -cat(" $attributes:", nrow(epigames$attributes), "rows x", ncol(epigames$attributes), "cols\n") -cat(" $edgelist: ", nrow(epigames$edgelist), "rows x", ncol(epigames$edgelist), "cols\n") -cat(" $dyn_attrs: ", nrow(epigames$dyn_attrs), "rows x", ncol(epigames$dyn_attrs), "cols\n") - -# --------------------------------------------------------------------------- -# 4. Save compressed .rda -# --------------------------------------------------------------------------- +# Save compressed .rda usethis::use_data(epigames, overwrite = TRUE, compress = "xz") -cat("\nSaved: data/epigames.rda\n") diff --git a/data-raw/epigamesDiffNet.R b/data-raw/epigamesDiffNet.R index 8731c5c..6db8a87 100644 --- a/data-raw/epigamesDiffNet.R +++ b/data-raw/epigamesDiffNet.R @@ -1,26 +1,20 @@ # data-raw/epigamesDiffNet.R # Generating the daily diffnet object from epigames using collapse_timeframes() -# Issue #75: Now includes vertex.dyn.attrs (mask, med, quarantine per day) -# # Run after data-raw/epigames.R has built data/epigames.rda. rm(list = ls()) library(netdiffuseR) -# --------------------------------------------------------------------------- -# 1. Load the base epigames dataset (with dynamic attrs) -# --------------------------------------------------------------------------- +# Load the base epigames dataset (with dynamic attrs) load("data/epigames.rda") -attrs <- epigames$attributes # 594 x 6: id, toa, qyes_total, qno_total, mask_prop, med_prop -edges <- epigames$edgelist # hourly edgelist: sender, receiver, time (0-338), weight -dyn_long <- epigames$dyn_attrs # long format: id, hour (0-338), mask, med, quarantine +attrs <- epigames$attributes # 594 x 6: id, toa, qyes_total, qno_total, mask_prop, med_prop +edges <- epigames$edgelist # hourly edgelist: sender, receiver, time (0-338), weight +dyn_long <- epigames$dyn_attrs # long format: id, hour (0-338), mask, med, quarantine -# --------------------------------------------------------------------------- -# 2. Collapse hourly edgelist into 15 daily windows via collapse_timeframes() -# --------------------------------------------------------------------------- -WINDOW_SIZE <- 24 # hours per day -N_DAYS <- 15 +# Collapse hourly edgelist into 15 daily windows via collapse_timeframes() +WINDOW_SIZE <- 24 # hours per day +N_DAYS <- 15 daily_edgelist <- collapse_timeframes( edgelist = edges, @@ -34,9 +28,6 @@ daily_edgelist <- collapse_timeframes( symmetric = TRUE ) -cat("Daily edgelist: ", nrow(daily_edgelist), "rows, time range:", - range(daily_edgelist$time), "\n") - # Build adjacency matrices adjmat <- edgelist_to_adjmat( daily_edgelist[, c("sender", "receiver")], @@ -46,17 +37,15 @@ adjmat <- edgelist_to_adjmat( multiple = TRUE ) -# --------------------------------------------------------------------------- -# 3. Build vertex.dyn.attrs: one data.frame per day (15 total) -# Each data.frame: 594 rows, columns: mask, med, quarantine (daily means) -# --------------------------------------------------------------------------- +# Build vertex.dyn.attrs: one data.frame per day (15 total) +# Each data.frame: 594 rows, columns: mask, med, quarantine (daily means) # Map hourly data to day index (day d = hours [(d-1)*24 .. d*24-1]) -dyn_long$day <- (dyn_long$hour %/% WINDOW_SIZE) + 1 # 1-based day -dyn_long$day <- pmin(dyn_long$day, N_DAYS) # clamp hour 336-338 to day 15 +dyn_long$day <- (dyn_long$hour %/% WINDOW_SIZE) + 1 # 1-based day +dyn_long$day <- pmin(dyn_long$day, N_DAYS) # clamp hour 336-338 to day 15 vertex_dyn <- lapply(1:N_DAYS, function(d) { sub <- dyn_long[dyn_long$day == d, ] - + # Aggregate per node: mean within each 24-hour window # (proportion of hours in that day where behavior was active) agg <- aggregate( @@ -64,65 +53,27 @@ vertex_dyn <- lapply(1:N_DAYS, function(d) { data = sub, FUN = mean ) - + # Sort by id to match the node ordering in the diffnet object agg <- agg[order(agg$id), ] rownames(agg) <- NULL - + # Return only the behavior columns (not id — diffnet uses position) agg[, c("mask", "med", "quarantine")] }) -# Sanity check: each element should be 594 rows x 3 cols -stopifnot(all(sapply(vertex_dyn, nrow) == 594)) -stopifnot(all(sapply(vertex_dyn, ncol) == 3)) - -cat("vertex.dyn.attrs built: ", N_DAYS, "data.frames of", - nrow(vertex_dyn[[1]]), "rows x", ncol(vertex_dyn[[1]]), "cols\n") -cat(" Day 1 — mean mask usage:", round(mean(vertex_dyn[[1]]$mask), 3), - " mean quarantine:", round(mean(vertex_dyn[[1]]$quarantine), 3), "\n") -cat(" Day 15 — mean mask usage:", round(mean(vertex_dyn[[15]]$mask), 3), - " mean quarantine:", round(mean(vertex_dyn[[15]]$quarantine), 3), "\n") - -# --------------------------------------------------------------------------- -# 4. Prepare TOA vector -# --------------------------------------------------------------------------- +# Prepare TOA vector toa_vec <- stats::setNames(attrs$toa, as.character(attrs$id)) -# --------------------------------------------------------------------------- -# 5. Assemble diffnet object -# --------------------------------------------------------------------------- +# Assemble diffnet object epigamesDiffNet <- as_diffnet( adjmat, - toa = toa_vec, + toa = toa_vec, vertex.static.attrs = attrs, - vertex.dyn.attrs = vertex_dyn, + vertex.dyn.attrs = vertex_dyn, t0 = 1, t1 = N_DAYS ) -cat("\nepigamesDiffNet summary:\n") -print(epigamesDiffNet) - -# --------------------------------------------------------------------------- -# 6. Quick validation: dynamic exposure vs static exposure -# --------------------------------------------------------------------------- -cat("\nValidating exposure() with dynamic mask attrs...\n") -expo_static <- exposure( - epigamesDiffNet, - attrs = matrix( - rep(epigamesDiffNet$vertex.static.attrs$mask_prop, N_DAYS), - nrow = 594, ncol = N_DAYS - ) -) -expo_dynamic <- exposure(epigamesDiffNet, attrs = "mask") - -cor_val <- cor(as.vector(expo_static), as.vector(expo_dynamic), use = "complete.obs") -cat(" Correlation static vs dynamic mask exposure:", round(cor_val, 4), "\n") -cat(" (Should be < 1.0, confirming dynamic attrs add new information)\n") - -# --------------------------------------------------------------------------- -# 7. Save -# --------------------------------------------------------------------------- +# Save usethis::use_data(epigamesDiffNet, overwrite = TRUE, compress = "xz") -cat("\nSaved: data/epigamesDiffNet.rda\n") From 6bec689c43bf4217a01fdcb6f6e33e00d6a7ee82 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Wed, 8 Apr 2026 10:39:24 -0700 Subject: [PATCH 07/18] chore: add t1 to edgelist format and clean up comments --- data-raw/epigamesDiffNet.R | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/data-raw/epigamesDiffNet.R b/data-raw/epigamesDiffNet.R index 6db8a87..42eb05e 100644 --- a/data-raw/epigamesDiffNet.R +++ b/data-raw/epigamesDiffNet.R @@ -5,7 +5,6 @@ rm(list = ls()) library(netdiffuseR) -# Load the base epigames dataset (with dynamic attrs) load("data/epigames.rda") attrs <- epigames$attributes # 594 x 6: id, toa, qyes_total, qno_total, mask_prop, med_prop @@ -13,9 +12,12 @@ edges <- epigames$edgelist # hourly edgelist: sender, receiver, time (0-338), we dyn_long <- epigames$dyn_attrs # long format: id, hour (0-338), mask, med, quarantine # Collapse hourly edgelist into 15 daily windows via collapse_timeframes() -WINDOW_SIZE <- 24 # hours per day +WINDOW_SIZE <- 24 N_DAYS <- 15 +dyn_long$day <- (dyn_long$hour %/% WINDOW_SIZE) + 1 +dyn_long$day <- pmin(dyn_long$day, N_DAYS) # day mapping + daily_edgelist <- collapse_timeframes( edgelist = edges, ego = "sender", @@ -33,21 +35,18 @@ adjmat <- edgelist_to_adjmat( daily_edgelist[, c("sender", "receiver")], w = daily_edgelist$weight, t0 = daily_edgelist$time, + t1 = daily_edgelist$time, keep.isolates = TRUE, multiple = TRUE ) # Build vertex.dyn.attrs: one data.frame per day (15 total) -# Each data.frame: 594 rows, columns: mask, med, quarantine (daily means) -# Map hourly data to day index (day d = hours [(d-1)*24 .. d*24-1]) -dyn_long$day <- (dyn_long$hour %/% WINDOW_SIZE) + 1 # 1-based day -dyn_long$day <- pmin(dyn_long$day, N_DAYS) # clamp hour 336-338 to day 15 +# Each data.frame: 594 rows, columns: mask, med, quarantine vertex_dyn <- lapply(1:N_DAYS, function(d) { sub <- dyn_long[dyn_long$day == d, ] # Aggregate per node: mean within each 24-hour window - # (proportion of hours in that day where behavior was active) agg <- aggregate( cbind(mask, med, quarantine) ~ id, data = sub, @@ -58,7 +57,7 @@ vertex_dyn <- lapply(1:N_DAYS, function(d) { agg <- agg[order(agg$id), ] rownames(agg) <- NULL - # Return only the behavior columns (not id — diffnet uses position) + # Return only the behavior columns agg[, c("mask", "med", "quarantine")] }) From 07218b3b9d951ec45c7e8ae44575fa1fc56c8558 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Tue, 14 Apr 2026 11:29:31 -0700 Subject: [PATCH 08/18] Fix logic and improve printer for degree_adoption_diagnostic --- R/degree_adoption_diagnostic.R | 216 +++++++++++++++++++++------------ 1 file changed, 136 insertions(+), 80 deletions(-) diff --git a/R/degree_adoption_diagnostic.R b/R/degree_adoption_diagnostic.R index 1fa9ada..baf047f 100644 --- a/R/degree_adoption_diagnostic.R +++ b/R/degree_adoption_diagnostic.R @@ -78,12 +78,14 @@ #' #' # Different degree aggregation strategies #' result_first <- degree_adoption_diagnostic(kfamilyDiffNet, degree_strategy = "first") -#' result_last <- degree_adoption_diagnostic(kfamilyDiffNet, degree_strategy = "last") +#' result_last <- degree_adoption_diagnostic(kfamilyDiffNet, degree_strategy = "last") #' #' # Multi-diffusion (toy) ---------------------------------------------------- #' set.seed(999) -#' n <- 40; t <- 5; q <- 2 -#' garr <- rgraph_ws(n, t, p=.3) +#' n <- 40 +#' t <- 5 +#' q <- 2 +#' garr <- rgraph_ws(n, t, p = .3) #' diffnet_multi <- rdiffnet(seed.graph = garr, t = t, seed.p.adopt = rep(list(0.1), q)) #' #' # pooled (one combined analysis) @@ -96,20 +98,19 @@ #' @family statistics #' @export degree_adoption_diagnostic <- function( - graph, - degree_strategy = c("mean", "first", "last"), - bootstrap = TRUE, - R = 1000, - conf.level = 0.95, - toa = NULL, - t0 = NULL, t1 = NULL, - name = NULL, - behavior = NULL, - combine = c("none", "pooled", "average", "earliest"), - min_adopters = 3, - valued = getOption("diffnet.valued", FALSE), - ... -) { + graph, + degree_strategy = c("mean", "first", "last"), + bootstrap = TRUE, + R = 1000, + conf.level = 0.95, + toa = NULL, + t0 = NULL, t1 = NULL, + name = NULL, + behavior = NULL, + combine = c("none", "pooled", "average", "earliest"), + min_adopters = 3, + valued = getOption("diffnet.valued", FALSE), + ...) { # Check that bootstrap is a logical scalar if (!is.logical(bootstrap) || length(bootstrap) != 1 || is.na(bootstrap)) { stop("'bootstrap' must be a logical scalar") @@ -154,8 +155,10 @@ degree_adoption_diagnostic <- function( } behavior_indices <- match(behavior, colnames(toa)) if (any(is.na(behavior_indices))) { - stop("Some behavior names not found in colnames(toa): ", - paste(behavior[is.na(behavior_indices)], collapse = ", ")) + stop( + "Some behavior names not found in colnames(toa): ", + paste(behavior[is.na(behavior_indices)], collapse = ", ") + ) } } else if (is.numeric(behavior)) { behavior_indices <- behavior @@ -186,8 +189,10 @@ degree_adoption_diagnostic <- function( combined_data <- prepare_combined_data(degrees, toa, combine, min_adopters, Q) if (nrow(combined_data) < min_adopters) { - stop("Insufficient adopters for correlation analysis. (n=", nrow(combined_data), - ", minimum = ", min_adopters, ").") + stop( + "Insufficient adopters for correlation analysis. (n=", nrow(combined_data), + ", minimum = ", min_adopters, ")." + ) } # Compute correlations @@ -232,8 +237,12 @@ process_graph_input <- function(graph, toa, t0, t1, name, ...) { # If graph is a list, ensure all elements are dgCMatrix if (is.list(graph)) { graph <- lapply(graph, function(g) { - if (inherits(g, "dgCMatrix")) return(g) - if (is.matrix(g)) return(as(Matrix::Matrix(g, sparse = TRUE), "dgCMatrix")) + if (inherits(g, "dgCMatrix")) { + return(g) + } + if (is.matrix(g)) { + return(as(Matrix::Matrix(g, sparse = TRUE), "dgCMatrix")) + } stop("All elements of the graph list must be matrices or dgCMatrix.") }) } @@ -328,8 +337,8 @@ analyze_multi_behaviors_separately <- function(degrees, toa, min_adopters, boots toa = toa_q[adopters_q] ) - correlations_matrix[1, q] <- cor_safe(data_q$indegree, data_q$toa ) - correlations_matrix[2, q] <- cor_safe(data_q$outdegree, data_q$toa ) + correlations_matrix[1, q] <- cor_safe(data_q$indegree, data_q$toa) + correlations_matrix[2, q] <- cor_safe(data_q$outdegree, data_q$toa) sample_sizes[q] <- nrow(data_q) if (bootstrap) { @@ -391,7 +400,9 @@ prepare_combined_data <- function(degrees, toa, combine, min_adopters, Q) { } else if (combine == "earliest") { # Earliest TOA across behaviors per actor toa_min <- apply(toa, 1, function(row) { - if (all(is.na(row))) return(NA_real_) + if (all(is.na(row))) { + return(NA_real_) + } min(row, na.rm = TRUE) }) toa_min[is.infinite(toa_min)] <- NA @@ -414,12 +425,12 @@ compute_correlations <- function(data) { compute_bootstrap_results <- function(combined_data, R, conf.level) { # Compute baseline correlations - base_corr <- compute_correlations(combined_data) - indeg_corr <- base_corr[["indegree_toa"]] + base_corr <- compute_correlations(combined_data) + indeg_corr <- base_corr[["indegree_toa"]] outdeg_corr <- base_corr[["outdegree_toa"]] indeg_boot_list <- NULL - out_boot_list <- NULL + out_boot_list <- NULL # Out-degree if (!is.na(outdeg_corr)) { @@ -430,13 +441,16 @@ compute_bootstrap_results <- function(combined_data, R, conf.level) { } boot_obj_out <- boot::boot(combined_data, statistic = safe_bootstrap_out, R = R) bias_out <- mean(boot_obj_out$t, na.rm = TRUE) - outdeg_corr - se_out <- stats::sd(boot_obj_out$t, na.rm = TRUE) - - ci_out <- tryCatch({ - bci <- boot::boot.ci(boot_obj_out, conf = conf.level, type = "perc") - # Percentile CI vector (low, high) - if (!is.null(bci$percent)) bci$percent[4:5] else NULL - }, error = function(e) NULL) + se_out <- stats::sd(boot_obj_out$t, na.rm = TRUE) + + ci_out <- tryCatch( + { + bci <- boot::boot.ci(boot_obj_out, conf = conf.level, type = "perc") + # Percentile CI vector (low, high) + if (!is.null(bci$percent)) bci$percent[4:5] else NULL + }, + error = function(e) NULL + ) out_boot_list <- list( correlation = outdeg_corr, @@ -462,12 +476,15 @@ compute_bootstrap_results <- function(combined_data, R, conf.level) { } boot_obj_in <- boot::boot(combined_data, statistic = safe_bootstrap_in, R = R) bias_in <- mean(boot_obj_in$t, na.rm = TRUE) - indeg_corr - se_in <- stats::sd(boot_obj_in$t, na.rm = TRUE) - - ci_in <- tryCatch({ - bci <- boot::boot.ci(boot_obj_in, conf = conf.level, type = "perc") - if (!is.null(bci$percent)) bci$percent[4:5] else NULL - }, error = function(e) NULL) + se_in <- stats::sd(boot_obj_in$t, na.rm = TRUE) + + ci_in <- tryCatch( + { + bci <- boot::boot.ci(boot_obj_in, conf = conf.level, type = "perc") + if (!is.null(bci$percent)) bci$percent[4:5] else NULL + }, + error = function(e) NULL + ) indeg_boot_list <- list( correlation = indeg_corr, @@ -508,7 +525,7 @@ check_undirected_graph <- function(graph) { return(all(sapply(graph, function(g) isSymmetric(as.matrix(g))))) } if (is.array(graph) && length(dim(graph)) == 3) { - return(all(sapply(seq_len(dim(graph)[3]), function(t) isSymmetric(as.matrix(graph[,,t]))))) + return(all(sapply(seq_len(dim(graph)[3]), function(t) isSymmetric(as.matrix(graph[, , t]))))) } if (is.matrix(graph)) { return(isSymmetric(as.matrix(graph))) @@ -568,7 +585,7 @@ print_single_behavior_results <- function(x, undirected) { # Print correlations cat("Correlations:\n") if (undirected) { - deg_r <- indeg_r # For undirected graphs, in-degree = out-degree = degree + deg_r <- indeg_r # For undirected graphs, in-degree = out-degree = degree cat(sprintf(" Degree - Time of Adoption: %.3f\n", deg_r)) } else { cat(sprintf(" In-degree - Time of Adoption: %.3f\n", indeg_r)) @@ -582,16 +599,24 @@ print_single_behavior_results <- function(x, undirected) { bootstrap_data <- x$bootstrap deg_ci <- if (undirected && !is.null(bootstrap_data$indegree$conf_int)) { bootstrap_data$indegree$conf_int - } else NULL + } else { + NULL + } indeg_ci <- if (!is.null(bootstrap_data$indegree$conf_int)) { bootstrap_data$indegree$conf_int - } else NULL + } else { + NULL + } outdeg_ci <- if (!is.null(bootstrap_data$outdegree$conf_int)) { bootstrap_data$outdegree$conf_int - } else NULL + } else { + NULL + } lvl <- if (!is.null(bootstrap_data$indegree$conf_level)) { bootstrap_data$indegree$conf_level * 100 - } else NA_real_ + } else { + NA_real_ + } if (undirected) { explain_degree_correlation("Degree", deg_r, deg_ci, lvl_arg = lvl) @@ -648,16 +673,24 @@ print_multi_behavior_results <- function(x, undirected) { bootstrap_data <- if (!is.null(x$bootstrap)) x$bootstrap[[j]] else NULL deg_ci <- if (undirected && !is.null(bootstrap_data) && !is.null(bootstrap_data$indegree$conf_int)) { bootstrap_data$indegree$conf_int - } else NULL + } else { + NULL + } indeg_ci <- if (!is.null(bootstrap_data) && !is.null(bootstrap_data$indegree$conf_int)) { bootstrap_data$indegree$conf_int - } else NULL + } else { + NULL + } outdeg_ci <- if (!is.null(bootstrap_data) && !is.null(bootstrap_data$outdegree$conf_int)) { bootstrap_data$outdegree$conf_int - } else NULL + } else { + NULL + } lvl <- if (!is.null(bootstrap_data) && !is.null(bootstrap_data$indegree$conf_level)) { bootstrap_data$indegree$conf_level * 100 - } else NA_real_ + } else { + NA_real_ + } cat(sprintf(" [%s]\n", bname)) if (undirected) { @@ -696,49 +729,72 @@ explain_degree_correlation <- function(label, r, ci, lvl_arg = NA_real_, thr = 0 format_interpretation_no_ci <- function(label, r, abs_big, degree_term, thr) { if (!abs_big) { - cat(sprintf(" %s: Weak relationship between %s and adoption timing:\n |r| \u2264 %.1f; no CI.\n", - label, degree_term, thr)) - } else if (r > 0) { - cat(sprintf(" %s: Central actors (high %s) tended to adopt early (supporters):\n |r| > %.1f; no CI.\n", - label, degree_term, thr)) + cat(sprintf( + " %s: Weak relationship between %s and adoption timing:\n |r| \u2264 %.1f; no CI.\n", + label, degree_term, thr + )) + } else if (r < 0) { + cat(sprintf( + " %s: Central actors (high %s) tended to adopt early (supporters):\n |r| > %.1f; no CI.\n", + label, degree_term, thr + )) } else { - cat(sprintf(" %s: Central actors (high %s) tended to adopt late (opposers):\n |r| > %.1f; no CI.\n", - label, degree_term, thr)) + cat(sprintf( + " %s: Central actors (high %s) tended to adopt late (opposers):\n |r| > %.1f; no CI.\n", + label, degree_term, thr + )) } } format_interpretation_with_ci <- function(label, r, ci, abs_big, degree_term, thr, lvl_arg) { lvl_local <- if (!is.na(lvl_arg)) lvl_arg else 95 ci_includes_zero <- (length(ci) >= 2) && is.finite(ci[1]) && is.finite(ci[2]) && (ci[1] <= 0 && ci[2] >= 0) + + ci_low <- if (length(ci) >= 1) ci[1] else NA_real_ + ci_high <- if (length(ci) >= 2) ci[2] else NA_real_ if (!abs_big) { - cat(sprintf(" %s: Weak relationship between %s and adoption timing; %s statistically supported:\n |r| \u2264 %.1f; CI (%.1f%%) %s 0.\n", - label, degree_term, - if (ci_includes_zero) "NOT" else "", - thr, lvl_local, - if (ci_includes_zero) "includes" else "excludes")) - } else if (r > 0) { - cat(sprintf(" %s: Central actors (high %s) tended to adopt early (supporters); %s statistically supported:\n |r| > %.1f; CI (%.1f%%) %s 0.\n", - label, degree_term, - if (ci_includes_zero) "NOT" else "", - thr, lvl_local, - if (ci_includes_zero) "includes" else "excludes")) + cat(sprintf( + " %s: Weak relationship between %s and adoption timing; %s statistically supported:\n |r| \u2264 %.1f; CI (%.1f%%) = [%.3f, %.3f]\n", + label, degree_term, + if (ci_includes_zero) "NOT" else "", + thr, lvl_local, + ci_low, ci_high + )) + } else if (r < 0) { + cat(sprintf( + " %s: Central actors (high %s) tended to adopt early (supporters); %s statistically supported:\n |r| > %.1f; CI (%.1f%%) = [%.3f, %.3f]\n", + label, degree_term, + if (ci_includes_zero) "NOT" else "", + thr, lvl_local, + ci_low, ci_high + )) } else { - cat(sprintf(" %s: Central actors (high %s) tended to adopt late (opposers); %s statistically supported:\n |r| > %.1f; CI (%.1f%%) %s 0.\n", - label, degree_term, - if (ci_includes_zero) "NOT" else "", - thr, lvl_local, - if (ci_includes_zero) "includes" else "excludes")) + cat(sprintf( + " %s: Central actors (high %s) tended to adopt late (opposers); %s statistically supported:\n |r| > %.1f; CI (%.1f%%) = [%.3f, %.3f]\n", + label, degree_term, + if (ci_includes_zero) "NOT" else "", + thr, lvl_local, + ci_low, ci_high + )) } } # Safe correlation: returns NA (no warnings) if zero-variance or too few pairs cor_safe <- function(x, y) { - x <- as.numeric(x); y <- as.numeric(y) + x <- as.numeric(x) + y <- as.numeric(y) ok <- is.finite(x) & is.finite(y) - if (!any(ok)) return(NA_real_) - x <- x[ok]; y <- y[ok] - if (length(x) < 2L) return(NA_real_) - if (sd(x) == 0 || sd(y) == 0) return(NA_real_) + if (!any(ok)) { + return(NA_real_) + } + x <- x[ok] + y <- y[ok] + if (length(x) < 2L) { + return(NA_real_) + } + if (sd(x) == 0 || sd(y) == 0) { + return(NA_real_) + } stats::cor(x, y) } From 2c931485372a8a01057cacc03e9aa6fae1ef46cb Mon Sep 17 00:00:00 2001 From: aoliveram Date: Tue, 14 Apr 2026 12:01:50 -0700 Subject: [PATCH 09/18] Fix bug in dynamic degree extraction and symmetry detection --- R/degree_adoption_diagnostic.R | 51 ++++++++++++---------------------- 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/R/degree_adoption_diagnostic.R b/R/degree_adoption_diagnostic.R index baf047f..7d1600d 100644 --- a/R/degree_adoption_diagnostic.R +++ b/R/degree_adoption_diagnostic.R @@ -205,8 +205,8 @@ degree_adoption_diagnostic <- function( NULL } - # Determine if undirected (graph is always a diffnet here) - undirected <- isTRUE(is_undirected(graph)) + # Determine if undirected by checking matrices + undirected <- check_undirected_graph(graph) # Return results structure(list( @@ -280,31 +280,16 @@ compute_degree_measures <- function(graph, degree_strategy, valued) { indegree <- rowMeans(dgr(graph, cmode = "indegree", valued = valued), na.rm = TRUE) outdegree <- rowMeans(dgr(graph, cmode = "outdegree", valued = valued), na.rm = TRUE) } else { - deg_matrix <- dgr(graph, valued = valued) - if (length(dim(deg_matrix)) == 3) { - # Dynamic case - if (degree_strategy == "first") { - indegree <- deg_matrix[, 1, "indegree"] - outdegree <- deg_matrix[, 1, "outdegree"] - } else if (degree_strategy == "last") { - last_time <- dim(deg_matrix)[2] - indegree <- deg_matrix[, last_time, "indegree"] - outdegree <- deg_matrix[, last_time, "outdegree"] - } - } else if (length(dim(deg_matrix)) == 2) { - # Static case: check for column names, else use position - cn <- colnames(deg_matrix) - if (!is.null(cn) && all(c("indegree", "outdegree") %in% cn)) { - indegree <- deg_matrix[, "indegree"] - outdegree <- deg_matrix[, "outdegree"] - } else if (ncol(deg_matrix) >= 2) { - indegree <- deg_matrix[, 1] - outdegree <- deg_matrix[, 2] - } else { - stop("Degree matrix does not have expected columns for static graph.") - } - } else { - stop("Unexpected degree matrix dimensions in compute_degree_measures.") + # Request in-degree and out-degree separately and explicitly + indeg_mat <- dgr(graph, cmode = "indegree", valued = valued) + outdeg_mat <- dgr(graph, cmode = "outdegree", valued = valued) + + if (degree_strategy == "first") { + indegree <- if (is.matrix(indeg_mat)) indeg_mat[, 1] else indeg_mat + outdegree <- if (is.matrix(outdeg_mat)) outdeg_mat[, 1] else outdeg_mat + } else { # last + indegree <- if (is.matrix(indeg_mat)) indeg_mat[, ncol(indeg_mat)] else indeg_mat + outdegree <- if (is.matrix(outdeg_mat)) outdeg_mat[, ncol(outdeg_mat)] else outdeg_mat } } @@ -350,11 +335,7 @@ analyze_multi_behaviors_separately <- function(degrees, toa, min_adopters, boots } # Determine if undirected - undirected <- if (inherits(graph, "diffnet")) { - is_undirected(graph) - } else { - check_undirected_graph(graph) - } + undirected <- check_undirected_graph(graph) structure(list( correlations = correlations_matrix, @@ -521,6 +502,10 @@ create_empty_result <- function(degree_strategy, original_call, combine, sample_ } check_undirected_graph <- function(graph) { + # If the input is a diffnet, we extract its raw list of matrices + if (inherits(graph, "diffnet")) { + graph <- graph$graph + } if (is.list(graph)) { return(all(sapply(graph, function(g) isSymmetric(as.matrix(g))))) } @@ -749,7 +734,7 @@ format_interpretation_no_ci <- function(label, r, abs_big, degree_term, thr) { format_interpretation_with_ci <- function(label, r, ci, abs_big, degree_term, thr, lvl_arg) { lvl_local <- if (!is.na(lvl_arg)) lvl_arg else 95 ci_includes_zero <- (length(ci) >= 2) && is.finite(ci[1]) && is.finite(ci[2]) && (ci[1] <= 0 && ci[2] >= 0) - + ci_low <- if (length(ci) >= 1) ci[1] else NA_real_ ci_high <- if (length(ci) >= 2) ci[2] else NA_real_ From 52b89285e948ee16232e9361b90ebca3bd048dbe Mon Sep 17 00:00:00 2001 From: aoliveram Date: Thu, 16 Apr 2026 14:46:08 -0700 Subject: [PATCH 10/18] data: Make epigamesDiffNet non-cumulative and weighted --- data-raw/epigamesDiffNet.R | 4 ++-- data/epigamesDiffNet.rda | Bin 133580 -> 53120 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data-raw/epigamesDiffNet.R b/data-raw/epigamesDiffNet.R index 42eb05e..0637ad2 100644 --- a/data-raw/epigamesDiffNet.R +++ b/data-raw/epigamesDiffNet.R @@ -25,8 +25,8 @@ daily_edgelist <- collapse_timeframes( timevar = "time", weightvar = "weight", window_size = WINDOW_SIZE, - binarize = TRUE, - cumulative = TRUE, + binarize = FALSE, + cumulative = FALSE, symmetric = TRUE ) diff --git a/data/epigamesDiffNet.rda b/data/epigamesDiffNet.rda index fdcce0f7687207724b67054b64e47e78c5e00fcc..8e8e0d30d666b71fb01846e5dab97d00a9785dbe 100644 GIT binary patch literal 53120 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 literal 133580 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


{KmDe38!ZVr=P}TwZL>B#7oXQ<NtvMd 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 From 5319ff6d4cbe4d364adf18d1125333b3b68a84b7 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Thu, 16 Apr 2026 14:46:15 -0700 Subject: [PATCH 11/18] docs: Update epigamesDiffNet docs with cumulative reconstruction steps --- R/data.r | 15 +++++++++++++++ man/epigamesDiffNet.Rd | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/R/data.r b/R/data.r index 4ed3b83..9fe59d1 100644 --- a/R/data.r +++ b/R/data.r @@ -980,6 +980,21 @@ NULL # "epigames" #' A directed dynamic graph with 594 vertices and 15 time periods. The attributes #' in the graph are described in \code{\link{epigames}}. #' +#' By default, this \code{diffnet} object is **non-cumulative** (each slice represents +#' ephemeral daily contacts) and **valued** (edge weights represent contact duration in seconds). +#' +#' To reconstruct the classic cumulative/binarized network, you can run: +#' +#' \preformatted{ +#' epigames_cumul <- epigamesDiffNet +#' +#' # 1. Accumulate the history across time periods +#' epigames_cumul$graph <- Reduce("+", epigames_cumul$graph, accumulate = TRUE) +#' +#' # 2. Apply a logical cut-off to binarize the network +#' epigames_cumul$graph <- lapply(epigames_cumul$graph, function(m) { m@x[] <- 1; m }) +#' } +#' #' Non-adopters have \code{toa = NA}. #' #' @format A \code{\link{diffnet}} class object. diff --git a/man/epigamesDiffNet.Rd b/man/epigamesDiffNet.Rd index f633835..6d36932 100644 --- a/man/epigamesDiffNet.Rd +++ b/man/epigamesDiffNet.Rd @@ -14,6 +14,21 @@ A directed dynamic graph with 594 vertices and 15 time periods. The attributes in the graph are described in \code{\link{epigames}}. } \details{ +By default, this \code{diffnet} object is **non-cumulative** (each slice represents +ephemeral daily contacts) and **valued** (edge weights represent contact duration in seconds). + +To reconstruct the classic cumulative/binarized network, you can run: + +\preformatted{ +epigames_cumul <- epigamesDiffNet + +# 1. Accumulate the history across time periods +epigames_cumul$graph <- Reduce("+", epigames_cumul$graph, accumulate = TRUE) + +# 2. Apply a logical cut-off to binarize the network +epigames_cumul$graph <- lapply(epigames_cumul$graph, function(m) { m@x[] <- 1; m }) +} + Non-adopters have \code{toa = NA}. } \seealso{ From ddaec9e69ca3abb6ba8e3e37d48d06c0756c91fc Mon Sep 17 00:00:00 2001 From: aoliveram Date: Fri, 17 Apr 2026 14:02:17 -0700 Subject: [PATCH 12/18] feat(diffnet): add $tod slot and $transmission slot (M1, #78) - new_diffnet() gains a -tod- argument (single-behavior vector) with validation (element-wise tod > toa, NA where toa is NA, length match). - When -tod- is supplied, cumadopt is reconstructed from the intervals [toa, tod - 1] via cumadopt_from_intervals() in R/adjmat.r. - New $transmission slot plus exported helpers as_transmission_tree() and get_transmissions() (R/transmission.R) storing the directed infection forest as a data.frame with columns date, source, target, source_exposure_date, virus_id, virus. Docs cite Lloyd-Smith et al. (2005) and White & Pagano (2008). - Tests cover interval reconstruction, validation errors, coercion, and the transmission slot round-trip. No new package dependencies. --- DESCRIPTION | 1 + NAMESPACE | 2 + R/adjmat.r | 23 +++++ R/diffnet-class.r | 53 ++++++++++- R/transmission.R | 137 +++++++++++++++++++++++++++++ man/as_transmission_tree.Rd | 51 +++++++++++ man/diffnet-class.Rd | 11 ++- man/get_transmissions.Rd | 22 +++++ tests/testthat/test-tod-slot.R | 82 +++++++++++++++++ tests/testthat/test-transmission.R | 93 ++++++++++++++++++++ 10 files changed, 473 insertions(+), 2 deletions(-) create mode 100644 R/transmission.R create mode 100644 man/as_transmission_tree.Rd create mode 100644 man/get_transmissions.Rd create mode 100644 tests/testthat/test-tod-slot.R create mode 100644 tests/testthat/test-transmission.R diff --git a/DESCRIPTION b/DESCRIPTION index 5c76d87..409aae7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -94,3 +94,4 @@ Collate: 'struct_equiv.R' 'struct_test.R' 'survey_to_diffnet.R' + 'transmission.R' diff --git a/NAMESPACE b/NAMESPACE index 4a6bdac..9e76d75 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -91,6 +91,7 @@ export(as.dgCMatrix) export(as_dgCMatrix) export(as_diffnet) export(as_spmat) +export(as_transmission_tree) export(bass_F) export(bass_dF) export(bass_f) @@ -123,6 +124,7 @@ export(ego_variance) export(egonet_attrs) export(exposure) export(fitbass) +export(get_transmissions) export(graph_power) export(grid_distribution) export(hazard_rate) diff --git a/R/adjmat.r b/R/adjmat.r index ca5bc83..cdd5847 100644 --- a/R/adjmat.r +++ b/R/adjmat.r @@ -537,6 +537,29 @@ toa_mat.default <- function(per, t0, t1) { ) } +# Build (adopt, cumadopt) from (toa, tod) intervals for a single behavior. +# Each node i is considered adopted on periods [toa[i], tod[i] - 1]; when +# tod[i] is NA the adoption is absorbing and the interval runs through t1. +cumadopt_from_intervals <- function(toa, tod, t0, t1, labels = NULL) { + n <- length(toa) + T <- t1 - t0 + 1L + adopt <- matrix(0L, nrow = n, ncol = T) + cumadopt <- matrix(0L, nrow = n, ncol = T) + for (i in seq_len(n)) { + s_val <- toa[i] + if (is.na(s_val)) next + s <- as.integer(s_val) - t0 + 1L + e_val <- tod[i] + e <- if (is.na(e_val)) T else (as.integer(e_val) - 1L - t0 + 1L) + if (s >= 1L && s <= T) adopt[i, s] <- 1L + if (s <= e && s >= 1L && e <= T && e >= 1L) cumadopt[i, s:e] <- 1L + } + rn <- if (length(labels)) labels else seq_len(n) + dimnames(adopt) <- list(rn, t0:t1) + dimnames(cumadopt) <- list(rn, t0:t1) + list(adopt = adopt, cumadopt = cumadopt) +} + # @rdname toa_mat # @export toa_mat.numeric <- function(times, labels=NULL, diff --git a/R/diffnet-class.r b/R/diffnet-class.r index 35dc67b..867ab1a 100644 --- a/R/diffnet-class.r +++ b/R/diffnet-class.r @@ -356,6 +356,13 @@ check_as_diffnet_attrs <- function( #' @param as.df Logical scalar. When TRUE returns a data.frame. #' @param name Character scalar. Name of the diffusion network (descriptive). #' @param behavior Character vector. Name of the behavior(s) been analyzed (innovation). +#' @param tod Optional numeric vector of size \eqn{n}. Times of disadoption +#' (e.g. recovery, removal). When supplied, each non-\code{NA} entry must be +#' strictly greater than the corresponding \code{toa} and \code{NA} whenever +#' \code{toa} is \code{NA}. Node \eqn{i} is considered adopted over the closed +#' interval \eqn{[\mathrm{toa}_i, \mathrm{tod}_i - 1]}; \code{NA} in \code{tod} +#' means the adoption is absorbing. Currently only single-behavior (vector) +#' \code{tod} is supported. #' #' @seealso Default options are listed at \code{\link{netdiffuseR-options}} #' @details @@ -572,7 +579,8 @@ new_diffnet <- function( self = getOption("diffnet.self"), multiple = getOption("diffnet.multiple"), name = "Diffusion Network", - behavior = NULL + behavior = NULL, + tod = NULL ) { # Step 0.0: Check if its diffnet! -------------------------------------------- @@ -639,9 +647,50 @@ new_diffnet <- function( } } + # Step 2.3: Validating -tod- (time of disadoption), if provided ------------- + if (length(tod)) { + + if (num_of_behaviors > 1L) + stop("Multi-behavior -tod- is not supported yet. Provide a vector -tod- ", + "with a single behavior, or leave -tod- as NULL.") + + if (!is.null(dim(tod))) + stop("-tod- must be a vector of the same length as -toa-.") + + if (length(tod) != length(toa)) + stop("-tod- and -toa- have different lengths (", length(tod), " and ", + length(toa), " respectively).") + + if (!is.integer(tod)) { + warning("Coercing -tod- into integer.") + tod_names <- names(tod) + tod <- as.integer(tod) + names(tod) <- tod_names + } + + has_both <- !is.na(toa) & !is.na(tod) + if (any(tod[has_both] <= toa[has_both])) + stop("-tod- must be strictly greater than -toa- for every node with ", + "both values defined (an adopter must remain so for at least one ", + "period before disadopting).") + + if (any(!is.na(tod) & is.na(toa))) + stop("-tod- is defined for some nodes that never adopted (NA in -toa-). ", + "-tod- entries must be NA wherever -toa- is NA.") + + if (!length(names(tod))) names(tod) <- names(toa) + } + # Step 3.1: Creating Time of adoption matrix --------------------------------- mat <- toa_mat(toa, labels = meta$ids, t0=t0, t1=t1) + # Step 3.1b: Rebuilding cumadopt using [toa, tod-1] intervals if -tod- set + if (length(tod) && num_of_behaviors == 1L) { + intervals <- cumadopt_from_intervals(toa, tod, t0 = t0, t1 = t1, + labels = meta$ids) + mat$cumadopt <- intervals$cumadopt + } + # Step 3.2: Verifying dimensions and fixing meta$pers if (num_of_behaviors==1) { @@ -775,12 +824,14 @@ new_diffnet <- function( list( graph = graph, toa = toa, + tod = tod, adopt = adopt, cumadopt = cumadopt, # Attributes vertex.static.attrs = vertex.static.attrs, vertex.dyn.attrs = vertex.dyn.attrs, graph.attrs = graph.attrs, + transmission = NULL, meta = meta ), class="diffnet" diff --git a/R/transmission.R b/R/transmission.R new file mode 100644 index 0000000..95f4765 --- /dev/null +++ b/R/transmission.R @@ -0,0 +1,137 @@ +# Transmission tree handling for diffnet objects. +# +# The $transmission slot is a list with the following elements: +# - tree: data.frame with columns +# date integer, period when the transmission happened +# source integer, row index of the infector in x (NA for seeds) +# target integer, row index of the infectee in x +# source_exposure_date integer, period when `source` was infected (NA for seeds) +# virus_id integer, optional virus identifier +# virus character, optional virus label +# - pars: list, free-form parameters/metadata associated with the tree. +# Each row represents one infection event (an edge in the transmission tree); +# the set of (source -> target) pairs forms the directed forest from which +# offspring distributions (Lloyd-Smith et al., 2005) and likelihood-based +# reproduction-number estimates (White & Pagano, 2008) are derived. + +.transmission_cols <- c( + "date", "source", "target", "source_exposure_date", "virus_id", "virus" +) + +.empty_transmission_tree <- function() { + data.frame( + date = integer(0), + source = integer(0), + target = integer(0), + source_exposure_date = integer(0), + virus_id = integer(0), + virus = character(0), + stringsAsFactors = FALSE + ) +} + +#' Attach a transmission tree to a \code{diffnet} object +#' +#' Populates the \code{$transmission} slot of a \code{diffnet} with a +#' transmission tree (who-infected-whom). The resulting directed forest is the +#' canonical input to offspring-distribution analyses +#' (Lloyd-Smith \emph{et al.}, 2005) and to likelihood-based estimators of the +#' reproduction number and serial interval (White & Pagano, 2008). +#' +#' @param x A \code{diffnet} object. +#' @param tree A \code{data.frame} with at least the columns \code{date}, +#' \code{source}, \code{target}, and \code{source_exposure_date}. Columns +#' \code{virus_id} and \code{virus} are optional. \code{source} and +#' \code{source_exposure_date} may be \code{NA} for seed infections (roots +#' of the tree). +#' @param pars Optional named list stored verbatim in \code{x$transmission$pars}. +#' Useful for recording kernel parameters, seeds, etc. +#' +#' @details +#' Each row of \code{tree} represents one infection event (an edge +#' \eqn{\text{source} \to \text{target}} in the transmission tree) time-stamped +#' by \code{date}. \code{source} and \code{target} must be integer row indices +#' into \code{x} (\code{1..nnodes(x)}); \code{target} is required for every +#' row. Existing \code{$transmission} content is overwritten. +#' +#' @return The \code{diffnet} object \code{x} with \code{$transmission} set to +#' a list with components \code{tree} (a clean, ordered \code{data.frame}) +#' and \code{pars}. +#' +#' @references +#' Lloyd-Smith, J. O., Schreiber, S. J., Kopp, P. E., & Getz, W. M. (2005). +#' Superspreading and the effect of individual variation on disease emergence. +#' \emph{Nature} 438:355-359. \doi{10.1038/nature04153} +#' +#' White, L. F., & Pagano, M. (2008). A likelihood-based method for real-time +#' estimation of the serial interval and reproductive number of an epidemic. +#' \emph{Statistics in Medicine} 27:2999-3016. \doi{10.1002/sim.3136} +#' +#' @export +#' @seealso \code{\link{new_diffnet}} +as_transmission_tree <- function(x, tree, pars = list()) { + + if (!inherits(x, "diffnet")) + stop("-x- must be a diffnet object.") + + if (!is.data.frame(tree)) + stop("-tree- must be a data.frame.") + + required <- c("date", "source", "target", "source_exposure_date") + missing_cols <- setdiff(required, names(tree)) + if (length(missing_cols)) + stop("-tree- is missing required column(s): ", + paste(missing_cols, collapse = ", "), ".") + + if (anyNA(tree$target)) + stop("-tree$target- cannot contain NA values.") + + n <- nnodes(x) + tgt <- suppressWarnings(as.integer(tree$target)) + if (anyNA(tgt) || any(tgt < 1L) || any(tgt > n)) + stop("-tree$target- must be integer indices in 1..", n, ".") + + src <- suppressWarnings(as.integer(tree$source)) + src_ok <- src[!is.na(src)] + if (length(src_ok) && (any(src_ok < 1L) || any(src_ok > n))) + stop("-tree$source- must be NA or an integer index in 1..", n, ".") + + out <- data.frame( + date = as.integer(tree$date), + source = src, + target = tgt, + source_exposure_date = as.integer(tree$source_exposure_date), + stringsAsFactors = FALSE + ) + + out$virus_id <- if (!is.null(tree$virus_id)) + as.integer(tree$virus_id) else rep(1L, nrow(out)) + + out$virus <- if (!is.null(tree$virus)) + as.character(tree$virus) else rep(NA_character_, nrow(out)) + + out <- out[, .transmission_cols, drop = FALSE] + out <- out[order(out$date, out$target), , drop = FALSE] + rownames(out) <- NULL + + x$transmission <- list(tree = out, pars = pars) + x +} + +#' Retrieve the transmission tree of a \code{diffnet} object +#' +#' Returns the data.frame stored in \code{x$transmission$tree}. If none has +#' been attached, an empty data.frame with the standard columns is returned. +#' +#' @param x A \code{diffnet} object. +#' @return A \code{data.frame} with columns \code{date}, \code{source}, +#' \code{target}, \code{source_exposure_date}, \code{virus_id}, \code{virus}. +#' @export +#' @seealso \code{\link{as_transmission_tree}} +get_transmissions <- function(x) { + if (!inherits(x, "diffnet")) + stop("-x- must be a diffnet object.") + + tr <- x$transmission$tree + if (is.null(tr)) .empty_transmission_tree() else tr +} diff --git a/man/as_transmission_tree.Rd b/man/as_transmission_tree.Rd new file mode 100644 index 0000000..a73a38c --- /dev/null +++ b/man/as_transmission_tree.Rd @@ -0,0 +1,51 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/transmission.R +\name{as_transmission_tree} +\alias{as_transmission_tree} +\title{Attach a transmission tree to a \code{diffnet} object} +\usage{ +as_transmission_tree(x, tree, pars = list()) +} +\arguments{ +\item{x}{A \code{diffnet} object.} + +\item{tree}{A \code{data.frame} with at least the columns \code{date}, +\code{source}, \code{target}, and \code{source_exposure_date}. Columns +\code{virus_id} and \code{virus} are optional. \code{source} and +\code{source_exposure_date} may be \code{NA} for seed infections (roots +of the tree).} + +\item{pars}{Optional named list stored verbatim in \code{x$transmission$pars}. +Useful for recording kernel parameters, seeds, etc.} +} +\value{ +The \code{diffnet} object \code{x} with \code{$transmission} set to + a list with components \code{tree} (a clean, ordered \code{data.frame}) + and \code{pars}. +} +\description{ +Populates the \code{$transmission} slot of a \code{diffnet} with a +transmission tree (who-infected-whom). The resulting directed forest is the +canonical input to offspring-distribution analyses +(Lloyd-Smith \emph{et al.}, 2005) and to likelihood-based estimators of the +reproduction number and serial interval (White & Pagano, 2008). +} +\details{ +Each row of \code{tree} represents one infection event (an edge +\eqn{\text{source} \to \text{target}} in the transmission tree) time-stamped +by \code{date}. \code{source} and \code{target} must be integer row indices +into \code{x} (\code{1..nnodes(x)}); \code{target} is required for every +row. Existing \code{$transmission} content is overwritten. +} +\references{ +Lloyd-Smith, J. O., Schreiber, S. J., Kopp, P. E., & Getz, W. M. (2005). +Superspreading and the effect of individual variation on disease emergence. +\emph{Nature} 438:355-359. \doi{10.1038/nature04153} + +White, L. F., & Pagano, M. (2008). A likelihood-based method for real-time +estimation of the serial interval and reproductive number of an epidemic. +\emph{Statistics in Medicine} 27:2999-3016. \doi{10.1002/sim.3136} +} +\seealso{ +\code{\link{new_diffnet}} +} diff --git a/man/diffnet-class.Rd b/man/diffnet-class.Rd index f2532b4..b825d54 100644 --- a/man/diffnet-class.Rd +++ b/man/diffnet-class.Rd @@ -52,7 +52,8 @@ new_diffnet( self = getOption("diffnet.self"), multiple = getOption("diffnet.multiple"), name = "Diffusion Network", - behavior = NULL + behavior = NULL, + tod = NULL ) \method{as.data.frame}{diffnet}( @@ -148,6 +149,14 @@ order of the rows in the attribute data.} \item{behavior}{Character vector. Name of the behavior(s) been analyzed (innovation).} +\item{tod}{Optional numeric vector of size \eqn{n}. Times of disadoption +(e.g. recovery, removal). When supplied, each non-\code{NA} entry must be +strictly greater than the corresponding \code{toa} and \code{NA} whenever +\code{toa} is \code{NA}. Node \eqn{i} is considered adopted over the closed +interval \eqn{[\mathrm{toa}_i, \mathrm{tod}_i - 1]}; \code{NA} in \code{tod} +means the adoption is absorbing. Currently only single-behavior (vector) +\code{tod} is supported.} + \item{x}{A \code{diffnet} object.} \item{row.names}{Ignored.} diff --git a/man/get_transmissions.Rd b/man/get_transmissions.Rd new file mode 100644 index 0000000..fd98b4d --- /dev/null +++ b/man/get_transmissions.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/transmission.R +\name{get_transmissions} +\alias{get_transmissions} +\title{Retrieve the transmission tree of a \code{diffnet} object} +\usage{ +get_transmissions(x) +} +\arguments{ +\item{x}{A \code{diffnet} object.} +} +\value{ +A \code{data.frame} with columns \code{date}, \code{source}, + \code{target}, \code{source_exposure_date}, \code{virus_id}, \code{virus}. +} +\description{ +Returns the data.frame stored in \code{x$transmission$tree}. If none has +been attached, an empty data.frame with the standard columns is returned. +} +\seealso{ +\code{\link{as_transmission_tree}} +} diff --git a/tests/testthat/test-tod-slot.R b/tests/testthat/test-tod-slot.R new file mode 100644 index 0000000..b275e27 --- /dev/null +++ b/tests/testthat/test-tod-slot.R @@ -0,0 +1,82 @@ +context("Time of disadoption (tod) slot") + +mk_graph <- function(n = 5L, T = 5L, seed = 1L) { + set.seed(seed) + lapply(seq_len(T), function(x) rgraph_ba(t = n - 1L)) +} + +test_that("Default new_diffnet still has tod = NULL and transmission = NULL", { + gr <- mk_graph() + toa <- c(1L, 2L, NA, 3L, 5L) + x <- new_diffnet(gr, toa, t0 = 1L, t1 = 5L) + + expect_null(x$tod) + expect_null(x$transmission) + expect_true(inherits(x, "diffnet")) +}) + +test_that("tod rebuilds cumadopt using [toa, tod - 1] intervals", { + gr <- mk_graph() + toa <- c(1L, 2L, NA, 3L, 5L) + tod <- c(3L, 4L, NA, NA, NA) + + x <- new_diffnet(gr, toa, tod = tod, t0 = 1L, t1 = 5L) + + expect_identical(x$tod, setNames(tod, as.character(seq_len(5L)))) + + # Node 1: adopts t=1, disadopts t=3 -> cumadopt c(1,1,0,0,0) + expect_equal(as.integer(x$cumadopt[1, ]), c(1L, 1L, 0L, 0L, 0L)) + # Node 2: adopts t=2, disadopts t=4 -> cumadopt c(0,1,1,0,0) + expect_equal(as.integer(x$cumadopt[2, ]), c(0L, 1L, 1L, 0L, 0L)) + # Node 3: never adopts -> all zero + expect_equal(as.integer(x$cumadopt[3, ]), rep(0L, 5L)) + # Node 4: adopts t=3, absorbing -> c(0,0,1,1,1) + expect_equal(as.integer(x$cumadopt[4, ]), c(0L, 0L, 1L, 1L, 1L)) + # Node 5: adopts t=5, absorbing -> c(0,0,0,0,1) + expect_equal(as.integer(x$cumadopt[5, ]), c(0L, 0L, 0L, 0L, 1L)) + + # adopt matrix is preserved (single 1 at the adoption period). + expect_equal(as.integer(rowSums(x$adopt)), c(1L, 1L, 0L, 1L, 1L)) +}) + +test_that("tod validation errors are informative", { + gr <- mk_graph() + toa <- c(1L, 2L, NA, 3L, 5L) + + # tod <= toa somewhere + expect_error( + new_diffnet(gr, toa, tod = c(0L, 2L, NA, NA, NA), t0 = 1L, t1 = 5L), + "strictly greater" + ) + + # length mismatch + expect_error( + new_diffnet(gr, toa, tod = c(3L, 4L, NA, NA, NA, NA), t0 = 1L, t1 = 5L), + "different lengths" + ) + + # tod defined where toa is NA + expect_error( + new_diffnet(gr, toa, tod = c(3L, 4L, 5L, NA, NA), t0 = 1L, t1 = 5L), + "NA wherever" + ) + + # tod must be a vector (matrix not yet supported) + expect_error( + new_diffnet(gr, toa, + tod = matrix(c(3L, 4L, NA, NA, NA), ncol = 1L), + t0 = 1L, t1 = 5L), + "vector of the same length" + ) +}) + +test_that("tod coerces non-integer input with a warning", { + gr <- mk_graph() + toa <- c(1L, 2L, NA, 3L, 5L) + + expect_warning( + x <- new_diffnet(gr, toa, tod = c(3, 4, NA, NA, NA), t0 = 1L, t1 = 5L), + "Coercing -tod-" + ) + expect_true(is.integer(x$tod)) +}) diff --git a/tests/testthat/test-transmission.R b/tests/testthat/test-transmission.R new file mode 100644 index 0000000..8c9d689 --- /dev/null +++ b/tests/testthat/test-transmission.R @@ -0,0 +1,93 @@ +context("Transmission tree slot") + +mk_diffnet <- function() { + set.seed(42) + gr <- lapply(1:5, function(x) rgraph_ba(t = 4L)) + toa <- c(1L, 2L, NA, 3L, 5L) + new_diffnet(gr, toa, t0 = 1L, t1 = 5L) +} + +test_that("get_transmissions() returns an empty data.frame when unset", { + x <- mk_diffnet() + tr <- get_transmissions(x) + expect_s3_class(tr, "data.frame") + expect_equal(nrow(tr), 0L) + expect_setequal( + names(tr), + c("date", "source", "target", "source_exposure_date", "virus_id", "virus") + ) +}) + +test_that("as_transmission_tree() validates required columns and ranges", { + x <- mk_diffnet() + + expect_error( + as_transmission_tree(x, data.frame(date = 1L, source = NA, target = 1L)), + "missing required column" + ) + + expect_error( + as_transmission_tree(x, data.frame( + date = 1L, source = NA_integer_, target = NA_integer_, + source_exposure_date = NA_integer_ + )), + "cannot contain NA" + ) + + expect_error( + as_transmission_tree(x, data.frame( + date = 1L, source = NA_integer_, target = 999L, + source_exposure_date = NA_integer_ + )), + "integer indices" + ) + + expect_error( + as_transmission_tree(x, data.frame( + date = 1L, source = 42L, target = 2L, source_exposure_date = 1L + )), + "NA or an integer index" + ) +}) + +test_that("as_transmission_tree() stores a clean tree and optional pars", { + x <- mk_diffnet() + tree <- data.frame( + date = c(3L, 1L, 2L), + source = c(2L, NA, 1L), + target = c(4L, 1L, 2L), + source_exposure_date = c(2L, NA, 1L), + virus_id = c(1L, 1L, 1L), + virus = c("flu", "flu", "flu"), + stringsAsFactors = FALSE + ) + y <- as_transmission_tree(x, tree, pars = list(kernel = "wells-riley")) + tr <- get_transmissions(y) + + # Ordered by (date, target) and clean rownames + expect_equal(tr$date, c(1L, 2L, 3L)) + expect_equal(tr$target, c(1L, 2L, 4L)) + expect_equal(rownames(tr), as.character(seq_len(nrow(tr)))) + + expect_equal(y$transmission$pars$kernel, "wells-riley") +}) + +test_that("Missing optional columns are defaulted", { + x <- mk_diffnet() + tree <- data.frame( + date = c(1L, 2L), + source = c(NA_integer_, 1L), + target = c(1L, 2L), + source_exposure_date = c(NA_integer_, 1L) + ) + y <- as_transmission_tree(x, tree) + tr <- get_transmissions(y) + + expect_true(all(tr$virus_id == 1L)) + expect_true(all(is.na(tr$virus))) +}) + +test_that("get_transmissions() requires a diffnet", { + expect_error(get_transmissions(42), "must be a diffnet") + expect_error(as_transmission_tree(42, data.frame()), "must be a diffnet") +}) From a8088c80f43437987c16a163fcd466d1ca4f85d7 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Fri, 17 Apr 2026 17:13:15 -0700 Subject: [PATCH 13/18] rename get_transmissions() -> transmission_tree() (M1 follow-up, #78) Avoid masking epiworldR::get_transmissions() when both packages are loaded. No behavior change; exported name and docs renamed, tests updated accordingly. Co-Authored-By: Claude Opus 4.7 --- NAMESPACE | 2 +- R/transmission.R | 2 +- man/{get_transmissions.Rd => transmission_tree.Rd} | 6 +++--- tests/testthat/test-transmission.R | 12 ++++++------ 4 files changed, 11 insertions(+), 11 deletions(-) rename man/{get_transmissions.Rd => transmission_tree.Rd} (88%) diff --git a/NAMESPACE b/NAMESPACE index 9e76d75..1660f50 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -124,7 +124,6 @@ export(ego_variance) export(egonet_attrs) export(exposure) export(fitbass) -export(get_transmissions) export(graph_power) export(grid_distribution) export(hazard_rate) @@ -188,6 +187,7 @@ export(threshold) export(toa_diff) export(toa_mat) export(transformGraphBy) +export(transmission_tree) export(vertex_covariate_compare) export(vertex_covariate_dist) export(vertex_mahalanobis_dist) diff --git a/R/transmission.R b/R/transmission.R index 95f4765..a450778 100644 --- a/R/transmission.R +++ b/R/transmission.R @@ -128,7 +128,7 @@ as_transmission_tree <- function(x, tree, pars = list()) { #' \code{target}, \code{source_exposure_date}, \code{virus_id}, \code{virus}. #' @export #' @seealso \code{\link{as_transmission_tree}} -get_transmissions <- function(x) { +transmission_tree <- function(x) { if (!inherits(x, "diffnet")) stop("-x- must be a diffnet object.") diff --git a/man/get_transmissions.Rd b/man/transmission_tree.Rd similarity index 88% rename from man/get_transmissions.Rd rename to man/transmission_tree.Rd index fd98b4d..10c065f 100644 --- a/man/get_transmissions.Rd +++ b/man/transmission_tree.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/transmission.R -\name{get_transmissions} -\alias{get_transmissions} +\name{transmission_tree} +\alias{transmission_tree} \title{Retrieve the transmission tree of a \code{diffnet} object} \usage{ -get_transmissions(x) +transmission_tree(x) } \arguments{ \item{x}{A \code{diffnet} object.} diff --git a/tests/testthat/test-transmission.R b/tests/testthat/test-transmission.R index 8c9d689..305002c 100644 --- a/tests/testthat/test-transmission.R +++ b/tests/testthat/test-transmission.R @@ -7,9 +7,9 @@ mk_diffnet <- function() { new_diffnet(gr, toa, t0 = 1L, t1 = 5L) } -test_that("get_transmissions() returns an empty data.frame when unset", { +test_that("transmission_tree() returns an empty data.frame when unset", { x <- mk_diffnet() - tr <- get_transmissions(x) + tr <- transmission_tree(x) expect_s3_class(tr, "data.frame") expect_equal(nrow(tr), 0L) expect_setequal( @@ -62,7 +62,7 @@ test_that("as_transmission_tree() stores a clean tree and optional pars", { stringsAsFactors = FALSE ) y <- as_transmission_tree(x, tree, pars = list(kernel = "wells-riley")) - tr <- get_transmissions(y) + tr <- transmission_tree(y) # Ordered by (date, target) and clean rownames expect_equal(tr$date, c(1L, 2L, 3L)) @@ -81,13 +81,13 @@ test_that("Missing optional columns are defaulted", { source_exposure_date = c(NA_integer_, 1L) ) y <- as_transmission_tree(x, tree) - tr <- get_transmissions(y) + tr <- transmission_tree(y) expect_true(all(tr$virus_id == 1L)) expect_true(all(is.na(tr$virus))) }) -test_that("get_transmissions() requires a diffnet", { - expect_error(get_transmissions(42), "must be a diffnet") +test_that("transmission_tree() requires a diffnet", { + expect_error(transmission_tree(42), "must be a diffnet") expect_error(as_transmission_tree(42, data.frame()), "must be a diffnet") }) From a2cd6396fc00f9e8839ce20a6641b5af3a90dc91 Mon Sep 17 00:00:00 2001 From: aoliveram Date: Fri, 17 Apr 2026 17:13:31 -0700 Subject: [PATCH 14/18] feat(exposure): pluggable link_fun kernel (M2, #78) Adds link_fun + link_pars arguments to exposure(). Supported named kernels: identity (default), linear (min(beta*w, 1)), sigmoid (plogis((w-h)/scale)), wells-riley (1 - exp(-beta*w)). Custom user functions are accepted with either signature function(w) or function(w, pars). Non-identity kernels force valued = TRUE with a warning. Default behavior unchanged; 639 pre-existing tests still pass. Co-Authored-By: Claude Opus 4.7 --- R/stats.R | 113 +++++++++++-- man/exposure.Rd | 28 +++- tests/testthat/test-exposure-link-fun.R | 200 ++++++++++++++++++++++++ 3 files changed, 327 insertions(+), 14 deletions(-) create mode 100644 tests/testthat/test-exposure-link-fun.R diff --git a/R/stats.R b/R/stats.R index b79ddd4..586f68b 100644 --- a/R/stats.R +++ b/R/stats.R @@ -276,6 +276,21 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { #' @param lags Integer scalar. When different from 0, the resulting exposure #' matrix will be the lagged exposure as specified (see examples). #' @param mode Character scalar. Either "deterministic" (default) or "stochastic". +#' @param link_fun Character scalar or function. Kernel applied to the +#' (valued) edge weights before exposure is computed. Supported names: +#' \code{"identity"} (default, no transformation), \code{"linear"} +#' (\eqn{\min(\beta w, 1)}), \code{"sigmoid"} +#' (\eqn{\mathrm{plogis}((w - h)/\mathrm{scale})}), and \code{"wells-riley"} +#' (\eqn{1 - \exp(-\beta w)}). Alternatively, a user-supplied function +#' with either signature \code{function(w)} (parameters baked into a +#' closure) or \code{function(w, pars)} (parameters passed through +#' \code{link_pars}); it must return a vector of the same length as +#' \code{w}. When \code{link_fun} is not \code{"identity"}, +#' \code{valued} is forced to \code{TRUE} (with a warning if the user set +#' it to \code{FALSE}). +#' @param link_pars Named list with the scalar parameters required by +#' \code{link_fun}. See the section "Link / kernel functions" for the +#' required names per kernel. #' @details #' Exposure is calculated as follows: #' @@ -514,8 +529,60 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { #' @name exposure NULL +# Link / kernel function applied to edge weights before exposure is computed. +# `link_fun` may be one of the named kernels listed below or a user-supplied +# function. User functions may have either signature: +# - `function(w)` — parameters baked into a closure, +# - `function(w, pars)` — parameters passed via `link_pars`. +# Either way, the function must return a vector of the same length as `w`, +# where `w` is the non-zero entries of a dgCMatrix (`@x`). +.apply_link_kernel <- function(W, link_fun, link_pars) { + if (is.null(link_fun) || + (is.character(link_fun) && identical(link_fun, "identity"))) + return(W) + + if (is.function(link_fun)) { + fmls <- formals(link_fun) + single_arg <- !is.null(fmls) && length(fmls) == 1L && + !("..." %in% names(fmls)) + new_x <- if (single_arg) link_fun(W@x) else link_fun(W@x, link_pars) + if (length(new_x) != length(W@x)) + stop("Custom -link_fun- must return a vector of the same length as ", + "its input (the non-zero edge weights).") + W@x <- as.numeric(new_x) + return(W) + } + + if (!is.character(link_fun) || length(link_fun) != 1L) + stop("-link_fun- must be NULL, a character scalar, or a function.") + + W@x <- switch( + link_fun, + "linear" = { + if (is.null(link_pars$beta)) + stop("link_fun = \"linear\" requires link_pars$beta.") + pmin(link_pars$beta * W@x, 1) + }, + "sigmoid" = { + if (is.null(link_pars$h) || is.null(link_pars$scale)) + stop("link_fun = \"sigmoid\" requires link_pars$h and link_pars$scale.") + stats::plogis((W@x - link_pars$h) / link_pars$scale) + }, + "wells-riley" = { + if (is.null(link_pars$beta)) + stop("link_fun = \"wells-riley\" requires link_pars$beta.") + 1 - exp(-link_pars$beta * W@x) + }, + stop("Unknown link_fun: ", link_fun, + ". Supported: identity, linear, sigmoid, wells-riley, or a function.") + ) + W +} + # Workhorse of exposure plotting -.exposure <- function(graph, cumadopt, attrs, outgoing, valued, normalized, self, mode = "deterministic") { +.exposure <- function(graph, cumadopt, attrs, outgoing, valued, normalized, self, + mode = "deterministic", + link_fun = "identity", link_pars = list()) { # Getting the parameters n <- nrow(graph) @@ -533,6 +600,9 @@ NULL # Checking self if (!self) graph <- sp_diag(graph, rep(0, nnodes(graph))) + # Apply link / kernel function to edge weights (pre stochastic / normalization) + graph <- .apply_link_kernel(graph, link_fun, link_pars) + # Calculate normalization and apply stochastic filter if (mode == "stochastic") { # Denominator: Based on Degree (Potential connections as binary) @@ -610,9 +680,21 @@ exposure <- function( self = getOption("diffnet.self"), lags = 0L, mode = "deterministic", + link_fun = "identity", + link_pars = list(), ... ) { + # When a non-identity link kernel is requested, edge weights become the + # kernel input and must be preserved (binarizing would collapse them). + is_identity_link <- (is.null(link_fun)) || + (is.character(link_fun) && identical(link_fun, "identity")) + if (!is_identity_link && !valued) { + warning("-link_fun- different from \"identity\" requires valued edges; ", + "forcing -valued- to TRUE.") + valued <- TRUE + } + # Checking diffnet attributes if (length(attrs) == 1 && inherits(attrs, "character")) { if (!inherits(graph, "diffnet")) @@ -730,7 +812,8 @@ exposure <- function( if ((is.array(graph) & !inherits(graph, "matrix")) | is.list(graph)) { exposure.list(as_spmat(graph), cumadopt, attrs, outgoing, valued, normalized, - self, lags, mode = mode) + self, lags, mode = mode, + link_fun = link_fun, link_pars = link_pars) } else stopifnot_graph(graph) } @@ -738,7 +821,8 @@ exposure <- function( # @export exposure.list <- function( graph, cumadopt, attrs, - outgoing, valued, normalized, self, lags, mode = "deterministic") { + outgoing, valued, normalized, self, lags, mode = "deterministic", + link_fun = "identity", link_pars = list()) { # attrs can be either # degree, indegree, outdegree, or a user defined vector. @@ -758,7 +842,8 @@ exposure.list <- function( add_dimnames.mat(attrs) output <- exposure_for(graph, cumadopt, attrs, outgoing, valued, normalized, - self, lags, mode = mode) + self, lags, mode = mode, + link_fun = link_fun, link_pars = link_pars) dimnames(output) <- dimnames(cumadopt) output @@ -774,7 +859,9 @@ exposure_for <- function( normalized, self, lags, - mode = "deterministic" + mode = "deterministic", + link_fun = "identity", + link_pars = list() ) { if (length(dim(cumadopt)) == 3) { @@ -789,7 +876,9 @@ exposure_for <- function( valued = valued, normalized = normalized, self = self, - mode = mode) + mode = mode, + link_fun = link_fun, + link_pars = link_pars) } } else { for (i in (1 - lags):nslices(graph)) { @@ -800,7 +889,9 @@ exposure_for <- function( valued = valued, normalized = normalized, self = self, - mode = mode) + mode = mode, + link_fun = link_fun, + link_pars = link_pars) } } } else { @@ -815,7 +906,9 @@ exposure_for <- function( valued = valued, normalized = normalized, self = self, - mode = mode) + mode = mode, + link_fun = link_fun, + link_pars = link_pars) } } else { for (i in (1 - lags):nslices(graph)) { @@ -826,7 +919,9 @@ exposure_for <- function( valued = valued, normalized = normalized, self = self, - mode = mode) + mode = mode, + link_fun = link_fun, + link_pars = link_pars) } } } diff --git a/man/exposure.Rd b/man/exposure.Rd index f83a3ce..339e98a 100644 --- a/man/exposure.Rd +++ b/man/exposure.Rd @@ -16,6 +16,8 @@ exposure( self = getOption("diffnet.self"), lags = 0L, mode = "deterministic", + link_fun = "identity", + link_pars = list(), ... ) } @@ -50,6 +52,23 @@ matrix will be the lagged exposure as specified (see examples).} \item{mode}{Character scalar. Either "deterministic" (default) or "stochastic".} +\item{link_fun}{Character scalar or function. Kernel applied to the +(valued) edge weights before exposure is computed. Supported names: +\code{"identity"} (default, no transformation), \code{"linear"} +(\eqn{\min(\beta w, 1)}), \code{"sigmoid"} +(\eqn{\mathrm{plogis}((w - h)/\mathrm{scale})}), and \code{"wells-riley"} +(\eqn{1 - \exp(-\beta w)}). Alternatively, a user-supplied function +with either signature \code{function(w)} (parameters baked into a +closure) or \code{function(w, pars)} (parameters passed through +\code{link_pars}); it must return a vector of the same length as +\code{w}. When \code{link_fun} is not \code{"identity"}, +\code{valued} is forced to \code{TRUE} (with a warning if the user set +it to \code{FALSE}).} + +\item{link_pars}{Named list with the scalar parameters required by +\code{link_fun}. See the section "Link / kernel functions" for the +required names per kernel.} + \item{...}{Further arguments passed to \code{\link{struct_equiv}} (only used when \code{alt.graph="se"}).} } @@ -125,12 +144,11 @@ When \code{mode = "stochastic"}, the exposure is calculated based on a probabili interpretation of the edges. In this mode, the weights of the graph \eqn{S_t} are treated as probabilities of transmission. For each edge \eqn{(i,j)}, a Bernoulli trial is performed with probability \eqn{S_{t,ij}}. If the trial is successful, -the edge is "realized" as a full connection (weight 1). If failed, -the edge is treated as non-existent (weight 0). +the edge is "realized" as a full connection. If failed, the edge is treated +as non-existent. -The denominator (normalization factor) is calculated using the degree of the node -(count of neighbors), regardless of the weights. This represents the total number -of potential contacts. +The denominator is calculated using the degree of the node, representing the total +number of potential contacts. \deqn{ \tilde{E}_{ti} = \frac{\sum_{j \neq i} \mathbb{I}(U_{ij} < S_{t,ij}) a_{tj}}{\sum_{j \neq i} 1} diff --git a/tests/testthat/test-exposure-link-fun.R b/tests/testthat/test-exposure-link-fun.R new file mode 100644 index 0000000..8cdf6dc --- /dev/null +++ b/tests/testthat/test-exposure-link-fun.R @@ -0,0 +1,200 @@ +context("Exposure link / kernel function") +library(netdiffuseR) + +# ---- Helpers -------------------------------------------------------------- +# Build a small valued dynamic graph + cumadopt that we can reuse. +mk_fixture <- function(seed = 71) { + set.seed(seed) + n <- 8L + g <- rgraph_er(n, t = 1, p = 0.5) + g@x <- runif(length(g@x), min = 0.1, max = 2.0) + cumadopt <- matrix(0, nrow = n, ncol = 1) + cumadopt[1:3, 1] <- 1 + list(g = list(g), cumadopt = cumadopt, n = n) +} + +# ---- Identity (default) --------------------------------------------------- +test_that("link_fun = 'identity' reproduces the default exposure", { + fx <- mk_fixture() + e_default <- exposure(fx$g, fx$cumadopt, valued = TRUE) + e_ident <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "identity") + expect_equal(e_default, e_ident) + + # NULL is treated as identity as well + e_null <- exposure(fx$g, fx$cumadopt, valued = TRUE, link_fun = NULL) + expect_equal(e_default, e_null) +}) + +# ---- Linear --------------------------------------------------------------- +test_that("link_fun = 'linear' applies min(beta * w, 1) to edge weights", { + fx <- mk_fixture() + + g_lin <- fx$g + g_lin[[1]]@x <- pmin(0.4 * g_lin[[1]]@x, 1) + e_manual <- exposure(g_lin, fx$cumadopt, valued = TRUE) + + e_kernel <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "linear", link_pars = list(beta = 0.4)) + expect_equal(e_kernel, e_manual) + + # Linear with beta large enough to saturate at 1 + g_sat <- fx$g + g_sat[[1]]@x <- pmin(1000 * g_sat[[1]]@x, 1) + e_sat_manual <- exposure(g_sat, fx$cumadopt, valued = TRUE) + e_sat_kernel <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "linear", + link_pars = list(beta = 1000)) + expect_equal(e_sat_kernel, e_sat_manual) +}) + +# ---- Sigmoid -------------------------------------------------------------- +test_that("link_fun = 'sigmoid' applies plogis((w - h)/scale)", { + fx <- mk_fixture() + + g_sig <- fx$g + g_sig[[1]]@x <- stats::plogis((g_sig[[1]]@x - 1.0) / 0.5) + e_manual <- exposure(g_sig, fx$cumadopt, valued = TRUE) + + e_kernel <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "sigmoid", + link_pars = list(h = 1.0, scale = 0.5)) + expect_equal(e_kernel, e_manual) +}) + +# ---- Wells-Riley ---------------------------------------------------------- +test_that("link_fun = 'wells-riley' applies 1 - exp(-beta * w)", { + fx <- mk_fixture() + + g_wr <- fx$g + g_wr[[1]]@x <- 1 - exp(-0.7 * g_wr[[1]]@x) + e_manual <- exposure(g_wr, fx$cumadopt, valued = TRUE) + + e_kernel <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "wells-riley", + link_pars = list(beta = 0.7)) + expect_equal(e_kernel, e_manual) +}) + +# ---- User-supplied function ---------------------------------------------- +test_that("link_fun can be a user-supplied function(w, pars)", { + fx <- mk_fixture() + + my_kernel <- function(w, pars) 1 - exp(-pars$beta * w) + + g_wr <- fx$g + g_wr[[1]]@x <- 1 - exp(-0.9 * g_wr[[1]]@x) + e_manual <- exposure(g_wr, fx$cumadopt, valued = TRUE) + + e_user <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = my_kernel, link_pars = list(beta = 0.9)) + expect_equal(e_user, e_manual) +}) + +test_that("link_fun accepts a single-argument closure with baked pars", { + fx <- mk_fixture() + beta <- 0.3 + closure_kernel <- function(w) 1 - exp(-beta * w) + + g_ref <- fx$g + g_ref[[1]]@x <- 1 - exp(-beta * g_ref[[1]]@x) + e_manual <- exposure(g_ref, fx$cumadopt, valued = TRUE) + + # No link_pars supplied at all: should still work. + e_closure <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = closure_kernel) + expect_equal(e_closure, e_manual) + + # Dot-args functions are called with both args (pars travel into ...). + dots_kernel <- function(...) { + a <- list(...) + 1 - exp(-beta * a[[1]]) + } + e_dots <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = dots_kernel) + expect_equal(e_dots, e_manual) +}) + +test_that("user-supplied link_fun must return same-length output", { + fx <- mk_fixture() + bad_kernel <- function(w, pars) w[-1L] + expect_error( + exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = bad_kernel, link_pars = list()), + "same length" + ) +}) + +# ---- Parameter validation ------------------------------------------------- +test_that("Missing required link_pars raises informative errors", { + fx <- mk_fixture() + + expect_error( + exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "linear", link_pars = list()), + "beta" + ) + expect_error( + exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "wells-riley", link_pars = list()), + "beta" + ) + expect_error( + exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "sigmoid", link_pars = list(h = 1)), + "scale" + ) + expect_error( + exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "sigmoid", link_pars = list(scale = 1)), + "h" + ) +}) + +test_that("Unknown link_fun name errors informatively", { + fx <- mk_fixture() + expect_error( + exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "gompertz", link_pars = list()), + "Unknown link_fun" + ) +}) + +# ---- Interaction with `valued` ------------------------------------------- +test_that("Non-identity link_fun warns and forces valued = TRUE", { + fx <- mk_fixture() + expect_warning( + e_forced <- exposure(fx$g, fx$cumadopt, valued = FALSE, + link_fun = "wells-riley", + link_pars = list(beta = 0.5)), + "valued" + ) + e_valued <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = "wells-riley", + link_pars = list(beta = 0.5)) + expect_equal(e_forced, e_valued) +}) + +# ---- diffnet dispatch threads link_fun through ---------------------------- +test_that("diffnet dispatch accepts link_fun/link_pars", { + set.seed(9) + dn <- suppressWarnings(rdiffnet(n = 20, t = 4, seed.graph = "small-world", + seed.p.adopt = 0.1, + stop.no.diff = FALSE)) + # Force a non-trivial valued graph + for (i in seq_along(dn$graph)) { + dn$graph[[i]]@x <- runif(length(dn$graph[[i]]@x), 0.1, 2.0) + } + + e_ident <- exposure(dn, valued = TRUE) + e_wr <- exposure(dn, valued = TRUE, + link_fun = "wells-riley", + link_pars = list(beta = 1.2)) + + # Output must have the same shape as identity case + expect_equal(dim(e_ident), dim(e_wr)) + + # Wells-Riley output is bounded in [0, 1] + expect_true(all(e_wr >= 0)) + expect_true(all(e_wr <= 1 + 1e-10)) +}) From ebed4bd56465e098fdcc0b4e1ced6521ed88d74e Mon Sep 17 00:00:00 2001 From: aoliveram Date: Fri, 17 Apr 2026 17:40:20 -0700 Subject: [PATCH 15/18] test(exposure): continuous-weight stochastic tests + warn on out-of-range weights (M3, #78) Adds four test_that blocks to tests/testthat/test-stochastic-exposure.R covering each link kernel under seconds-scale weights, the degree-denominator fix, and zero-weight self-loop handling. Small code changes in R/stats.R: (1) warn when stochastic mode sees post-kernel weights outside [0, 1] -- the sampler silently saturated before; (2) denominator now counts non-zero-weight neighbours instead of every stored entry, so link kernels that zero out some edges no longer inflate the normaliser. No NAMESPACE / Rd changes. 652 tests pass. Co-Authored-By: Claude Opus 4.7 --- R/stats.R | 24 +++++- tests/testthat/test-stochastic-exposure.R | 100 +++++++++++++++++++++- 2 files changed, 118 insertions(+), 6 deletions(-) diff --git a/R/stats.R b/R/stats.R index 586f68b..b55b66b 100644 --- a/R/stats.R +++ b/R/stats.R @@ -605,10 +605,28 @@ NULL # Calculate normalization and apply stochastic filter if (mode == "stochastic") { - # Denominator: Based on Degree (Potential connections as binary) - # We treat the graph as binary (weights=1) for the normalization + # Stochastic mode interprets edge weights as Bernoulli probabilities. + # Values outside [0, 1] saturate the sampler (>1 always fires, <0 + # never fires), which is almost never what the user intended when + # weights come from raw quantities (e.g. seconds of contact). Warn + # and let the caller decide whether to apply a `link_fun`. + if (length(graph@x) && + (any(graph@x < 0, na.rm = TRUE) || + any(graph@x > 1, na.rm = TRUE))) { + warning("Stochastic exposure expects edge weights in [0, 1] ", + "(Bernoulli probabilities). Found values outside this ", + "range; the sampler will saturate. Consider applying a ", + "-link_fun- such as \"wells-riley\" or \"linear\" that ", + "maps weights into [0, 1].") + } + + # Denominator: count non-zero-weight neighbours. Using `graph@x != 0` + # instead of `rep(1, ...)` keeps the denominator aligned with the + # kernel output -- structurally-stored zeros (e.g. from a link kernel + # that maps some weights to 0, or from user-supplied 0 weights) do + # not inflate the degree. graph_binary <- graph - graph_binary@x <- rep(1, length(graph@x)) + graph_binary@x <- as.numeric(graph@x != 0) norm <- as.vector(graph_binary %*% attrs) + 1e-20 # Numerator: Stochastic Filter (Bernoulli -> Binary) diff --git a/tests/testthat/test-stochastic-exposure.R b/tests/testthat/test-stochastic-exposure.R index 88a8d5c..6bc9b44 100644 --- a/tests/testthat/test-stochastic-exposure.R +++ b/tests/testthat/test-stochastic-exposure.R @@ -45,19 +45,113 @@ test_that("rdiffnet wrapper with stochastic exposure", { test_that("rdiffnet wrapper with stochastic exposure (multiple behaviors)", { set.seed(1231) # 2 behaviors - diffnet <- rdiffnet(n=20, t=5, seed.graph="small-world", + diffnet <- rdiffnet(n=20, t=5, seed.graph="small-world", exposure.mode="stochastic", seed.p.adopt = list(0.2, 0.2), stop.no.diff = FALSE) expect_s3_class(diffnet, "diffnet") - + # Calculate exposure to check dimensions # Note: We must use the same mode to get consistent dimensions/behavior expo <- exposure(diffnet, mode="stochastic") - + # Check dimensions of exposure: n x t x 2 expect_equal(dim(expo), c(20, 5, 2)) expect_true(all(expo >= 0)) expect_true(all(expo <= 1 + 1e-10)) }) + +# ---- Continuous (non-Bernoulli) edge weights ----------------------------- +# Fixture: graph with floating-point weights resembling seconds of contact. +mk_seconds_graph <- function(seed = 17, n = 10L) { + set.seed(seed) + g <- rgraph_er(n, t = 1, p = 0.6) + g@x <- runif(length(g@x), min = 30, max = 3600) # 30s .. 1h + cumadopt <- matrix(0, nrow = n, ncol = 1) + cumadopt[1:4, 1] <- 1 + list(g = list(g), cumadopt = cumadopt, n = n) +} + +test_that("Each link_fun maps seconds-scale weights into valid probabilities", { + fx <- mk_seconds_graph() + + # Identity: raw seconds > 1 warns and saturates the sampler; the + # normalised exposure still ends up in [0, 1]. + expect_warning( + e_id <- exposure(fx$g, fx$cumadopt, valued = TRUE, mode = "stochastic"), + "weights in \\[0, 1\\]" + ) + expect_true(all(e_id >= 0) && all(e_id <= 1 + 1e-10)) + + set.seed(101) + e_wr <- exposure(fx$g, fx$cumadopt, valued = TRUE, mode = "stochastic", + link_fun = "wells-riley", + link_pars = list(beta = 1 / 1800)) + expect_true(all(e_wr >= 0) && all(e_wr <= 1 + 1e-10)) + + set.seed(101) + e_lin <- exposure(fx$g, fx$cumadopt, valued = TRUE, mode = "stochastic", + link_fun = "linear", + link_pars = list(beta = 1 / 5000)) + expect_true(all(e_lin >= 0) && all(e_lin <= 1 + 1e-10)) + + set.seed(101) + e_sig <- exposure(fx$g, fx$cumadopt, valued = TRUE, mode = "stochastic", + link_fun = "sigmoid", + link_pars = list(h = 600, scale = 300)) + expect_true(all(e_sig >= 0) && all(e_sig <= 1 + 1e-10)) +}) + +test_that("Out-of-range warning fires only when raw weights leave [0, 1]", { + fx <- mk_seconds_graph() + + # Kernel maps into [0, 1]: no warning. + expect_warning( + exposure(fx$g, fx$cumadopt, valued = TRUE, mode = "stochastic", + link_fun = "wells-riley", + link_pars = list(beta = 1 / 1800)), + regexp = NA + ) + + # Caller pre-normalises: no warning. + set.seed(99); n <- fx$n + g_ok <- rgraph_er(n, t = 1, p = 0.6); g_ok@x <- runif(length(g_ok@x)) + expect_warning( + exposure(list(g_ok), fx$cumadopt, valued = TRUE, mode = "stochastic"), + regexp = NA + ) +}) + +test_that("Stochastic denominator excludes zero-weight stored neighbours", { + # Node 1 has 4 stored edges to adopters; 3 weigh 0, 1 weighs 1. + # Old behaviour: exposure[1] = 1/4; corrected: 1/1 = 1. + n <- 5L + A <- matrix(0, n, n); A[1, 2:5] <- 1 + G <- methods::as(A, "CsparseMatrix") + stopifnot(length(G@x) == 4) + G@x <- c(0, 0, 0, 1) # three stored zeros, one stored one + + cumadopt <- matrix(0, n, 1); cumadopt[2:5, 1] <- 1 + + set.seed(123) + e <- exposure(list(G), cumadopt, valued = TRUE, mode = "stochastic", + self = TRUE) + + expect_equal(e[1, 1], 1) +}) + +test_that("Zero-weight self-loops do not blow up the exposure", { + set.seed(7); n <- 6L + g <- rgraph_er(n, t = 1, p = 0.6) + g[1, 1] <- 1; g[1, 1] <- 0 # force a stored 0 on the diagonal + cumadopt <- matrix(0, n, 1); cumadopt[1, 1] <- 1 + + e <- exposure(list(g), cumadopt, valued = TRUE, mode = "stochastic", + self = FALSE, + link_fun = "wells-riley", + link_pars = list(beta = 0.5)) + expect_false(anyNA(e)) + expect_true(all(is.finite(e))) + expect_true(all(e >= 0) && all(e <= 1 + 1e-10)) +}) From c4ae6657d82f0fc54094a80bdfccbb83e7cbc68f Mon Sep 17 00:00:00 2001 From: aoliveram Date: Fri, 17 Apr 2026 18:01:14 -0700 Subject: [PATCH 16/18] refactor(exposure): user link_fun is single-arg only (M2 follow-up, #78) Drop the dual signature for user-supplied link_fun. The helper now always calls `link_fun(W@x)` with a single argument; parameters are expected to be baked into the closure. `link_pars` remains relevant only for the named kernels ("linear", "sigmoid", "wells-riley"). Simpler API, simpler docs, simpler tests. Co-Authored-By: Claude Opus 4.7 --- R/stats.R | 32 ++++++++---------- man/exposure.Rd | 17 +++++----- tests/testthat/test-exposure-link-fun.R | 43 ++++++------------------- 3 files changed, 30 insertions(+), 62 deletions(-) diff --git a/R/stats.R b/R/stats.R index b55b66b..833bea9 100644 --- a/R/stats.R +++ b/R/stats.R @@ -281,16 +281,15 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { #' \code{"identity"} (default, no transformation), \code{"linear"} #' (\eqn{\min(\beta w, 1)}), \code{"sigmoid"} #' (\eqn{\mathrm{plogis}((w - h)/\mathrm{scale})}), and \code{"wells-riley"} -#' (\eqn{1 - \exp(-\beta w)}). Alternatively, a user-supplied function -#' with either signature \code{function(w)} (parameters baked into a -#' closure) or \code{function(w, pars)} (parameters passed through -#' \code{link_pars}); it must return a vector of the same length as -#' \code{w}. When \code{link_fun} is not \code{"identity"}, -#' \code{valued} is forced to \code{TRUE} (with a warning if the user set -#' it to \code{FALSE}). +#' (\eqn{1 - \exp(-\beta w)}). Alternatively, a user-supplied +#' single-argument function \code{function(w)} with its parameters +#' baked into the closure; it must return a vector of the same length +#' as \code{w}. When \code{link_fun} is not \code{"identity"}, +#' \code{valued} is forced to \code{TRUE} (with a warning if the user +#' set it to \code{FALSE}). #' @param link_pars Named list with the scalar parameters required by -#' \code{link_fun}. See the section "Link / kernel functions" for the -#' required names per kernel. +#' the named kernels (\code{"linear"}, \code{"sigmoid"}, +#' \code{"wells-riley"}). Ignored when \code{link_fun} is a function. #' @details #' Exposure is calculated as follows: #' @@ -530,22 +529,17 @@ dgr.array <- function(graph, cmode, undirected, self, valued) { NULL # Link / kernel function applied to edge weights before exposure is computed. -# `link_fun` may be one of the named kernels listed below or a user-supplied -# function. User functions may have either signature: -# - `function(w)` — parameters baked into a closure, -# - `function(w, pars)` — parameters passed via `link_pars`. -# Either way, the function must return a vector of the same length as `w`, -# where `w` is the non-zero entries of a dgCMatrix (`@x`). +# `link_fun` is either one of the named kernels listed below or a +# user-supplied single-argument function `function(w)` that returns a vector +# of the same length as `w` (the non-zero entries of a dgCMatrix, `@x`). +# Parameters for user functions are expected to be baked into the closure. .apply_link_kernel <- function(W, link_fun, link_pars) { if (is.null(link_fun) || (is.character(link_fun) && identical(link_fun, "identity"))) return(W) if (is.function(link_fun)) { - fmls <- formals(link_fun) - single_arg <- !is.null(fmls) && length(fmls) == 1L && - !("..." %in% names(fmls)) - new_x <- if (single_arg) link_fun(W@x) else link_fun(W@x, link_pars) + new_x <- link_fun(W@x) if (length(new_x) != length(W@x)) stop("Custom -link_fun- must return a vector of the same length as ", "its input (the non-zero edge weights).") diff --git a/man/exposure.Rd b/man/exposure.Rd index 339e98a..1b9599f 100644 --- a/man/exposure.Rd +++ b/man/exposure.Rd @@ -57,17 +57,16 @@ matrix will be the lagged exposure as specified (see examples).} \code{"identity"} (default, no transformation), \code{"linear"} (\eqn{\min(\beta w, 1)}), \code{"sigmoid"} (\eqn{\mathrm{plogis}((w - h)/\mathrm{scale})}), and \code{"wells-riley"} -(\eqn{1 - \exp(-\beta w)}). Alternatively, a user-supplied function -with either signature \code{function(w)} (parameters baked into a -closure) or \code{function(w, pars)} (parameters passed through -\code{link_pars}); it must return a vector of the same length as -\code{w}. When \code{link_fun} is not \code{"identity"}, -\code{valued} is forced to \code{TRUE} (with a warning if the user set -it to \code{FALSE}).} +(\eqn{1 - \exp(-\beta w)}). Alternatively, a user-supplied +single-argument function \code{function(w)} with its parameters +baked into the closure; it must return a vector of the same length +as \code{w}. When \code{link_fun} is not \code{"identity"}, +\code{valued} is forced to \code{TRUE} (with a warning if the user +set it to \code{FALSE}).} \item{link_pars}{Named list with the scalar parameters required by -\code{link_fun}. See the section "Link / kernel functions" for the -required names per kernel.} +the named kernels (\code{"linear"}, \code{"sigmoid"}, +\code{"wells-riley"}). Ignored when \code{link_fun} is a function.} \item{...}{Further arguments passed to \code{\link{struct_equiv}} (only used when \code{alt.graph="se"}).} diff --git a/tests/testthat/test-exposure-link-fun.R b/tests/testthat/test-exposure-link-fun.R index 8cdf6dc..0531f10 100644 --- a/tests/testthat/test-exposure-link-fun.R +++ b/tests/testthat/test-exposure-link-fun.R @@ -77,50 +77,25 @@ test_that("link_fun = 'wells-riley' applies 1 - exp(-beta * w)", { }) # ---- User-supplied function ---------------------------------------------- -test_that("link_fun can be a user-supplied function(w, pars)", { +test_that("link_fun accepts a single-argument user function with baked pars", { fx <- mk_fixture() - - my_kernel <- function(w, pars) 1 - exp(-pars$beta * w) - - g_wr <- fx$g - g_wr[[1]]@x <- 1 - exp(-0.9 * g_wr[[1]]@x) - e_manual <- exposure(g_wr, fx$cumadopt, valued = TRUE) - - e_user <- exposure(fx$g, fx$cumadopt, valued = TRUE, - link_fun = my_kernel, link_pars = list(beta = 0.9)) - expect_equal(e_user, e_manual) -}) - -test_that("link_fun accepts a single-argument closure with baked pars", { - fx <- mk_fixture() - beta <- 0.3 - closure_kernel <- function(w) 1 - exp(-beta * w) + # A fully-specified closure -- no link_pars needed. + random_func <- function(x) 1 - exp(-0.3 * x) g_ref <- fx$g - g_ref[[1]]@x <- 1 - exp(-beta * g_ref[[1]]@x) + g_ref[[1]]@x <- 1 - exp(-0.3 * g_ref[[1]]@x) e_manual <- exposure(g_ref, fx$cumadopt, valued = TRUE) - # No link_pars supplied at all: should still work. - e_closure <- exposure(fx$g, fx$cumadopt, valued = TRUE, - link_fun = closure_kernel) - expect_equal(e_closure, e_manual) - - # Dot-args functions are called with both args (pars travel into ...). - dots_kernel <- function(...) { - a <- list(...) - 1 - exp(-beta * a[[1]]) - } - e_dots <- exposure(fx$g, fx$cumadopt, valued = TRUE, - link_fun = dots_kernel) - expect_equal(e_dots, e_manual) + e_user <- exposure(fx$g, fx$cumadopt, valued = TRUE, + link_fun = random_func) + expect_equal(e_user, e_manual) }) test_that("user-supplied link_fun must return same-length output", { fx <- mk_fixture() - bad_kernel <- function(w, pars) w[-1L] + bad_kernel <- function(w) w[-1L] expect_error( - exposure(fx$g, fx$cumadopt, valued = TRUE, - link_fun = bad_kernel, link_pars = list()), + exposure(fx$g, fx$cumadopt, valued = TRUE, link_fun = bad_kernel), "same length" ) }) From c6d84e94d6bdf1c32d37d12565665069ee878a4e Mon Sep 17 00:00:00 2001 From: aoliveram Date: Mon, 20 Apr 2026 11:44:17 -0700 Subject: [PATCH 17/18] feat: logit adoption model (M4) Adds adoption_model = c("threshold", "logit") and adoption_pars arguments to rdiffnet(). In logit mode, node i adopts at step t with probability plogis(beta0 + beta_expo * exposure_i), drawn from runif() each step. Threshold stays the default so fixed-seed calls that omit the new argument remain bit-identical. 15 new tests cover backward compatibility, parameter validation, saturation / suppression extremes, and multi-behaviour runs. Full suite: 665 pass, 0 fail. --- R/rdiffnet.r | 29 ++++++++- man/rdiffnet.Rd | 13 +++- tests/testthat/test-rdiffnet-logit.R | 97 ++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 tests/testthat/test-rdiffnet-logit.R diff --git a/R/rdiffnet.r b/R/rdiffnet.r index f15407a..fed1eca 100644 --- a/R/rdiffnet.r +++ b/R/rdiffnet.r @@ -28,6 +28,13 @@ #' @param stop.no.diff Logical scalar. When \code{TRUE}, the function will return #' with error if there was no diffusion. Otherwise it throws a warning. #' @param disadopt Function of disadoption, with current exposition, cumulative adoption, and time as possible inputs. +#' @param adoption_model Character scalar. Either \code{"threshold"} (default; +#' adopter iff \code{exposure >= threshold}) or \code{"logit"} (adopter with +#' probability \code{plogis(beta0 + beta_expo * exposure)}). +#' @param adoption_pars Named list. Required when +#' \code{adoption_model = "logit"}: must supply \code{beta0} (intercept) +#' and \code{beta_expo} (slope on exposure). Ignored when +#' \code{adoption_model = "threshold"}. #' @return A random \code{\link{diffnet}} class object. #' @family simulation functions #' @details @@ -408,9 +415,18 @@ rdiffnet <- function( name = "A diffusion network", behavior = "Random contagion", stop.no.diff = TRUE, - disadopt = NULL + disadopt = NULL, + adoption_model = c("threshold", "logit"), + adoption_pars = NULL ) { + adoption_model <- match.arg(adoption_model) + if (adoption_model == "logit") { + if (is.null(adoption_pars$beta0) || is.null(adoption_pars$beta_expo)) + stop("-adoption_pars- must supply both -beta0- and -beta_expo- ", + "when -adoption_model- = \"logit\".") + } + # Checking options for (arg in names(default_rewire.args)) if (!length(rewire.args[[arg]])) @@ -567,8 +583,15 @@ rdiffnet <- function( for (q in 1:num_of_behaviors) { - # 3.2 Identifying who adopts based on the threshold - whoadopts <- which( (expo[,,q] >= thr[,q]) & is.na(toa[,q])) + # 3.2 Identifying who adopts under the configured adoption model + if (adoption_model == "logit") { + e_q <- as.vector(expo[, , q]) + p <- stats::plogis(adoption_pars$beta0 + + adoption_pars$beta_expo * e_q) + whoadopts <- which((stats::runif(length(p)) < p) & is.na(toa[, q])) + } else { + whoadopts <- which((expo[, , q] >= thr[, q]) & is.na(toa[, q])) + } # 3.3 Updating the cumadopt cumadopt[whoadopts, i:t, q] <- 1L diff --git a/man/rdiffnet.Rd b/man/rdiffnet.Rd index 1a27d23..71a100b 100644 --- a/man/rdiffnet.Rd +++ b/man/rdiffnet.Rd @@ -22,7 +22,9 @@ rdiffnet( name = "A diffusion network", behavior = "Random contagion", stop.no.diff = TRUE, - disadopt = NULL + disadopt = NULL, + adoption_model = c("threshold", "logit"), + adoption_pars = NULL ) } \arguments{ @@ -72,6 +74,15 @@ threshold for each node.} with error if there was no diffusion. Otherwise it throws a warning.} \item{disadopt}{Function of disadoption, with current exposition, cumulative adoption, and time as possible inputs.} + +\item{adoption_model}{Character scalar. Either \code{"threshold"} (default; +adopter iff \code{exposure >= threshold}) or \code{"logit"} (adopter with +probability \code{plogis(beta0 + beta_expo * exposure)}).} + +\item{adoption_pars}{Named list. Required when +\code{adoption_model = "logit"}: must supply \code{beta0} (intercept) +and \code{beta_expo} (slope on exposure). Ignored when +\code{adoption_model = "threshold"}.} } \value{ A random \code{\link{diffnet}} class object. diff --git a/tests/testthat/test-rdiffnet-logit.R b/tests/testthat/test-rdiffnet-logit.R new file mode 100644 index 0000000..0b2df6f --- /dev/null +++ b/tests/testthat/test-rdiffnet-logit.R @@ -0,0 +1,97 @@ +context("rdiffnet logit adoption model") +library(netdiffuseR) + +test_that("threshold (default) path is unchanged", { + # Compare a threshold run under fixed seed against itself on a second + # call with adoption_model explicitly set to "threshold". + set.seed(2026) + dn_default <- rdiffnet(n = 25, t = 6, seed.graph = "small-world", + seed.p.adopt = 0.1, stop.no.diff = FALSE) + + set.seed(2026) + dn_threshold <- rdiffnet(n = 25, t = 6, seed.graph = "small-world", + seed.p.adopt = 0.1, stop.no.diff = FALSE, + adoption_model = "threshold") + + expect_identical(dn_default$toa, dn_threshold$toa) +}) + +test_that("logit mode runs and returns a diffnet", { + set.seed(2026) + dn <- rdiffnet(n = 40, t = 6, seed.graph = "small-world", + seed.p.adopt = 0.05, stop.no.diff = FALSE, + adoption_model = "logit", + adoption_pars = list(beta0 = -2, beta_expo = 6)) + + expect_s3_class(dn, "diffnet") + expect_equal(dim(dn$cumadopt), c(40, 6)) + expect_equal(length(dn$toa), 40) +}) + +test_that("logit mode requires both beta0 and beta_expo", { + expect_error( + rdiffnet(n = 20, t = 4, seed.graph = "small-world", + adoption_model = "logit", adoption_pars = list(beta0 = 0), + stop.no.diff = FALSE), + "beta0.*beta_expo|beta_expo" + ) + expect_error( + rdiffnet(n = 20, t = 4, seed.graph = "small-world", + adoption_model = "logit", adoption_pars = list(beta_expo = 1), + stop.no.diff = FALSE), + "beta0" + ) + expect_error( + rdiffnet(n = 20, t = 4, seed.graph = "small-world", + adoption_model = "logit", + stop.no.diff = FALSE), + "beta0" + ) +}) + +test_that("saturating beta0 drives near-universal adoption", { + # Very large intercept -> plogis(beta0 + ...) ~ 1 for all exposures. + set.seed(99) + dn <- rdiffnet(n = 60, t = 8, seed.graph = "small-world", + seed.p.adopt = 0.05, stop.no.diff = FALSE, + adoption_model = "logit", + adoption_pars = list(beta0 = 50, beta_expo = 0)) + # Everyone has adopted by some t <= T + expect_true(all(!is.na(dn$toa))) +}) + +test_that("very negative beta0 + beta_expo = 0 suppresses diffusion", { + set.seed(99) + expect_warning( + dn <- rdiffnet(n = 30, t = 6, seed.graph = "small-world", + seed.p.adopt = 0.05, stop.no.diff = FALSE, + adoption_model = "logit", + adoption_pars = list(beta0 = -50, beta_expo = 0)), + "No diffusion" + ) + # All adopters come from the seed round (toa == 1) + expect_true(all(dn$toa[!is.na(dn$toa)] == 1L)) +}) + +test_that("logit works with multiple behaviors", { + set.seed(2026) + dn <- rdiffnet(n = 40, t = 6, seed.graph = "small-world", + seed.p.adopt = list(0.05, 0.05), + stop.no.diff = FALSE, + adoption_model = "logit", + adoption_pars = list(beta0 = -1, beta_expo = 4)) + + expect_s3_class(dn, "diffnet") + # Multi-behavior diffnet stores cumadopt as a list of length num_behaviors + expect_type(dn$cumadopt, "list") + expect_length(dn$cumadopt, 2L) + expect_equal(dim(dn$toa), c(40, 2)) +}) + +test_that("unknown adoption_model raises match.arg error", { + expect_error( + rdiffnet(n = 20, t = 4, seed.graph = "small-world", + adoption_model = "probit", stop.no.diff = FALSE), + "should be one of" + ) +}) From cd3cc8d1ad549e7fa73dd3f1f5e41c98385d0c1f Mon Sep 17 00:00:00 2001 From: aoliveram Date: Tue, 21 Apr 2026 21:55:38 -0700 Subject: [PATCH 18/18] rename(rdiffnet): adoption_model values threshold/logit -> deterministic/stochastic (M4 follow-up, #78) Renames the two values accepted by adoption_model in rdiffnet() so the vocabulary matches the existing exposure.mode (which already uses deterministic/stochastic). No behavior change: - adoption_model = c("deterministic", "stochastic"), default "deterministic" (was "threshold") - "stochastic" keeps the same plogis(beta0 + beta_expo * exposure) Bernoulli draw previously called "logit" - Error message, roxygen doc and man page updated to match - Test file renamed test-rdiffnet-logit.R -> test-rdiffnet-stochastic.R; all 15 existing expectations updated to use the new names Full suite: 665 passed, 0 failed. --- R/rdiffnet.r | 16 ++++----- man/rdiffnet.Rd | 10 +++--- ...net-logit.R => test-rdiffnet-stochastic.R} | 36 +++++++++---------- 3 files changed, 31 insertions(+), 31 deletions(-) rename tests/testthat/{test-rdiffnet-logit.R => test-rdiffnet-stochastic.R} (69%) diff --git a/R/rdiffnet.r b/R/rdiffnet.r index fed1eca..353bc1f 100644 --- a/R/rdiffnet.r +++ b/R/rdiffnet.r @@ -28,13 +28,13 @@ #' @param stop.no.diff Logical scalar. When \code{TRUE}, the function will return #' with error if there was no diffusion. Otherwise it throws a warning. #' @param disadopt Function of disadoption, with current exposition, cumulative adoption, and time as possible inputs. -#' @param adoption_model Character scalar. Either \code{"threshold"} (default; -#' adopter iff \code{exposure >= threshold}) or \code{"logit"} (adopter with +#' @param adoption_model Character scalar. Either \code{"deterministic"} (default; +#' adopter iff \code{exposure >= threshold}) or \code{"stochastic"} (adopter with #' probability \code{plogis(beta0 + beta_expo * exposure)}). #' @param adoption_pars Named list. Required when -#' \code{adoption_model = "logit"}: must supply \code{beta0} (intercept) +#' \code{adoption_model = "stochastic"}: must supply \code{beta0} (intercept) #' and \code{beta_expo} (slope on exposure). Ignored when -#' \code{adoption_model = "threshold"}. +#' \code{adoption_model = "deterministic"}. #' @return A random \code{\link{diffnet}} class object. #' @family simulation functions #' @details @@ -416,15 +416,15 @@ rdiffnet <- function( behavior = "Random contagion", stop.no.diff = TRUE, disadopt = NULL, - adoption_model = c("threshold", "logit"), + adoption_model = c("deterministic", "stochastic"), adoption_pars = NULL ) { adoption_model <- match.arg(adoption_model) - if (adoption_model == "logit") { + if (adoption_model == "stochastic") { if (is.null(adoption_pars$beta0) || is.null(adoption_pars$beta_expo)) stop("-adoption_pars- must supply both -beta0- and -beta_expo- ", - "when -adoption_model- = \"logit\".") + "when -adoption_model- = \"stochastic\".") } # Checking options @@ -584,7 +584,7 @@ rdiffnet <- function( for (q in 1:num_of_behaviors) { # 3.2 Identifying who adopts under the configured adoption model - if (adoption_model == "logit") { + if (adoption_model == "stochastic") { e_q <- as.vector(expo[, , q]) p <- stats::plogis(adoption_pars$beta0 + adoption_pars$beta_expo * e_q) diff --git a/man/rdiffnet.Rd b/man/rdiffnet.Rd index 71a100b..ce15355 100644 --- a/man/rdiffnet.Rd +++ b/man/rdiffnet.Rd @@ -23,7 +23,7 @@ rdiffnet( behavior = "Random contagion", stop.no.diff = TRUE, disadopt = NULL, - adoption_model = c("threshold", "logit"), + adoption_model = c("deterministic", "stochastic"), adoption_pars = NULL ) } @@ -75,14 +75,14 @@ with error if there was no diffusion. Otherwise it throws a warning.} \item{disadopt}{Function of disadoption, with current exposition, cumulative adoption, and time as possible inputs.} -\item{adoption_model}{Character scalar. Either \code{"threshold"} (default; -adopter iff \code{exposure >= threshold}) or \code{"logit"} (adopter with +\item{adoption_model}{Character scalar. Either \code{"deterministic"} (default; +adopter iff \code{exposure >= threshold}) or \code{"stochastic"} (adopter with probability \code{plogis(beta0 + beta_expo * exposure)}).} \item{adoption_pars}{Named list. Required when -\code{adoption_model = "logit"}: must supply \code{beta0} (intercept) +\code{adoption_model = "stochastic"}: must supply \code{beta0} (intercept) and \code{beta_expo} (slope on exposure). Ignored when -\code{adoption_model = "threshold"}.} +\code{adoption_model = "deterministic"}.} } \value{ A random \code{\link{diffnet}} class object. diff --git a/tests/testthat/test-rdiffnet-logit.R b/tests/testthat/test-rdiffnet-stochastic.R similarity index 69% rename from tests/testthat/test-rdiffnet-logit.R rename to tests/testthat/test-rdiffnet-stochastic.R index 0b2df6f..a28073c 100644 --- a/tests/testthat/test-rdiffnet-logit.R +++ b/tests/testthat/test-rdiffnet-stochastic.R @@ -1,26 +1,26 @@ -context("rdiffnet logit adoption model") +context("rdiffnet stochastic adoption model") library(netdiffuseR) -test_that("threshold (default) path is unchanged", { - # Compare a threshold run under fixed seed against itself on a second - # call with adoption_model explicitly set to "threshold". +test_that("deterministic (default) path is unchanged", { + # Compare a deterministic run under fixed seed against itself on a second + # call with adoption_model explicitly set to "deterministic". set.seed(2026) dn_default <- rdiffnet(n = 25, t = 6, seed.graph = "small-world", seed.p.adopt = 0.1, stop.no.diff = FALSE) set.seed(2026) - dn_threshold <- rdiffnet(n = 25, t = 6, seed.graph = "small-world", - seed.p.adopt = 0.1, stop.no.diff = FALSE, - adoption_model = "threshold") + dn_det <- rdiffnet(n = 25, t = 6, seed.graph = "small-world", + seed.p.adopt = 0.1, stop.no.diff = FALSE, + adoption_model = "deterministic") - expect_identical(dn_default$toa, dn_threshold$toa) + expect_identical(dn_default$toa, dn_det$toa) }) -test_that("logit mode runs and returns a diffnet", { +test_that("stochastic mode runs and returns a diffnet", { set.seed(2026) dn <- rdiffnet(n = 40, t = 6, seed.graph = "small-world", seed.p.adopt = 0.05, stop.no.diff = FALSE, - adoption_model = "logit", + adoption_model = "stochastic", adoption_pars = list(beta0 = -2, beta_expo = 6)) expect_s3_class(dn, "diffnet") @@ -28,22 +28,22 @@ test_that("logit mode runs and returns a diffnet", { expect_equal(length(dn$toa), 40) }) -test_that("logit mode requires both beta0 and beta_expo", { +test_that("stochastic mode requires both beta0 and beta_expo", { expect_error( rdiffnet(n = 20, t = 4, seed.graph = "small-world", - adoption_model = "logit", adoption_pars = list(beta0 = 0), + adoption_model = "stochastic", adoption_pars = list(beta0 = 0), stop.no.diff = FALSE), "beta0.*beta_expo|beta_expo" ) expect_error( rdiffnet(n = 20, t = 4, seed.graph = "small-world", - adoption_model = "logit", adoption_pars = list(beta_expo = 1), + adoption_model = "stochastic", adoption_pars = list(beta_expo = 1), stop.no.diff = FALSE), "beta0" ) expect_error( rdiffnet(n = 20, t = 4, seed.graph = "small-world", - adoption_model = "logit", + adoption_model = "stochastic", stop.no.diff = FALSE), "beta0" ) @@ -54,7 +54,7 @@ test_that("saturating beta0 drives near-universal adoption", { set.seed(99) dn <- rdiffnet(n = 60, t = 8, seed.graph = "small-world", seed.p.adopt = 0.05, stop.no.diff = FALSE, - adoption_model = "logit", + adoption_model = "stochastic", adoption_pars = list(beta0 = 50, beta_expo = 0)) # Everyone has adopted by some t <= T expect_true(all(!is.na(dn$toa))) @@ -65,7 +65,7 @@ test_that("very negative beta0 + beta_expo = 0 suppresses diffusion", { expect_warning( dn <- rdiffnet(n = 30, t = 6, seed.graph = "small-world", seed.p.adopt = 0.05, stop.no.diff = FALSE, - adoption_model = "logit", + adoption_model = "stochastic", adoption_pars = list(beta0 = -50, beta_expo = 0)), "No diffusion" ) @@ -73,12 +73,12 @@ test_that("very negative beta0 + beta_expo = 0 suppresses diffusion", { expect_true(all(dn$toa[!is.na(dn$toa)] == 1L)) }) -test_that("logit works with multiple behaviors", { +test_that("stochastic works with multiple behaviors", { set.seed(2026) dn <- rdiffnet(n = 40, t = 6, seed.graph = "small-world", seed.p.adopt = list(0.05, 0.05), stop.no.diff = FALSE, - adoption_model = "logit", + adoption_model = "stochastic", adoption_pars = list(beta0 = -1, beta_expo = 4)) expect_s3_class(dn, "diffnet")