This vignette describes the two implemented methods for blockmodeling in signed networks.

```
library(igraph)
library(signnet)
```

In signed blockmodeling, the goal is to determine `k`

blocks of nodes such that all intra-block edges are positive and
inter-block edges are negative. In the example below, we construct a
network with a perfect block structure with
`sample_islands_signed()`

. The network consists of 10 blocks
with 10 vertices each, where each block has a density of 1 (of positive
edges). The function `signed_blockmodel()`

is used to
construct the blockmodel. The parameter `k`

is the number of
desired blocks. `alpha`

is a trade-off parameter. The
function minimizes \(P(C)=\alpha
N+(1-\alpha)P\), where \(N\) is
the total number of negative ties within blocks and \(P\) be the total number of positive ties
between blocks.

```
<- sample_islands_signed(10,10,1,20)
g <- signed_blockmodel(g,k = 10,alpha = 0.5)
clu table(clu$membership)
#>
#> 1 2 3 4 5 6 7 8 9 10
#> 10 10 10 10 10 10 10 10 10 10
$criterion
clu#> [1] 0
```

The function returns a list with two entries. The block membership of nodes and the value of \(P(C)\).

The function `ggblock()`

can be used to plot the outcome
of the blockmodel (`ggplot2`

is required).

`ggblock(g,clu$membership,show_blocks = TRUE)`

If the parameter `annealing`

is set to TRUE, simulated
annealing is used in the optimization step. This generally leads to
better results but longer runtimes.

```
data("tribes")
set.seed(44) #for reproducibility
signed_blockmodel(tribes,k = 3,alpha=0.5,annealing = TRUE)
#> $membership
#> [1] 1 1 2 2 3 2 2 2 3 3 2 2 3 3 1 1
#>
#> $criterion
#> [1] 2
signed_blockmodel(tribes,k = 3,alpha=0.5,annealing = FALSE)
#> $membership
#> [1] 1 1 2 2 3 2 2 2 3 3 2 2 3 3 1 1
#>
#> $criterion
#> [1] 2
```

The function `signed_blockmodel()`

is only able to provide
a blockmodel where the diagonal blocks are positive and off-diagonal
blocks are negative. The function
`signed_blockmodel_general()`

can be used to specify
different block structures. In the below example, we construct a network
that contains three blocks. Two have positive and one has negative
intra-group ties. The inter-group edges are negative between group one
and two, and one and three. Between group two and three, all edges are
positive.

```
<- g2 <- g3 <- graph.full(5)
g1
V(g1)$name <- as.character(1:5)
V(g2)$name <- as.character(6:10)
V(g3)$name <- as.character(11:15)
<- Reduce("%u%",list(g1,g2,g3))
g E(g)$sign <- 1
E(g)$sign[1:10] <- -1
<- 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)) g
```

The parameter `blockmat`

is used to specify the desired
block structure.

```
set.seed(424) #for reproducibility
<- matrix(c(1,-1,-1,-1,1,1,-1,1,-1),3,3,byrow = TRUE)
blockmat
blockmat#> [,1] [,2] [,3]
#> [1,] 1 -1 -1
#> [2,] -1 1 1
#> [3,] -1 1 -1
<- signed_blockmodel_general(g,blockmat,alpha = 0.5)
general <- signed_blockmodel(g,k = 3,alpha = 0.5,annealing = TRUE)
traditional
c(general$criterion,traditional$criterion)
#> [1] 0 6
```

Doreian, Patrick, and Andrej Mrvar. 1996. “A Partitioning Approach to Structural Balance.” Social Networks 18 (2): 149–68.

Doreian, Patrick, and Andrej Mrvar. 2009. “Partitioning Signed Social Networks.” Social Networks 31 (1): 1–11.

Doreian, Patrick, and Andrej Mrvar. 2015. “Structural Balance and Signed International Relations.” Journal of Social Structure 16: 1.