Contents

1 netresponse - probabilistic tools for functional network analysis

For bug reports and maintainer contact details, see the README file

1.1 Background

Condition-specific network activation is characteristic for cellular systems and other real-world interaction networks. If measurements of network states are available across a versatile set of conditions or time points, it becomes possible to construct a global view of network activation patterns. Different parts of the network respond to different conditions, and in different ways. Systematic, data-driven identification of these responses will help to obtain a holistic view of network activity [1-2]. This package provides robust probabilistic algorithms for functional network analysis [1, 3].

The methods are based on nonparametric probabilistic modeling and variational learning, and provide general exploratory tools to investigate the structure

NetResponse detects and characterizes subnetworks that exhibit context-specific activation patterns across versatile collections of functional measurements, such as gene expression data. The implementations are partially based on the agglomerative independent variable group analysis (AIVGA) and variational Dirichlet process Gaussian mixture models (Kurihara et al. 2007). The tools are particularly useful for global exploratory analysis of genome-wide interaction networks and versatile collections of gene expression data, and in general to discover subnetworks with alternative states.

1.2 Usage examples

Examples on running NetResponse algorithm and visualizing the results. The algorithm combines network and functional information to detect coherent subnetworks that reveal distinct activation modes across conditions.

library(netresponse)

# Generate simulated data
res <- generate.toydata(Dim = 3, Nc = 3, Ns = 200, sd0 = 3, rgam.shape = 1, rgam.scale = 1)

D <- res$data
component.means <- res$means
component.sds   <- res$sds
sample2comp     <- res$sample2comp

# Use fully connected network
network <- matrix(rep(1, 9), nrow = 3) 

# Fit NetResponse model
# Various network formats are supported, see help(detect.responses) for
# details. With large data sets, consider the 'speedup' option.
set.seed(4243)
res <- detect.responses(D, network, mixture.method = "vdp", pca.basis = TRUE)

# List subnets (each is a list of nodes)
subnet.id <- names(get.subnets(res))[[1]]

1.2.1 PCA visualization

library(ggplot2)
vis <- plot_responses(res, subnet.id, plot_mode = "pca")
# Modify the resulting ggplot2 object to enhance visualization
p <- vis$p # Pick the ggplot2 object from results
p <- p + geom_point(size = 3) # Modify point size
print(p) 

1.2.2 Network visualization

vis <- plot_responses(res, subnet.id, plot_mode = "network")

1.2.3 Heatmap visualization

vis <- plot_responses(res, subnet.id, plot_mode = "heatmap")

1.2.4 Boxplot visualization

vis <- plot_responses(res, subnet.id, plot_mode = "boxplot_data")

See also mode = “response.barplot”

1.2.5 Color scale

plot_scale(vis$breaks, vis$palette, two.sided = TRUE)

1.2.6 Cluster assignments

The sample-response assignments from the mixture model are soft ie. defined as continuous probabilities. Retrieve the hard clustering ie. list of samples for each response, response for each sample, based the highest probability:

subnet.id <- 'Subnet-1'

# Sample - response probabilities (soft cluster assignment)
response.probs <- sample2response(res, subnet.id)
tail(round(response.probs, 6))
##            Mode-1   Mode-2   Mode-3
## Sample-195      0 0.448262 0.551738
## Sample-196      1 0.000000 0.000000
## Sample-197      0 0.960423 0.039577
## Sample-198      0 1.000000 0.000000
## Sample-199      1 0.000000 0.000000
## Sample-200      0 1.000000 0.000000
# Sample - response hard assignments
hard.clusters <- response2sample(res, subnet.id)
print(hard.clusters)
## $`Mode-1`
##  [1] "Sample-5"   "Sample-16"  "Sample-17"  "Sample-22"  "Sample-23" 
##  [6] "Sample-27"  "Sample-30"  "Sample-33"  "Sample-34"  "Sample-44" 
## [11] "Sample-47"  "Sample-50"  "Sample-52"  "Sample-53"  "Sample-54" 
## [16] "Sample-55"  "Sample-56"  "Sample-58"  "Sample-63"  "Sample-65" 
## [21] "Sample-67"  "Sample-68"  "Sample-69"  "Sample-70"  "Sample-73" 
## [26] "Sample-74"  "Sample-75"  "Sample-77"  "Sample-79"  "Sample-81" 
## [31] "Sample-82"  "Sample-85"  "Sample-87"  "Sample-88"  "Sample-91" 
## [36] "Sample-92"  "Sample-96"  "Sample-99"  "Sample-102" "Sample-110"
## [41] "Sample-114" "Sample-119" "Sample-120" "Sample-121" "Sample-122"
## [46] "Sample-124" "Sample-127" "Sample-129" "Sample-131" "Sample-133"
## [51] "Sample-135" "Sample-136" "Sample-138" "Sample-140" "Sample-143"
## [56] "Sample-144" "Sample-146" "Sample-152" "Sample-153" "Sample-160"
## [61] "Sample-162" "Sample-167" "Sample-176" "Sample-178" "Sample-180"
## [66] "Sample-183" "Sample-185" "Sample-190" "Sample-191" "Sample-193"
## [71] "Sample-196" "Sample-199"
## 
## $`Mode-2`
##  [1] "Sample-1"   "Sample-4"   "Sample-8"   "Sample-9"   "Sample-11" 
##  [6] "Sample-12"  "Sample-13"  "Sample-14"  "Sample-20"  "Sample-24" 
## [11] "Sample-25"  "Sample-26"  "Sample-28"  "Sample-32"  "Sample-35" 
## [16] "Sample-39"  "Sample-41"  "Sample-42"  "Sample-43"  "Sample-45" 
## [21] "Sample-49"  "Sample-51"  "Sample-57"  "Sample-61"  "Sample-64" 
## [26] "Sample-66"  "Sample-71"  "Sample-78"  "Sample-80"  "Sample-83" 
## [31] "Sample-84"  "Sample-89"  "Sample-90"  "Sample-95"  "Sample-100"
## [36] "Sample-103" "Sample-107" "Sample-109" "Sample-112" "Sample-118"
## [41] "Sample-125" "Sample-126" "Sample-130" "Sample-132" "Sample-134"
## [46] "Sample-139" "Sample-141" "Sample-145" "Sample-149" "Sample-150"
## [51] "Sample-151" "Sample-154" "Sample-155" "Sample-158" "Sample-161"
## [56] "Sample-163" "Sample-164" "Sample-165" "Sample-170" "Sample-172"
## [61] "Sample-173" "Sample-179" "Sample-182" "Sample-186" "Sample-189"
## [66] "Sample-194" "Sample-195" "Sample-197"
## 
## $`Mode-3`
##  [1] "Sample-2"   "Sample-3"   "Sample-6"   "Sample-7"   "Sample-10" 
##  [6] "Sample-15"  "Sample-18"  "Sample-19"  "Sample-21"  "Sample-29" 
## [11] "Sample-31"  "Sample-36"  "Sample-37"  "Sample-38"  "Sample-40" 
## [16] "Sample-46"  "Sample-48"  "Sample-59"  "Sample-60"  "Sample-62" 
## [21] "Sample-72"  "Sample-76"  "Sample-86"  "Sample-93"  "Sample-94" 
## [26] "Sample-97"  "Sample-98"  "Sample-101" "Sample-104" "Sample-105"
## [31] "Sample-106" "Sample-108" "Sample-111" "Sample-113" "Sample-115"
## [36] "Sample-116" "Sample-117" "Sample-123" "Sample-128" "Sample-137"
## [41] "Sample-142" "Sample-147" "Sample-148" "Sample-156" "Sample-157"
## [46] "Sample-159" "Sample-166" "Sample-168" "Sample-169" "Sample-171"
## [51] "Sample-174" "Sample-175" "Sample-177" "Sample-181" "Sample-184"
## [56] "Sample-187" "Sample-188" "Sample-192" "Sample-198" "Sample-200"

Retrieve model parameters for a given subnetwork (Gaussian mixture means, covariance diagonal, and component weights; see help(get.model.parameters) for details):

params <- get.model.parameters(res, subnet.id) 
names(params)
## [1] "mu"          "sd"          "w"           "free.energy" "Nparams"    
## [6] "qofz"        "nodes"

1.3 Nonparametric Gaussian mixture models

Nonparametric Gaussian mixtures with variational Dirichlet processes based on implementations by Kurihara et al. (2007) and Honkela et al..

# Generate 2-dimensional simulated data with 3 clusters
res <- generate.toydata(Dim = 2, Nc = 3, Ns = 200, sd0 = 3, rgam.shape = 1, rgam.scale = 1)

D <- res$data
real.means <- res$means
real.sds   <- res$sds
real.sample2comp     <- res$sample2comp

# Infinite Gaussian mixture model with       
# Variational Dirichlet Process approximation       
mixt <- vdp.mixt( D )
            
# Centroids of the detected Gaussian components       
estimated.means <- mixt$posterior$centroids

# The colors denote the known clusters
# The blue ball denotes the original (known) cluster centroids and
# the triangle denotes the estimated centroids
plot(D, col = real.sample2comp, pch = 1)
points(real.means, col = "blue", pch = 16, cex = 2)
points(estimated.means, col = "blue", pch = 17, cex = 2)

# Hard mixture component assignment for each sample
estimated.sample2comp <- apply(mixt$posterior$qOFz, 1, which.max)

# Compare known and estimated mixture components
# (note that cluster indices may have switched due to unidentifiability)
# nearly all samples have one-to-one match between the real and estimated 
# clusters
head(table(estimated.sample2comp, real.sample2comp))
##                      real.sample2comp
## estimated.sample2comp  1  2  3
##                     1 63  3 69
##                     2  0 56  9

1.3.1 Citing NetResponse

Please cite Lahti et al. (2010) with the package.

citation("netresponse")
## 
## To cite netrespose (algorithm and package) in publications use:
## 
##   Leo Lahti et al. Global modeling of transcriptional responses in
##   interaction networks Bioinformatics 26(21):2713--20, 2010.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Article{,
##     title = {Global modeling of transcriptional responses in interaction networks},
##     author = {Leo Lahti and Juha E.A. Knuuttila and Samuel Kaski},
##     journal = {Bioinformatics},
##     year = {2010},
##     volume = {26},
##     issue = {21},
##     pages = {2713--20},
##   }
## 
## For ICMg functionality, please cite additionally the references listed
## in help(ICMg.combined.sampler). Thanks for Olli-Pekka Huovilainen and
## Antonio Gusmao for contributions to the R/C implementation of the
## netresponse algorithm and Juuso Parkkinen for ICMg.

1.3.2 Version information

This document was written using:

sessionInfo()
## R version 4.2.1 (2022-06-23)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.5 LTS
## 
## Matrix products: default
## BLAS:   /home/biocbuild/bbs-3.15-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.15-bioc/R/lib/libRlapack.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_GB              LC_COLLATE=C              
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] netresponse_1.56.1  reshape2_1.4.4      mclust_5.4.10      
##  [4] minet_3.54.0        rmarkdown_2.16      Rgraphviz_2.40.0   
##  [7] graph_1.74.0        BiocGenerics_0.42.0 knitr_1.40         
## [10] BiocStyle_2.24.0   
## 
## loaded via a namespace (and not attached):
##  [1] qvalue_2.28.0       tidyselect_1.1.2    xfun_0.32          
##  [4] bslib_0.4.0         purrr_0.3.4         splines_4.2.1      
##  [7] colorspace_2.0-3    vctrs_0.4.1         generics_0.1.3     
## [10] htmltools_0.5.3     stats4_4.2.1        yaml_2.3.5         
## [13] utf8_1.2.2          rlang_1.0.5         jquerylib_0.1.4    
## [16] pillar_1.8.1        glue_1.6.2          DBI_1.1.3          
## [19] RColorBrewer_1.1-3  lifecycle_1.0.1     plyr_1.8.7         
## [22] stringr_1.4.1       munsell_0.5.0       gtable_0.3.1       
## [25] evaluate_0.16       fastmap_1.1.0       parallel_4.2.1     
## [28] fansi_1.0.3         highr_0.9           Rcpp_1.0.9         
## [31] scales_1.2.1        BiocManager_1.30.18 cachem_1.0.6       
## [34] magick_2.7.3        jsonlite_1.8.0      ggplot2_3.3.6      
## [37] digest_0.6.29       stringi_1.7.8       bookdown_0.28      
## [40] dplyr_1.0.10        cli_3.3.0           tools_4.2.1        
## [43] magrittr_2.0.3      sass_0.4.2          tibble_3.1.8       
## [46] pkgconfig_2.0.3     assertthat_0.2.1    R6_2.5.1           
## [49] igraph_1.3.4        compiler_4.2.1