splines2 v0.3.1


Monthly downloads



Regression Spline Functions and Classes

Constructs B-splines and its integral, M-splines and its integral (I-splines), convex splines (C-splines), generalized Bernstein polynomials, and their derivatives. It also contains a C++ head-only library integrated with Rcpp. See De Boor (1978) <doi:10.1002/zamm.19800600129>, Ramsay (1988) <doi:10.1214/ss/1177012761>, and Meyer (2008) <doi:10.1214/08-AOAS167> for more information about the spline basis.



CRAN\_Status\_Badge Downloads from the RStudio CRAN
mirror Build
Status AppVeyor Build
Status codecov

The R package splines2 provides functions to construct basis matrix of

  • B-splines
  • M-splines
  • I-splines
  • convex splines (C-splines)
  • generalized Bernstein polynomials
  • their integrals (except C-splines) and derivatives of given order by close-form recursive formulas

In addition to the R interface, splines2 also provides a C++ header-only library integrated with Rcpp, which allows construction of spline basis matrix directly in C++ with the help of Rcpp and RcppArmadillo. So it can also be treated as one of the Rcpp* packages. A toy example package that uses the C++ interface is available here.

Installation of CRAN Version

You can install the released version from CRAN.



The latest version of package is under development at GitHub. If it is able to pass the building check by Travis CI, one may install it by

if (! require(remotes)) install.packages("remotes")

Getting Started

Online document provides reference for all functions and contains the following vignettes:


Since v0.3.0, the implementation of the main functions has been rewritten in C++ with the help of the Rcpp and RcppArmadillo package. The computational performance has thus been boosted.

Some benchmarks with the splines package (version 4.0.1) are provided for reference as follows:


x <- seq.int(0, 1, 0.001)
degree <- 3
ord <- degree + 1
knots <- seq.int(0.1, 0.9, 0.1)
b_knots <- range(x)
all_knots <- sort(c(knots, rep(b_knots, ord)))

## check equivalency of outputs
my_check <- function(values) {
    all(sapply(values[- 1], function(x) {
        all.equal(unclass(values[[1]]), x, check.attributes = FALSE)

For B-splines, function splines2::bSpline() provides equivalent results with splines::bs() and splines::splineDesign(), and is about 3x faster than bs() and 2x faster than splineDesign().

## B-splines
    "splines::bs" = bs(x, knots = knots, degree = degree,
                       intercept = TRUE, Boundary.knots = b_knots),
    "splines::splineDesign" = splineDesign(x, knots = all_knots, ord = ord),
    "splines2::bSpline" = bSpline(x, knots = knots, degree = degree,
                                  intercept = TRUE, Boundary.knots = b_knots),
    check = my_check,
    times = 1e3
Unit: microseconds
                  expr     min      lq   mean median      uq    max neval cld
           splines::bs 335.703 353.810 387.53 362.81 381.259 3015.9  1000   c
 splines::splineDesign 204.151 213.133 244.16 216.05 226.820 2342.8  1000  b 
     splines2::bSpline  84.866  91.677 108.45  95.46  99.399 2149.9  1000 a

Similarly, for derivatives of B-splines, splines2::dbs() provides equivalent results with splines::splineDesign(), and is more than 2x faster.

## Derivatives of B-splines
derivs <- 2
    "splines::splineDesign" = splineDesign(x, knots = all_knots,
                                           ord = ord, derivs = derivs),
    "splines2::dbs" = dbs(x, derivs = derivs, knots = knots, degree = degree,
                          intercept = TRUE, Boundary.knots = b_knots),
    check = my_check,
    times = 1e3
Unit: microseconds
                  expr     min      lq   mean median     uq    max neval cld
 splines::splineDesign 274.066 285.540 330.04  295.3 327.12 4143.4  1000   b
         splines2::dbs  88.085  94.344 127.73   99.0 107.18 2639.1  1000  a 

The splines package does not provide function producing integrals of B-splines. So we instead performed a comparison with package ibs (version 1.4), where the function ibs::ibs() was also implemented in Rcpp.

## integrals of B-splines
coef_sp <- rnorm(length(all_knots) - ord)
    "ibs::ibs" = ibs::ibs(x, knots = all_knots, ord = ord, coef = coef_sp),
    "splines2::ibs" = as.numeric(
        splines2::ibs(x, knots = knots, degree = degree,
                      intercept = TRUE, Boundary.knots = b_knots) %*% coef_sp
    check = my_check,
    times = 1e3
Unit: microseconds
          expr     min      lq    mean  median      uq      max neval cld
      ibs::ibs 2445.25 2666.93 3259.59 3213.59 3342.26 113446.1  1000   b
 splines2::ibs  264.84  319.18  363.78  338.62  360.94   2826.4  1000  a 

The function ibs::ibs() returns the integrated B-splines instead of the integrals of spline bases. So we applied the same coefficients to the bases from splines2::ibs() for equivalent results, which was still much faster than ibs::ibs().


GNU General Public License (≥ 3)

Functions in splines2

Name Description
mSpline M-Spline Basis for Polynomial Splines
cSpline C-Spline Basis for Polynomial Splines
bSpline B-Spline Basis for Polynomial Splines
bernsteinPoly Generalized Bernstein Polynomial Basis
dbs Derivatives of B-Spline Basis
ibs Integrals of B-Spline Basis
deriv Derivatives of Spline Bases
predict Evaluate a Spline Basis at specified points
splines2 splines2: Regression Spline Functions and Classes
iSpline I-Spline Basis for Polynomial Splines
No Results!

Vignettes of splines2

No Results!

Last month downloads


Date 2020-07-13
LinkingTo Rcpp, RcppArmadillo
VignetteBuilder knitr
License GPL (>= 3)
URL https://github.com/wenjie2wang/splines2
BugReports https://github.com/wenjie2wang/splines2/issues
Encoding UTF-8
RoxygenNote 7.1.1
NeedsCompilation yes
Packaged 2020-07-13 17:08:25 UTC; wenjie
Repository CRAN
Date/Publication 2020-07-14 13:30:02 UTC

Include our badge in your README