Orthogonal Nonlinear Least-Squares Regression
- CRAN checks, method
Method
Checks and health
CRAN runs every current package through
R CMD checkon a set of machines and publishes a result for each one. The health shown on a package page comes from these results alone.- Problems
- Notes alone never count against a package, but a warning, an error or a failure on any platform is a problem. Open CRAN deadlines are a fact of their own, shown as a clock after the mark, so the mark always says what the checks found.
- Checks only
- Health reflects CRAN's check results and nothing else. Even a package with no tests, no coverage or no recent release can have every platform OK.
- Once a day
- Results are collected once a day from files CRAN publishes. Each platform is one machine set-up, named by its R version, operating system, architecture and compiler, such as r-devel-linux-x86_64-fedora-clang.
- Platforms counted
- The 13 in 3 of 13 is the number of platform rows CRAN published for that package on the day of collection. The set of machines changes over time, so the number is not fixed, and a package missing from a platform counts as neither passing nor failing there.
- All OK13 platforms
- CRAN 30-day downloads, method
- 596−35% down on the 30 days before, the worse direction
- Dependent packages, method
Method
Reverse dependencies
Dependent packages are other packages that list this one under
Depends,ImportsorLinkingToin theirDESCRIPTIONfile. Those fields list the packages a package needs to install, so dependents break if this one is archived or broken.- As declared
- The counts follow the declarations as written, not whether a package uses the other one when it runs.
- Suggests apart
- Packages that list this one only under
Suggestsinstall and run without it, and use it for tests, examples or an optional feature. They are counted as Suggested by, never among the dependents, and a package that also lists it under one of the three fields is a dependent and is not counted again. - Zero
- Zero dependents means no current CRAN package declares a need for this one, though some may suggest it. On 28 Oct 2026, 19,572 of the 25,583 current CRAN packages had no dependent package.
- 01 more suggest it
- Test coverage, method
Method
Test coverage
Test coverage is measured by downloading each CRAN package's current source file, installing its dependencies, building it and running its tests under covr.
- Almost half of CRAN has no tests to run
- Only CRAN packages are measured. Many have no percentage, most often because the package has no tests, and that blank is a recorded outcome, not missing data.
- NOT_CRAN
- Tests run with NOT_CRAN=true, so tests that skip themselves on CRAN run here, and the figure can differ from what CRAN's own checks see.
- Current version only
- Only the current version is measured, and a new version on CRAN is measured again. Older rows are kept but never filled in later. This is one package's run.
- Never 0%
- On a package page three states stay apart: measured, no tests, and not measured. Neither of the last two is ever shown as 0%.
- No testsnothing to run
- Advisories, method
Method
Security advisories
Advisories come from the R Consortium advisory database, a community record of security problems in R packages, as OSV publishes it.
- The copy
- The record is read once a day. The data is published under the Apache License 2.0 and is credited on the advisories list.
- Box under the name
- Under the package's name, a box names any advisory that affects the current release, with its fix or that there is none.
- Ranges
- Advisories state ranges, such as from 0.9.12 up to but not including 1.8.8. Each range is checked against every version CRAN has published, using the version rules R itself uses, so a release that came out after the advisory was written is still caught by its range.
- Not the package
- The rating is for the library flaw itself, not for how exposed the R package is, and it is never added up into a figure for the package.
- None known
About
Method, About Method Licence figures come from the Licences
License field of each package's DESCRIPTION file, read the way R itself reads it. No licence file is opened.tools::analyze_license() and R's own licence database, as CRAN's checks read it.| is read, so one string can offer two families.
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
More details
- Releases
- 6
- Needs compilation
- No
- Needs R
- >= 2.13.0
Task views (1)
Subjects (2) Method, SubjectsMethod
Subjects and collections
Subjects are the site's own grouping of CRAN packages, found by clustering. Collections are sets of packages that communities declare, such as the tidyverse.
- Subjects
- Subjects are found by clustering the words of current CRAN packages and the packages they use. No one edits them by hand.
- Collections
- Collections are sets that communities declare, through a package that installs the set or an organization on GitHub. The site finds them by rules.
- Who made each
- Subjects are marked Site and collections Community. Subjects, collections and task views are never mixed in one list.
- The day of the data
- Subjects and collections were last worked out on 22 Oct 2026.
Cite
Package
Run in R for the authors' preferred citation:
citation("onls")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.
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.
Health
All 13 check platforms pass.
r-devel-linux-x86_64-debian-clangThe unreleased R on Linux, x86_64, debian-clang
OK
- Version checked
- 0.2
- Time taken
- 86 s
r-devel-linux-x86_64-debian-gccThe unreleased R on Linux, x86_64, debian-gcc
OK
- Version checked
- 0.2
- Time taken
- 59 s
r-devel-linux-x86_64-fedora-clangThe unreleased R on Linux, x86_64, fedora-clang
OK
- Version checked
- 0.2
- Time taken
- 69 s
r-devel-linux-x86_64-fedora-gccThe unreleased R on Linux, x86_64, fedora-gcc
OK
- Version checked
- 0.2
- Time taken
- 63 s
r-devel-windows-x86_64The unreleased R on Windows, x86_64
OK
- Version checked
- 0.2
- Time taken
- 102 s
r-oldrel-macos-arm64The previous release of R on macOS, arm64
OK
- Version checked
- 0.2
- Time taken
- 30 s
r-oldrel-macos-x86_64The previous release of R on macOS, x86_64
OK
- Version checked
- 0.2
- Time taken
- 111 s
r-oldrel-windows-x86_64The previous release of R on Windows, x86_64
OK
- Version checked
- 0.2
- Time taken
- 117 s
r-patched-linux-x86_64The patched release of R on Linux, x86_64
OK
- Version checked
- 0.2
- Time taken
- 83 s
r-release-linux-x86_64The current release of R on Linux, x86_64
OK
- Version checked
- 0.2
- Time taken
- 82 s
r-release-macos-arm64The current release of R on macOS, arm64
OK
- Version checked
- 0.2
- Time taken
- 27 s
r-release-macos-x86_64The current release of R on macOS, x86_64
OK
- Version checked
- 0.2
- Time taken
- 105 s
r-release-windows-x86_64The 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)
| Changed | Worst status | OK | Notes | Warnings | Errors |
|---|---|---|---|---|---|
| 5 Aug 2026 | OK | 13 | 0 | 0 | 0 |
| 1 Aug 2026 | Note | 12 | 1 | 0 | 0 |
| 10 Mar 2026 | OK | 14 | 0 | 0 | 0 |
Since March 2026
Downloads
Method, Downloads Method Download figures count requests logged by each distribution channel. They are not counts of installs or of users, because each channel publishes its own totals and this site reads them.Downloads
- 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
The total is 617 downloads in the last 30 days. It is the sum of 4 channels: CRAN, r2u, autoCRAN and c2d4u.
Over time
Dependencies
- 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
Code
Method, Code Method Code metrics come from reading the released source of each package version. The package is never installed, loaded or run.Code metrics
README, vignettes, a NEWS file and the shares read from its help pages. Files kept only in the repository, such as a pkgdown configuration or CI files, are read by the repository scan instead.
- Functions
- 32
- Public exports
- 8
- Lines of R code
- 1,354
- Median complexity
- 4
Functions (32)
Size and composition
Lines by kind (3,147)
| Kind | Lines | Share |
|---|---|---|
| R code | 1,354 | 43% |
| Documentation | 1,014 | 32% |
| Guides | 779 | 25% |
Lines by language
| Language | Lines | Share |
|---|---|---|
| R | 1,354 | 43% |
| Rd | 1,014 | 32% |
| Vignettes | 779 | 25% |
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)
Release changes
Tests
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
Documentation
- Exports documented
- 100%
- Arguments documented
- 100%
- Return value documented
- 100%
- Help pages with examples
- 100%
- Examples run in checks
- 45.5%
Other documentation
- README
- No
- Release notes file
- Yes
- Help pages
- 11
- Lines of documentation
- 1,014
People
Method, People Method People on the site are the names packages give them in their Author and maintainer identity
DESCRIPTION files: authors from the author list, and the maintainer from the Maintainer field. Spellings of one name become one person only where the rules below allow it, and when in doubt the rules keep people apart.
Andrej-Nikolai Spiess, an organisation
Maintainer since 0.1-0 (2015), author
Repository
Method, figures by host Method Repository signals are the figures read from the source repository a package links to: stars, forks, issues, commits, releases and the time issues take to close. They are read from GitHub, GitLab, Codeberg and Bitbucket.Repository signals
URL and BugReports fields of its DESCRIPTION file. Read-only mirrors, the cran and bioc accounts on GitHub and git.bioconductor.org, are left out.
No repository on record
History
Method, History Method Archived is built from CRAN's archive records, its list of check deadlines and Bioconductor's package records. Every figure is counted to 28 Oct 2026, the day the data was read.Packages leaving
- On CRAN
- Archived
- Release
Archived and back
| Archived | Back | CRAN's reason | Kind |
|---|---|---|---|
| 6 May 2022 | 31 Oct 2022 | email to the maintainer was undeliverable | Maintainer unreachable |
| Version | Released | R | Events |
|---|---|---|---|
| 0.2 current | 21 Sep 2026 | 4.6.1 | |
| 0.1-4 | 1 Sep 2025 | 4.5.1 | |
| 0.1-3 | 20 Aug 2025 | 4.5.1 | |
| 0.1-2 | 31 Oct 2022 | 4.2.2 | Back on CRAN 31 Oct 2022 |
| 0.1-1 | 9 Sep 2015 | 3.2.2 | Archived 6 May 2022 “email to the maintainer was undeliverable” |
| 0.1-0 | 17 Jan 2015 | 3.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
ftolandptol(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) andlower/upperas alternatives to the arguments of the same name extendandwindownow default to NULL, i.e. foot points are unbounded as in ODRPACK. They remain available as optional foot-point bounds for single-predictor models (windowonly together withextend)- 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
weightsare 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_yandknown_sigmaarguments (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) andtol_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
panelargument) for more than two predictors - plot.onls() gained an
aspargument 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_xmatrix giving wrong (partly zero) predictor precisions - fixed
weights,sigma_xandsigma_ygiven as vectors not followingsubsetandna.action(only asigma_xmatrix 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
...,jacandverbosearguments from onls() (tracealready covered progress reporting; the Jacobian is now always supplied internally) datais 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/upperdo 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()