R Observatory
Search
install.packages("onls")
CRAN 30-day downloads, method
596−35% down on the 30 days before, the worse direction

Fits n-dimensional data by means of orthogonal nonlinear least-squares using Levenberg-Marquardt minimization and provides functionality for fit diagnostics and plotting. Delivers the same results as the 'ODRPACK' Fortran implementation described in Boggs et al. (1989) <doi:10.1145/76909.76913>, but is implemented in pure R.

Maintainer
Andrej-Nikolai Spiess
Licence
GPL (>= 2)
Latest release
21 Sep 2026
First release
17 Jan 2015

Compare with another package

More details
Releases
6
Needs compilation
No
Needs R
>= 2.13.0
Task views (1)
Subjects (2) Method, Subjects
Cite

Package

Run in R for the authors' preferred citation:

citation("onls")
APA
Andrej-Nikolai Spiess. (2026). onls: Orthogonal Nonlinear Least-Squares Regression (Version 0.2) [Computer software]. https://doi.org/10.32614/CRAN.package.onls
About

This package has no citation file, so citation() returns this entry built from DESCRIPTION.

R Observatory

For a number measured here: a download total, a coverage figure, an archival date.

APA
Balamuta, J. J. (2026). R Observatory: Metrics for onls version 0.2 [Data set]. HJJB, LLC. Data release v2026-10-28. https://doi.org/10.5281/zenodo.21843040
About

From data release v2026-10-28, which the citation names so these numbers can be found later.

All 13 check platforms pass.

  • r-devel-linux-x86_64-debian-clang

    The unreleased R on Linux, x86_64, debian-clang

    OK

    Version checked
    0.2
    Time taken
    86 s
  • r-devel-linux-x86_64-debian-gcc

    The unreleased R on Linux, x86_64, debian-gcc

    OK

    Version checked
    0.2
    Time taken
    59 s
  • r-devel-linux-x86_64-fedora-clang

    The unreleased R on Linux, x86_64, fedora-clang

    OK

    Version checked
    0.2
    Time taken
    69 s
  • r-devel-linux-x86_64-fedora-gcc

    The unreleased R on Linux, x86_64, fedora-gcc

    OK

    Version checked
    0.2
    Time taken
    63 s
  • r-devel-windows-x86_64

    The unreleased R on Windows, x86_64

    OK

    Version checked
    0.2
    Time taken
    102 s
  • r-oldrel-macos-arm64

    The previous release of R on macOS, arm64

    OK

    Version checked
    0.2
    Time taken
    30 s
  • r-oldrel-macos-x86_64

    The previous release of R on macOS, x86_64

    OK

    Version checked
    0.2
    Time taken
    111 s
  • r-oldrel-windows-x86_64

    The previous release of R on Windows, x86_64

    OK

    Version checked
    0.2
    Time taken
    117 s
  • r-patched-linux-x86_64

    The patched release of R on Linux, x86_64

    OK

    Version checked
    0.2
    Time taken
    83 s
  • r-release-linux-x86_64

    The current release of R on Linux, x86_64

    OK

    Version checked
    0.2
    Time taken
    82 s
  • r-release-macos-arm64

    The current release of R on macOS, arm64

    OK

    Version checked
    0.2
    Time taken
    27 s
  • r-release-macos-x86_64

    The current release of R on macOS, x86_64

    OK

    Version checked
    0.2
    Time taken
    105 s
  • r-release-windows-x86_64

    The current release of R on Windows, x86_64

    OK

    Version checked
    0.2
    Time taken
    100 s
  • 13 OK

Over time

No change since 5 Aug 2026

As a list (3)
ChangedWorst statusOKNotesWarningsErrors
5 Aug 2026OK13000
1 Aug 2026Note12100
10 Mar 2026OK14000

Since March 2026

Check results on CRAN

Total downloads in the last 30 days
617−36.1% down on the 30 days before, the worse directionIt is the sum of 4 channels: CRAN, r2u, autoCRAN and c2d4u.

CRAN rank

5,135 of 26,530

CRAN

596 downloads in the last 30 days

Rank
5,135 of 26,530
Change
−35% down on the 30 days before, the worse direction

It is in the total. Take it out

r2u

7 downloads in the last 30 days

Rank
7,875 of 30,526
Change
−41.7% down on the 30 days before, the worse direction

It is in the total. Take it out

autoCRAN

6 downloads in the last 30 days

Rank
8,234 of 29,212
Change
−70% down on the 30 days before, the worse direction

It is in the total. Take it out

c2d4u, no longer updated

8 downloads in the last 30 days

Rank
2,093 of 7,575
Change
−50% down on the 30 days before, the worse direction

It is in the total. Take it out

Over time

Compare downloads

Needs
2
Dependent packages
0
Suggested by
1
Needs (2)
Installing it adds
29 packages, 22.8 MB of source
Of those, need compilation
17
Optional extras (2)
Functions
32
Public exports
8
Lines of R code
1,354
Median complexity
4
Functions (32)
Size and composition

Lines by kind (3,147)

KindLinesShare
R code1,35443%
Documentation1,01432%
Guides77925%

Lines by language

LanguageLinesShare
R1,35443%
Rd1,01432%
Vignettes77925%

Languages are counted from file extensions.

Files
25
R functions
32
Object systems
S3: 16 methods
Complexity
Median
4
Mean
10.09
Highest
101
Median lines per function
11
About complexity

Cyclomatic complexity counts the independent paths through a function: 1 is a straight line, higher is harder to test. R functions only.

Call graph figures
R functions
32
Calls
14
Unconnected
16
Groups
2
Growth (6 releases)
Total lines by release
1,524 on 17 Jan 20153,147 on 21 Sep 2026
Release changes

The package was built and has no tests to run.

Lines of tests
0
Exports named in tests
0%
Test suite
Has tests
No
Test frameworks
No tests in this release
Test lines per line of code
0
Exports documented
100%
Arguments documented
100%
Return value documented
100%
Help pages with examples
100%
Examples run in checks
45.5%
Guides (1)
Other documentation
README
No
Release notes file
Yes
Help pages
11
Lines of documentation
1,014

No repository on record

R releases
  • On CRAN
  • Archived
  • Release
0.1-10.1-20.1-40.2BackArchivedArchived and backArchived and back

Archived and back

ArchivedBackCRAN's reasonKind
6 May 202231 Oct 2022email to the maintainer was undeliverableMaintainer unreachable
VersionReleasedREvents
0.2 current21 Sep 20264.6.1
0.1-41 Sep 20254.5.1
0.1-320 Aug 20254.5.1
0.1-231 Oct 20224.2.2Back on CRAN 31 Oct 2022
0.1-19 Sep 20153.2.2Archived 6 May 2022
“email to the maintainer was undeliverable”
0.1-017 Jan 20153.1.2
Release notes (0.2)

MAJOR UPDATE: one-pass (ODRPACK-style) algorithm and multivariateness:

  • replaced the nested two-step algorithm (inner foot-point optimization for every observation, outer optimization of the parameters, using L-BFGS-B for foot points when p > 1) by a one-pass algorithm in the manner of ODRPACK: the parameters and all foot-point corrections delta_i are estimated simultaneously by a single Levenberg-Marquardt run (minpack.lm::nls.lm) on the joint problem, minimizing the same objective as ODRPACK, sum[ Qyy_i * (y_i - f(x_i + delta_i, theta))^2 + delta_i' * Qx_i * delta_i ], with Qyy and Qx corresponding to ODRPACK's WE and WD
  • the same code path now handles any number of predictors (single predictor, multivariate, correlated predictor errors); the foot points are no longer found by a separate inner optimizer, and orthogonality of the foot points is now the stationarity condition of the joint problem
  • the Jacobian of the joint problem is now supplied to the solver exactly, using symbolic derivatives of the model formula (deriv()) and falling back to central finite differences if the formula cannot be differentiated (e.g. calls to user-defined functions). MINPACK's internal forward-difference Jacobian is unsuitable here, because its step is proportional to the size of each unknown and vanishes for small foot-point corrections, which stalled foot points at their observations (non-orthogonal points, e.g. for the last point of the odrpack guide example 2.C.i)
  • control$outer_max is now the total budget of Levenberg-Marquardt iterations (default 5000). As minpack.lm silently caps a single nls.lm call at 1024 iterations, the solver is restarted from its last iterate until it converges, a restart brings no further improvement, or the budget is used up
  • new control elements ftol and ptol (convergence tolerances, default 1e-10 instead of sqrt(.Machine$double.eps), which left points with very small residuals slightly non-orthogonal), diag (optional parameter scaling, MINPACK's adaptive scaling is now the default) and lower/upper as alternatives to the arguments of the same name
  • extend and window now default to NULL, i.e. foot points are unbounded as in ODRPACK. They remain available as optional foot-point bounds for single-predictor models (window only together with extend)
  • the covariance matrix of the parameters is now the ODRPACK (Gauss-Newton) covariance, i.e. the parameter block of the inverse of J'J of the joint problem, evaluated with effective-variance weights w_i = 1/(1/Qyy_i + g_i' * Qx_i^-1 * g_i) with g_i = df/dx at the foot point. This is valid for any number of predictors (the previous multivariate version ignored the predictor error in the standard errors)
  • the NLS warm start now substitutes fixed parameters into the model formula instead of fitting them freely and resetting them afterwards, and no longer fails silently when weights are supplied (the weights were not found by nlsLM, so the raw starting values were used instead)
  • onls() now warns if some free parameters have no measurable influence on the fitted model (e.g. a sigmoid that has collapsed to a constant because its exponent underflows), a degenerate stationary point at which the solver may report convergence
  • the model formula is now evaluated in its own environment, so that user-defined functions and constants used in the model are found; the model is evaluated once at the starting values and errors are reported instead of being swallowed
  • extended the core algorithm from single-predictor to n-dimensional (multivariate) models
  • added support for weighted/heteroscedastic orthogonal regression via new sigma_x, sigma_y and known_sigma arguments (scalar, per-predictor vector, full p x p covariance matrix, or observation-specific standard deviations)
  • check_o() now automatically switches from the tangent-angle criterion to a KKT-residual criterion for weighted fits, and checks multivariate models one predictor axis at a time
  • check_o() no longer returns NaN if a foot point coincides with its observation (dx = 0, e.g. where the model slope is zero): the angle is now computed as atan2(|m*dx - dy|, |dx + m*dy|), which is algebraically identical to the old formula but avoids the division by dx. Observations lying on the fitted curve are reported with alpha = NA and Ortho = TRUE
  • check_o() gained the arguments tol_deg (default 0.05 degrees) and tol_kkt (default 0.001) for the orthogonality tolerances, and now computes its slopes itself (central differences, evaluated in the environment of the model formula) instead of relying on internal helper functions
  • plot.onls() gained an interactive 3D rgl-based plot for two-predictor models and a grid of partial-dependence panels (selectable via new panel argument) for more than two predictors
  • plot.onls() gained an asp argument to toggle the 1:1 axis-ratio enforcement used to visually verify orthogonality, and now auto-derives a matching range when only xlim or ylim is supplied
  • logLik_o() now includes a Jacobian/normalizing-constant correction for response/predictor precisions, so AIC()/BIC() from it are valid across onls() fits with different weighting schemes
  • confint.onls() now explicitly conducts bootstrap confidence interval estimation on the orthogonal residuals.
  • fixed a diagonal p x p sigma_x matrix giving wrong (partly zero) predictor precisions
  • fixed weights, sigma_x and sigma_y given as vectors not following subset and na.action (only a sigma_x matrix did)
  • fixed residuals_o() returning values in sorted-predictor order instead of original observation order, which also misaligned NA reinsertion via na.action
  • fixed summary.onls() reporting Std. Error/t value/Pr(>|t|) as 0/Inf/a wrong p-value for fixed parameters instead of NA, and computing cov.unscaled from the vertical- instead of the orthogonal-residual variance
  • fixed check_o() using the wrong sign in its KKT-residual computation for multivariate weighted models, and now correctly realigns precisions to sorted-predictor order for single-predictor models
  • fixed vcov.onls() rescaling the covariance matrix by the vertical- instead of the orthogonal-residual variance
  • fixed logLik.onls() scaling the weight-correction term by n/2 instead of 0.5, affecting AIC()/BIC() for any fit with non-constant weights
  • fixed predict.onls() erroring on se.fit/prediction intervals for models with fixed parameters
  • fixed profile.onls() silently treating originally-fixed parameters as free while profiling other parameters
  • deviance_o(), residuals_o() and print.onls() now report general precision-weighted orthogonal distances rather than assuming plain Euclidean distance
  • removed the ..., jac and verbose arguments from onls() (trace already covered progress reporting; the Jacobian is now always supplied internally)
  • data is no longer optional in onls() (previously defaulted to parent.frame())
  • onls() now stops with an informative error if the response is not a plain variable name, if all parameters are fixed, or if lower/upper do not have one value per parameter
  • clarified that multivariate formulas must use explicit classical notation (y ~ b0 + b1*x1 + b2*x2) rather than R shorthand (y ~ x1 + x2)
  • rewrote onls.Rd to describe the one-pass algorithm with its mathematics (objective, joint residual vector and Jacobian structure, stationarity conditions, covariance), updated check_o.Rd, and corrected the value of the bounded fit in example 6 (1.4376 / 0.9)
  • added new reference-check examples to onls() (Total Least Squares closed-form comparison, Pearson/York weighted regression, Daeron & Vermeesch 2024, control settings) and new 3D/multivariate examples to plot.onls()