The Bayesian verbs get their own reference section, placed
directly after Network Estimation: certainty(),
bayes_compare(), subtract_networks() and
as_netdifference(). They were previously buried in a
fourteen-entry “Bootstrap & Inference” list.
bootstrap_network() now points at certainty()
as its closed-form counterpart, and permutation() points at
bayes_compare() as its Bayesian complement, so each pair is
reachable from either side.
frequencies() is no longer marked
\keyword{internal}. The topic page and the exported
function share a roxygen topic name, so the keyword from the topic block
leaked onto the function’s own help page even though the function is
exported (and called by the package). cluster_data() keeps
its internal keyword: it is a deprecated alias for
build_clusters() and is meant to stay out of the
index.
Dropped the utils help page, which documented no
exported object. The @importFrom directives it carried are
retained.
audit_codex/ is no longer tracked; it holds
generated audit artifacts.
Suggests: cograph (>= 2.4.4). The netdifference
verbs added in 0.7.8 need cograph 2.4.x: CRAN’s cograph 2.3.6 contains
no netdifference support, so
cograph::plot_difference() does not exist there and
cograph::splot() on a netdifference falls
through to the plain netobject renderer and silently draws
an unsigned network. Nestimate must not be submitted to CRAN before
cograph 2.4.4 is available there.subtract_networks() /
as_netdifference() — verbs for the difference between two
networks. subtract_networks(x, y) returns the edge-wise
difference as a netdifference object;
as_netdifference() promotes an existing comparison result
to the same class — a bayes_compare() result, or a
netdifference, which passes through; anything else errors —
so a difference computed by any route prints the same way. Adds
print.netdifference.
bayes_compare() accepts two
net_edge_betweenness() objects (source method
"relative" only). Edge betweenness is recomputed on every
posterior draw, giving the Bayesian analogue of
permutation()’s edge-betweenness dispatch, with posterior
mean betweenness matrices and the plug-in
observed_diff.
permutation() gains a measures argument
for centrality permutation tests, matching the tna
package’s dispatch.
bayes_compare()’s probability-of-direction column is
renamed pd -> p_difference in the
summary() frame, and the result now carries class
c("net_bayes", "netdifference", "net_permutation") so it
dispatches to the difference verbs as well as the permutation
ones.
Non-ASCII characters normalized across R sources and man pages.
centrality_stability() no longer errors with
“missing value where TRUE/FALSE needed” when a requested measure is
undefined on the network (e.g. Diffusion is
NaN on a small cyclic net): sd() returned
NA, which poisoned if (!any(keep)). Such
measures now drop like zero-variance ones.
centrality_stability()’s default
measures is restored to
c("InStrength", "OutStrength", "Betweenness"). 0.7.7 had
swapped OutStrength for Diffusion, which broke
the package: it calls centrality_stability() with no
measures and compares the result against its own explicit
trio. centrality() / net_centrality() keep the
Diffusion default; only centrality_stability()
reverts.
Suggests: cograph relaxed from
(>= 2.4.4) to (>= 2.3.6), the version
available on CRAN. Additional_repositories removed — every
declared dependency now resolves from CRAN.
plot() on a net_centrality_group gains
type = "delta", showing the between-group difference per
measure, and now supports three or more groups. Zero-valued edges can be
blanked with drop_zero = TRUE.plot() on a net_edge_betweenness() result
(plot.net_edge_betweenness).plot() on centrality results gains alternative views:
type = c("bar", "line", "heatmap") for a single
net_centrality, and
type = c("bar", "line", "delta") for a
net_centrality_group. Count-like measures get integer axis
labels.Version bump only; no user-visible changes.
as_htna() — builds a grouped node-level network from
data and a clustering, keeping every node (unlike
cluster_summary(), which collapses to a cluster-level macro
summary). Intended for cograph::plot_htna().Centrality gains the tna-parity measures.
net_centrality(x, measures = "all") now returns
OutStrength, InStrength,
ClosenessIn, ClosenessOut,
Closeness, Betweenness,
BetweennessRSP, Diffusion and
Clustering — previously only the strengths,
Closeness and Betweenness. Adds
plot.net_centrality and
plot.net_centrality_group.
sequence_plot() and the MCML plots gain layout
refinements.
as_netobject() / validate_netobject() —
the boundary layer between (which owns the psychometric-network math and
emits a lean cograph_network) and Nestimate (which owns the
canonical netobject schema). as_netobject()
promotes a psychnet result or a bare
cograph_network to the dual-class
c("netobject", "cograph_network") so it dispatches to every
Nestimate verb, parking psychnet-specific fields (including the GLASSO
KKT certificate) under $meta$psychnet;
netobjects pass through unchanged.
validate_netobject() enforces the shared structural
contract so schema drift on either side fails loudly.
psychnet is not a declared dependency — Nestimate never
calls it; the converter works by S3 dispatch on whatever
psychnet object the caller supplies.
certainty() — analytic Bayesian counterpart of
bootstrap_network() for transition networks. Models each
state’s outgoing transitions as a Dirichlet-Multinomial process
(Jeffreys prior) and returns posterior mean, sd, credible interval and a
stability decision per edge in closed form (no resampling). Returns the
exact net_bootstrap object layout and carries class
c("net_certainty", "net_bootstrap"), so it is a drop-in:
every net_bootstrap method works on it. Completes the
assessment trio certainty / stability (bootstrap_network) /
reliability (reliability).
sequence_plot() gains a multichannel view for
mcml objects built from sequences.
sequence_plot(fit) draws one carpet panel per cluster
channel plus a macro Summary panel — each channel’s own
states solid, the other clusters a faded wash, finished cells white,
rows aligned by the macro sequence.
sequence_plot(fit, type = "distribution") stacks the
prevalence (own states + faded other clusters + an explicit
NA band, to 100%), and normalize = TRUE gives
a TraMineR-style seqdplot where each time point sums to 1.
ggplot-based and dependency-free; returns a ggplot
object.
bayes_compare() results are now 100% compatible with
the permutation() format: the object carries class
c("net_bayes", "net_permutation") with all
net_permutation slots (diff_sig,
p_values, effect_size, iter,
alpha, paired, adjust), and its
summary is a superset of
summary.net_permutation
(from, to, weight_x, weight_y, diff, effect_size, p_value, sig
plus the Bayesian extras
count_x, count_y, ci_lower, ci_upper, ci_width, pd). A
bayes_compare() result is now a drop-in wherever a
net_permutation is consumed.
bayes_compare() — Bayesian Dirichlet-Multinomial
comparison of two transition networks, a complement to
permutation(). Models each source state’s outgoing
transitions as a Dirichlet-Multinomial process (Jeffreys prior) and
returns, per edge, a posterior mean difference, a credible interval, the
probability of direction (pd) and its two-sided
p-equivalent. Adds
print/summary/plot methods and
netobject_group dispatch (all-pairwise or matched). Method
source: Johnston & Jendoubi (2026), How Delivery Mode Reshapes
Resource Engagement: A Bayesian Differential Network Analysis, TNA
Workshop 2026.as_networks() — promote a build_mcml_pc()
result into a netobject_group (the psychometric-network
counterpart of as_tna()). Singleton clusters with no
within-network are dropped with a warning; an existing
netobject_group passes through unchanged.markov_order_test() reads sequences straight from a fitted
network (markov_order_test(net)); HYPA anomaly tables use
summary(hypa, order_by = "ratio"); higher-order pathways
use pathways(hon, top = ); grouped-clustering inspection
uses cluster_diagnostics().build_mcml_pc() — MCML aggregation for psychometric
networks (cor / pcor / EBICglasso). Five aggregation methods with
explicitly different statuses: "average" (descriptive
block-mean; works without raw data), "composite" (cluster
scores re-estimated with the chosen estimator — a genuine cluster-level
network), "loadings" (composites weighted by mean
within-cluster connection strength — Nestimate’s own weighting, not an
EGA reimplementation), "rv" (Escoufier’s RV matrix
correlation between blocks), and "canonical" (first
canonical correlation — the upper bound for composite methods).
Within-cluster networks re-estimated by default
(within = "reestimate") since a pcor submatrix is not the
subsystem’s pcor network. Item diagnostics in $loadings:
signed loadings (reverse-keyed items detected via the leading
eigenvector of the within-block matrix and flipped in composites),
cross-cluster strengths, and a misfit flag when an item is
more connected to another cluster than its own (warned). Composites
tolerate missing data (row-wise renormalized weighted means); Composite
item weights are selectable via weighting — ten built-in
schemes spanning three views of the cluster: the scale as scored
("equal", "item_total"), the network’s view
("strength", "eigen",
"closeness", "betweenness",
"expected_influence", "specificity" — the
misfit margin as a weighting, zeroing items that belong as much to
another cluster), and the latent-variable view ("pca",
"factor"); plus fully custom weighting via a named numeric
vector or a function(W_block, data_block, nodes).
aggregation = "loadings" is the alias for composite +
strength. The "factor" weighting exposes its extraction
method via fa_method: "ml" (factanal),
"paf" (iterated principal axis), "minres"
(ULS), or "cfa" (one-factor lavaan model; with
cor_method = "polychoric" the categorical DWLS factor
model) — all operating on the cor_method-consistent
correlation structure. Reverse-keyed handling works under every
sign-carrying scheme (item-total correlations are computed on
eigen-sign-pre-oriented columns so a reversed member cannot contaminate
small clusters). cor_method = "polychoric" (via lavaan)
supports ordinal items; id_col drops identifier columns so
convert_sequence_format(format = "frequency")
actor-profiles feed the function directly (the within-person
co-occurrence view of event data). Returns class mcml_pc
(macro + within netobjects, all undirected) with print/summary/plot; the
composite/loadings macro is a full netobject, so
bootstrap_network(), vertex_bootstrap(), and
vertex_compare() apply to it directly.
cograph::plot_mcml() (>= 2.3.8) renders the two-layer
undirected MCML view. Experimental: API and formulas may change.loading_stability() — case-bootstrap stability of the
build_mcml_pc() composite weights (percentile CIs,
sign-flip rates), with print and forest-style plot.vertex_bootstrap() — Snijders & Borgatti (1999)
vertex bootstrap for network-level statistics (density, mean weight,
strength centralization, weighted reciprocity, plus custom
statistic_fn). Needs only the weight matrix, so it works on
data-less netobjects (build_mlvar() constituents,
as_tna(mcml) elements, plain matrices) where
bootstrap_network() cannot run. Returns a tidy
one-row-per-statistic net_vertex_bootstrap with
print/summary/plot. Self-loops are preserved (diagonal carries the
resampled vertex’s own self-weight); undirected replicates stay
symmetric.vertex_compare() — the Snijders & Borgatti
two-network test the vertex bootstrap was originally proposed for:
z-tests and normal-approximation CIs for differences in network-level
statistics between two networks (netobjects, matrices, or precomputed
net_vertex_bootstrap objects). Tidy
net_vertex_comparison result with print/summary/plot
(forest plot of differences).bootstrap_network() and vertex_bootstrap()
gain ci_method = c("percentile", "basic"): basic intervals
(Davison & Hinkley 1997, eq. 5.6) reflect the percentile bounds
around the observed estimate, correcting first-order bootstrap bias.
Default remains "percentile".build_mcml() (sequence and edge-list paths) now records
the effective directedness in $meta$directed:
FALSE when type = "cooccurrence", whose
weights are symmetrized, instead of echoing the directed
argument unchanged. Renderers that auto-detect directedness (e.g.,
cograph::plot_mcml() with directed = NULL) now
draw co-occurrence MCML objects as undirected networks
automatically.mosaic_analysis(data, var1, var2) — two-variable mosaic
analysis on a data.frame: chi-square or Fisher test,
Cramer’s V (df-adjusted effect size) and a flat mosaic plot. Returns
class mosaic_analysis with a tidy one-row-per-cell
$counts, a one-row $stats, and
print/summary/plot. Distinct from mosaic_plot(), which
draws from a fitted network object.mosaic_plot() gains
style = c("classic", "flat"). The flat style uses
variable-width columns, white gutters and in-tile or side labels,
sharing the classic style’s geometry and diverging palette;
values = TRUE prints residuals inside the tiles.build_network() and the transition wrappers
(build_tna(), build_ftna(),
build_atna(), build_cna()) gain
start and end boundary markers:
FALSE (default), TRUE (labels
"Start" / "End") or a custom string.
start prepends a source state to every sequence;
end places a sink in the single cell after each sequence’s
last non-NA state (not absorbing — see
mark_terminal_state() for that). Honoured by the
relative, frequency,
co_occurrence and attention estimators; other
methods error.
build_mmm() gains covariate_effect.
"em" (default) folds covariates into the EM as
covariate-dependent mixing, changing the fit; "posthoc"
fits a plain mixture and uses covariates only for the after-fit
multinomial logit, leaving the clustering bit-identical to a
no-covariate fit.
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.