Build a standardised P-Spline design matrix and the associated P-Spline penalty matrix
make_matrices_dens.Rd
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!