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 headings{migraph}make_*_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 asked{manynet}, which
defaults to previous behaviormeasure, 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
tscale 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
cutoffnode_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
dncnet_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 timeconnectivity= 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)
knode_in_louvain() and node_in_leiden()
search the resolution parameter for the value that returns
knode_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{manynet}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.method_k().model_k() to method_k() and
related cluster-selection utilities renamed for clarity.{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()net_x_brokerage(), net_x_dyad(),
net_x_hazard(), net_x_mixed(),
net_x_tetrad(), net_x_triad()node_x_brokerage(), node_x_dyad(),
node_x_exposure(), node_x_path(),
node_x_tetrad(), node_x_tie(),
node_x_triad()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.