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).persistent_homology(), build_simplicial(type = "vr")) plus diagram
tools bottleneck_distance() and persistence_landscape().compare_model() (with netobject_group dispatch),
summary.netobject(), plot.net_comparison(), and rename_models() for
relabelling grouped network objects.magnitude_difference(), casedrop_reliability(), build_hypergraph(),
hypergraph_measures(), and cluster_data() were previously absent.Remotes: field; cograph and tna are available from CRAN,
so no non-CRAN source pin is needed.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).
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)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)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)summary.mcml() roxygen corrected — was claiming a printing side
effect that doesn't exist. (audit_mcml #5)build_mcml() clusters = "<col>" 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)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..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.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.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.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.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.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.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.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.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.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.--as-cran --run-donttest audit pass..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.inst/doc/ as required by CRAN.skip_on_cran() to slow test block to keep check time under 10 minutes.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.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).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.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_score column renamed to p_value..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.do.call(rbind, ...) replaced with data.table::rbindlist() in mcml.R and sequence_compare.R.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.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.centrality_stability() and boot_glasso() now accept a centrality_fn parameter for external centrality computation.graphical_var() from scratch using coordinate descent lasso + graphical lasso with EBIC model selection, eliminating the graphicalVAR dependency.ml_graphical_var() — users should use mlvar() for multilevel VAR.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.attention estimator for decay-weighted transition networks.build_network() with 8 built-in estimators.bootstrap_network()), permutation testing (permutation()), EBICglasso bootstrap (boot_glasso()).c("netobject", "cograph_network") output for cograph compatibility.