Positional analysis groups nodes together who have similar relationalcharacteristics, rather than individual characteristics of nodesthemselves. There are many approaches to clustering in social networksbased on modularity maximization (e.g, Louvain, SLM, hierarchicalclustering) or principles of information theory (e.g, Infomap).ideanet’srole_analysis function currentlyoffers workflows for two common methods of positional analysis: CONCORand hierarchical clustering.
Note: for the sake of simplicity, we will not directly directlydisplay all visualizations generated byrole_analysis inthis vignette. However we provide code for displaying omittedvisualizations encourage you to paste this code in your R console as youfollow this vignette.
To illustrate how to use therole_analysis function,we’ll use a multirelational network of business and marriagerelationships between families in Renaissance-era Florence. This networkis frequently used to demonstrate role detection methods methods, and isincluded natively inideanet.
| id | family |
|---|---|
| 0 | ACCIAIUOL |
| 1 | ALBIZZI |
| 2 | BARBADORI |
| 3 | BISCHERI |
| 4 | CASTELLAN |
| 5 | GINORI |
| source | target | weight | type |
|---|---|---|---|
| 0 | 8 | 1 | marriage |
| 1 | 5 | 1 | marriage |
| 1 | 6 | 1 | marriage |
| 1 | 8 | 1 | marriage |
| 2 | 4 | 1 | marriage |
| 2 | 8 | 1 | marriage |
The first step in our positional analysis workflow is to process thisnetwork using thenetwrite function, as one generally doeswhen usingideanet to work with sociocentric data:
nw_flor<-netwrite(nodelist = florentine_nodes,node_id ="id",i_elements = florentine_edges$source,j_elements = florentine_edges$target,type = florentine_edges$type,directed =FALSE,net_name ="florentine")We’ll be passing resultingigraph_list andnode_measures object to therole_analysisfunction.
As with all other tools inideanet, therole_analysis function asks users to specify severalarguments ahead of execution. Some of these arguments are specific tothe positional analysis method being used and are only required when theuser selects that method:
General Arguments
graph: Anigraph object generated bynetwrite. If the network in question is multirelational (asis the one in this example), the object passed tographshould be theigraph_list object generated bynetwrite.nodes: A nodelist data frame generated bynetwrite.directed: Specify if the edges should be interpreted asdirected or undirected. ExpectsTRUE orFALSElogical.method: Method of role inference. Current valid optionsare"cluster" for hierarchical clustering andconcor for CONCOR.min_partitions: A numeric value indicating the numberof minimum number of clusters or partitions to assign to nodes in thenetwork. When using hierarchical clustering, this value reflects theminimum number of clusters produced by analysis. When using CONCOR, thisvalue reflects the minimum number of partitions produced in analysis,such that a value of1 results in a partitioning of twogroups, a value of2 results in four groups, and soon.max_partitions: A numeric value indicating the numberof maximum number of clusters or partitions to assign to nodes in thenetwork. The value given here is applied in the same way asmin_partitions.min_partition_size: A numeric value indicating theminimum number of nodes required for inclusion in a cluster. If aninferred cluster or partition contains fewer nodes than the numberassigned tomin_partition_size, nodes in thiscluster/partition will be labeled as members of a parentcluster/partition.backbone: A numeric value ranging from 0-1 indicatingwhich edges in the similarity/correlation matrix should be kept whencalculating modularity of cluster/partition assignments. Whencalculating optimal modularity, it helps to backbone thesimilarity/correlation matrix according to the nth percentile. Largernetworks benefit from higher backbone values, while lower valuesgenerally benefit smaller networks.viz: Output summary visualizations. ExpectsTRUE orFALSE logical.Arguments Specific to Hierarchical Clustering
retain_variables: Output a dataframe of variables usedin clustering. ExpectsTRUE orFALSElogical.cluster_summaries: Output a dataframe containing meanvalues of clustering variables within each cluster. ExpectsTRUE orFALSE logical.dendro_names: Ifviz is set toTRUE, a logical value indicating whether the clusterdendrogram visualization produced should display node labels rather thannumeric ID numbers.fast_triad: A logical value indicating whether to use afaster method for counting individual nodes’ positions in differenttypes of triads. Set toTRUE by default.NOTE: Thisfaster method may lead to memory issues and should be avoided whenworking with larger networks.Arguments Specific to CONCOR
self_ties: A logical value indicting whether to includeself-loops in CONCOR calculation.cutoff: A numeric value ranging from 0 to 1 thatindicates the correlation cutoff for detecting convergence in CONCORcalculation.max_iter: A numeric value indicating the maximum numberof iterations allowed for CONCOR calculation.For our first example, let’s look at how to identify role positionsusing the hierarchical clustering method. Althoughrole_analysis takes the many arguments listed above, inpractice we only need to specify a fraction of them:
flor_cluster<-role_analysis(method ="cluster",graph = nw_flor$igraph_list,nodes = nw_flor$node_measures,directed =FALSE,min_partitions =2,max_partitions =7,viz =TRUE,cluster_summaries =TRUE,fast_triad =TRUE)Note that we’ve setfast_triad to beTRUEhere to expedite counting the number of triad positions, ormotifs, that each node occupies in the network. This isacceptable for the current network given its small size; however, asstated earlier, settingfast_triad toTRUE maylead to memory issues with your computer given too large a network.Should this occur, we recommend settingfast_triad toFALSE and trying again.
role_analysis is similar tonetwrite inthat it simultaneously creates several outputs stored in a single listobject. In the following section, we’ll examine each of the outputswithin this list and what they contain.
Depending on the amount of partitioning applied during clustering,individual nodes may vary in terms of cluster membership. Users caninspect cluster membership of individual nodes at each level ofpartitioning using thecluster_assignments object:
| id | cut_1 | cut_2 | cut_3 | cut_4 | cut_5 | cut_6 | cut_7 | max_mod | best_fit |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 |
| 2 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 |
| 3 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 |
| 4 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 |
| 5 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 1 | 1 |
Hereid contains each node’s simplified identifier as itappears in thenode_measures dataframe produced bynetwrite. Columns beginning with thecut_prefix indicate a specific level of partitioning. In most cases, we areinterested in finding a single solution that best categorizes nodes intodifferent types (“roles”) according to their relational characteristics.role_analysis determines the optimal level of partitioningby taking the distance matrix used in the clustering process andconverting it into a similarity matrix. This similarity matrix is thentreated as a dense network whose modularity varies according to themembership of nodes within derived clusters. Finally,role_analysis designates the level of partitioning whosecluster assignments produce the highest modularity score as the bestfit. In effect, this converts a multirelational role problem into asingle-relation community detection problem in a dense network.
Cluster assignments at this identified optimal level are stored inthemax_mod column, and values in this column are generallythose that users will want to use. However, if users require clusters tohave a minimum size as specified by themin_partition_sizeargument, they will want smaller clusters identified inmax_mod to be subsumed into a parent cluster. When this isthe case, thebest_fit column will contain the closestcompromise betweenmax_mod and the user’sspecifications.
To determine the number of clusters produced at the optimal level ofpartitioning, you can simply identify the maximum value contained inmax_mod. However,role_analysis generates twodiagnostic visualizations that provide a faster way of interpretingclustering output. Thecluster_dendrogram visualizationillustrates the cluster membership of nodes at each level ofpartitioning while also indicating membership of nodes at the optimalpartitioning level:
Whilecluster_dendrogram shows where nodes fall at eachlevel of partitioning,cluster_modularity shows how themodularity score of the similarity matrix changes at each level ofpartitioning:
Note: this plot may not appear in R Markdown documents, but willappear in a plot window if called in the R console.
Looking at this plot and the dendrogram together, we see that nodesin the network have been assigned to one of seven different clusters(including one isolate node; isolates are assigned their own cluster inour approach), and that this partitioning produces the best fit asdetermined by modularity score. We also see that while most clusterscontain about 2-4 nodes, node 8 appears to be unique enough in itsrelational position to constitute its own cluster.
We now know that nodes in this network fall into one of sevenpositions or “roles.” A proper understanding of these results requiresmore, however. If clusters are supposed to represent different kinds ofroles that nodes occupy in the network, we’ll want to knowwhycertain nodes are placed in one cluster over another and how theseclusters differ from one another. Thecluster_summariesdataframe provides a numerical overview of differences between inferredclusters, allowing us to make progress to this end.
| cluster | size | mean_total_degree | mean_weighted_degree | mean_norm_weighted_degree | mean_marriage_total_degree | mean_marriage_weighted_degree | mean_marriage_norm_weighted_degree | mean_business_total_degree | mean_business_weighted_degree | mean_business_norm_weighted_degree | mean_betweenness | mean_marriage_betweenness | mean_business_betweenness | mean_bonpow | mean_bonpow_negative | mean_marriage_bonpow | mean_marriage_bonpow_negative | mean_business_bonpow | mean_business_bonpow_negative | mean_eigen_centrality | mean_marriage_eigen_centrality | mean_business_eigen_centrality | mean_closeness | mean_marriage_closeness | mean_business_closeness | mean_isolate | mean_marriage_isolate | mean_business_isolate | mean_cor_marriage_summary_graph | mean_cor_business_summary_graph | mean_cor_business_marriage | mean_summary_graph_201_s | mean_summary_graph_201_b | mean_summary_graph_300 | mean_marriage_201_s | mean_marriage_201_b | mean_marriage_300 | mean_business_201_b | mean_business_201_s | mean_business_300 | mean_total_degree_std | mean_weighted_degree_std | mean_norm_weighted_degree_std | mean_marriage_total_degree_std | mean_marriage_weighted_degree_std | mean_marriage_norm_weighted_degree_std | mean_business_total_degree_std | mean_business_weighted_degree_std | mean_business_norm_weighted_degree_std | mean_betweenness_std | mean_marriage_betweenness_std | mean_business_betweenness_std | mean_bonpow_std | mean_bonpow_negative_std | mean_marriage_bonpow_std | mean_marriage_bonpow_negative_std | mean_business_bonpow_std | mean_business_bonpow_negative_std | mean_eigen_centrality_std | mean_marriage_eigen_centrality_std | mean_business_eigen_centrality_std | mean_closeness_std | mean_marriage_closeness_std | mean_business_closeness_std | mean_isolate_std | mean_marriage_isolate_std | mean_business_isolate_std | mean_cor_marriage_summary_graph_std | mean_cor_business_summary_graph_std | mean_cor_business_marriage_std | mean_summary_graph_201_s_std | mean_summary_graph_201_b_std | mean_summary_graph_300_std | mean_marriage_201_s_std | mean_marriage_201_b_std | mean_marriage_300_std | mean_business_201_b_std | mean_business_201_s_std | mean_business_300_std |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 3 | 2.000000 | 2.000000 | 0.0285714 | 1.000000 | 1.000000 | 0.0250000 | 1.000000 | 1.000000 | 0.0333333 | 0.0023913 | 0.0000000 | 0.0000000 | 0.4279204 | 0.1649395 | 0.3436182 | 0.2496124 | 0.3586379 | 0.0925887 | 0.2454682 | 0.1951241 | 0.1863881 | 0.4703704 | 0.3559259 | 0.2174074 | 0 | 0 | 0.3333333 | 0.7402046 | 0.4899753 | -0.0547522 | 5.000000 | 0.0000000 | 0.0000000 | 2.0000000 | 0.0000000 | 0.0000000 | 0 | 1.333333 | 0.000000 | -1.0033651 | -1.0801234 | -1.0801234 | -1.1927968 | -1.1927968 | -1.1927968 | -0.5773503 | -0.5773503 | -0.5773503 | -0.6591202 | -0.8357033 | -0.5807955 | -1.2077500 | -0.7456867 | -1.3077063 | -0.6726904 | -0.5561957 | -0.6685451 | -1.2055180 | -1.3111876 | -0.6063701 | -1.0090112 | -1.3153252 | -0.2911651 | 0 | 0 | 0.1456438 | -1.0041260 | -0.3405152 | -1.2141592 | 0.1086938 | -0.7188608 | -0.6370221 | -0.3124216 | -0.7186497 | -0.4830459 | -0.4711756 | -0.0968246 | -0.4605662 |
| 2 | 3 | 3.333333 | 3.333333 | 0.0476190 | 3.333333 | 3.333333 | 0.0833333 | 0.000000 | 0.000000 | 0.0000000 | 0.0483957 | 0.1238095 | 0.0000000 | 0.6575333 | 0.4435213 | 1.1948522 | 0.7712099 | 0.0000000 | 0.0000000 | 0.4099270 | 0.7293140 | 0.0000000 | 0.5444444 | 0.5259259 | 0.0000000 | 0 | 0 | 1.0000000 | 1.0000000 | 0.0000000 | 0.0000000 | 5.000000 | 2.3333333 | 0.3333333 | 4.3333333 | 2.6666667 | 0.0000000 | 0 | 0.000000 | 0.000000 | -0.1672275 | -0.5400617 | -0.5400617 | 0.4771187 | 0.4771187 | 0.4771187 | -1.1547005 | -1.1547005 | -1.1547005 | -0.2258785 | 0.2089258 | -0.5807955 | -0.6435723 | -0.3639669 | 0.6622280 | 0.0616603 | -1.2020508 | -0.8044721 | -0.6144057 | 0.7042539 | -1.1052988 | 0.0997923 | 0.7011553 | -1.5172336 | 0 | 0 | 1.6020820 | 0.9577265 | -1.5815831 | -1.0357505 | 0.1086938 | -0.1198101 | -0.3185110 | 0.5287135 | 0.5311759 | -0.4830459 | -0.4711756 | -0.7423218 | -0.4605662 |
| 3 | 3 | 4.000000 | 6.000000 | 0.0857143 | 2.666667 | 2.666667 | 0.0666667 | 3.333333 | 3.333333 | 0.1111111 | 0.0816639 | 0.0730159 | 0.1031746 | 1.2805915 | 0.8223691 | 0.9525905 | 0.6033423 | 1.2037240 | 0.8869239 | 0.8666517 | 0.5837147 | 0.7968545 | 0.5537037 | 0.4711111 | 0.4055556 | 0 | 0 | 0.0000000 | 0.8885364 | 0.9054561 | 0.6113803 | 8.333333 | 7.6666667 | 2.3333333 | 5.3333333 | 2.6666667 | 0.6666667 | 5 | 4.333333 | 1.666667 | 0.2508413 | 0.5400617 | 0.5400617 | 0.0000000 | 0.0000000 | 0.0000000 | 0.7698004 | 0.7698004 | 0.7698004 | 0.0874211 | -0.2196400 | 0.6610369 | 0.8873329 | 0.1551398 | 0.1015834 | -0.1746784 | 0.9656823 | 0.4975971 | 1.0271936 | 0.1549233 | 1.0277429 | 0.2383928 | 0.0509612 | 0.7698958 | 0 | 0 | -0.5825753 | 0.1160057 | 0.7118641 | 0.9564162 | 1.0144756 | 1.2494485 | 1.5925551 | 0.8892000 | 0.5311759 | 1.1271071 | 1.2115945 | 1.3555442 | 1.8422647 |
| 4 | 3 | 3.000000 | 4.333333 | 0.0619048 | 3.000000 | 3.000000 | 0.0750000 | 1.333333 | 1.333333 | 0.0444444 | 0.0610019 | 0.1412698 | 0.0000000 | 0.8589091 | 0.5129390 | 1.0059946 | 0.7996485 | 0.4643523 | 0.1793993 | 0.5159179 | 0.5894034 | 0.2694346 | 0.5185185 | 0.5000000 | 0.2925926 | 0 | 0 | 0.0000000 | 0.9353949 | 0.8598075 | 0.6250892 | 1.666667 | 0.6666667 | 0.0000000 | 0.6666667 | 0.6666667 | 0.0000000 | 0 | 1.000000 | 0.000000 | -0.3762619 | -0.1350154 | -0.1350154 | 0.2385594 | 0.2385594 | 0.2385594 | -0.3849002 | -0.3849002 | -0.3849002 | -0.1071611 | 0.3562453 | -0.5807955 | -0.1487753 | -0.2688490 | 0.2251719 | 0.1016986 | -0.3658194 | -0.5411008 | -0.2334442 | 0.1763859 | -0.3840690 | -0.2882889 | 0.3936311 | 0.1328415 | 0 | 0 | -0.5825753 | 0.4698589 | 0.5962399 | 1.0010863 | -0.7970880 | -0.5477035 | -0.6370221 | -0.7930702 | -0.4061933 | -0.4830459 | -0.4711756 | -0.2581989 | -0.4605662 |
| 5 | 2 | 4.500000 | 6.000000 | 0.0857143 | 2.000000 | 2.000000 | 0.0500000 | 4.000000 | 4.000000 | 0.1333333 | 0.0427601 | 0.0095238 | 0.0928571 | 1.2488985 | 0.9740216 | 0.6967201 | 0.4871883 | 1.4002756 | 1.2350687 | 0.8696674 | 0.4235596 | 0.9617895 | 0.5472222 | 0.4050000 | 0.4138889 | 0 | 0 | 0.0000000 | 0.7928724 | 0.8997065 | 0.4547319 | 3.500000 | 0.0000000 | 0.0000000 | 1.5000000 | 0.0000000 | 0.0000000 | 0 | 1.500000 | 0.000000 | 0.5643929 | 0.5400617 | 0.5400617 | -0.4771187 | -0.4771187 | -0.4771187 | 1.1547005 | 1.1547005 | 1.1547005 | -0.2789514 | -0.7553473 | 0.5368537 | 0.8094606 | 0.3629378 | -0.4905545 | -0.3382102 | 1.3196435 | 1.0086992 | 1.0380326 | -0.4493248 | 1.4692456 | 0.1413724 | -0.7332257 | 0.8168916 | 0 | 0 | -0.5825753 | -0.6064038 | 0.6973010 | 0.4459814 | -0.2989080 | -0.7188608 | -0.6370221 | -0.4926648 | -0.7186497 | -0.4830459 | -0.4711756 | -0.0161374 | -0.4605662 |
| 6 | 1 | 8.000000 | 11.000000 | 0.1571429 | 6.000000 | 6.000000 | 0.1500000 | 5.000000 | 5.000000 | 0.1666667 | 0.4198356 | 0.4523810 | 0.2285714 | 1.6192207 | 2.8578544 | 1.7458177 | 2.6653876 | 1.1316370 | 2.2727995 | 0.8597697 | 1.0000000 | 0.5120959 | 0.7111111 | 0.6333333 | 0.4611111 | 0 | 0 | 0.0000000 | 0.8194652 | 0.8010379 | 0.3133398 | 2.000000 | 10.0000000 | 2.0000000 | 3.0000000 | 5.0000000 | 1.0000000 | 6 | 0.000000 | 0.000000 | 2.7592541 | 2.5652932 | 2.5652932 | 2.3855936 | 2.3855936 | 2.3855936 | 1.7320508 | 1.7320508 | 1.7320508 | 3.2721188 | 2.9812110 | 2.1703409 | 1.7193727 | 2.9442127 | 1.9372779 | 2.7284504 | 0.8358641 | 2.5321641 | 1.0024577 | 1.7255231 | 0.2654936 | 2.5946002 | 1.9751844 | 1.0832012 | 0 | 0 | -0.5825753 | -0.4055876 | 0.4473812 | -0.0147410 | -0.7065098 | 1.8484992 | 1.2740441 | 0.0480649 | 1.6247733 | 1.9321836 | 1.5481485 | -0.7423218 | -0.4605662 |
| 7 | 1 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
cluster_summaries provides both crude and standardizedaverages of the relational measures used to determine clustermembership. These include various measures of network centrality, aswell as the frequency with which nodes occupy specific positions indifferent kinds of triads that appear in the network (motifs). Rightaway, we see that the single node in cluster 6 differs from itscounterparts in other clusters. This node has a considerably higherdegree, betweenness, and closeness centrality measures, among others. Wealso see that our cluster of isolates (cluster 7) appears at the end ofthis data frame, with all of its values set toNA givenisolates’ lack of connection to other nodes in the network.
While recognized here, these differences are also visualized in thecluster_summaries_cent object. Because the network examinedhere is multirelational,cluster_summaries_cent plots thesedifferences for each unique relationship type in the network, as well asfor the overall network:
Those familiar with positions and motifs in networks know that asmany as 36 types of positions can exist in a network, which can beunwieldy to inspect alongside other measures. Consequently, differencesin triad positions are visualized separately incluster_summaries_triad:
Overall, the node in cluster 6 tends to have the highest values onmost measures used to identify roles in the network. Those familiar withthe substantive setting of this network will not be surprised to learnthat this node represents the Medici family, which was known for itspower and influence in Renaissance Florence. Additionally, nodes incluster 2 tend to appear in more clustered parts of this network due totheir business ties. If one is curious to see where the Medici andfamilies in other role positions appear relative to one another in thenetwork, one can quickly take the information contained incluster_assignments and assign it as a node-level attributein anigraph object for visualization:
igraph::V(nw_flor$florentine)$role<- flor_cluster$cluster_assignments$best_fitplot(nw_flor$florentine,vertex.color =as.factor(igraph::V(nw_flor$florentine)$role),vertex.label =NA)A final point of consideration in positional analysis involvesknowing whether nodes in a particular role tend to form ties amongthemselves or with nodes in other roles. When using hierarchicalclustering,role_analysis generates a series of heatmaps,contained in a list, to visualize the frequency of tie formation withinand between clusters. Each heatmap measures connections across clustersusing different measures, and the names of these measures are used toextract their corresponding plot from the list:
Looking at the density-based heatmaps here, one finds a high level ofconnection between the Medici family and families belonging to cluster4. One can also see that families in cluster 2 have a high propensity tobe tied to families in cluster 5.
Alongside hierarchical clustering, the CONvergence of iteratedCORrelations (CONCOR) algorithm is a popular method for conductingpositional analysis in networks. Those wishing to use this algorithminstead of hierarchical clustering can easily do so using therole_analysis function. As stated before, setup for usingCONCOR is similar to that for using hierarchical clustering, with usersonly having to specify a few different arguments:
flor_concor<-role_analysis(method ="concor",graph = nw_flor$igraph_list,nodes = nw_flor$node_measures,directed =FALSE,min_partitions =1,max_partitions =4,viz =TRUE)Using CONCOR inrole_analysis produces fewer outputs,but those that are produced resemble select items produced usinghierarchical clustering.concor_assignments, for example,appends “block” assignments to the end of thenode_measuresdata frame that the user feeds into therole_analysisfunction:
| id | family | block_1 | block_2 | block_3 | block_4 | best_fit |
|---|---|---|---|---|---|---|
| 0 | ACCIAIUOL | 2 | 4 | 8 | 13 | 2 |
| 1 | ALBIZZI | 2 | 4 | 7 | 11 | 2 |
| 2 | BARBADORI | 2 | 4 | 8 | 12 | 2 |
| 3 | BISCHERI | 1 | 2 | 4 | 6 | 1 |
| 4 | CASTELLAN | 1 | 1 | 2 | 3 | 1 |
| 5 | GINORI | 2 | 3 | 6 | 9 | 2 |
| 6 | GUADAGNI | 1 | 2 | 3 | 4 | 1 |
| 7 | LAMBERTES | 1 | 2 | 4 | 5 | 1 |
| 8 | MEDICI | 2 | 3 | 6 | 8 | 2 |
| 9 | PAZZI | 2 | 3 | 5 | 7 | 2 |
| 10 | PERUZZI | 1 | 1 | 2 | 2 | 1 |
| 11 | PUCCI | NA | NA | NA | NA | 3 |
| 12 | RIDOLFI | 2 | 4 | 7 | 10 | 2 |
| 13 | SALVIATI | 2 | 4 | 8 | 13 | 2 |
| 14 | STROZZI | 1 | 1 | 1 | 1 | 1 |
| 15 | TORNABUON | 2 | 4 | 7 | 11 | 2 |
As with the hierarchical clustering method, the optimal level ofpartitioning for CONCOR is determined according to the maximization ofmodularity in a similarity matrix. One can inspect how modularitychanges at different levels of partitioning using theconcor_modularity visualization:
Visualizing CONCOR assignments in a conventional networkvisualization entails a similar process to that used for hierarchicalclustering.
In lieu of a dendrogram, users can see how smaller partitions branchoff of larger parents with theconcor_block_treevisualization. Likecluster_dendrogram, this visualizationallows users to quickly gauge the relative size of blocks inferred byCONCOR:
Finally, users can also assess the level of connection across CONCORblocks using theconcor_relations_heatmaps object:
On the whole, using CONCOR tells us that nodes in the Florentinenetwork fall into one of only two blocks (plus a third block for ourisolate), and that nodes within these roles tend to interact amongthemselves rather than with nodes in the other block. These simplerresults are less informative than those produced by the hierarchicalclustering method. But this is not to say that CONCOR is an inferiorapproach to positional analysis. Interpreting results from positionalanalysis often entails more subjectivity than other network analysismethods. Although two partitions may maximize modularity, users may findthat a higher level of partitioning produces blocks with importantsubstantive differences. Were we to accept four blocks as a moreappropriate fit than two, we see our inferred blocks start to resemblethe groups we inferred using hierarchical clustering. Moreover, thisresemblance also comes with only a small drop in modularity:
igraph::V(nw_flor$florentine)$concor2<- flor_concor$concor_assignments$block_2plot(nw_flor$florentine,vertex.color =as.factor(igraph::V(nw_flor$florentine)$concor2),vertex.label =NA)With this in mind, we encourage users to thoroughly consider how theytreat their data when usingrole_analysis and to use theirbest judgment when interpreting its output.