removeOutliersIQR() applies the interquartile envelopes of the inspected
predictors together instead of one at a time. The loop rebuilt the surviving
set from the original data on each pass, so only the last inspected column
ever narrowed it: with an outlier seeded in each of three columns the function
removed one row of sixty. It now removes all three. A dataset whose ranked
predictors are all non-numeric returns unchanged rather than failing in a C
stack overflow, and a missing value in an inspected column no longer decides
its row, because a value that cannot be compared to an envelope is not
evidence of an outlier.Stage 3 prediction skips a cell whose TEST split holds no rows, with a
warning, instead of aborting the run. buildDataset() can drop every test row
of a cell when a predictor lacks coverage, which is routine in chain datasets;
the run previously stopped on a type mismatch. The Stage 2 metrics and
out-of-fold predictions of the skipped cell stand, and the cell contributes no
delivery rows.
The chain stitch excludes a declared response that produced no iteration-0 metric row, with a warning, instead of aborting. Such a response has no fitted cell in any iteration — every cell was skipped for insufficient support — so it has no delivery rows to preserve.
The resampling argument and its temporal timeslice mode are removed from
modelPipeline(), chainPipeline(), trainModel() and
trainRegressionModel(), together with the internal .resolveResampling()
helper, its short-series guard, its test file, and its vignette. The argument
never reached a released version: it was added after 0.3.1 was published, and
no consumer passed it. Fitting returns to the single k-fold generator it used
before, and every artifact of a default run is unchanged.
Time-respecting evaluation belongs to a separate forecast API whose unit is a series rather than a row, and which needs a horizon axis that none of the present artifacts carry. Threading a fold generator through the supervised path could not provide it.
The help topics of trainModel() and trainRegressionModel() describe the
layers of the training API as they behave: which stage owns each directory,
what each mode reads and writes, and where the ensemble weights come from.
The ensemble-theory article gains the matching derivation.
removeOutliersIQR() states what it does. The topic previously described
envelopes that the function did not apply, and did not mention that the
response column must be named y or that the caret formula interface rejects
missing values before any envelope is computed.
trainRegressionModel() now restores the exact named R2 and RMSE
score lists for each response--dataset cell before unseen-row prediction.
Ensemble weights and method pruning are therefore cell-local and no longer
inherit state from the last OOF cell visited. Weight formulas, equal-weight
fallbacks, output schemas, and selectors are unchanged.auditOverfit() now discovers mixed-case caret method names consistently
with oofEnsemble().dev/ and TITO/ material. DESCRIPTION and
README metadata now match the implemented public API and include verified
method references.semiSupervisedPipeline(). Package-defined range-ratio
pseudo-label promotion with an out-of-fold squared-correlation gauge over
original labelled rows, a key budget, absolute-tolerance reversion with an
accepted-state refit, and final serial cell-file re-emission. With
.path.iter pointing to a chainPipeline() iteration directory, the
baseline can use one selected augmented dataset snapshot.trainRegressionModel() now promotes integer predictor columns to numeric
after reading train/test split CSVs in the training, metrics, and prediction
paths. This keeps caret model frames type-stable when data.table::fread()
infers integer in one split and double in another, avoiding prediction-time
class mismatch failures without changing the numeric values.inst/dev/sot/ and
is not part of the public API in this release. The redesign items are tracked
as planned work before any exported semi-supervised entry point is added.buildDataset(), modelPipeline(), and chainPipeline() now accept an
optional exact features vector for base predictors. When supplied,
train/test splits use only those predictor columns plus chain-generated
prior-iteration columns governed by ITER_SUFFIX, and fail clearly if a
requested predictor is missing or if a response/identifier column is listed
as a predictor. The default features = NULL preserves legacy predictor
inference.chainPipeline(resume = TRUE) now fails before attempting to read metrics
when the resume state is incomplete. If .path.iter/convergence.csv and
.path.iter/Y.csv exist but .path.summary/metrics.csv is missing, the
error names the missing artifact and tells the caller to start a fresh run
with resume = FALSE or restore the summary metrics artifact.trainRegressionModel() now skips response/dataset cells whose training
response has no variance before calling caret::train(). The warning names
the affected cell and reports the row count, unique response count, minimum,
and maximum, avoiding low-level errors such as invalid number of intervals
for unsupported response/dataset intersections.chainPipeline() now snapshots and stitches all summary artifacts
consistently in the final per-response best-iteration pass. metrics.csv,
response_long.csv, residuals_oof.csv, prediction_quantiles.csv, and
overfit.csv are all taken from the same selected iteration per response,
avoiding reports that mixed stitched metrics with last-iteration residuals.Initial release.
dataPipeline() --- assembles per-dataset CSVs from the
manifest-declared domain CSVs.modelPipeline() --- single-response weighted-ensemble fit with
5-fold cross-validation, OOF residuals, signed residual-offset
summaries, and an in-sample-vs-CV optimism audit.chainPipeline() --- multi-response iterative refinement with
two sweep orders ("jacobi" and "gauss-seidel"), package-defined
active-set gates, a positional change heuristic, and per-response
iteration stitching.Dataset assembly, training, prediction, residual audit, and chain
gating helpers: buildDatasets, buildDataset, trainModel,
trainRegressionModel, predictModel, aggregateResponses,
oofEnsemble, auditQuantiles, auditOverfit, detectOutliers,
extractChainImportance, activeByImportance, activeByShadow,
computeActiveByImportance, removeOutliersIQR, toNumeric,
which.nonnum.
vignette("ssel-quickstart", package = "ssel") --- minimal usage
template.vignette("ensemble-theory", package = "ssel") --- single-response
estimators: weighted-ensemble construction, OOF residual
reconstruction, signed offsets, optimism diagnostic, and the two
response/dataset selectors.vignette("chain-regression", package = "ssel") --- multi-response
input expansion: row-class-specific Jacobi and asymmetric
Gauss--Seidel updates, package-defined fixed and shadow gates,
stopping policy, and per-response iteration stitch.The bibliography for all four vignettes lives in inst/REFERENCES.bib.