create.polygonal.basis
is essentially a B-spline basis of order
2, degree 1. Monomial and polynomial bases can be obtained as linear
transformations of certain B-spline bases.create.bspline.basis(rangeval=NULL, nbasis=NULL, norder=4,
breaks=NULL, dropind=NULL, quadvals=NULL, values=NULL,
basisvalues=NULL, names="bspl", axes=NULL)
if(is.null(breaks)) 0:1 else range(breaks)
. If length(rangeval) == 1
and rangeval
This 'nbasis' argument is ignored if 'breaks' is supplied, in which case nbasis = nbreaks + norder - 2, where nbreaks = length(breaks).
breaks[1] = rangeval[1]
and
quadvals
contains the
quadrature points, and the second column the quadquadvals
.vector("list",1)
.
This argument is designed to avoid evaluation of a basis system repeatedly
at a set of argument values. Each list within the vector corresponds to a
specific set of norder, "."
and 1:nbasis
are appended as paste(names, norder, ".",
1:nbasis, sep="")
. Fplot
functions to create
custom axes
. If this axes
argument is not
NULL
, functions plot.basisfd
, plot.fd
,
plot.fdSmooth
bspline
Consider as an illustration the very common case where the order is 4 for all polynomials, so that degree of each polynomials is 3. That is, the polynomials are cubic. Then at each break point or knot, the values of adjacent polynomials must match, and so also for their first and second derivatives. Only their third derivatives will differ at the point of junction.
The number of degrees of freedom of a cubic spline function of this nature is calculated as follows. First, for the first interval, there are four degrees of freedom. Then, for each additional interval, the polynomial over that interval now has only one degree of freedom because of the requirement for matching values and derivatives. This means that the number of degrees of freedom is the number of interior knots (that is, not counting the lower and upper limits) plus the order of the polynomials:
nbasis = norder + length(breaks) - 2
The consistency of the values of nbasis
, norder
and
breaks
is checked, and an error message results if this
equation is not satisfied.
B-splines are a set of special spline functions that can be used to construct any such piece-wise polynomial by computing the appropriate linear combination. They derive their computational convience from the fact that any B-spline basis function is nonzero over at most m adjacent intervals. The number of basis functions is given by the rule above for the number of degrees of freedom.
The number of intervals controls the flexibility of the spline; the more knots, the more flexible the resulting spline will be. But the position of the knots also plays a role. Where do we position the knots? There is room for judgment here, but two considerations must be kept in mind: (1) you usually want at least one argument value between two adjacent knots, and (2) there should be more knots where the curve needs to have sharp curvatures such as a sharp peak or valley or an abrupt change of level, but only a few knots are required where the curve is changing very slowly.
This function automatically includes norder
replicates of the
end points rangeval. By contrast, the analogous functions
splineDesign and spline.des in the
splines
package do NOT automatically replicate the end points.
To compare answers, the end knots must be replicated manually when
using splineDesign or spline.des.
Ramsay, James O., and Silverman, Bernard W. (2002), Applied Functional Data Analysis, Springer, New York.
basisfd
,
create.constant.basis
,
create.exponential.basis
,
create.fourier.basis
,
create.monomial.basis
,
create.polygonal.basis
,
create.polynomial.basis
,
create.power.basis
splineDesign
spline.des
##
## The simplest basis currently available with this function:
##
bspl1.1 <- create.bspline.basis(norder=1)
plot(bspl1.1)
# 1 basis function, order 1 = degree 0 = step function:
# should be the same as above:
b1.1 <- create.bspline.basis(0:1, nbasis=1, norder=1, breaks=0:1)
stopifnot(
all.equal(bspl1.1, b1.1)
)
bspl2.2 <- create.bspline.basis(norder=2)
plot(bspl2.2)
bspl3.3 <- create.bspline.basis(norder=3)
plot(bspl3.3)
bspl4.4 <- create.bspline.basis()
plot(bspl4.4)
bspl1.2 <- create.bspline.basis(norder=1, breaks=c(0,.5, 1))
plot(bspl1.2)
# 2 bases, order 1 = degree 0 = step functions:
# (1) constant 1 between 0 and 0.5 and 0 otherwise
# (2) constant 1 between 0.5 and 1 and 0 otherwise.
bspl2.3 <- create.bspline.basis(norder=2, breaks=c(0,.5, 1))
plot(bspl2.3)
# 3 bases: order 2 = degree 1 = linear
# (1) line from (0,1) down to (0.5, 0), 0 after
# (2) line from (0,0) up to (0.5, 1), then down to (1,0)
# (3) 0 to (0.5, 0) then up to (1,1).
bspl3.4 <- create.bspline.basis(norder=3, breaks=c(0,.5, 1))
plot(bspl3.4)
# 4 bases: order 3 = degree 2 = parabolas.
# (1) (x-.5)^2 from 0 to .5, 0 after
# (2) 2*(x-1)^2 from .5 to 1, and a parabola
# from (0,0 to (.5, .5) to match
# (3 & 4) = complements to (2 & 1).
bSpl4. <- create.bspline.basis(c(-1,1))
plot(bSpl4.)
# Same as bSpl4.23 but over (-1,1) rather than (0,1).
# set up the b-spline basis for the lip data, using 23 basis functions,
# order 4 (cubic), and equally spaced knots.
# There will be 23 - 4 = 19 interior knots at 0.05, ..., 0.95
lipbasis <- create.bspline.basis(c(0,1), 23)
plot(lipbasis)
bSpl.growth <- create.bspline.basis(growth$age)
# cubic spline (order 4)
bSpl.growth6 <- create.bspline.basis(growth$age,norder=6)
# quintic spline (order 6)
Run the code above in your browser using DataLab