Changes in version 0.4.0 (2026-10-11) This release re-submits the package to CRAN, from which it was archived on 2025-10-03: the vignette called library(FactoMineR) unconditionally while FactoMineR is only suggested, and the build failed on a check flavor where it was not installed. The vignette is rewritten and the optional chunk is only evaluated when FactoMineR is available. Bug fixes - test and validation now do what the documentation says. Until now the held out sets were drawn but never used: all regressions, trees and criteria were computed on all the observations. The training set is now the only data used to fit; validation selects the iteration; test is used only to report the performance of the best tree (performance$performance). - The validation versions of the criteria were broken in version 0.3.1: criterion = "aic" with validation = TRUE failed with "factor x1 has new levels", the BIC returned -Inf, and the Gini mixed the labels of all validation observations with the predictions of one segment. All are now computed correctly (log-likelihood or Gini on the held out set). - The BIC penalty of a segment used log(n) of the whole data set because of an operator precedence error; it now uses the size of the segment, as intended. - With fewer than 50 iterations the "best" tree was always the one of iteration 2, drawn from a random segmentation, and iterations = 1 failed with "object 'best_link' not found". The burn-in is now the argument burn_in (default: the minimum of 50 and a quarter of iterations) and a tree is always returned. - Integer columns, tibbles, matrices, character and logical columns are accepted in x; logical and factor responses are accepted for y. Missing values are reported with an error. - normalizedGini() is computed from ranks (2 AUC - 1): it no longer depends on the order of the observations when predictions are tied, and returns NA if there is a single class. - The class documentation was filed under glmdisc-class; it is now glmtree-class. New features - predict() for glmtree objects (probabilities, or type = "segment"), robust to factor levels unseen in training (they get the rate of positives of their segment); show() / print(). - New arguments burn_in, patience (stop the chain when the criterion stopped improving) and verbose (the criterion was printed at every iteration; it is now silent by default). - best.tree also stores coefficients, labels, rates etc. used to predict; the glm objects of best.tree$glms are named by segment. - performance$best_iteration and parameters$sizes (training / validation / test sizes). Changes - The SEM loop was rewritten: one glm.fit per segment on a design matrix built once instead of glm() + predict() on the whole data frame for each segment and iteration, a single prediction of the tree per iteration instead of two, vectorized sampling of the segments instead of apply(sample()) over the rows. See inst/benchmarks/speed.R for the timings. - Dependencies reduced to partykit (dplyr, magrittr and caret are no longer needed); FactoMineR is only used in an optional vignette chunk. - Defaults as documented: test = FALSE, validation = FALSE, criterion = "bic". - generateData() is vectorized (same distributions, different random stream). - CI: standard r-lib/actions workflows (check on Linux, macOS and Windows plus a job without the suggested packages, coverage, styler, pkgdown) replace the previous single workflow; renv, Travis and the committed docs/ were removed. - Added inst/benchmarks/, a comparison with a logistic regression, ctree, model-based recursive partitioning and a random forest on simulated and real data.