NEWS
np 0.70-3 (2026-06-04)
- Added
nplsqreg()/nplsqregbw() as a location-scale quantile-regression
front end with formula/data and bandwidth-object workflows, scalar/vector
tau, prediction, residual extraction, summaries, and plot routes built on
the shared quantile plotting engine.
- Supported MADS/NOMAD-backed bandwidth-search routes now use the final native
crs NOMAD C API rather than the retired legacy snomadr() fallback.
This covers the promoted regression, density, distribution, conditional
density, conditional distribution, smooth-coefficient, single-index,
partially linear, and location-scale quantile search surfaces where those
routes support native NOMAD/MADS. The runtime dependency on crs
is now declared in Imports, while LinkingTo remains for the native
header.
- Native NOMAD routes now preserve progress best-record reporting, expose
cache/evaluation diagnostics, honor explicit start and option controls, and
reject unsupported or indeterminate cache-off settings before solver entry.
Inadmissible GLP degree candidates are guarded before expensive evaluator
work.
npindexbw(..., method = "ichimura", regtype = c("ll", "lp")) now reuses
the established local-polynomial regression objective evaluator for
fixed-degree and NOMAD degree-search routes. Focused sentinel runs preserved
selected objective payloads while materially reducing runtime for
local-linear and local-polynomial Ichimura single-index bandwidth searches.
options(np.tree = "auto") is now the default tree mode. In auto mode,
continuous kd-tree routes are enabled only for bounded-support continuous
kernels ("epanechnikov" and "uniform"); np.tree = TRUE remains the
explicit force-on override and np.tree = FALSE remains the force-off
diagnostic path.
- Powell bandwidth searches now expose package-side repeated-candidate
objective caching through
options(np.objective.cache = TRUE/FALSE). The
cache remains enabled by default and is scoped to one bandwidth solve, so it
can reuse exact candidates across Powell restarts without carrying state
across datasets or later calls. Continuous-only generalized/adaptive
nearest-neighbor routes also retain their integer nearest-neighbor objective
cache under the same switch; NOMAD solver caching and extended-NN distance
reuse remain separate mechanisms.
- Continuous large-bandwidth shortcut evaluations can now be disabled with
options(np.largeh = FALSE), and discrete near-upper-bandwidth shortcut
evaluations can now be disabled with options(np.largelambda = FALSE).
Both remain enabled by default. These switches are intended for diagnostic
timing and reproducibility studies that need to separate tree effects from
large-bandwidth and large-lambda fast paths without changing the canonical
dense/tree objective machinery.
- Local-polynomial regression cross-validation now uses a leaner hot
symmetric weighted-sum loop. Fixed-bandwidth
npregbw(..., regtype = "lp", bwmethod = "cv.ls") objective probes show substantially faster
local-polynomial CV evaluation while preserving objective values to
numerical precision; adjacent density bandwidth probes preserve their
objective values as well.
- Shared weighted outer-product accumulation in
npksum() now uses a guarded
BLAS dgemm route when the operation is dense, non-permuted, and
memory-bounded. Focused fixed-bandwidth probes preserve objective values to
numerical precision while substantially accelerating high-basis
local-polynomial regression and smooth-coefficient objective rows; small and
scalar routes remain on the established loop path.
- Unconditional density least-squares cross-validation now uses a leaner
fixed-bandwidth Gaussian convolution loop. Fixed-bandwidth
npudensbw(..., bwmethod = "cv.ls") objective probes preserve objective
values exactly in the focused validation rows while materially reducing the
convolution portion of the objective calculation. Conditional-density
least-squares objective probes inherit the same fixed-bandwidth Gaussian
convolution improvement.
- Non-Gaussian scalar-bandwidth convolution helpers now hoist the response
bandwidth power outside the inner loop, improving fixed-bandwidth
least-squares density cross-validation with compact-support kernels while
preserving objective values exactly in focused probes.
- Continuous-kernel vector helpers now reuse the loop-invariant signed inverse
bandwidth scale inside their inner loops. Focused density, conditional
density, and regression objective probes preserved objective values exactly
while reducing repeated scaling work in shared C hot paths.
- Conditional density and conditional distribution least-squares
cross-validation now use a size-aware row-block policy for local-polynomial
objective evaluation. The accepted route keeps the bounded-quadrature cap
unchanged, bounds transient memory by sample size, and preserves objective
values to numerical precision while materially reducing evaluator overhead
for fixed-bandwidth CVLS probes.
- Local-polynomial conditional density maximum-likelihood cross-validation now
uses the same bounded-memory block machinery for fixed and generalized
nearest-neighbor bandwidths. Focused
npcdensbw(..., bwmethod = "cv.ml", regtype = "lp") probes preserve objective values and selected bandwidths to
numerical precision while reducing objective and full-search runtime.
- Large-sample categorical-only regression now has a profile-compressed
execution route controlled by
options(np.categorical.compress = TRUE),
which is enabled by default. This categorical route is independent of
options(np.tree). For local constant categorical regression, repeated
predictor profiles are compressed before fitting, prediction/evaluation,
standard errors, gradients where meaningful, bandwidth search, hat-helper
use, and plot bootstrap helpers.
This preserves the established dense-route numerical contract while greatly
reducing work for large samples with many repeated
factor/ordered predictor combinations.
- Categorical-only unconditional density routes now use the same
profile-compression idea when
options(np.categorical.compress = TRUE) is
enabled. The fixed-bandwidth fit/evaluation route preserves dense-route
fitted/evaluation values while avoiding repeated computation over identical
categorical profiles, and the bandwidth-search route now uses the same
compressed support representation for all-categorical data. As with other
flat categorical search surfaces, selected smoothing parameters may drift by
optimizer-path amounts while preserving the objective scale.
- Categorical-only conditional density and conditional distribution bandwidth
searches now honor
options(np.categorical.compress = TRUE). The promoted
route preserves the objective value to numerical precision while allowing
harmless optimizer-path drift in selected smoothing parameters, especially
near upper-bound or large-bandwidth regions where the objective is flat.
- Ordered-only unconditional distribution bandwidth search and fit/evaluation
routes also use profile compression when
options(np.categorical.compress = TRUE) is enabled. The bandwidth-search
route preserves the objective value to numerical precision while allowing
harmless optimizer-path drift in selected smoothing parameters; fitted
distribution values and standard errors are preserved while avoiding repeated
computation over identical ordered profiles.
- Fixed-bandwidth local-constant
npscoef() fits now use categorical-profile
compression when all Z variables are categorical and
options(np.categorical.compress = TRUE) is enabled. The route preserves
fitted means, coefficient surfaces, asymptotic mean standard errors, and
coefficient/gradient standard errors for training and evaluation fits while
avoiding repeated work over duplicate Z profiles. The corresponding
npscoefhat(output = "apply") path and count-based plot-bootstrap helper
use the same profile compression without changing the explicit full-matrix
output = "matrix" contract.
- Internal categorical-profile and large-bandwidth caches are now cleared at
the relevant top-level density, distribution, conditional-density,
conditional-distribution, and regression cleanup points. These caches are
keyed by call-local row pointers, so clearing them per
.Call prevents stale
same-process state from leaking across unrelated data sets.
- Formula variables whose names contain dots, such as
y.irr ~ x, are no
longer mistaken for the formula wildcard . in conditional density and
conditional distribution bandwidth routes. The conditional-density bandwidth
formula route also now expands the actual wildcard form y ~ . using the
supplied data frame, matching the conditional-distribution route.
np 0.70-2 (2026-05-15)
npqreg() is now a fully fledged quantile-regression front end. It
supports the formula/data workflow, internally computes
npcdistbw() bandwidths when a bandwidth object is not supplied,
accepts scalar or vector tau, reuses selected bandwidths for
additional quantiles in plot(), and exposes the usual S3 surface:
fitted(), predict(), predict(..., se.fit=TRUE), se(),
gradients(), summary(), print(), quantile(), and plot().
npqreg() prediction now honors the standard newdata workflow while
preserving native exdat precedence for compatibility with existing
np call surfaces. Formula-based prediction validates that new data
contain the required right-hand-side variables.
npqreg() plotting has been expanded for vector quantiles,
level/gradient displays, ordered predictors, user-specified legends,
and object-fed plotting of additional tau values without recomputing
cross-validation.
npconmode() is now a first-class conditional-mode estimator. It
supports formula/data and bandwidth-object workflows, forwards
bandwidth-selection options to npcdensbw(), propagates local
polynomial and NOMAD metadata, and exposes fitted(), predict(),
summary(), print(), gradients(), and plot() methods.
npconmode() now supports optional class-probability matrices and
level-specific probability gradients. For non-local-constant fits,
probabilities are normalized to be non-negative and to sum to one
across the discrete response support before modal classification.
npconmode() now fails early for non-categorical responses and
validates formula-based newdata against the original right-hand-side
variables.
npconmode() plotting now supports object-fed class-probability slices
and two-dimensional probability surfaces, optional rgl rendering, and
probability-level asymptotic intervals where defined. Surface bootstrap
intervals for class probabilities remain intentionally deferred.
npcopula() is now a first-class copula estimator. It supports
formula/data and bandwidth-object workflows, automatic two-dimensional
probability grids, explicit u evaluation grids, and ordinary
extractable object components including $bws.
npcopula() now provides fitted(), predict(), predict(..., se.fit=TRUE), se(), summary(), print(), as.data.frame(), and
richer plot() methods. Plotting supports base persp, image, and
optional rgl rendering, with asymptotic and bootstrap intervals for
copula surfaces where defined.
npcopula() explicit-grid evaluation now uses the direct estimator
route, preserving numerical results while avoiding the severe runtime
growth of the previous expanded-grid path when users request larger
probability grids.
- The automatic local-polynomial NOMAD controls have been split into
explicit restart toggles:
powell.remin for Powell restarts and
nomad.remin for the second NOMAD hot start. This preserves the
Powell Numerical Recipes restart default while allowing NOMAD hot
starts to be controlled separately.
- Deprecated legacy
remin remains accepted by npregbw() and npreg()
with a warning and is mapped to the modern powell.remin/nomad.remin
controls where appropriate, preserving downstream compatibility while
documenting the new spelling.
- Hat-operator helpers now support an additional constraint-oriented
output route for objects needed by shape-constrained quadratic
programming workflows, avoiding reimplementation of local-polynomial
hat-matrix construction in user examples.
- Local-polynomial derivative support has been broadened across the
conditional estimator family.
npreg(), npcdens(), and npcdist()
now honor gradient.order more consistently for fitted, evaluated,
predicted, and plotted objects when the selected polynomial degree is
high enough, including vector derivative orders over continuous
predictors and tensor/additive/Bernstein local-polynomial bases.
- Core and semiparametric S3 prediction paths have been hardened around
newdata, native evaluation-argument precedence, formula RHS
validation, and se.fit handling.
- Front-end/bandwidth argument hygiene has been tightened so
estimator-only controls such as
proper are not forwarded into
bandwidth selectors that do not accept them.
- Documentation has been refreshed for the promoted
npqreg(),
npconmode(), and npcopula() workflows, including the
local-polynomial NOMAD route, probability/gradient outputs, plot
controls, and examples that use the streamlined interfaces.
- The pre-release validation suite was expanded with focused hostile
argument tests, S3 contract tests, installed/tarball proof scripts,
and cross-package parity checks for the newly promoted estimator
families.
np 0.70-1 (2026-05-02)
- The default multistart cap for bandwidth selection now follows
min(2, p) across the core estimator families, replacing the older
min(5, p) cap. This includes automatic LP degree-search calls when
search.engine="nomad" or "nomad+powell" and nmulti is not
supplied explicitly.
- The univariate boundary density helper
npuniden.boundary() now
defaults to nmulti=1.
- The empirical studies supporting this change are documented under
benchmarks/validation/.
- LP-capable front ends now accept
nomad=TRUE as a documented
convenience preset for the recommended automatic NOMAD local-polynomial
route. Missing settings expand to the same long-form LP/NOMAD defaults
documented in the bandwidth help pages, and regression formula calls
such as npreg(y ~ x, nomad = TRUE) now carry that shortcut through
the internally computed bandwidth path.