bSpline {splines2} | R Documentation |
B-Spline Basis for Polynomial Splines
Description
Generates the spline basis matrix for B-splines representing the family of
piecewise polynomials with the specified interior knots, degree, and
boundary knots, evaluated at the values of x
.
Usage
bSpline(
x,
df = NULL,
knots = NULL,
degree = 3L,
intercept = FALSE,
Boundary.knots = NULL,
periodic = FALSE,
derivs = 0L,
integral = FALSE,
warn.outside = getOption("splines2.warn.outside", TRUE),
...
)
ibs(
x,
df = NULL,
knots = NULL,
degree = 3,
intercept = FALSE,
Boundary.knots = NULL,
...
)
dbs(
x,
derivs = 1L,
df = NULL,
knots = NULL,
degree = 3,
intercept = FALSE,
Boundary.knots = NULL,
...
)
bsp(
x,
df = NULL,
knots = NULL,
degree = 3L,
intercept = FALSE,
Boundary.knots = NULL,
periodic = FALSE,
derivs = 0L,
integral = FALSE,
warn.outside = getOption("splines2.warn.outside", TRUE),
...
)
Arguments
x |
The predictor variable. Missing values are allowed and will be returned as they are. |
df |
Degree of freedom that equals to the column number of the returned
matrix. One can specify |
knots |
The internal breakpoints that define the splines. The default
is |
degree |
A nonnegative integer specifying the degree of the piecewise
polynomial. The default value is |
intercept |
If |
Boundary.knots |
Boundary points at which to anchor the splines. By
default, they are the range of |
periodic |
A logical value. If |
derivs |
A nonnegative integer specifying the order of derivatives of
splines basis function. The default value is |
integral |
A logical value. If |
warn.outside |
A logical value indicating if a warning should be thrown
out when any |
... |
Optional arguments that are not used. |
Details
This function extends the bs()
function in the splines
package
for B-spline basis functions by allowing piecewise constant (left-closed and
right-open except on the right boundary) spline basis of degree zero. In
addition, the function provides derivatives or integrals of the B-spline
basis functions when one specifies the arguments derivs
or
integral
appropriately. The function constructs periodic B-splines
when periodic
is TRUE
. All the implementations are based on
the closed-form recursion formula following De Boor (1978) and Wang and Yan
(2021).
The functions ibs()
and dbs()
are provided for convenience.
The former provides the integrals of B-splines and is equivalent to
bSpline()
with integral = TRUE
. The latter produces the
derivatives of given order of B-splines and is equivalent to
bSpline()
with default derivs = 1
. The function bsp()
is an alias of to encourage the use in a model formula.
Value
A numeric matrix of length(x)
rows and df
columns if
df
is specified. If knots
are specified instead, the
output matrix will consist of length(knots) + degree +
as.integer(intercept)
columns if periodic = FALSE
, or
length(knots) + as.integer(intercept)
columns if periodic =
TRUE
. Attributes that correspond to the arguments specified are
returned for usage of other functions in this package.
References
De Boor, Carl. (1978). A practical guide to splines. Vol. 27. New York: Springer-Verlag.
Wang, W., & Yan, J. (2021). Shape-restricted regression splines with R package splines2. Journal of Data Science, 19(3),498–517.
See Also
knots
for extracting internal and boundary knots.
Examples
library(splines2)
set.seed(1)
x <- runif(100)
knots <- c(0.3, 0.5, 0.6) # internal knots
## cubic B-splines
bsMat <- bSpline(x, knots = knots, degree = 3, intercept = TRUE)
ibsMat <- update(bsMat, integral = TRUE) # the integrals
d1Mat <- deriv(bsMat) # the 1st derivaitves
d2Mat <- deriv(bsMat, 2) # the 2nd derivaitves
op <- par(mfrow = c(2, 2), mar = c(2.5, 2.5, 0.2, 0.1), mgp = c(1.5, 0.5, 0))
plot(bsMat, ylab = "Cubic B-splines")
plot(ibsMat, ylab = "The integrals")
plot(d1Mat, ylab = "The 1st derivatives")
plot(d2Mat, ylab = "The 2nd derivatives")
## evaluate at new values
predict(bsMat, c(0.125, 0.801))
## periodic B-splines
px <- seq(0, 3, 0.01)
pbsMat <- bSpline(px, knots = knots, Boundary.knots = c(0, 1),
intercept = TRUE, periodic = TRUE)
ipMat <- update(pbsMat, integral = TRUE)
dpMat <- deriv(pbsMat)
dp2Mat <- deriv(pbsMat, 2)
plot(pbsMat, ylab = "Periodic B-splines", mark_knots = "b")
plot(ipMat, ylab = "The integrals", mark_knots = "b")
plot(dpMat, ylab = "The 1st derivatives", mark_knots = "b")
plot(dp2Mat, ylab = "The 2nd derivatives", mark_knots = "b")
par(op) # reset to previous plotting settings