Implements a novel method for privatizing network data using differential privacy. Provides functions for generating synthetic networks based on LSM (Latent Space Model), applying differential privacy to network latent positions to achieve overall network privatization, and evaluating the utility of privatized networks through various network statistics. The privatize and evaluate functions support both LSM and RDPG (Random Dot Product Graph). For generating RDPG networks, users are encouraged to use the 'randnet' package < https://CRAN.R-project.org/package=randnet>. For more details, see the "proposed method" section of Liu, Bi, and Li (2025)
GRANDpriv (Graph Release with Assured Node Differential privacy) is an R package that implements a novel method for privatizing network data using differential privacy. The package provides functions for generating synthetic networks based on LSM (Latent Space Model), applying differential privacy to network latent positions to achieve overall network privatization, and evaluating the utility of privatized networks through various network statistics. The privatize and evaluate functions support both LSM and RDPG (Random Dot Product Graph). For generating RDPG networks, users are encouraged to use the randnet package. For more details, see the "proposed method" section of Liu, Bi, and Li (2025).
# Install GRANDpriv from CRAN
install.packages("GRANDpriv")
Note: CRAN version is currently under review and not yet available. Please use the development version from GitHub.
# Install devtools if you haven't already
install.packages("devtools")
# Install GRANDpriv from GitHub
devtools::install_github("lsq0000/GRANDpriv")
The package requires the following R packages:
library(GRANDpriv)
# Generate a sample network using Latent Space Model
# Note: Use larger networks (n >= 1000) for better stability
network <- LSM.Gen(n = 400, k = 2, K = 3, avg.d = 40)
# Privatize the first 200 nodes with different privacy budgets
result <- GRAND.privatize(
A = network$A,
K = 2,
idx = 1:200,
eps = c(1, 2, 5, 10),
model = "LSM"
)
# Evaluate the privatization results
evaluation <- GRAND.evaluate(result)
print(evaluation)
# Evaluate specific statistics only
evaluation_subset <- GRAND.evaluate(result, statistics = c("degree", "triangle"))
print(evaluation_subset)
LSM.Gen(n, k, K, avg.d = NULL)Generates a random network following LSM (Latent Space Model) with specified parameters.
n: Integer. Number of nodes in the network.k: Integer. Dimension of the latent space.K: Integer. Number of communities/groups.avg.d: Numeric. Target average node degree. If NULL, no degree adjustment is performed.Returns: A list containing:
A: Adjacency matrix of the generated networkg: Graph object of the generated networkP: Probability matrix of the generated networkalpha: Node-specific intercept parametersZ: Latent positions in k-dimensional spaceidx: Community assignments for each nodeGRAND.privatize(A, K, idx, eps = 1, model = "LSM", niter = 500, rho = 0.05, verbose = TRUE)Applies the GRAND (Graph Release with Assured Node Differential privacy) method to privatize network data using differential privacy.
A: Matrix. Adjacency matrix of the input network.K: Integer. Dimension of the latent space for network embedding.idx: Integer vector. Indices of nodes to be privatized.eps: Numeric or numeric vector. Privacy budget parameter(s) for differential privacy. Default is 1.model: Character. Model type, either "LSM" (Latent Space Model) or "RDPG" (Random Dot Product Graph). Default is "LSM".niter: Integer. Number of iterations for the optimization algorithm. Default is 500.rho: Numeric. Parameter controlling the neighborhood size for conditional distributions. Default is 0.05.verbose: Logical. Whether to print progress messages. Default is TRUE.Returns: A list containing:
non.private.result: Results without privacy (original and estimated data)GRAND.result: List with one element per epsilon value. Each element contains privatization results for that specific epsilonLaplace.result: List with one element per epsilon value. Each element contains baseline Laplace mechanism results for that specific epsiloneps: Vector of privacy budget parameter(s) usedGRAND.evaluate(result, statistics = c("degree", "vshape", "triangle", "eigen", "harmonic"))Evaluates the quality of GRAND privatization results by comparing various network statistics between the original and privatized networks using Wasserstein distance.
result: List. Output from GRAND.privatize function containing privatization results.statistics: Character vector. Network statistics to evaluate. Options include: "degree" (Node Degree), "vshape" (V-Shape Count), "triangle" (Triangle Count), "eigen" (Eigen Centrality), "harmonic" (Harmonic Centrality). Default is all statistics.Returns: A data frame containing evaluation results with columns:
stat: Type of network statistic(s) evaluatedeps: Privacy budget parameter(s) usedHat: Wasserstein distance for release set estimationHat2: Wasserstein distance for holdout set estimationGRAND: Wasserstein distance for GRAND privatization methodLaplace: Wasserstein distance for standard Laplace mechanismGRAND uses a two-step approach:
GPL (>= 3)
If you use GRANDpriv in your research, please cite:
@misc{liu2025grand,
title={GRAND: Graph Release with Assured Node Differential Privacy},
author={Suqing Liu and Xuan Bi and Tianxi Li},
year={2025},
eprint={2507.00402},
archivePrefix={arXiv},
primaryClass={stat.ML},
url={https://arxiv.org/abs/2507.00402}
}
Or in text format:
S. Liu, X. Bi, and T. Li. GRAND: Graph Release with Assured Node Differential Privacy. arXiv preprint arXiv:2507.00402, 2025.
Please report issues or contribute to the package through GitHub.