Nestimate 0.9.24
Documentation
- Fixes to the 0.9.23 help-page merge, found in review:
- Pages are named after their function again:
build_mcmlandplot_state_frequencieshad been named after aprint()method, and their usage now lists the function before its methods. - The descriptions of 51 methods (what a plot draws, what a print shows) are restored, as a “Methods” section on each function’s page.
- Each page’s
...entry states what each method does with extra arguments: methods that reject them say so,plot.net_bayes()namescograph::splot(), and the rest say they are ignored. -
compare_networks: the...andlabelsentries no longer repeat;net_edge_betweennessandnet_pruning_detailsno longer list a non-existent class. - Every S3 method has a documented return value.
- Pages are named after their function again:
Behaviour notes
- The
mgmestimator rejectsscale = FALSEwith a classed error (nestimate_mgm_unscaled); this started in 0.9.23 and was not listed there. Missing values are handled pairwise, now passed explicitly.
Tests
- Two more reference-implementation tests (a hand-written linear solve for
passage_time(), a manualmultinomre-computation) and unused reference helpers moved to the local suite; section headers that claimed equivalence tests are renamed. New tests: mgm on data with missing values, and thescale = FALSEerror.
Nestimate 0.9.23
Internal changes
- The
mgmandisingestimators delegate topsychnets::mgm_fit()andpsychnets::ising_fit()(glmnet engine), joiningcor,pcorandglasso. Results are unchanged: identical to the former in-package code (max absolute difference 0 for Ising over 180 configurations, 5.6e-17 for MGM over 48). Nestimate keeps type detection, input validation and the result fields. The Ising result no longer carries the unusedasymm_weightsandlambda_selectedfields. The unused internal moderated-MGM code is removed.
Documentation
- Each function has one help page. The 181
print(),summary(),plot(),format()andas.data.frame()methods are documented on the page of the function that creates their object (?nctcoversprint.net_nct()andsummary.net_nct()), as iscompare_model()’snetobject_groupmethod. 286 help pages become 139;?print.net_nctstill opens the right page. -
compare_model()andas_netdifference()have examples.
Bug fixes
-
build_network(method = "mgm")no longer fails on data with missing values (“number of observations in y not equal to the number of rows of x”).
Tests
- Equivalence tests against other packages (tna, igraph, mgm, stringdist,
glm()) and naive-loop reference implementations are no longer shipped. - CRAN runs a core of 15 test files (data preparation, estimation registry, extraction, Markov, link prediction, Bayesian verbs, pruning, and the htna contract); every other file is skipped on CRAN and runs locally and in CI. The CRAN test run drops from about 300 s to 22 s.
- Slow examples run with fewer iterations (
boot_glasso(),nct(),permutation_diagnostics(),build_gimme()) and?sequence_plotdraws fewer figures.
Nestimate 0.9.21
Bug fixes
-
summary()of apredict_links()result reportsNAscores for a method with no predictions (every possible link already exists). It returnedNaN/-Inf/Infwith one warning per column.
Documentation
- Every help page now has example code that runs under
R CMD check. 31 pages had all of it inside\donttest{}or\dontrun{}; fast examples are unwrapped, and slow ones (nct(),permutation_diagnostics(),entropy_bayes()) run live with fewer iterations. - The
predict_links()family of examples uses fixed data that leaves links to predict, and theloading_stability()/as_networks()examples use items with real two-factor structure, so neither emits warnings. - pkgdown: the
cograph-tutorial-nestimatearticle was a 47.8 MB page (300 dpi figures inlined as base64); it is now about 70 KB with figures as separate files. The README no longer lists outdated imports.
Nestimate 0.9.18
Documentation
- The pkgdown site builds again. Four exported topics (
state_colors(),set_state_colors(),composites(),item_loadings()) were missing from the reference index, which had failed every site build since 0.9.10. Thecompare-networksandpermutation-nested-dataarticles now publish.
Nestimate 0.9.17
New features
-
compare_networks()gainsactor =, passed to the permutation backend: whole actors are reassigned between the networks, the printed header names the actor column, andglobal_differences()gains the rowsICC,Design effect (edges)andDesign effect (M)(category"Nesting"). Requirestest = "permutation"(error classnestimate_compare_actor_needs_permutation).
Nestimate 0.9.16
Breaking changes (development versions only)
- The nesting argument added in 0.9.13 (
permutation(),permutation_diagnostics()) and 0.9.15 (bootstrap_network()) is renamed fromblocktoactor, the column identifying whose sequences they are: the same vocabulary asbuild_network(actor = ). Results carryactorandn_actors; diagnostic columns use_sequence(sequences reassigned) and_actor(actors reassigned), e.g.p_global_sequence/p_global_actor; conditions arenestimate_bad_actor,nestimate_actor_missing,nestimate_actor_misaligned,nestimate_actor_unsupportedandnestimate_few_actors. The printout readsActor: Group (200 actors)andNesting in Group: ICC = .... Neither name was ever on CRAN.
Bug fixes
build_network(): columns named inmetadata_cols(or left out ofstate_cols) are no longer read as sequence positions in wide data. They were moved to$metadataonly after estimation, so their values became states and created spurious transitions, in single and grouped networks. Forcor,pcor,glasso,isingandmgm, declared metadata columns are no longer entered as variables.An ICC that cannot be estimated (one block, or no variation) is reported as not estimable instead of
NaN [NA, NA]bypermutation(),bootstrap_network()andpermutation_diagnostics().
Nestimate 0.9.15
New features
-
bootstrap_network()gainsblock =, the column identifying the unit that sequences are nested in. Whole units are resampled with replacement, keeping their sequences together (cluster bootstrap, top level only; Davison & Hinkley, 1997; Field & Welsh, 2007). The result reports the ICC (Shrout & Fleiss, 1979) and the design effect (Kish, 1965) for the edges, printed under the bootstrap summary and returned asclusteringandclustering_edges. With one sequence per unit it reproduces the ordinary bootstrap exactly. Transition networks only.
Nestimate 0.9.13
New features
permutation()gainsblock =, the column identifying the unit that sequences are nested in (sessions in students, students in teams). Whole units are reassigned between the groups; units with sequences in both groups, as in repeated-measures designs, have their sequences reassigned within the unit; mixed designs combine the two (Good, 2005; Anderson & ter Braak, 2003). Supported for transition networks (relative,frequency,co_occurrence); association networks raisenestimate_block_unsupported. A warning of classnestimate_few_blocksis raised when no p-value could fall belowalpha.With
block,permutation()reports the nesting effect: the intraclass correlation (Shrout & Fleiss, 1979) with a jackknife 95% interval, and the design effect (Kish, 1965), the blocked over the unblocked null variance, for the edges and the global statistic M.permutation_diagnostics(x, block =)runs the ordinary and the blocked test on the same data and returns them side by side as a tidy data frame, one row per pair or, withlevel = "edges", per edge.
Improvements
print()of anet_permutationshows the global test (M and S, with p-values) and, withblock, the ICC and design effects. A grouped result prints every pair in full.The
permutation()help page is reorganised into sections: what is tested, nested data andblock, ICC and design effect, reading the printed output.Building a transition network from a single long sequence now raises a message instead of a warning; running
bootstrap_network()orpermutation()on such a network still warns. Both carry the classnestimate_single_sequence.
Bug fixes
\%in markdown roxygen silently cut the rest of a line from the help pages ofcertainty(),build_gimme(),build_mcml()andsequence_plot(); the text is restored.Missing space in the
permutation()print header.
Nestimate 0.9.12
New verbs
set_state_colors(x, colors)attaches a palette to anetobject,netobject_group,mcmlorhtna, and every figure drawn from that object then uses it –sequence_plot(),distribution_plot(),plot_state_frequencies()andcograph::splot(). The cograph half goes through the documentedmeta$splotproducer contract (defaults$node_fill, stamped in node order), sosplot(net)needs no arguments and renders byte-identically tosplot(net, node_fill = ...). Astate_colors(x) <-replacement form is also available.state_colors(x)reads the resolved palette back as a tidy data.frame: one row per key, withstate,colorandsource("set"or"default"). It is what the figures actually draw, not just what was passed in.
Improvements
States a named palette does not mention are now dealt the Okabe-Ito colours the palette has not used, one each, instead of taking their positional slot. Pinning
plan = "#0072B2"no longer leaves another state defaulting to that same blue. Affects the named form only; an unnamedstate_colorsand the all-default palette are unchanged.An attached palette resolves once, in the object’s own key order, so every figure drawn from it colours a state identically. Previously only the colours you set were carried and each figure dealt the remaining defaults in its own sort order –
plot_state_frequencies()sorts states by frequency andsequence_plot()alphabetically, so one state could come out amber in one figure and black in the other.In-tile labels in
plot_state_frequencies()take whichever ink (dark or white) has the higher WCAG contrast ratio against the tile, instead of one fixed grey. A percentage on a dark tile – black, navy, dark wine – is now readable, whether the colour came from the default palette or from a palette you set.
Nestimate 0.9.11
Fixes
- A named
state_colorsno longer has to match the figure exactly. Names the plot does not draw are dropped with amessage()naming them, so one project-wide palette – states from a wider coding scheme, clusters a given call merged away – can be handed to every plot and each takes the keys that apply to it. 0.9.10 raised an error instead, which made a shared palette unusable.
Nestimate 0.9.10
Improvements
state_colorsaccepts a named vector everywheresequence_plot(),distribution_plot()andplot_state_frequencies()draw, and the names are a lookup rather than a positional list: only the keys you name are overridden, every other key keeps its default, and the vector may be shorter than the number of states. An unnamed vector is still positional, unchanged.For an
mcml, that lookup covers the whole multichannel figure, not only the states. A cluster name colours itsSummaryband, its channel strip and its faded band in the other panels; a group merged bycombine =is named by its label (the list name, or"A + B");rest_labelis a key too. Sosequence_plot(fit, combine = list(Task = c("Cognitive", "Regulation")), state_colors = c(Task = "#0072B2"))recolours the combined cluster and leaves the rest of the palette alone. Previously the cluster and combined keys were drawn from a fixed internal palette with no way to set them.A
state_colorsname that matches no key in the figure is now an error naming the available keys, instead of being silently ignored.
Nestimate 0.9.9
New verbs
-
build_mcml()gainscombine =andexpand =. On new input they change the partition before estimation, in anyclustersform and for every input type:build_mcml(data, clusters = cl, combine = c("A", "B"))equals a build withAandBmerged incl(the merged cluster lists its states in cluster-name order). On an existingmcmlthey re-partition it:build_mcml(mc, combine =)merges clusters,build_mcml(mc, expand =)splits clusters into one cluster per state, andbuild_mcml(mc, clusters =)applies a new partition. The model (macro network, within-cluster networks, sequences) is re-estimated from the sequences themcmlcarries, with its originaltype,methodanddirected. With the partition unchanged the result equals the input;expand = "all"reproduces the node-level transition network of the sametype. Raisesnestimate_mcml_no_sequencesfor anmcmlbuilt from a matrix or an edge list (which keeps only within-cluster edges), and errors when sequence-shaping arguments (trim,exclude,end,labels,actor, …) are passed with a re-partition, since the carried sequences already reflect them. -
session_ids()names the session behind every sequence of a network built from long data, and of abuild_mmm()orbuild_clusters()fit on such a network. It returns one row per sequence in model order:sequence, theactorandsessioncolumns under their own names,session_label, and, for a fit,cluster(plusposteriorfor a mixture). The fit’s assignments can then be joined to the input by those columns instead of parsing the"actor | session"label, which breaks when an id contains" | ". Raisesnestimate_no_session_idsfor wide-data input or for fits made before this version, andnestimate_session_ids_misalignedwhen the metadata and the sequences differ in number. -
item_loadings()returns the tidy item-diagnostic table of abuild_mcml_pc()fit (node, cluster, loading, weight, sign, max_cross, cross_cluster, misfit);misfit = TRUE/FALSEfilters it. -
composites()returns the per-respondent cluster scores of abuild_mcml_pc()fit: one row per input row (input order and row names,NAwhere all of a cluster’s items are missing) and one column per cluster. Raisesnestimate_no_compositesfor the descriptive aggregations ("average","escoufier","cancor"), which form no score.
Changes
sequence_plot()on anmcmlgainscombine =: named clusters are merged into one channel (a character vector for one group, a list for several; list names label the merged channels, default"A + B"). The merged group acts as one cluster across the figure (one panel, one Summary key, one faded band) and can itself be opened withexpand =.sequence_plot()on anmcmlgainsrest = c("clusters", "pooled", "none"): how a cluster’s panel shows the time spent in other clusters (one faded band per cluster, one pooled grey band, or blank, leaving only the panel’s own states). Applies to the carpet and distribution views.rest_label =(default"Other states") sets the legend text: the pooled band takes it as is, per-cluster bands read"Social (Other states)". This replaces the former"(elsewhere)"wording.sequence_plot()on anmcmlnow honoursna =in the distribution view:na = FALSEdrops theNA(ended) band and shows each time point as shares of the sequences still running, asdistribution_plot()already did.macro_network()accepts anmcml_pcfit and returns its cluster-level network;expand =on anmcml_pcraisesnestimate_no_expand, andmethod =or...error (the estimator is set inbuild_mcml_pc()).sequence_plot()errors whencombine,expand,restorrest_labelis passed for input that is not anmcml, instead of ignoring them.print.mcml_pc()and its build-time warnings nameitem_loadings()instead of pointing at$loadings.prepare()(and sobuild_network()on long data) keeps thesessioncolumn(s) in the per-sequence metadata under their own names, and returns the metadata explicitly in sequence row order (it was assembled withmerge(sort = FALSE), whose order is unspecified).build_mmm()andbuild_clusters()keep the input network’s$metadata(restricted to the fitted rows whenbuild_mmm()drops sequences with missing covariates).
Fixes
-
sequence_plot()on anmcmlwithtype = "heatmap"/"index"andexpand =drew the other-cluster wash as blank cells: the wash was keyed by the Summary keys, which are states once a cluster is expanded. It is now keyed by cluster. -
sequence_plot()on anmcmlwithtype = "distribution"andexpand =no longer fails with “subscript out of bounds” in the default (normalize = FALSE) view. The Summary band now opens the expanded cluster into its states, and the other panels draw it as one faded"<cluster> (<rest_label>)"band. -
sequence_plot()on anmcmlwith a single channel (one cluster, or every cluster merged bycombine) no longer fails in the carpet view with “replacement has 1 row, data has 0”. -
sequence_plot()on anmcml: withexpand =, each cluster’s faded band in the other panels now has its own colour (expanded clusters all shared one).
Nestimate 0.9.5
New verbs
-
macro_network()returns the macro (cluster-level) network of anmcmlwith one or more named clusters expanded back into their member states and every other cluster left collapsed — a network at mixed resolution. It re-counts from the recoded sequence data rather than splitting the k x k aggregate, which cannot be disaggregated; a matrix-derivedmcmlraisesnestimate_no_expand_source.$node_groupsmaps each expanded state back to its parent cluster, so the result plots grouped. -
extract_pathways()cuts a long event log into pathways and returns one row per pathway. Three cuts viatype =:"unit"(one pathway per group),"segments"(one per contiguous run),"anchored"(spans around an anchor event).resolve =appends a resolution label as the closing state. -
outcome_model()regresses a unit-level outcome on sequence or network predictors — pattern indicators,simplicial_features()output, or any numeric covariate — with family auto-detection, an optionallme4random intercept,select = "split"hold-out selection, BH-corrected p-values, confidence intervals and odds ratios.effects_table()is the tidy accessor;summary()returns the same table. -
simplicial_features()returns topological summaries of one or many networks as a tidy data.frame, one row per network per threshold, ready to use as regression predictors. Accepts anetobject,netobject_group,mcml, a square weight matrix, or a named list of any of these.
Extended
-
build_mcml()gains theexclude,trim,endandend_bysequence arguments, applied in that fixed order. -
as_tna()is now a generic.as_tna.mcml(expand =)delegates tomacro_network()for the macro layer only; per-cluster layers are untouched. Anas_tna.default()covers everything else. -
sequence_plot()and itsmcmlmethod gainpanel = c("both", "summary", "channels").
Fixes
-
frequencies(format = "frequency")returned zero rows for any long-format data whose id column was not integer-valued. The sequence key was coerced withas.integer()before the merge, turning every character id intoNA; the merge then matched nothing and failed silently. Sequence keys are now aligned in their character form. -
sequence_plot()on anmcmlerrored whenever a singleton cluster was named after its own state: the shared fill scale built its levels withfactor(levels = c(states, clusters)), and duplicate levels are an error. Levels and values are now de-duplicated. -
as.data.frame()methods fornet_hypergraph_transductionandnet_hypergraph_clusterplacedwhatin the generic’srow.namesslot, soas.data.frame(x, "scores")bound"scores"torow.names. The generic’s arguments now come first androw.namesis honoured (R CMD check“S3 generic/method consistency”).
Nestimate 0.9.4
- pkgdown reference index repaired: the five topics added in 0.9.3 were unindexed and
build_reference_index()failed. The S3 Methods section now wildcardsas.data.frame.alongsideprint.,summary.andplot., so a future result class with the house-standard accessor cannot repeat it.
Nestimate 0.9.3
New verb: compare_networks()
- Compares two or more networks (
netobject,netobject_group,tna,group_tna,mcml,cograph_network, matrices, or a list of them) in one object.summary()returns the tidy one-row-per-pair overview, as every other Nestimatesummary()does; the full tables are their own verbs:edge_differences(),node_differences(),global_differences(),network_metrics(), each with apaircolumn. All pairs by default, or every network against onereference =. - Ratios are guarded (
NA, neverInf/NaN); every cell is kept, absent edges appear at weight 0;higher(colour) andstatus(shape) columns drive the plots. -
plot(x)draws one view per call, selected withtype =(the package-wide argument name;what =is accepted as an alias):"networks"(default; each network drawn once viacograph::splot()),"difference"(the signed difference network of each pair),"edges"(ranked dumbbell),"nodes","global","heatmap","scatter", and"inference"(a forest of the edge differences on the difference scale, with credible intervals when the Bayesian backend ran, a filled marker for a significant edge and the p-value in a right-hand column; it raisesnestimate_compare_no_testwhentest = "none"). One sign-to-colour contract (#4A6FE3= first/reference higher,#D33F6A= second higher) backed by line type and marker shape; the heatmap scale follows the data. -
plot(x, combined = FALSE)splits a multi-pair view into a named list of single-pair plots (one per pair) instead of facetting them into one figure, matching thecombinedargument ofplot.net_reliability(),plot.simplicial_complex()and friends. The base-graphics views draw one panel per page. - Optional inference on the same tables:
test = "permutation","bayes"(with an optionalrope),"bootstrap", combinable. Non-significant results are faded, never deleted. -
permutation()gains a$globaldata frame with NCT-styleM(sum of absolute differences) andS(largest absolute difference) statistics and their permutation p-values, computed from the same null. -
compare_model()is unchanged and will be soft-deprecated oncecompare_networks()has been through one release.
Hypergraph suite
-
build_hypergraph()promotes a network’s k-cliques (k >= 3) to hyperedges, following Burgio, Matamalas, Gomez and Arenas (2020); underlying pairwise edges are retained.clique_expansion()projects a hypergraph back to a pairwise network in onetcrossprod()call, closing the event data ->bipartite_groups()-> hypergraph -> network cycle. -
hypergraph_measures()returns the structural-statistics suite (Lee, Choe and Shin 2024); an empty hypergraph returns trivial zeros rather than erroring.hypergraph_centrality()computes Benson’s (2019) three eigenvector centralities. -
hypergraph_laplacian()computes the normalized Laplacian, either the Zhou, Huang and Scholkopf (2006) form on the binary incidence pattern or the Hayashi, Aksoy, Park and Park (2020) weighted form. Built on it:hypergraph_cluster()(spectral clustering) andhypergraph_transduction()(semi-supervised label propagation), each with print, summary, plot andas.data.frame()methods.
Nestimate 0.9.1
tna-parity release: sequence-side gaps against tna::build_model() and tna::prepare_data() closed.
New estimators
-
build_network(method = "ngram")(paramsn_gram, default 2),"gap"(paramsmax_gap, default 1) and"reverse"(paramsweighted) mirror the tna types"n-gram","gap"and"reverse". Weights are numerically identical to tna on shared inputs (tested). All three accept wide or long input,start/endboundary markers,group =dispatch andscaling = "normalize"for row probabilities. - New aliases:
"n-gram"/"n_gram"->"ngram","co-occurrence"->"co_occurrence".
Timezone-safe timestamp parsing
-
prepare()andbuild_network()gaintimezone = "UTC"(Olson name). Naive timestamps are interpreted in that zone; ISO-8601Z/UTC/GMTmarkers and numeric offsets (+0200,+02:00) are converted from their offset. Parsing no longer depends on the machine’s local time zone. - Fixes:
...Ztimestamps parsed toNA(the marker was stripped before matching), offsets were silently ignored, and wall-clock readings inside a DST gap could turn into spurious session boundaries. Unparsable values now raise an error instead of becoming session breaks.
Nestimate 0.9.0
Delegation release: Nestimate stops owning psychometric-network math and delegates it to its two clean-room home packages, psychnets (cross-sectional) and idiographic (temporal). No public API changes: every signature, default, return shape, and — verified against frozen pre-delegation baselines — every number is preserved.
Delegated to psychnets (new hard dependency, >= 0.5.2)
- The
cor,pcor, andglassoestimators keep Nestimate’s input layer, validation, and return contract; the math now runs inpsychnets::cor_network()/pcor_network()/ebic_glasso(). Verified field-complete against the frozen baseline:corexact,pcorwithin 5.6e-17,glassoexact on weights, precision, selected lambda, and the EBIC path (includingpenalize.diagonalandrefitbranches). -
nct()delegates its inner EBIC-glasso solve; the NCT-specificnearPDsymmetrization stays local. Seeded runs: networks and p-values exact. -
boot_glasso()andpermutation()(glasso branch) delegate the per-resample solve viapsychnets::ebic_glasso(lambda_path = ), keeping the fixed-path-across-resamples semantics. Seededpermutation()is byte-identical;boot_glasso()is identical except wall-clock timing. - The internal pure-R glasso kernel (
glasso_pure.R) and its EBIC helpers are deleted; psychnets owns that math now. - The
isingandmgmestimators remain local for now (their delegation needs psychnets to expose per-node lambda selection and a scale passthrough) and are unchanged.
Delegated to idiographic (new hard dependency, >= 0.3.4)
-
build_mlvar()keeps its signature, S3 methods, and return object; the lmer estimation pipeline now runs inidiographic::fit_mlvar(). Verified identical at tolerance 0 (object, class, print, summary) across lag/standardize/day/beep configurations, and againstmlVAR::mlVAR()at 8.8e-16 over 954 checks. - When the between-subjects network is not estimable (a random-intercept SD of zero),
build_mlvar()now warns before returning the zero matrix; it previously returned it silently. Numbers are unchanged. -
build_gimme()delegates its whole search toidiographic::fit_gimme(). This is the one delegation that changes results: idiographic’s search reproduces the upstreamgimmepackage (>= 10.0) exactly, which Nestimate’s own search did not — the individual-level path search in particular under-detected person-specific paths relative to upstream. Group-level results are typically unchanged; individual-level path sets can grow. The signature and thenet_gimmefield contract are unchanged (the object gains idiographic’s netobject fields and now renders directly with cograph);print/summary/plotdispatch to idiographic’s methods. Treat pre-0.9.0build_gimme()individual-level results as superseded.
Nestimate 0.8.5
CRAN release: 2026-08-21
Bug-fix release. 0.8.4 was published on r-universe but never reached CRAN.
Plotting in non-UTF-8 locales
plot()onnet_entropy_bayesandnet_sequence_comparisonresults no longer fails where the graphics device cannot represent the arrow glyph. Edge labels and the comparison subtitle previously usedU+2192/U+2190, which a non-UTF-8 locale cannot convert; the graphics engine raised an error (conversion failure ... in 'mbcsToSbcs') rather than substituting a character, so the plot could not be drawn at all. Both now use the ASCII arrow notation (A -> B) already used by the higher-order network verbs. Console output is unaffected.plot()onnet_entropy_bayesresults no longer emits a deprecation warning under ggplot2 4.0, which removedgeom_errorbarh().
Rendering entropy networks with cograph
-
entropy_network()now renders with its intended transition-network styling on cograph 2.4.4, the current CRAN version. The object states its full style through cograph’smeta$splotproducer contract instead of relying on cograph recognising the"entropy"method name, so no cograph update is required. Output is identical under cograph 2.4.4 and 2.4.5.
Documentation
- The
print()andplot()examples for the MMM clustering attribute now reach it throughbuild_network(), matching the 0.8.4 change that madecluster_mmm()return the fittednet_mmmobject.
Nestimate 0.8.4
Transition matrix entropy
- New entropy suite around the entropy rate of a transition matrix (Shannon 1948; Cover & Thomas 2006, ch. 4; the transition entropy of Krejtz et al. 2015 and the real-time mobile transition matrix entropy of Krejtz et al. 2025):
-
transition_entropy()— entropy rate H (stationary distribution from the eigendecomposition at lambda = 1), stationary entropy, redundancy, per-state branching entropies, all with the normalized (scale-free) variants; print/summary/plot andnetobject_groupdispatch. -
entropy_network()— the exact edge-level decomposition of H: each edge carries its term pi_i P_ij log(1/P_ij); weights sum to H. Displays the summands of the entropy-rate equation — no new quantity is estimated.scaling = "share"relabels edges as percentages of H (sum = 100). Additional weights:"surprisal"(optionallyscaling = "chance") and"production"(irreversibility). The result is a regularnetobjectthat inherits its source network’s styling and ships an entropy house style via cograph’smeta$splotproducer contract, which states the styling outright rather than relying on cograph recognising the method name (cograph >= 2.4.4). -
entropy_trajectory()— sliding-window entropy over the transition stream (the windowed design of Krejtz et al. 2025): tidy per-window table, per-group trajectories, loess-trend plot; the per-window estimator weights rows by observed occupancy (robust to non-ergodic window fragments). -
entropy_bayes()— Dirichlet-posterior estimation: credible intervals for H, per-state entropies, and per-edge contributions; edges flagged credible when their share of H credibly exceedsmin_share;$modelholds the pruned stable entropy network.
-
- New vignette: Transition Matrix Entropy.
Mixed Markov clustering contract
-
cluster_mmm()now returns the fittednet_mmmclustering object, retaining assignments, posterior probabilities, mixing proportions, fit criteria, and fitted component models. Network materialization remains the responsibility ofbuild_network(fit)or the one-stepcluster_network(..., cluster_by = "mmm")workflow. -
as_htna()gains anet_mmmmethod. An MMM fit created from an HTNA model is materialized into anhtna_groupwithout rerunning the MMM fit, while the original actor partition and clustering diagnostics are preserved.
Nestimate 0.8.3
HTNA expansion
-
as_htna()still rebuilds one full node-level network from the original source, preserving every between-cluster transition, and now completes the canonical HTNA contract. Its result inherits fromhtna,netobject, andcograph_network; stores character actor labels in$node_groups$group, a factor in$nodes$groups, and actor order in$actor_levels; and retains actor-order metadata on$node_groupsfor lossless partition round trips, plus the legacy$nodes$clusterand"cluster_members"metadata.
Nestimate 0.8.2
Session grouping
-
prepare()now identifies sessions from the observed combinations of theactorandsessioncolumns instead ofbase::interaction(). Three defects are fixed:-
Integer overflow.
interaction()codes a combination over the marginal level space, which exceeds.Machine$integer.maxonce both columns pass 46,341 distinct values. The resultingNAs were pasted into the literal string"NA", merging unrelated events into one pseudo-session. On 50,000 actor-session pairs this silently discarded 14% of sessions and manufactured transitions that no input sequence contained, including self-loops on terminal states. -
Separator collisions. Identifiers were pasted with
" | "before being used as a grouping and metadata merge key, so("a | b", "c")and("a", "b | c")collapsed into a single session. Grouping now keys on the original columns; the readable label is display-only and is exposed as.session_labelinmeta_data. - Missing identifiers. Missing values in a grouping column silently changed the session count. They now raise an error naming the columns.
Group numbering reproduces
interaction()’s ordering, so prepared row order and finite same-seed bootstrap results are unchanged. -
Integer overflow.
time_threshold = FALSEswitches session-interval splitting off, so each actor (or actor-session) forms a single sequence regardless of gap length. Accepted byprepare(),build_network()andbuild_mcml().
Testing
- Added a randomized grouping sweep over 1,000 seeded datasets covering actor/session column counts, identifier vocabularies including separator and UTF-8 cases, time on and off, tied timestamps, explicit order columns, shuffled input, and time-gap structures that split, do not split, or sit exactly on the threshold. Verified against ground truth and against
interaction()for row-order compatibility.
Nestimate 0.8.1
HTNA interoperability
Distance clustering and mixed-Markov clustering now preserve HTNA inputs.
build_clusters()andcluster_mmm()carry the node-to-actor partition into network materialization, whilecluster_network()returns anhtna_groupdirectly. Every child remains anhtnaobject with$node_groups,$nodes$groups, and$actor_levels; clustering assignments, posterior probabilities, fit diagnostics, and other outer attributes remain attached.Added extensive randomized equivalence coverage across distance clustering, mixed-Markov clustering, all transition-network estimators, actor-absent clusters, and HTNA-versus-plain input paths.
Nestimate 0.8.0
CRAN release: 2026-07-10
Documentation
The Bayesian verbs get their own reference section, placed directly after Network Estimation:
certainty(),bayes_compare(),subtract_networks()andas_netdifference(). They were previously buried in a fourteen-entry “Bootstrap & Inference” list.bootstrap_network()now points atcertainty()as its closed-form counterpart, andpermutation()points atbayes_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 forbuild_clusters()and is meant to stay out of the index.Dropped the
utilshelp page, which documented no exported object. The@importFromdirectives it carried are retained.audit_codex/is no longer tracked; it holds generated audit artifacts.
Dependencies
-
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 nonetdifferencesupport, socograph::plot_difference()does not exist there andcograph::splot()on anetdifferencefalls through to the plainnetobjectrenderer and silently draws an unsigned network. Nestimate must not be submitted to CRAN before cograph 2.4.4 is available there.
Nestimate 0.7.8
New features
subtract_networks()/as_netdifference()— verbs for the difference between two networks.subtract_networks(x, y)returns the edge-wise difference as anetdifferenceobject;as_netdifference()promotes an existing comparison result to the same class — abayes_compare()result, or anetdifference, which passes through; anything else errors — so a difference computed by any route prints the same way. Addsprint.netdifference.bayes_compare()accepts twonet_edge_betweenness()objects (source method"relative"only). Edge betweenness is recomputed on every posterior draw, giving the Bayesian analogue ofpermutation()’s edge-betweenness dispatch, with posterior mean betweenness matrices and the plug-inobserved_diff.permutation()gains ameasuresargument for centrality permutation tests, matching thetnapackage’s dispatch.
Enhancements
bayes_compare()’s probability-of-direction column is renamedpd->p_differencein thesummary()frame, and the result now carries classc("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.
Bug fixes
centrality_stability()no longer errors with “missing value where TRUE/FALSE needed” when a requested measure is undefined on the network (e.g.DiffusionisNaNon a small cyclic net):sd()returnedNA, which poisonedif (!any(keep)). Such measures now drop like zero-variance ones.centrality_stability()’s defaultmeasuresis restored toc("InStrength", "OutStrength", "Betweenness"). 0.7.7 had swappedOutStrengthforDiffusion, which broke the package: it callscentrality_stability()with nomeasuresand compares the result against its own explicit trio.centrality()/net_centrality()keep theDiffusiondefault; onlycentrality_stability()reverts.Suggests: cographrelaxed from(>= 2.4.4)to(>= 2.3.6), the version available on CRAN.Additional_repositoriesremoved — every declared dependency now resolves from CRAN.
Nestimate 0.7.7
Enhancements
-
plot()on anet_centrality_groupgainstype = "delta", showing the between-group difference per measure, and now supports three or more groups. Zero-valued edges can be blanked withdrop_zero = TRUE.
Nestimate 0.7.6
New features
-
plot()on anet_edge_betweenness()result (plot.net_edge_betweenness).
Enhancements
-
plot()on centrality results gains alternative views:type = c("bar", "line", "heatmap")for a singlenet_centrality, andtype = c("bar", "line", "delta")for anet_centrality_group. Count-like measures get integer axis labels.
Nestimate 0.7.4
New features
-
as_htna()— builds a grouped node-level network from data and a clustering, keeping every node (unlikecluster_summary(), which collapses to a cluster-level macro summary). Intended forcograph::plot_htna().
Enhancements
Centrality gains the
tna-parity measures.net_centrality(x, measures = "all")now returnsOutStrength,InStrength,ClosenessIn,ClosenessOut,Closeness,Betweenness,BetweennessRSP,DiffusionandClustering— previously only the strengths,ClosenessandBetweenness. Addsplot.net_centralityandplot.net_centrality_group.sequence_plot()and the MCML plots gain layout refinements.
Nestimate 0.7.3
New features
as_netobject()/validate_netobject()— the boundary layer between (which owns the psychometric-network math and emits a leancograph_network) and Nestimate (which owns the canonicalnetobjectschema).as_netobject()promotes apsychnetresult or a barecograph_networkto the dual-classc("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.psychnetis not a declared dependency — Nestimate never calls it; the converter works by S3 dispatch on whateverpsychnetobject the caller supplies.certainty()— analytic Bayesian counterpart ofbootstrap_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 exactnet_bootstrapobject layout and carries classc("net_certainty", "net_bootstrap"), so it is a drop-in: everynet_bootstrapmethod works on it. Completes the assessment trio certainty / stability (bootstrap_network) / reliability (reliability).
Enhancements
sequence_plot()gains a multichannel view formcmlobjects built from sequences.sequence_plot(fit)draws one carpet panel per cluster channel plus a macroSummarypanel — 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 explicitNAband, to 100%), andnormalize = TRUEgives a TraMineR-styleseqdplotwhere each time point sums to 1. ggplot-based and dependency-free; returns aggplotobject.bayes_compare()results are now 100% compatible with thepermutation()format: the object carries classc("net_bayes", "net_permutation")with allnet_permutationslots (diff_sig,p_values,effect_size,iter,alpha,paired,adjust), and itssummaryis a superset ofsummary.net_permutation(from, to, weight_x, weight_y, diff, effect_size, p_value, sigplus the Bayesian extrascount_x, count_y, ci_lower, ci_upper, ci_width, pd). Abayes_compare()result is now a drop-in wherever anet_permutationis consumed.
Nestimate 0.7.2
New features
-
bayes_compare()— Bayesian Dirichlet-Multinomial comparison of two transition networks, a complement topermutation(). 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. Addsprint/summary/plotmethods andnetobject_groupdispatch (all-pairwise or matched). Method source: Johnston & Jendoubi (2026), How Delivery Mode Reshapes Resource Engagement: A Bayesian Differential Network Analysis, TNA Workshop 2026.
Nestimate 0.7.1
New features
-
as_networks()— promote abuild_mcml_pc()result into anetobject_group(the psychometric-network counterpart ofas_tna()). Singleton clusters with no within-network are dropped with a warning; an existingnetobject_grouppasses through unchanged.
Documentation
- Vignettes and articles now call package verbs directly instead of hand-assembled base-R subsetting rituals:
markov_order_test()reads sequences straight from a fitted network (markov_order_test(net)); HYPA anomaly tables usesummary(hypa, order_by = "ratio"); higher-order pathways usepathways(hon, top = ); grouped-clustering inspection usescluster_diagnostics().
Nestimate 0.7.0
New features (experimental)
-
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 amisfitflag 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 viaweighting— 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 afunction(W_block, data_block, nodes).aggregation = "loadings"is the alias for composite + strength. The"factor"weighting exposes its extraction method viafa_method:"ml"(factanal),"paf"(iterated principal axis),"minres"(ULS), or"cfa"(one-factor lavaan model; withcor_method = "polychoric"the categorical DWLS factor model) — all operating on thecor_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_coldrops identifier columns soconvert_sequence_format(format = "frequency")actor-profiles feed the function directly (the within-person co-occurrence view of event data). Returns classmcml_pc(macro + within netobjects, all undirected) with print/summary/plot; the composite/loadings macro is a full netobject, sobootstrap_network(),vertex_bootstrap(), andvertex_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 thebuild_mcml_pc()composite weights (percentile CIs, sign-flip rates), with print and forest-style plot.
Nestimate 0.6.5
New features
-
vertex_bootstrap()— Snijders & Borgatti (1999) vertex bootstrap for network-level statistics (density, mean weight, strength centralization, weighted reciprocity, plus customstatistic_fn). Needs only the weight matrix, so it works on data-less netobjects (build_mlvar()constituents,as_tna(mcml)elements, plain matrices) wherebootstrap_network()cannot run. Returns a tidy one-row-per-statisticnet_vertex_bootstrapwith 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 precomputednet_vertex_bootstrapobjects). Tidynet_vertex_comparisonresult with print/summary/plot (forest plot of differences). -
bootstrap_network()andvertex_bootstrap()gainci_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".
Nestimate 0.6.4
Bug fixes
-
build_mcml()(sequence and edge-list paths) now records the effective directedness in$meta$directed:FALSEwhentype = "cooccurrence", whose weights are symmetrized, instead of echoing thedirectedargument unchanged. Renderers that auto-detect directedness (e.g.,cograph::plot_mcml()withdirected = NULL) now draw co-occurrence MCML objects as undirected networks automatically.
Nestimate 0.6.3
New features
-
mosaic_analysis(data, var1, var2)— two-variable mosaic analysis on adata.frame: chi-square or Fisher test, Cramer’s V (df-adjusted effect size) and a flat mosaic plot. Returns classmosaic_analysiswith a tidy one-row-per-cell$counts, a one-row$stats, and print/summary/plot. Distinct frommosaic_plot(), which draws from a fitted network object.
Enhancements
-
mosaic_plot()gainsstyle = 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 = TRUEprints residuals inside the tiles.
Nestimate 0.6.1
New features
build_network()and the transition wrappers (build_tna(),build_ftna(),build_atna(),build_cna()) gainstartandendboundary markers:FALSE(default),TRUE(labels"Start"/"End") or a custom string.startprepends a source state to every sequence;endplaces a sink in the single cell after each sequence’s last non-NAstate (not absorbing — seemark_terminal_state()for that). Honoured by therelative,frequency,co_occurrenceandattentionestimators; other methods error.build_mmm()gainscovariate_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.
Nestimate 0.6.0
CRAN release: 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 polarplot()portraits (stacked and circular). - Full persistent homology with a Vietoris-Rips filtration (
persistent_homology(),build_simplicial(type = "vr")) plus diagram toolsbottleneck_distance()andpersistence_landscape(). - Network comparison:
compare_model()(withnetobject_groupdispatch),summary.netobject(),plot.net_comparison(), andrename_models()for relabelling grouped network objects.
Documentation
- The pkgdown reference index now lists every exported function;
magnitude_difference(),casedrop_reliability(),build_hypergraph(),hypergraph_measures(), andcluster_data()were previously absent.
Nestimate 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) tobuild_clusters()instead of silently passing them tobuild_network(). The split runs on caller...only — netobjectbuild_argscontinue to flow only to thebuild_network()step, protecting attention-method (atna) network history from being re-routed to weighted Hamming. (audit_clustering #1) -
.auto_detect_clusters()(used bybuild_mcml()andcluster_summary()) now requiresnode_groupsto carry a node identifier column when shaped as a data.frame, or be a named atomic vector keyed by node label. Previously, a barecluster-only data.frame was read positionally — silently mis-assigning nodes whenevernode_groupsrows were in a different order thanx$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)— whenTRUE, the fittednet_mmmmodels are attached asattr(result, "fits")keyed byk, 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-conditionstopifnot()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 = "<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()methodparameter 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 awarning()(was claimed silent) and only fires forrelativemethod (was claimed unconditional). (audit_mcml #6) -
build_clusters()na_symsdoc 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-stylena_syms— only actualNAcells become NA inits. (audit_clustering #5, doc-only path)
Tests
- +12 new tests pinning the corrected contracts and the documented edge cases (misordered
node_groupsalignment, label propagation throughstate_distribution(),as_tna.mcml()drop-warning fixture, MMM first-column NA behaviour, and the four-waycluster_network()arg-routing contract). Full sweep: 1628 / 1628 pass, 0 fail.
Nestimate 0.5.0
Bug fixes
-
.extract_edges_from_matrix()no longer drops the diagonal. Netobjects built via.wrap_netobject()(and therefore everything frombuild_network(),build_mcml(),bootstrap_network(),build_mmm(),wtna(),as_tna()) now have$edgescontaining every non-zero matrix entry, including self-loops. Previously$weightsand$edgeswere 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 acrossnetobject,netobject_group,mcml, andhtna. 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 ongeom_rect()with cumulative-width / cumulative-height geometry. Reusable for any tidydata.frame(group, state, weight)input.
Nestimate 0.4.4
Bug fixes
-
passage_time()andmarkov_stability()now raise an explicit error naming the dead state when a transition-matrix row sums to zero, instead of silently propagatingNaNthrougheigen/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$dataslot is a numeric matrix (not a data.frame). Any downstream caller that row-subsetted$dataand re-invoked the estimator (centrality_stability(),bootstrap_network(),reliability()) was silently producing NULL centralities caught bytryCatch, which surfaced as an “all centrality measures have zero variance” warning or all-NaNcorrelations. 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()gainsstate_colsandmetadata_colsparameters (both defaultNULL). 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. aconditioncolumn 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 thegroup = ...recursive dispatch so per-group calls honour the override.
Removed
-
plot.net_link_prediction()andplot.mcml()removed. Nestimate is a computation engine — visualization is the user’s concern. Previously both methods calledcograph::directly, violating the stated dependency invariant (Nestimate -> cograph direction forbidden). Users callcograph::splot(net)orcograph::plot_mcml(fit)directly.
Documentation
-
wtna()@param typenow flags thattype = "relative"combined withmethod = "cooccurrence"produces an asymmetric matrix (conditional co-occurrence given row state), not a symmetric undirected weight matrix. Usetype = "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::mlVARat 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 usesigraphpath-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, andHyperG. Not shipped in the R-packagetests/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.
Nestimate 0.4.3
CRAN release: 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 usedR CMD build --no-build-vignettes, which preserved pre-builtinst/doc/*.htmlbut stripped the index — CRAN flagged “VignetteBuilder field but no prebuilt vignette index.” -
test-gimme.Rnowskip_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.
Nestimate 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 matchingmlVAR::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 matchingNetworkComparisonTest::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) nowcograph_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(), andprepare()replace earlier internal names for consistency with thebuild_*naming convention. -
mgmestimator added (method = "mgm") for mixed continuous + categorical data via nodewise lasso, matchingmgm::mgm()at machine precision.
Bug fixes
-
build_mmm()no longer crashes on platforms whereparallel::detectCores()returnsNA(macOS ARM64 CRAN check failure). -
gimmeconvergence filter now correctly handles all typedNAvariants (NA_character_,NA_real_, etc.). -
NaNvalues in numeric metadata aggregation (all-NAsessions) normalized toNA_real_. - HYPA p-values corrected;
hypa_scorecolumn renamed top_value.
CRAN compliance
-
.datapronoun added toglobalVariables(). -
base::.rowSums()/base::.colSums()replaced withrowSums()/colSums(). -
dev.new()guarded byinteractive()— no side effects under knitr or CI. - Equivalence test files excluded from the built tarball.
Performance
-
do.call(rbind, ...)replaced withdata.table::rbindlist()inmcml.Randsequence_compare.R.
Nestimate 0.3.4
- HYPA: Renamed
hypa_scorecolumn top_valuefor clarity. Added$over,$under,$n_over,$n_underfields tonet_hypaobjects. Scores are now pre-sorted with anomalous paths first. - HYPA:
summary.net_hypa()now shows over/under-represented paths separately with a configurablenparameter. -
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.
Nestimate 0.2.0
- Reduced hard dependencies from 6 to 4 Imports (ggplot2, glasso, data.table, cluster).
- Removed igraph from Imports —
centrality_stability()andboot_glasso()now accept acentrality_fnparameter 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 usemlvar()for multilevel VAR. - Removed cograph plot wrappers —
plot.netobject(),plot.net_bootstrap(),plot.net_permutation(),plot.net_hon(),plot.net_hypa()andas_cograph()removed. Users call cograph plotting functions directly on netobjects. - Added
attentionestimator 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.
Nestimate 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.