Tracking Communities in Changing Temporal Networks
Overview
Tools for temporal networks that change over time, where nodes enter and leave, groups form, split, merge and dissolve, and periods differ in size. The temporal fitters track nodes and communities across periods. A community keeps one identifier while it persists, and a newly formed group receives a new one. Two-stage fitters run Louvain or Leiden community detection in each period and link communities in linked periods by Jaccard similarity, the overlap coefficient or node-strength weighted variants. The 'layer_links' argument sets which periods are directly linked, adjacent periods only by default. By default all periods are fitted jointly, so later periods can change earlier labels, and tracking = 'filtered' prevents this. Multislice modularity (Mucha et al. 2010) doi:10.1126/science.1184819 and Hungarian matching are included as comparison methods, and a bootstrap stability score helps choose between the two-stage and multislice approaches.
Includes every change listed under 1.3.2 below, which was not released
separately. The same changes are in the Python package dynamic-multiplex
1.4.0.
Breaking changes
- The bootstrap is kept only for the stability score s used to compare two fits of the same network (for example DynMux against multislice).
co_assignment_ci()andcommunity_est()are removed, andpartition_stability()now returns onlystability,stability_by_layer,stability_mc_se,metricandreport: the calibrated accuracy floor, node floors, decided-pair outputs, thedecidedandcalibration_tablearguments and the bundled calibration table are removed. Their coverage was not reliable.
Show all changes in 1.4.0Hide the rest of the changes in 1.4.0
- R fit functions now default to
seed = 123, as in the Python package (previouslyNULL, the caller's random number stream). Passseed = NULLfor unseeded detection. Because bootstrap refits are now seeded, R values of s differ slightly from 1.3.x (for example 0.916 to 0.921 on a test network, within Monte Carlo error). allow_unequal_nodes = TRUEnow requires vertex names on every layer even when layers have the same size, since nodes can enter and leave without the size changing. Previously same-size unnamed layers were matched by position. (Python: adjacency matrices are rejected withallow_unequal_nodes=True.)
New features
repair_chainsandrepair_min_similarity(two-stage fit functions, default off). Stage-2 modularity tends to cut a long-lived community into time segments (a resolution-limit effect on chains of communities). Withrepair_chains = TRUEa group that ends at layer s and one that starts at a linked layer t are joined when their communities are mutual best matches (Kawadia and Sreenivasan 2012) with similarity at leastrepair_min_similarity(default 0.2; Greene et al. 2010 use a matching threshold). Groups that coexist are never merged. Joins are logged inchain_repairs.tracking = "filtered"(two-stage fit functions; default"smoothed", the previous behaviour). Stage 2 runs forward in time: the meta ids of layers 1..t depend only on layers 1..t, so fitted labels carry no information from later layers. Works with Leiden and Louvain and withrepair_chains. Needs a seed (seed = NULLis an error), because unseeded stage-1 fits of later layers would shift the random stream that stage 2 uses.layers_from_membership()builds one weighted layer per time slice from group memberships (wide 0/1 matrices or long node-group tables), withweighting = "count","size"or"kumar"(Kumar et al. hypergraph reweighting, as in hypernetx 2.4.3). There is no default weighting, each slice is built on its own, andrescale = "mean"puts slices on a common scale for the multislice coupling.bootstrap_multilayer()gainsallow_unequal_nodes(nodes entering and leaving) and passestracking,repair_chainsandrepair_min_similarityto the refits. Layers with different named node sets now stop with an error unlessallow_unequal_nodes = TRUE.
Python only (by design)
- The two packages deliberately diverge here, because the libraries these rely on exist in Python and not in R.
partition_membership_bipartite()partitions membership slices by Barber's bipartite modularity (leidenalg's bipartite construction, Leiden only);partition_membership_strict()by strict (all-or-nothing) hypergraph modularity (hypernetx reference pipeline, optional extra[hypergraph], which needs pandas < 3);fit_multilayer_from_partitions()tracks supplied per-slice partitions with the DynMux second stage or Hungarian matching. They are comparison specifications; in pilot simulations both did worse than the projections inlayers_from_membership().
Bug fixes
fit_multilayer_identity_ties()(undirected): the multislice local mover scored staying in a community the vertex has no tie into as 0, which could refuse an improving move (the same flaw was fixed for directed slices in 1.3.2). The stay score is now exact. Results on the package's regression networks are unchanged.- Python:
bootstrap_multilayer()silently paired nodes by position when networkx layers had the same size but different nodes; it now stops unlessallow_unequal_nodes=True, which matches nodes by label.
From NEWS.md in the release
Install
Health
- OK13 OKNow
- OK6 OK2026-08-08
Documentation
- Help pages
- 14
- Examples that run
- 93%13 run in a plain check (2 of them under a condition) · 1 only when donttest examples are enabled (R CMD check --as-cran)
- Exported functions with examples
- 100%
- Documented parameters
- 98%
- Return-value docs
- 100%
- Help pages citing references
- 0%
Downloads
Repository
- PRs merged (all time)
- 93%
- Median days to close, 50 most recently updated closed issues
- 62
- Median days to close, 50 most recently updated closed PRs
- 0
Stars over time
Commits over time
Commit identities over time
2 development-tooling and community-health practices detected across 1 family in the upstream repository
Checks run against github.com/jfedgerton/dynamic_multiplex on 2026-10-21.
The R CMD check workflow runs on Linux and macOS
This repository shows signs of AI coding tools.
- Codexfirst seen 2026-02-06Pull request it wrote: opened by a project member
- Claude Codefirst seen 2026-02-28Seen in the repository: CLAUDE.mdNamed in .gitignore: .claudePull request it wrote: opened by a project memberCommits: 45 by its own account · at least 94 crediting it in the message
- Claude Fable 5.137 commits · Sep 2026
- Claude Opus 5.523 commits · Sep to Oct 2026
- Claude Opus 4.815 commits · Jul 2026
- Claude Fable 513 commits · Jul to Sep 2026
- Claude Opus 4.64 commits · Mar to Apr 2026
1 more model not listed.
Dependencies
Code & Tests
People & History
Pick two releases to compare their code metrics.
- 1.4.0Latest2026-10-14 · current release · diff ↗ ·
removed 2 exports
co_assignment_ci, community_est·added 1 export
layers_from_membershiplisted once in CRAN's queue
Seen in one reading of CRAN's incoming queue, at 2026-10-14 19:53 UTC, so it stayed less than the time between readings. - 1.3.1
- 1.1.02026-08-07
- RR 4.6.0 released · 2026-04-24
Package metadata
- First published
- 2026-08-07
- Total releases
- 3 / 1 yrs
- License
- MIT + file LICENSE OSI
- Minimum R
- ≥ 4.1.0
- Download size
- 95 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("dynamicmultiplex")This package has no citation file, so citation() returns this entry built from DESCRIPTION.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-23, which the citation names so these numbers can be found later. More on citing and the projects behind them.