identify members that link multiple projects (i.e. hubs)
This document is mostly an exploration of network analysis methodology and interactive visualization.
The raw data is not available on Github to safeguard privacy.
General overview
Code
library(igraph) # network analysislibrary(visNetwork) # interactive networklibrary(plotly) # interactive plot# load membership listmem <-read.csv( here::here("data", "derived-data", "mte_members.csv"))# load informations on projectsmeta <- readxl::read_xlsx( here::here("data", "raw-data", "mte", "Projets_FRB-MTECT-OFB.xlsx"))# create a last+first name columnmem$name <-paste(mem$lastname, mem$firstname)# number of members per group and positiontable(mem$group, mem$function_in_group)
# number of members per type of groupn_mem <-data.frame(table(mem$group))n_mem$Type <- meta$Type[match(n_mem$Var1, meta$Acronyme)]tapply(n_mem$Freq, n_mem$Type, summary)
$`REVUE SYSTEMATIQUE`
Min. 1st Qu. Median Mean 3rd Qu. Max.
7.0 8.5 9.5 9.0 10.0 10.0
$SYNERGIE
Min. 1st Qu. Median Mean 3rd Qu. Max.
4.00 7.00 8.00 8.30 9.75 13.00
$SYNTHESE
Min. 1st Qu. Median Mean 3rd Qu. Max.
11.00 12.25 13.00 12.50 13.00 13.00
Code
# list all group per nameinfoV <-tapply(mem$group, mem$name, paste, collapse ="<br>")nproj <-table(table(mem$name))
Among the 24 projects of the programs, there are 223 different researchers. Most of the researcher are member of a single project (N=204), but 17 researchers are attached to 2 projects; and 2 researchers works on 3 projects.
Project network
Based on the number of shared members, we can build a network of projects.
Code
group_mem <-table(mem$group, mem$name)member_overlap <-tcrossprod(group_mem)# or Jaccard to account for different group size# proxy::simil(group_mem, method = "Jaccard", diag = TRUE, upper = TRUE)diag(member_overlap) <-0netMEM <- igraph::graph_from_adjacency_matrix( member_overlap,mode ="undirected",weighted =TRUE)# modularity (optimal because the graph is tiny)modMEM <-cluster_walktrap(netMEM) # same as cluster_optimal# set color per groupcluMEM <-membership(modMEM)nclu <-table(cluMEM)cclu <- colorspace::qualitative_hcl(n =length(nclu), palette ="Dark 3")cclu[nclu ==1] <-"#808080"# greycolMEM <- cclu[cluMEM]simclu <-ifelse(cluMEM <= (sum(nclu >1)), cluMEM, "isolated")
The network has 24 nodes, 19 edges, a connectance of 0.069 and a modularity of 0.69
# color by typexnodtypshp <-c("triangle", "square", "dot")[V(netMEM)$type]V(netMEM)$shape <- typshp# x-axis by yearvyr <-V(netMEM)$yearxnod <- (vyr -min(vyr)) / (max(vyr) -min(vyr)) *2-1# take the membership as y-axisymod <-as.numeric(as.factor(simclu))ynod <- ymod /max(ymod)# layout_nicely(netMEM)[, 2]# sqrt(membership(modMEM)) / max(sqrt(membership(modMEM)))# or take the first MDS dimension# ynod <- layout_with_mds(netMEM)[, 1]# coordinatescoo <-cbind(jitter(xnod, 1.5), jitter(ynod, 3))# plot(netMEM, layout = coo)laby <-sort(unique(vyr))seqy <- (laby -min(laby)) / (max(laby) -min(laby)) *2-1visNetwork::visIgraph( netMEM,layout ='layout.norm',layoutMatrix = coo,randomSeed =54,type ="full") |>visLegend(addNodes =list(list(label ="Revue",shape ="triangle",color ="grey" ),list(label ="Synergie",shape ="square",color ="grey" ),list(label ="Synthese",shape ="dot",color ="grey" ) ),useGroups =FALSE ) |>visOptions(highlightNearest =TRUE,selectedBy =list(variable ="type", multiple = T) )
Centrality
There are a lot of different measures of centrality. Here we use betweenness (number of shortest paths going through a vertex) and the Google page rank.
The bipartite network has 247 nodes, 244 edges, and a connectance of 0.004.
Conclusion
We identified 5 sub-groups of projects based on shared members and a handful of researchers working on multiple FRB-MTE-OFB projects.
Yet, the membership is only a rough proxy of research collaboration. To better understand the research being produced, we need to investigate the bibliographic references produced and cited by each of the projects.