Learn R Programming

⚠️There's a newer version (0.2.1) of this package.Take me there.

concorR

The goal of concorR is to implement the CONCOR (CONvergence of iterated CORrelations) algorithm for positional analysis. Positional analysis divides a network into blocks based on the similarity of links between actors. CONCOR uses structural equivalence—“same ties to same others”—as its criterion for grouping nodes, and calculates this by correlating columns in the adjacency matrix. For more details on CONCOR, see the original description by Breiger, Boorman, and Arabie (1975), or Chapter 9 in Wasserman and Faust (1994).

Installation

You can install the development version from GitHub with:

# install.packages("devtools")
devtools::install_github("ATraxLab/concorR")

Example

This is a basic example which shows a common task: using CONCOR to partition a single adjacency matrix.

library(concorR)
a <- matrix(c(0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 
               1, 0, 1, 0, 1, 1, 0, 0, 0, 0), ncol = 5)
rownames(a) <- letters[1:5]
colnames(a) <- letters[1:5]
concor(list(a))
#>   block vertex
#> 1     1      b
#> 2     1      c
#> 3     1      d
#> 4     2      a
#> 5     2      e

Additional helper functions are included for using the igraph package:

library(igraph)
#> 
#> Attaching package: 'igraph'
#> The following objects are masked from 'package:stats':
#> 
#>     decompose, spectrum
#> The following object is masked from 'package:base':
#> 
#>     union

plot(graph_from_adjacency_matrix(a))
glist <- concor_make_igraph(list(a))

plot(glist[[1]], vertex.color = V(glist[[1]])$csplit1)

The blockmodel shows the permuted adjacency matrix, rearranged to group nodes by CONCOR partition.

bm <- make_blk(list(a), 1)[[1]]
plot_blk(bm, labels = TRUE)

The reduced matrix represents each position as a node, and calculates links by applying a density threshold to the ties between (and within) positions.

(r_mat <- make_reduced(list(a), nsplit = 1))
#> $reduced_mat
#> $reduced_mat[[1]]
#>         Block 1 Block 2
#> Block 1       1       0
#> Block 2       1       1
#> 
#> 
#> $dens
#> [1] 0.6
r_igraph <- make_reduced_igraph(r_mat$reduced_mat[[1]])

plot_reduced(r_igraph)

Example 2: Krackhardt high-tech managers

CONCOR can use multiple adjacency matrices to partition nodes based on all relations simultaneously. The package includes igraph data files for the Krackhardt (1987) high-tech managers study, which gives networks for advice, friendship, and reporting among 21 managers at a firm. (These networks were used in the examples of Wasserman and Faust (1994).)

First, take a look at the CONCOR partitions for two splits (four positions), considering only the advice or only the friendship networks.

par(mfrow = c(1, 2))
plot_socio(krack_advice)  # plot_socio imposes some often-useful plot parameters
plot_socio(krack_friend)
par(mfrow = c(1,1))

m1 <- igraph::as_adjacency_matrix(krack_advice, sparse = FALSE)
m2 <- igraph::as_adjacency_matrix(krack_friend, sparse = FALSE)

g1 <- concor_make_igraph(list(m1), nsplit = 2)
g2 <- concor_make_igraph(list(m2), nsplit = 2)

gadv <- set_vertex_attr(krack_advice, "csplit2", value = V(g1[[1]])$csplit2)
gfrn <- set_vertex_attr(krack_friend, "csplit2", value = V(g2[[1]])$csplit2)

par(mfrow = c(1, 2))
plot_socio(gadv, nsplit = 2)
plot_socio(gfrn, nsplit = 2)
par(mfrow = c(1,1))

Next, compare with the multi-relation blocking:

gboth <- concor_make_igraph(list(m1, m2), nsplit = 2)

gadv2 <- set_vertex_attr(krack_advice, "csplit2", value = V(gboth[[1]])$csplit2)
gfrn2 <- set_vertex_attr(krack_friend, "csplit2", value = V(gboth[[2]])$csplit2)

par(mfrow = c(1, 2))
plot_socio(gadv2, nsplit = 2)
plot_socio(gfrn2, nsplit = 2)
par(mfrow = c(1,1))

Including information from both relations changes the block membership of several nodes.

It also affects the reduced networks, as can be seen from comparing the single-relation version:

red1 <- make_reduced(list(m1), nsplit = 2)
red2 <- make_reduced(list(m2), nsplit = 2)

gred1 <- make_reduced_igraph(red1$reduced_mat[[1]])
gred2 <- make_reduced_igraph(red2$reduced_mat[[1]])

par(mfrow = c(1, 2))
plot_reduced(gred1)
plot_reduced(gred2)
par(mfrow = c(1,1))

with the multi-relation version:

redboth <- make_reduced(list(m1, m2), nsplit = 2)
gboth <- lapply(redboth$reduced_mat, make_reduced_igraph)
par(mfrow = c(1, 2))
plot_reduced(gboth[[1]])
plot_reduced(gboth[[2]])
par(mfrow = c(1,1))

Acknowledgments

This work was supported by National Science Foundation awards DUE-1712341 and DUE-1711017.

References

R. L. Breiger, S. A. Boorman, P. Arabie, An algorithm for clustering relational data with applications to social network analysis and comparison with multidimensional scaling. J. of Mathematical Psychology. 12, 328 (1975). http://doi.org/10.1016/0022-2496(75)90028-0

D. Krackhardt, Cognitive social structures. Social Networks. 9, 104 (1987). http://doi.org/10.1016/0378-8733(87)90009-8

S. Wasserman and K. Faust, Social Network Analysis: Methods and Applications (Cambridge University Press, 1994).

Copy Link

Version

Install

install.packages('concorR')

Monthly Downloads

307

Version

0.2.0

License

GPL (>= 2)

Issues

Pull Requests

Stars

Forks

Maintainer

Adrienne Traxler

Last Published

June 3rd, 2020

Functions in concorR (0.2.0)

concor1

Find +1/-1 convergence points of an input matrix
plot_reduced

Plot a reduced network
plot_socio

Plot sociogram colored by CONCOR partition
make_reduced_igraph

Build an igraph object for a reduced network
make_blk

Make blockmodel objects using CONCOR partition
concor

Find CONCOR partition for a graph
plot_blk

Plot a blockmodel
make_reduced

Run CONCOR and output reduced adjacency matrices
concor_make_igraph

Find CONCOR partition and create a list of igraph objects
concorR

The concorR Package
concor_igraph_apply

Find CONCOR partition and add to a list of igraph objects
krack_advice

Krackhardt High-Tech Managers data