st_select — ST-PLS — Score Threshold selection

Group: Variable selector · Registry tolerance: 1e-06

Description

ST-PLS soft-thresholded sparse PLS (§18 Phase 5u)

Registry note — R plsVarSel::stpls (Sæbø et al. 2008 ST-PLS, J. Chemom. 20, 54-62) with the shrink-ladder sweep (0.1, 0.3, 0.5, 0.7, 0.9) picking the most-shrunk model that still has >= min_selected non-zero coefs. Default _st_select_pls4all path mirrors the same R call with seed=11, giving bit-exact mask parity. The C++ absolute-threshold kernel is opt-in via legacy=True.

Parameters

Name

Type

Default

Notes

thresholds

—

required

current public binding signature

n_components

int

2

current public binding signature

min_selected

int | None

None

current public binding signature

Explanations

Bibliographic source

Mehmood, T., Liland, K. H., Snipen, L. & Sæbø, S. (2012). A review of variable selection methods in partial least squares regression. Chemometrics and Intelligent Laboratory Systems 118, 62–69. https://doi.org/10.1016/j.chemolab.2012.07.010 — same review as shaving_select; §3.4 Score-threshold methods covers the deterministic-threshold family implemented here.

Mathematical principle

Apply deterministic thresholds on the standardised coefficient (or VIP) scores: keep features whose absolute score exceeds the threshold \(\tau\), with a minimum-retained fallback to avoid the empty selection. The benchmark scans a grid of thresholds and returns the subset with lowest CV-RMSE.

Conceptually similar to UVE but uses absolute thresholds rather than noise-baseline-relative ones. Less elegant but cheaper since no augmented noise matrix is needed.

Appropriate uses

Removing wavelengths with small stability-normalized PLS coefficients.

Limits and validation

Reliability estimates depend on the resampling design, and the ratio becomes unstable when coefficient variability is poorly estimated.

Implementation

n4m_feature_selection_st_select.

Sources and provenance

Current implementation: cpp/src/core/st_selection.cpp.

API and bindings

C ABI (ABI 2): n4m_feature_selection_st_select. Use the linked public header for the exact signature, configuration, and result handles.

Python (verified public re-export):

from n4m.feature_selection.wrapper import ST

Source signature: ST(thresholds, *, n_components: int = 2, min_selected: int | None = None) (n4m/_impl/selection.py).

R (source-verified): st_select(X, Y, n_components, thresholds, min_selected = NULL).

The source signature has additional required inputs, so no example call is fabricated.

MATLAB / Octave (source-verified): st_select(X, Y, n_components, thresholds, min_selected).

The source signature has additional required inputs, so no example call is fabricated.

Registry parity references 📐

  • 📐 ref.r_plsvarsel (R · r) — plsVarSel 0.10.0 · strict (rmse_rel ≤ 1e-06) — R plsVarSel::stpls (Sæbø et al. 2008) — soft-threshold PLS variable selection. We sweep the shrink parameter and pick the most aggressive shrinkage that still keeps ≥ min_selected features non-zero (mirrors pls4all’s min-selected guard).

Benchmarks

Archived measurement identity. Backend labels in this table are the raw IDs recorded when the benchmark ran (including historical pls4all.* IDs). They preserve measurement provenance and do not describe a current public Python, R, or MATLAB binding; use the source-verified API and bindings section above for current entry points.

Adaptive wall-clock per cell measured against full_matrix.csv. Only backends that implement this method are listed; libraries without the method are omitted.

Verdict  ·  ✓ ref / ≈ ref / ~ shape mark a reference-gate pass at strict / relaxed / qualitative tolerance  ·  ✓ bind = archived binding-harness result agrees with the C++ baseline  ·  ⇄ cross-check = documented by-design selector/RNG/model, noncanonical API/facade convention, or secondary oracle  ·  ✗ divergent  ·  ⚠ error  ·  — not run. The fastest backend per column is marked 🏆.

Reference gate: strict — numeric equivalence (rmse_rel_tol ≤ 1e-06).

Rows tagged with 📐 are the canonical parity references for this method (declared in parity_timing.registry). C++ and external rows show reference parity; archived language-harness rows show binding parity against the C++ backend. Hover the icon for role and tolerance band.

BackendParity200×40 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ J 1.00403.7 ms
Python · archived pls4all benchmark
pls4all.python✓ J 1.00418.3 ms
pls4all.sklearn⇄ J 0.571.82 ms🏆
R · archived pls4all benchmark
pls4all.R⇄ J 0.576.05 ms
pls4all.R.formula⇄ J 0.575.27 ms
pls4all.R.mdatools⇄ J 0.575.45 ms
pls4all.R.pls⇄ J 0.575.46 ms
R · external
📐ref.r_plsvarselsource17.8 ms
BackendParity200×40 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ J 1.00399.6 ms
Python · archived pls4all benchmark
pls4all.python✓ J 1.00400.5 ms
pls4all.sklearn⇄ J 0.571.95 ms🏆
R · archived pls4all benchmark
pls4all.R⇄ J 0.574.89 ms
pls4all.R.formula⇄ J 0.576.39 ms
pls4all.R.mdatools⇄ J 0.578.78 ms
pls4all.R.pls⇄ J 0.575.32 ms
R · external
📐ref.r_plsvarselsource17.5 ms
BackendParity200×40 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ J 1.00429.2 ms
Python · archived pls4all benchmark
pls4all.python✓ J 1.00435.3 ms
pls4all.sklearn⇄ J 0.571.78 ms🏆
R · archived pls4all benchmark
pls4all.R⇄ J 0.574.31 ms
pls4all.R.formula⇄ J 0.576.27 ms
pls4all.R.mdatools⇄ J 0.576.77 ms
pls4all.R.pls⇄ J 0.575.49 ms
R · external
📐ref.r_plsvarselsource19.4 ms

See also: benchmark overview · methods index · interactive dashboard