NEWS


exametrika 2.2.0

New: predict() classifies new respondents with a fitted model

predict(fit, newdata) holds the estimated parameters (and, for biclustering, the field memberships of the items) fixed and runs one E-step on new responses, returning the membership probabilities, the estimated class or rank and each respondent's log-likelihood. It covers LCA() (binary, nominal, ordinal, rated), LRA() (binary, ordinal, rated) and Biclustering() / Ranklustering (binary, nominal, ordinal, rated). Items are matched by name, missing responses are left out of the likelihood, and a response in a category the fitted data never used for that item is treated as missing with a warning. On the data the model was fitted to it reproduces the stored membership.

To make this possible the fits now record how they coded the categories: CategoryMap (the raw codes behind each item's renumbered categories) in the nominal, ordinal and rated LCA() and LRA(), CategoryShift in the nominal and ordinal Biclustering(), and LogPrior (the rank prior set by trapezoidal) in the ordinal and rated LRA(). Fits made with earlier versions lack these; predict() asks for a refit where it cannot rebuild them.

Breaking change: memberships are the posterior under the returned parameters

LCA(), the binary LRA() (GTM and isotonic) and every Biclustering() returned the class posterior of the last E-step, which was computed from the parameters of the previous cycle; the parameters themselves then moved once more. The membership and the parameters returned did not belong together, and an E-step with the returned parameters on the same data did not reproduce the membership. Each now runs one more E-step after the loop with the final parameters (the ordinal and rated LRA() and the SOM already did). Memberships, class estimates and the fit quantities built on them move slightly.

When the biclustering EM stops because its objective decreased, it restored the reference profiles of the previous cycle but kept the new field (and, for the nominal and ordinal data, class) memberships. All are now rolled back together. On J35S515 (binary Ranklustering, GTM, 6 x 5) the field memberships of a few items and the fit indices change (log-likelihood -7273.06 to -7273.90). Shojima's Mathematica reference implementation had both defects; it was corrected in step and the reference fixtures regenerated.

Model comparison: evidence lower bound, marginal likelihood, entropy, ICL

Every latent class, latent rank and biclustering fit now carries four additional quantities for model comparison (elbo, log_lik_marginal, entropy, ICL; rated models report the nominal layer with the suffix _nominal). Their definitions are documented in the return value of each function and in R/00_VariationalFit.R:

Breaking change: ordinal biclustering starts from the data (init)

The default fit of Biclustering() on ordinal data changes. The EM is deterministic but converges to a local optimum, and the start used up to now (fields = items split by their median, block probabilities = a ladder common to every field) stopped at one in over 80% of simulated data sets. The new argument init chooses the start:

"auto" also adds nstart random starts (default 10; seed sets them, and the session's random number stream is left untouched). The two data-based starts always run to convergence, so the random starts can only raise the ELBO; the random starts are run for 100 EM cycles and only the best 3 continue. A random start has random classes; its fields are conf if given, and otherwise those of the "quantile" start for half of the starts and random for the other half. On real data the likelihood surface often had many more local optima than in simulations, and the data-based starts alone were often beaten by random ones; raise nstart for such data.

In "quantile" and "ward" the fields start from a Ward clustering of the items' class-mean profiles (centred per item), and the block probabilities from the category frequencies of each block. Both starts are invariant to the order of the rows. In simulations they reached the level of a start at the true partition: "quantile" under equal class sizes, "ward" under unequal ones, and "auto" under both, at about the cost of one legacy fit. With conf the given fields are kept, and with conf_class the given classes are the single start. The fit records init, init_selected and init_elbo.

Breaking change: ordinal biclustering judges SOAC/WOAC on the model

The isotonic fit of ordinal Ranklustering constrains the field reference profiles, but SOACflg and WOACflg were judged on a test reference profile built from data-weighted counts, which the constraint does not reach. A single dip from sampling noise turned SOAC off even when every FRP was monotone, and more often with more ranks. TRP of Biclustering() (ordinal) and Biclustering_IRM() (ordinal) is now computed from the model, as for binary and rated data: the sum over fields of field size times the field expected score. A monotone FRP thus gives a monotone TRP, and the isotonic fit always satisfies SOAC. The checks allow the feasibility tolerance of the isotonic step (1e-6). The profile from the data is returned as TRP_empirical (mean observed score of the class members, summed over fields); its departure from TRP shows how far the model is from the data. TRP values change.

Breaking change: category codes are no longer renumbered per item

Up to now the polytomous biclustering models renumbered each item's observed categories to 1..k, so on an item where nobody chose a category the codes above it moved down. Since 1.15.0, Biclustering() and Biclustering_IRM() on nominal, ordinal and rated data did this through remap_category_codes(), which was meant only to make 0-based codes usable. In these models the items of a field share the block's category probabilities, so code q must mean the same category on every item; on an item whose lowest category was empty the renumbering misaligned every response of that item with the rest of its field. This is common in practice: in simulated data most data sets had an item whose bottom category was empty.

Breaking change: nominal and ordinal biclustering report the ELBO

The log_lik of Biclustering() and Biclustering_IRM() on nominal and ordinal data, and the AIC, BIC and CAIC built on it, change. Up to 2.1.0 these reported sum_sj log sum_fc m_jf m_sc pi_fcq: the probability of each observed cell under a mixture of the block probabilities weighted by that respondent's and that item's posterior memberships. That is the likelihood of a mixed-membership model with the memberships plugged in as free parameters, not of the mixture model being fitted, and it is not the quantity the EM ascends. Because the plugged-in memberships are never counted in the penalty, BIC on this quantity favours more blocks the larger the sample, which is what a simulation study of the grid search showed (over-selection of the number of classes rising with the number of respondents). The reported value is now the evidence lower bound, which the EM also monitors for convergence. The binary implementation keeps the expected log-likelihood of the reference implementation (Shojima, 2022) as its log_lik; the new fields are added alongside it there, so its fit indices are unchanged.

Consequences for ordinal and nominal data:

Missing data: one convention, and the places that broke it

dataFormat() now stores a missing cell as 0 in U (binary and rated data) and keeps the indicator in Z; Q (polytomous data) still carries -1. Until 2.1.0 U held -1 for a missing cell, and every routine that summed U without masking it by Z counted each missing cell as minus one correct response. The audit before this release found that in the binary LCA and LRA cores (emclus(), emclus_isotonic(), somclus(), item_log_lik()), in BNM(), LDLRA(), LDB() and BINET(), and in the quantile reference of rated LRA(). With the new convention those sums are right by construction. Independently of the sentinel, the following counted a missing cell as an incorrect response or divided by the wrong count and are corrected:

Estimation bugs found in the pre-release audit

Bug Fixes

Other

exametrika 2.1.0 (2026-09-24)

A minor release. The estimates returned by LRA(method = "SOM") change, so the fixes below could not ship as a patch. They came out of reading the R code against the Mathematica routine it was ported from (Module_LRA.wl): the port had grown a seed argument and a convergence report that the original never had, and had moved the monotonicity sort to the end of each epoch.

Bug Fixes

Performance

Internal

exametrika 2.0.1

A patch release: two bug fixes, no new features and no change to any estimate. Released on GitHub only (2026-08-25); these fixes reached CRAN with 2.1.0.

Bug Fixes

Performance

exametrika 2.0.0 (2026-08-20)

The version number was raised to 2.0.0 because the EM convergence fix below changes the estimates of every EM-based model: the same code on the same data now returns different numbers, and no longer the numbers printed in Shojima (2022). A minor bump would have understated that. The deprecation removals planned for 2.0.0 ride along, so that the break happens once.

Removals (breaking)

The names deprecated in earlier releases are gone. Each carried a deprecation warning for several releases: the function renames since 1.7.0, the field-name aliases since 1.8.0.

Functions removed, with their replacements:

| Removed | Use instead | |---|---| | IRM() | Biclustering_IRM() | | StrLearningGA_BNM() | BNM_GA() | | StrLearningPBIL_BNM() | BNM_PBIL() | | StrLearningPBIL_LDLRA() | LDLRA_PBIL() |

Field aliases removed from returned objects. The snake_case names have been present alongside them since 1.8.0, so code that already reads the new names is unaffected:

| Removed | Use instead | |---|---| | $Nclass | $n_class | | $Nfield | $n_field | | $Nrank | $n_rank | | $N_Cycle | $n_cycle | | $LogLik | $log_lik |

GridSearch() still accepts "LogLik" as a value for its index argument; that is an input alias for the criterion name, not a field on the result.

Bug Fixes

Performance

Internal (no user-visible behavior change)

Improvements

exametrika 1.15.0 (2026-07-15)

Improvements

API consistency changes

An API audit across all exported model functions surfaced a number of gratuitous inconsistencies in argument names, argument order, and defaults. They are unified in this release; the changes below alter default behavior or (rarely) positional-argument calls, so please review if you relied on the old defaults.

Bug fixes

Removed

Internal (no user-visible behavior change)

Follow-up cleanup after the audit above, consolidating logic that had drifted out of sync across near-identical call sites (the same root cause behind several of the bugs fixed above):

exametrika 1.14.0 (2026-06-14)

Improvements

Bug fixes

exametrika 1.13.1 (2026-05-17)

Resubmission of the 1.13.0 release. The 1.13.0 submission was rejected by the CRAN auto-check service for a single Overall checktime NOTE on r-devel-windows-x86_64 (11 min vs. the 10 min limit). The package itself passed cleanly on both Windows and Debian (Status: OK / OK).

Test suite (no user-visible changes)

exametrika 1.13.0

This release also incorporates the development changes from 1.12.0–1.12.2 (never published to CRAN). Their entries are retained below for traceability.

New features

Documentation and CRAN check cleanup

exametrika 1.12.2

Bug fixes

exametrika 1.12.1

Bug fixes

exametrika 1.12.0

New features

Bug fixes

Performance

Output structure

Tests

Notes

exametrika 1.11.0 (2026-04-15)

New Features

New Data

Bug Fixes

exametrika 1.10.2

New Features

Improvements

Bug Fixes

Improvements

Documentation Fix

exametrika 1.10.1 (2026-03-19)

Vignette Build Time Reduction

exametrika 1.10.0

Bug Fixes

CAIC (Consistent AIC) Formula Correction

GRM Example Fix

dataFormat Robustness Improvements

BINET g_list / adj_list Input Path Fix

Biclustering_IRM.binary S3 Method Consistency Fix

Biclustering_IRM msg Field Fix

Biclustering_IRM.binary Missing LRD Alias

Biclustering_IRM Seed Default

Biclustering_IRM t(apply()) Dimension Drop Fix

Biclustering_IRM Log-Probability Normalization Fix

Biclustering.nominal Model Fit Fix

J20S400 Dataset Fix

New Features

Polytomous IRM (Biclustering_IRM.nominal / Biclustering_IRM.ordinal)

Confirmatory LCA/LRA (Test Equating)

Internal Refactoring: SOM Estimation

Test Suite Modernization

Documentation

Internal Improvements


exametrika 1.9.0

Bug Fixes

GridSearch index Parameter Fixes

Test Tolerance Fix

NAMESPACE Fix

LRA.ordinal / LRA.rated Category Computation Fix

GRM ItemFitIndices Computation Fix

LRA.ordinal Mixed Category Count Validation

LCA/LRA FRP Plot Type Removal

New Features

New Sample Datasets for Polytomous Biclustering

New Plot Types for Polytomous Biclustering

FRPIndex for Ordinal Biclustering

New Parameters for plot.exametrika()

Array Plot Improvements

Print Method Improvements

Documentation Improvements

Return Value Structure Unification

Systematic unification of return value structures across all analysis functions for consistency and interoperability.

snake_case Field Names Extended to All Functions

Top-Level log_lik Added to All Functions

TestFitIndices Structure Unified

Students Matrix Enhanced

Other Structural Improvements

Bug Fixes

Plot Layout Improvements


exametrika 1.8.1 (2026-02-17)

Bug Fixes

dataFormat Function

GridSearch Function

Biclustering.ordinal Function

Impact


exametrika 1.8.0 (2025-12-10)

Naming Convention Improvements

This release improves naming consistency across the package while maintaining full backward compatibility through a deprecation path.

New Field Names (Recommended)

All analysis functions now return results with snake_case field names for better consistency:

Deprecated Field Names (Still Supported)

The old field names continue to work for backward compatibility:

Example Migration

# Old code (deprecated but still works)
result <- LCA(data, ncls = 3)
n_classes <- result$Nclass

# New code (recommended)
result <- LCA(data, ncls = 3)
n_classes <- result$n_class

Output Formatting Improvements

Progress messages now display properly in R Markdown documents:

All progress messages now use proper line breaks instead of carriage returns, ensuring clean output in R Markdown/knitr documents and web documentation.

Bug Fixes

Internal Improvements

exametrika 1.7.0 (2025-11-22)

exametrika 1.6.5 (2025-11-06)

exametrika 1.6.4

exametrika 1.6.3 (2025-09-30)

exametrika 1.6.2

exametrika 1.6.1 (2025-08-27)

exametrika 1.6.0 (2025-08-19)

exametrika 1.5.2

exametrika 1.5.1 (2025-03-09)

exametrika 1.5.0

exametrika 1.4.4

exametrika 1.4.0

exametrika 1.3.0

exametrika 1.2.0 (2025-01-31)

exametrika 1.1.0 (2024-11-22)

exametrika 1.0.2

exametrika 1.0.1

exametrika 1.0.0

exametrika 0.11.5

exametrika 0.11.4

exametrika 0.11.3

exametrika 0.11.2

exametrika 0.11.1

exametrika 0.11.0

exametrika 0.10.0

exametrika 0.9.0

exametrika 0.8.1

exametrika 0.8.0

exametrika 0.7.0

exametrika 0.6.1