Changes in version 0.6.0 (2026-05-31)
New features
- magnitude_difference() compares the frequency (FTNA) and probability
(TNA) views of a transition network and quantifies the per-edge
discrepancy on a common scale, with five metrics, four scalings, and
two polar plot() portraits (stacked and circular).
- Full persistent homology with a Vietoris-Rips filtration
(persistent_homology(), build_simplicial(type = "vr")) plus diagram
tools bottleneck_distance() and persistence_landscape().
- Network comparison: compare_model() (with netobject_group dispatch),
summary.netobject(), plot.net_comparison(), and rename_models() for
relabelling grouped network objects.
Documentation
- The pkgdown reference index now lists every exported function;
magnitude_difference(), casedrop_reliability(), build_hypergraph(),
hypergraph_measures(), and cluster_data() were previously absent.
Packaging
- Removed the Remotes: field; cograph and tna are available from CRAN,
so no non-CRAN source pin is needed.
Changes in version 0.5.1
Audit follow-up (clustering + MCML)
Followed codex_docs/audit_clustering and codex_docs/audit_mcml
recommendations across two modules. Eleven of thirteen findings
addressed; two deferred pending design decisions on numeric semantics
(directed = FALSE raw-data MCML, MMM first-non-NA initial state).
Bug fixes
- cluster_network() now forwards distance-clustering arguments
(na_syms, weighted, lambda, seed, q, p, covariates) to
build_clusters() instead of silently passing them to
build_network(). The split runs on caller ... only — netobject
build_args continue to flow only to the build_network() step,
protecting attention-method (atna) network history from being
re-routed to weighted Hamming. (audit_clustering #1)
- .auto_detect_clusters() (used by build_mcml() and cluster_summary())
now requires node_groups to carry a node identifier column when
shaped as a data.frame, or be a named atomic vector keyed by node
label. Previously, a bare cluster-only data.frame was read
positionally — silently mis-assigning nodes whenever node_groups
rows were in a different order than x$nodes. (audit_mcml #1)
- build_clusters() now rejects all-missing input early with a clear
message instead of failing indirectly downstream in pam/hclust.
(audit_clustering #4)
New parameters
- compare_mmm(return_fits = FALSE) — when TRUE, the fitted net_mmm
models are attached as attr(result, "fits") keyed by k, so users can
pick the chosen model without re-running EM. Default behaviour
unchanged. (audit_clustering #6)
Improvements
- build_clusters() validation messages now name the offending argument
("'k' must be at least 2 (got k = 1)") rather than dumping the
failing predicate. Top-level type checks switched to named-condition
stopifnot() for the same reason. (audit_clustering #2)
Documentation
- summary.mcml() roxygen corrected — was claiming a printing side
effect that doesn't exist. (audit_mcml #5)
- build_mcml() clusters = "
" mode now documents its narrow
contract: assigns each row's group label to both endpoints, so it
only makes sense for within-group edge lists. (audit_mcml #2)
- build_mcml() method parameter doc now steers raw sequence /
event-log inputs to "sum", since the function counts observed
transitions. Other methods are for weighted edge lists or
pre-existing matrices. (audit_mcml #4)
- as_tna.mcml() "Excluded Clusters" section corrected — drop emits a
warning() (was claimed silent) and only fires for relative method
(was claimed unconditional). (audit_mcml #6)
- build_clusters() na_syms doc adds an explicit "Missing-value
distance rule" subsection: NA becomes a comparable sentinel state,
not pairwise deletion. (audit_clustering #3)
- build_mmm() adds an "Initial states" section explaining
first-column-verbatim init and that build_mmm does NOT honor
build_clusters-style na_syms — only actual NA cells become NA inits.
(audit_clustering #5, doc-only path)
Tests
- +12 new tests pinning the corrected contracts and the documented
edge cases (misordered node_groups alignment, label propagation
through state_distribution(), as_tna.mcml() drop-warning fixture,
MMM first-column NA behaviour, and the four-way cluster_network()
arg-routing contract). Full sweep: 1628 / 1628 pass, 0 fail.
Changes in version 0.5.0
Bug fixes
- .extract_edges_from_matrix() no longer drops the diagonal.
Netobjects built via .wrap_netobject() (and therefore everything
from build_network(), build_mcml(), bootstrap_network(),
build_mmm(), wtna(), as_tna()) now have $edges containing every
non-zero matrix entry, including self-loops. Previously $weights and
$edges were silently inconsistent on any matrix with a non-zero
diagonal, causing downstream consumers (e.g. cograph::centrality()
on an MCML macro) to under-count node degree by 2.
New features
- plot_state_frequencies() — native S3 generic for state-frequency
plots across netobject, netobject_group, mcml, and htna. Defaults to
a marimekko (mosaic) layout where column widths reflect per-group
totals and segment heights reflect within-group state proportions;
also supports a colored-bars style and a per-group faceted
marimekko. Uses the package Okabe-Ito palette throughout.
- plot_mosaic() — exported low-level marimekko primitive built on
geom_rect() with cumulative-width / cumulative-height geometry.
Reusable for any tidy data.frame(group, state, weight) input.
Changes in version 0.4.4
Bug fixes
- passage_time() and markov_stability() now raise an explicit error
naming the dead state when a transition-matrix row sums to zero,
instead of silently propagating NaN through eigen/solve. Zero rows
mean the chain is not ergodic; mean first passage times are
undefined. Shared helper .mpt_normalize_rows() factored out of both
entry points.
- .prepare_association_input() no longer hard-rejects non-square
numeric matrices. For association methods (glasso, pcor, cor) the
netobject's $data slot is a numeric matrix (not a data.frame). Any
downstream caller that row-subsetted $data and re-invoked the
estimator (centrality_stability(), bootstrap_network(),
reliability()) was silently producing NULL centralities caught by
tryCatch, which surfaced as an "all centrality measures have zero
variance" warning or all-NaN correlations. The matrix branch now
recognises non-square input as raw observation data and recursively
re-enters through the data-frame branch. Square symmetric matrices
(pre-computed correlation / covariance) still go through the
symmetric-matrix path with the symmetry check intact.
New parameters
- build_network() gains state_cols and metadata_cols parameters (both
default NULL). Explicit overrides for the state-vs-metadata column
classifier, which previously used a "values-in-nodes" heuristic that
silently misclassifies metadata columns whose values coincide with
node labels (e.g. a condition column with levels "A","B","C" when
nodes are "A","B","C"). Validation: error on overlap between the two
vectors, error on column names not present in the input data.
Forwarded through the group = ... recursive dispatch so per-group
calls honour the override.
Removed
- plot.net_link_prediction() and plot.mcml() removed. Nestimate is a
computation engine — visualization is the user's concern. Previously
both methods called cograph:: directly, violating the stated
dependency invariant (Nestimate -> cograph direction forbidden).
Users call cograph::splot(net) or cograph::plot_mcml(fit) directly.
Documentation
- wtna() @param type now flags that type = "relative" combined with
method = "cooccurrence" produces an asymmetric matrix (conditional
co-occurrence given row state), not a symmetric undirected weight
matrix. Use type = "frequency" if symmetric counts are required.
Testing infrastructure
- New numerical-equivalence tests (gated by
NESTIMATE_EQUIV_TESTS=true): test-equiv-permutation.R (vs.
stats::p.adjust + hand-coded base-R permutation loop),
test-equiv-mlvar.R (vs. mlVAR::mlVAR at machine precision),
test-equiv-association-rules.R (vs. arules::apriori),
test-equiv-link-prediction.R (vs. clean-room matrix algebra +
igraph::similarity), test-equiv-centrality-stability.R (vs.
bootnet::corStability). Total ~162k per-value comparisons; all
within machine precision except centrality-stability which uses a
documented drop-grid tolerance because bootnet uses igraph
path-based centrality and Nestimate uses Floyd-Warshall.
- New HON-family equivalence tests under
local_testing_and_equivalence/ validating HON, HONEM, HYPA, MOGen,
and hypergraph against pathpy 2.2.0 (via reticulate), BiasedUrn,
RSpectra, and HyperG. Not shipped in the R-package tests/ directory;
added to .Rbuildignore.
- Branch-matrix coverage added for the four many-mode APIs (wtna,
bootstrap_network, build_clusters, sequence_plot) — systematic
cross-product tests over all combinations of mode parameters to
catch regressions where one branch silently diverges.
Changes in version 0.4.3 (2026-04-20)
CRAN resubmission (addresses incoming-check NOTEs on 0.4.2)
- Tarball now ships build/vignette.rds (the vignette index).
Previous 0.4.2 build used R CMD build --no-build-vignettes, which
preserved pre-built inst/doc/*.html but stripped the index — CRAN
flagged "VignetteBuilder field but no prebuilt vignette index."
- test-gimme.R now skip_on_cran(). GIMME tests fit a lavaan SEM per
subject and took ~50s locally (2-3× on Windows), pushing total check
time to 11 min on win-devel. Full test suite still runs in CI and
local dev.
Changes in version 0.4.2
CRAN resubmission
- Full --as-cran --run-donttest audit pass.
- Purged stale .Rcheck/ and Meta/ build artifacts from working tree;
added explicit ^Nestimate\.Rcheck$ and ^\.\.Rcheck$ entries to
.Rbuildignore as belt-and-suspenders against repeat-submission
contamination.
Changes in version 0.4.1
CRAN resubmission
- Pre-built vignettes included in inst/doc/ as required by CRAN.
- Fixed 301-redirect URLs in README.
- Added skip_on_cran() to slow test block to keep check time under 10
minutes.
Changes in version 0.4.0
New functions
- build_mlvar() — multilevel VAR networks from ESM/EMA panel data.
Estimates temporal (directed), contemporaneous (undirected), and
between-subjects (undirected) networks matching mlVAR::mlVAR() at
machine precision.
- build_mmm() / compare_mmm() — mixture of Markov models via EM, with
BIC/AIC/ICL model selection and optional covariate regression.
- cooccurrence() — standalone co-occurrence network builder
supporting 6 input formats and 8 similarity methods.
- sequence_compare() — k-gram pattern comparison across groups with
optional permutation testing.
- sequence_plot() / distribution_plot() — base-R sequence index and
state distribution plots with clustering integration.
- build_simplicial(), persistent_homology(), q_analysis() —
topological analysis of networks via simplicial complexes.
- nct() — Network Comparison Test matching
NetworkComparisonTest::NCT() at machine precision.
- build_gimme() — group iterative mean estimation for idiographic
networks via lavaan.
- passage_time(), markov_stability() — Markov chain passage times and
stability analysis.
- predict_links() / evaluate_links() — link prediction with 6
structural similarity methods.
- association_rules() — Apriori association rule mining from sequences
or binary matrices.
- predictability() — node predictability for glasso/pcor/cor networks.
- build_hon(), build_honem(), build_hypa(), build_mogen() —
higher-order network methods (HON, HONEM, HYPA, MOGen) now
cograph_network-compatible.
New datasets
- human_long, ai_long — canonical long-format human–AI pair
programming interaction sequences (10,796 turns, 429 sessions).
- chatgpt_srl — ChatGPT-generated SRL scale scores for psychological
network analysis.
- trajectories — 138-student engagement trajectory matrix (15
timepoints, 3 states).
API
- build_clusters(), network_reliability(), permutation(), and
prepare() replace earlier internal names for consistency with the
build_* naming convention.
- mgm estimator added (method = "mgm") for mixed continuous +
categorical data via nodewise lasso, matching mgm::mgm() at machine
precision.
Bug fixes
- build_mmm() no longer crashes on platforms where
parallel::detectCores() returns NA (macOS ARM64 CRAN check failure).
- gimme convergence filter now correctly handles all typed NA variants
(NA_character_, NA_real_, etc.).
- NaN values in numeric metadata aggregation (all-NA sessions)
normalized to NA_real_.
- HYPA p-values corrected; hypa_score column renamed to p_value.
CRAN compliance
- .data pronoun added to globalVariables().
- base::.rowSums() / base::.colSums() replaced with rowSums() /
colSums().
- dev.new() guarded by interactive() — no side effects under knitr or
CI.
- Equivalence test files excluded from the built tarball.
Performance
- do.call(rbind, ...) replaced with data.table::rbindlist() in mcml.R
and sequence_compare.R.
Changes in version 0.3.4
- HYPA: Renamed hypa_score column to p_value for clarity. Added $over,
$under, $n_over, $n_under fields to net_hypa objects. Scores are now
pre-sorted with anomalous paths first.
- HYPA: summary.net_hypa() now shows over/under-represented paths
separately with a configurable n parameter.
- pathways.netobject(): New S3 method to extract higher-order pathways
directly from a netobject (builds HON or HYPA internally).
- path_counts(): Now handles NAs in trajectories by stripping them
before k-gram counting.
Changes in version 0.2.15
- Preparing for publication
Changes in version 0.2.0
- Reduced hard dependencies from 6 to 4 Imports (ggplot2, glasso,
data.table, cluster).
- Removed igraph from Imports — centrality_stability() and
boot_glasso() now accept a centrality_fn parameter for external
centrality computation.
- Removed tna from Imports — moved to Suggests (only used for input
class detection).
- Implemented graphical_var() from scratch using coordinate descent
lasso + graphical lasso with EBIC model selection, eliminating the
graphicalVAR dependency.
- Dropped ml_graphical_var() — users should use mlvar() for multilevel
VAR.
- Removed cograph plot wrappers — plot.netobject(),
plot.net_bootstrap(), plot.net_permutation(), plot.net_hon(),
plot.net_hypa() and as_cograph() removed. Users call cograph
plotting functions directly on netobjects.
- Added attention estimator for decay-weighted transition networks.
- Increased test coverage from 84.5% to 96.1% (2780 tests).
- Passes R CMD check with 0 errors, 0 warnings, 0 notes.
Changes in version 0.1.0
- Initial release. Split from Saqrlab v0.3.0.
- Core estimation via build_network() with 8 built-in estimators.
- Bootstrap inference (bootstrap_network()), permutation testing
(permutation()), EBICglasso bootstrap (boot_glasso()).
- Higher-order networks: HON, HONEM, HYPA, MOGen.
- GIMME, MCML, multilevel VAR, graphical VAR.
- Temporal network analysis and velocity TNA.
- Dual-class c("netobject", "cograph_network") output for cograph
compatibility.