-
Notifications
You must be signed in to change notification settings - Fork 6
/
README.Rmd
128 lines (91 loc) · 6.06 KB
/
README.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
---
output: github_document
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.path = "man/figures/README-",
out.width = "100%"
)
```
# signnet <img src="man/figures/logo.png" align="right"/>
<!-- badges: start -->
[![R-CMD-check](https://github.com/schochastics/signnet/workflows/R-CMD-check/badge.svg)](https://github.com/schochastics/signnet/actions)
[![CRAN status](https://www.r-pkg.org/badges/version/signnet)](https://cran.r-project.org/package=signnet)
[![Downloads](https://cranlogs.r-pkg.org/badges/signnet)](https://CRAN.R-project.org/package=signnet)
[![Codecov test coverage](https://codecov.io/gh/schochastics/signnet/branch/main/graph/badge.svg)]( https://app.codecov.io/gh/schochastics/signnet?branch=main)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7522563.svg)](https://doi.org/10.5281/zenodo.7522563)
[![JOSS](https://joss.theoj.org/papers/10.21105/joss.04987/status.svg)](https://doi.org/10.21105/joss.04987)
<!-- badges: end -->
The package provides methods to analyse signed networks (i.e. networks with both positive and negative ties).
## Installation
You can install the released version of signnet from CRAN with:
```{r inst, eval=FALSE}
install.packages("signnet")
```
The development version from is available with:
``` {r inst2, eval=FALSE}
# install.packages("devtools")
devtools::install_github("schochastics/signnet")
```
## Structural Balance and Triads
The principles underlying structural balance are based on a theory in social psychology dating back to the work of Heider in the 1940s, which was generalized and extended to graphs by Cartwright and Harary in the 1950s. In its simplest form, it is defined via triangles. A triangle is balanced if
all ties are positive ("the friend of a friend is a friend") or only one tie is positive ("the enemy of my enemy is my friend"). The remaining configurations are said to be unbalanced.
<img src="man/figures/balance_triples.png"/>
A network is balanced if i.a., it can be partitioned into two vertex subsets, such that intra-group edges are all positive and inter-group edges are all negative. Determining this is easy, but measuring a *degree of balancedness* (i.e. how close is a network to be balanced?) is not. The package, so far, implements three methods to calculate balance scores. All are defined such that a value of one indicates perfect balance and zero perfect unbalance. Though for intermediate networks, results may vary significantly. Check [this paper](https://doi.org/10.1093/comnet/cnx044) by Samin Aref (and his other work) for more details.
```{r balance_example,message=FALSE}
library(igraph)
library(signnet)
data("tribes")
balance_score(tribes, method = "triangles")
balance_score(tribes, method = "walk")
balance_score(tribes, method = "frustration")
```
For directed signed networks, `triad_census_signed()` can be used to compute the count for all 138 non-isomorphic signed triads.
*(The code to reproduce this figure can be found in [this gist](https://gist.github.com/schochastics/dd1974b42cfa5367cf6d8cb9e43bae32))*
<img src="man/figures/signed_triads.png"/>
# Blockmodeling
The package implements two different blockmodeling algorithms. The classic one tries to partition the
network into a specified set of groups such that intra group edges are positive and inter group edges are negative.
```{r block_code,message=FALSE}
clu <- signed_blockmodel(tribes, k = 3, alpha = 0.5, annealing = TRUE)
clu
```
The parameter *k* is the number of groups and *alpha* specifies the penalty of negative inter group and positive intra group edges.
If `alpha = 0` (`alpha = 1`) then only positive inter group (negative intra group) edges are penalized. Set `alpha = 0.5` for equal penalization
The algorithm is not exact and just a heuristic. If `annealing = TRUE`, then simulated annealing is used. This improves the result, but may take additional time.
The result of the blockmodel can be visualized with `ggblock` (requires `ggplot2`)
```{r block_example}
ggblock(tribes, clu$membership, show_blocks = TRUE, show_labels = TRUE)
```
The second blockmodeling technique is known as *generalized blockmodeling*. This method removes the restriction of positve (negative) inter (intra) group edges. Instead, a blockmatrix is passed to the function with the desired block structure. The example below illustrates the technique with a network composed of three groups with differing inter/intra group edge patterns.
```{r general_example}
# create a signed network with three groups and different inter/intra group ties
g1 <- g2 <- g3 <- graph.full(5)
V(g1)$name <- as.character(1:5)
V(g2)$name <- as.character(6:10)
V(g3)$name <- as.character(11:15)
g <- Reduce("%u%", list(g1, g2, g3))
E(g)$sign <- 1
E(g)$sign[1:10] <- -1
g <- add.edges(g, c(rbind(1:5, 6:10)), attr = list(sign = -1))
g <- add.edges(g, c(rbind(1:5, 11:15)), attr = list(sign = -1))
g <- add.edges(g, c(rbind(11:15, 6:10)), attr = list(sign = 1))
# specify the link patterns between groups
blockmat <- matrix(c(1, -1, -1, -1, 1, 1, -1, 1, -1), 3, 3, byrow = TRUE)
blockmat
clu <- signed_blockmodel_general(g, blockmat, 0.5)
clu
ggblock(g, clu$membership, show_blocks = TRUE, show_labels = FALSE)
```
# How to reach out?
### Where do I report bugs?
Simply [open an issue](https://github.com/schochastics/signnet/issues/new) on GitHub.
### How do I contribute to the package?
If you have an idea (but no code yet), [open an issue](https://github.com/schochastics/signnet/issues/new) on GitHub. If you want to contribute with a specific feature and have the code ready, fork the repository, add your code, and create a pull request.
### Do you need support?
The easiest way is to [open an issue](https://github.com/schochastics/signnet/issues/new) - this way, your question is also visible to others who may face similar problems.
### Code of Conduct
Please note that the signnet project is released with a [Contributor Code of Conduct](https://contributor-covenant.org/version/2/1/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms.