NEWS.md
cluster_cosine() to cluster nodes and not census features (thanks @Kaladani).onAttach() making library(netrics) faster to attachactions/actions/checkout path segmentparam_cutoffparam_decayparam_timesparam_variantparam_standardizedparam_connectivityNEWS.md family headingsmake_*_measure() to record algorithm details so results can be read without the script/manual
measure actually calculated, e.g. node_by_degree() is “strength centrality” on a weighted networknormalization, one of "normalized", "scaled", "proportional" or "none"
range, the theoretical range of the returned valuesvariant computed where a measure offers a choice, e.g. net_by_reciprocity() reports “ratio” when askedmeasure, range, normalization, and variant reporting to every measure where applicablenode_by_betweenness(cutoff = k) is distance-bounded or range-limited betweennessnode_by_reach(cutoff = k) is geodesic k-path centralitynode_by_closeness() as the Sabidussi indexnode_by_degree() on a weighted network as strength or weighted degree centralitynode_by_alpha() as Katz statusnode_by_hub() and node_by_authority() as the two halves of Kleinberg’s HITSnode_by_transitivity() as the local clustering coefficienttie_by_betweenness() as edge betweennessnode_by_subgraph() as a node’s contribution to the Estrada indexnode_by_induced() and node_by_vitality() as delta centralitynode_by_information() as the closeness member of the current-flow familynode_by_induced() also calling itself “vitality centrality”scale argument to scaled; old spelling still works but warnsdecay
alpha in node_by_alpha(), beta in regularity_rolesim()
alpha now only refers to Opsahl et al.’s trade-off between degree and strength in node_by_degree()
decay argument to node_by_harmonic(), and node_by_decay() as a shortcut for decay centralitydecay to node_by_pagerank(), exposing the damping factor previously fixed at 0.85decay to node_by_subgraph(), weighting closed walks by length, which Estrada calls t
scale doesnode_by_degree() to default to alpha = 0 to match documentationmode_by_betweenness() to accept only "all" and "in", as implementednode_by_reach() counting the node itself so normalised scores could exceed 1node_by_eigenvector() discarding tie weights it had computedtie_by_betweenness() and node_by_randomwalk() accepting normalized and then ignoring itnode_by_betweenness() accepting normalized and then ignoring it when given a cutoff
node_by_vitality() treats cut nodes
-Inf for cut nodes as the Wiener index definition requires[0,1] and places cut nodes at 0net_by_efficiency() to implement Krackhardt’s share of excess ties
net_x_hierarchy() now compares four quantities already on [0,1]
net_by_immunity() returning a negative herd immunity threshold when net_by_density(), net_by_equivalency() and node_by_reciprocity() summing tie weightsnode_by_closeness() to validate direction via match.arg()
direction from net_by_betweenness() which never used itnode_by_posneg() to the eigenvector doc groupnode_by_subgraph()
walks= to choose which closed walks to count: "odd", "even" or "all"
node_by_eigenvector() to cite Bonacich (1972), not only (1991)node_by_degree() and the centralisation functionsnet_by_bipartivity() for how close a network is to being bipartitenet_by_cyclicality() for detecting generalised exchangenet_by_compactness() for the average closeness of all pairs of nodesnode_by_integration() and net_by_integration() for Valente and Foreman’s integration and radialitynode_by_radiality() as a shortcut for node_by_integration(direction = "out")
net_by_inconsistency() for how far a partition’s blocks depart from ideal types
nul, com, reg, rdo, cdo and dnc
net_by_factions() beyond structural equivalencenode_by_equivalency() erroring on any network, despite being documented for the two-mode casenode_by_diversity() reporting undefined objects when substituting an inapplicable indexnet_by_transmissibility() declaring itself a proportionnet_by_balance() erroring on networks holding signs as negative weightsnet_by_diameter(), net_by_length() and net_by_compactness() on signed networks
node_by_reciprocity() to return 1 throughout for any undirected networknode_by_information() on rectangular matrices by using manynet::to_multilevel()
net_by_independence() erroring on multilevel networks by measuring wholenet_by_waves() reporting one wave where waves are held as time
connectivity= to net_by_components() for counting weak as well as strong components
"strong", so existing scripts are unaffectedvariant when the result is printedk= to community detection functions to target a specific number of communities (thanks @tomasdiviak)
k
node_in_louvain() and node_in_leiden() search the resolution parameter for the value that returns k
node_in_fluid() passes k straight to the algorithm, which also makes it much fasternode_in_labels() seeds k fixed labels and merges any surplus groups by modularitynode_in_partition() is now a k-way Kernighan-Lin, and no longer returns only two groupsnode_in_community() considers only these algorithms when k is givenk also accepts "silhouette", "elbow", and "strict", as in node_in_equivalence()
k= is now positioned second, so positional calls must name argumentsnode_in_fluid() and node_in_spinglass() aborting silently on disconnected networksnode_in_labels() for label propagation community detectiontimes= in node_in_walktrap() to steps=
consensus= to node_in_community() for combining partitions of all applicable algorithms
times), then converges on common groupingsconsensus = FALSE default, and ignored where network small enough for node_in_optimal()
"verbose"
node_by_coreness() to node_by_core()
node_in_core()
centrality= to coreness=
"rich" by default for weighted, directed or two-mode networks"correlation" otherwisedirection= for directed networks
"Sender" for core out-ties and periphery in-ties"Receiver" for core in-ties and periphery out-tiesnode_in_equivalence() to announce the cluster_*() and k_*() usednode_in_block() for direct blockmodelling for partitions that minimise net_by_inconsistency()
node_in_regular() to compute regular equivalence correctly
regularity = "rolesim" (default) and "rege" for recursive similaritynode_in_regular() will now return more correct resultsnode_in_motif(), though neither is Burt’s equivalence or an orbit-aware census (thanks @Kaladani)Kmax= to max_k= in the community and equivalence functionsnum_groups= to groups= in node_in_roulette()
cluster_by= to split= in node_in_core()
connectivity= to node_in_component() for weak as well as strong component membership
"strong", so existing scripts are unaffectednode_in_weak() and node_in_strong()
net_x_triad()
net_x_mixed()
net_x_mixed()
node_x_clique(), returning which maximal cliques each node belongs to
node_x_tie()
node_in_equivalence() and node_in_structural()
type tie attributenode_x_ties(), describing the distribution of each node’s tie values
node_x_alters() for describing composition of each node’s altersnode_x_similarity() for describing similarity of each node to its alters
net_x_homophily() for the table behind the EI index against expected baselineregularity_rolesim() and regularity_rege(), recursive role similarity methods
regularity_rege() is degenerate on unweighted connected networks, where it warnscoreness_correlation() is Borgatti and Everett’s continuous model, fixed to exclude self-tiescoreness_rich() is Ma and Mondragon’s rich-core for directed and two-mode networkscoreness_hub() is Elliott and colleagues’ more granualr directed core-peripherycoreness_transition() is Rombach and colleagues’ core score over boundary sharpness and core sizesplit_bins(), split_quantiles() and split_kmeans()
node_in_regular() for regular equivalence rather than the triad censusConfig/Needs/check packages instead of Config/Needs/website, which meant learnr was never actually installed before the pkgdown deploy stepequivalency, partition, faction) in the community tutorial that had no matching manynet glossary entry, which was breaking the tutorial’s article renderingnode_x_brokerage() and net_x_brokerage()) to the position tutorialnet_by_degree(), net_by_indegree(), net_by_outdegree(), net_by_betweenness(), net_by_closeness(), and net_by_eigenvector() now return a single network-level score for two-mode networks (via Freeman’s general centralization index over the mode-normalized node scores), consistent with returning a scalar network_measure for all networks
mode_by_*() family (mode_by_degree(), mode_by_indegree(), mode_by_outdegree(), mode_by_betweenness(), mode_by_closeness(), mode_by_eigenvector()) that returns the per-mode centralization scores for two-mode networks, following Borgatti and Everett (1997); these error on one-mode networksnet_by_betweenness() to respect its normalized argument for one-mode networks, which was previously ignored because igraph::centr_betw() always applied its default normalizationnet_by_closeness() and mode_by_closeness() to pass their direction argument through to the underlying node scores, so direction = "in"/"all" is now effective for two-mode networksnetrics1) with a new interactive style, and added an article version to the website
netrics2) with a new versionnetrics3) with a new interactive style
netrics4) with a new interactive style
node_by_homophily() to work when attribute is provided as a vector (e.g., a membership vector)node_by_homophily() to avoid calling as_igraph() multiple timesnet_x_hazard() to use diff_model$t for naming the returned data frame columns, rather than the deprecated diff_model$time
node_in_partition()
param_attr, param_data, param_dir, param_memb, param_motf, param_norm, param_select) and net/node/tie-level templates (net_measure, net_motif, node_mark, node_measure, node_member, node_motif, tie_mark, tie_measure) for consistent function documentation.node_adoption_time() to node_by_adopt_time()
node_thresholds() to node_by_adopt_threshold()
node_exposure() to node_by_adopt_exposure()node_recovery() to node_by_adopt_recovery()node_in_community() documentation from the hierarchical and non-hierarchical community-detection algorithms.net_by_change() to net_x_change() and related functions to reflect their motif (subgraph-counting) nature.netrics 0.1.0 is the first formal release of the package as a standalone analytic engine for the stocnet ecosystem. The analytic functions — marks, measures, motifs, and memberships — have been extracted from manynet and migraph into this dedicated package, with consistent naming conventions and a range of bug fixes.
All functions now follow a consistent verb–object–qualifier naming scheme:
node_is_*(), tie_is_*()): logical vectors identifying which nodes or ties hold a particular structural property.*_by_*()): numeric vectors at the network (net_by_*()), node (node_by_*()), or tie (tie_by_*()) level.*_x_*()): tabular counts of nodes’ or networks’ participation in structural sub-patterns.*_in_*()): categorical vectors assigning nodes to groups (components, communities, equivalence classes, etc.).Functions previously named with other prefixes (e.g. node_centrality_*, net_cohesion_*, node_equivalency_*) have been renamed to follow the *_by_*() / *_x_*() / *_in_*() convention. tie_by_cohesion() now correctly returns a tie_measure class object.
{manynet} / {migraph}
The following groups of functions have been moved into netrics:
node_is_core(), node_is_cutpoint(), node_is_exposed(), node_is_fold(), node_is_independent(), node_is_infected(), node_is_isolate(), node_is_latent(), node_is_max(), node_is_mean(), node_is_mentor(), node_is_min(), node_is_neighbor(), node_is_pendant(), node_is_random(), node_is_recovered(), node_is_universal()
tie_is_bridge(), tie_is_cyclical(), tie_is_feedback(), tie_is_imbalanced(), tie_is_loop(), tie_is_max(), tie_is_min(), tie_is_multiple(), tie_is_path(), tie_is_random(), tie_is_reciprocated(), tie_is_simmelian(), tie_is_transitive(), tie_is_triangular(), tie_is_triplet()
net_by_adhesion(), net_by_assortativity(), net_by_balance(), net_by_betweenness(), net_by_change(), net_by_closeness(), net_by_cohesion(), net_by_components(), net_by_congruency(), net_by_connectedness(), net_by_core(), net_by_correlation(), net_by_degree(), net_by_density(), net_by_diameter(), net_by_diversity(), net_by_efficiency(), net_by_eigenvector(), net_by_equivalency(), net_by_factions(), net_by_harmonic(), net_by_heterophily(), net_by_hierarchy(), net_by_homophily(), net_by_immunity(), net_by_indegree(), net_by_independence(), net_by_infection_complete(), net_by_infection_peak(), net_by_infection_total(), net_by_length(), net_by_modularity(), net_by_outdegree(), net_by_reach(), net_by_reciprocity(), net_by_recovery(), net_by_reproduction(), net_by_richclub(), net_by_richness(), net_by_scalefree(), net_by_smallworld(), net_by_spatial(), net_by_stability(), net_by_strength(), net_by_toughness(), net_by_transitivity(), net_by_transmissibility(), net_by_upperbound(), net_by_waves()
node_by_adoption_time(), node_by_alpha(), node_by_authority(), node_by_betweenness(), node_by_bridges(), node_by_brokering_activity(), node_by_brokering_exclusivity(), node_by_closeness(), node_by_constraint(), node_by_coreness(), node_by_deg(), node_by_degree(), node_by_distance(), node_by_diversity(), node_by_eccentricity(), node_by_efficiency(), node_by_effsize(), node_by_eigenvector(), node_by_equivalency(), node_by_exposure(), node_by_flow(), node_by_harmonic(), node_by_heterophily(), node_by_hierarchy(), node_by_homophily(), node_by_hub(), node_by_indegree(), node_by_induced(), node_by_information(), node_by_kcoreness(), node_by_leverage(), node_by_multidegree(), node_by_neighbours_degree(), node_by_outdegree(), node_by_pagerank(), node_by_posneg(), node_by_power(), node_by_randomwalk(), node_by_reach(), node_by_reciprocity(), node_by_recovery(), node_by_redundancy(), node_by_richness(), node_by_stress(), node_by_subgraph(), node_by_thresholds(), node_by_transitivity(), node_by_vitality()
tie_by_betweenness(), tie_by_closeness(), tie_by_cohesion(), tie_by_degree(), tie_by_eigenvector()
node_in_adopter(), node_in_automorphic(), node_in_betweenness(), node_in_brokering(), node_in_community(), node_in_component(), node_in_core(), node_in_eigen(), node_in_equivalence(), node_in_fluid(), node_in_greedy(), node_in_infomap(), node_in_leiden(), node_in_louvain(), node_in_optimal(), node_in_partition(), node_in_regular(), node_in_roulette(), node_in_spinglass(), node_in_strong(), node_in_structural(), node_in_walktrap(), node_in_weak()
node_is_isolate() and node_is_pendant() now work correctly with signed networks.tie_is_random() now correctly returns a tie_mark class object (previously returned a node mark).node_by_authority() and node_by_hub() updated to use current igraph API.node_by_brokering_activity() and node_by_brokering_exclusivity() now handle unlabelled networks correctly.node_by_homophily() no longer resolves the attribute to a vector prematurely.node_by_pagerank() updated to correctly extract the vector output from igraph.node_by_power() reverts to a lower exponent (closer to degree centrality) when there is no degree variation.node_by_randomwalk() now works with two-mode networks.net_by_degree(), net_by_harmonic(), and net_by_reach() now consistently include the function call in the returned object.net_by_richclub() returns 0 (rather than erroring) when all nodes have equivalent degree.net_by_smallworld() and node_by_bridges() now use internal netrics functions rather than manynet equivalents.net_by_waves() returns 1 for cross-sectional networks and correctly returns a network measure class.net_x_hierarchy() correctly classified as a motif function.node_in_community() now delegates to netrics membership functions internally.tie_by_cohesion() now correctly returns a tie_measure class object.