Skip to contents

This function builds the B-spline design matrix for a given data vector. Importantly, the B-spline basis functions are normalised such that the integral of each basis function is 1, hence this basis can be used for spline-based density estimation, when the basis functions are weighted by non-negative weights summing to one.

Usage

make_matrices_dens(
  x,
  k,
  type = "real",
  degree = 3,
  knots = NULL,
  quantile = FALSE,
  diff_order = 2,
  pow = 0.5,
  npoints = 10000
)

Arguments

x

data vector

k

number of basis functions

type

type of the data, either "real" for data on the reals, "positive" for data on the positive reals or "circular" for circular data like angles.

degree

degree of the B-spline basis functions, defaults to cubic B-splines

knots

optional vector of knots (including the boundary knots) to be used for basis construction. If not provided, the knots are placed equidistantly for "real" and "circular" and using polynomial spacing for "positive".

For "real" and "positive" k - degree + 1 knots are needed, for "circular" k + 1 knots are needed.

quantile

logical, if TRUE use quantile-based knot spacing (instead of equidistant or polynomial)

diff_order

order of differencing used for the P-Spline penalty matrix for each data stream. Defaults to second-order differences.

pow

power for polynomial knot spacing

npoints

number of points used in the numerical integration for normalizing the B-spline basis functions

Such non-equidistant knot spacing is only used for type = "positive".

Value

list containing the design matrix Z, the penalty matrix S, the prediction design matrix Z_predict, the prediction grid xseq, and details for the basis expansion.

Examples

set.seed(1)
# real-valued
x <- rnorm(100)
modmat <- make_matrices_dens(x, k = 20)
#> Leaving out last column of the penalty matrix, fix the last spline coefficient at zero for identifiability!
# positive-continuouos
x <- rgamma2(100, mean = 5, sd = 2)
modmat <- make_matrices_dens(x, k = 20, type = "positive")
#> Leaving out last column of the penalty matrix, fix the last spline coefficient at zero for identifiability!
# circular
x <- rvm(100, mu = 0, kappa = 2)
modmat <- make_matrices_dens(x, k = 20, type = "circular")
#> Leaving out last column of the penalty matrix, fix the last spline coefficient at zero for identifiability!
# bounded in an interval
x <- rbeta(100, 1, 2)
modmat <- make_matrices_dens(x, k = 20)
#> Leaving out last column of the penalty matrix, fix the last spline coefficient at zero for identifiability!