Generate the B-spline basis matrix for a polynomial spline.

```
bs(x, df = NULL, knots = NULL, degree = 3, intercept = FALSE,
Boundary.knots = range(x))
```

x

the predictor variable. Missing values are allowed.

df

degrees of freedom; one can specify `df`

rather than
`knots`

; `bs()`

then chooses `df-degree`

(minus one
if there is an intercept) knots at suitable quantiles of `x`

(which will ignore missing values). The default, `NULL`

,
takes the number of inner knots as `length(knots)`

. If that is
zero as per default, that corresponds to `df = degree - intercept`

.

knots

the *internal* breakpoints that define the
spline. The default is `NULL`

, which results in a basis for
ordinary polynomial regression. Typical values are the mean or
median for one knot, quantiles for more knots. See also
`Boundary.knots`

.

degree

degree of the piecewise polynomial---default is `3`

for
cubic splines.

intercept

if `TRUE`

, an intercept is included in the
basis; default is `FALSE`

.

Boundary.knots

boundary points at which to anchor the B-spline
basis (default the range of the non-`NA`

data). If both
`knots`

and `Boundary.knots`

are supplied, the basis
parameters do not depend on `x`

. Data can extend beyond
`Boundary.knots`

.

A matrix of dimension `c(length(x), df)`

, where either `df`

was supplied or if `knots`

were supplied, ```
df =
length(knots) + degree
```

plus one if there is an intercept. Attributes
are returned that correspond to the arguments to `bs`

, and
explicitly give the `knots`

, `Boundary.knots`

etc for use by
`predict.bs()`

.

`bs`

is based on the function `splineDesign`

.
It generates a basis matrix for
representing the family of piecewise polynomials with the specified
interior knots and degree, evaluated at the values of `x`

. A
primary use is in modeling formulas to directly specify a piecewise
polynomial term in a model.

When `Boundary.knots`

are set *inside* `range(x)`

,
`bs()`

now uses a ‘pivot’ inside the respective boundary
knot which is important for derivative evaluation. In R versions
\(\le\) 3.2.2, the boundary knot itself had been used as
pivot, which lead to somewhat wrong extrapolations.

Hastie, T. J. (1992)
Generalized additive models.
Chapter 7 of *Statistical Models in S*
eds J. M. Chambers and T. J. Hastie, Wadsworth & Brooks/Cole.

# NOT RUN { require(stats); require(graphics) bs(women$height, df = 5) summary(fm1 <- lm(weight ~ bs(height, df = 5), data = women)) ## example of safe prediction plot(women, xlab = "Height (in)", ylab = "Weight (lb)") ht <- seq(57, 73, length.out = 200) lines(ht, predict(fm1, data.frame(height = ht))) # }