Build a standardised P-Spline design matrix and the associated P-Spline penalty matrix
make_matrices_dens.RdThis 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,
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 + 1knots are needed, for"circular"k + 1knots are needed. # @param quantile logical, ifTRUEuse 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!