# kpbb: Kronecker Product Bspline Basis In cSFM: Covariate-adjusted Skewed Functional Model (cSFM)

## Description

Generate the B-spline basis matrix for a polynomial spline, applicable for both univariate basis and bivariate basis systems.

## Usage

 ```1 2``` ```kpbb(tp, cp = NULL, nknots.tp, nknots.cp = NULL, sub.case = 2, degree.poly = 3) ```

## Arguments

 `tp` timepoint vector in the time direction; must be sorted `cp` covariate vector in the covariate direction; must be sorted `nknots.tp` number of knots for the time direction; See 'Details' `nknots.cp` number of knots for the covariate direction; See 'Details' `sub.case` indicator for univariate (`sub.case = 1`) or bivariate (`sub.case = 2`) `degree.poly` degree of polynomials for B-spline basis system; default is `3`, i.e. cubis splines

## Details

kpbb is built based on the function `bs`. For the time direction, the generated basis matrix has the dimension `length(tp)` by `nknots.tp + degree.poly + 1`, regardless whehter the number of knots is negative or not. When `sub.case = 2`, the generated basis matrix is the kronecker product of the two basis matrices.

## Value

A basis matrix, with attributes which are for the future use of `predict.kpbb`.

## References

[1]. Meng Li, Ana-Maria Staicu and Howard D. Bondell (2013), Incorporating Covariates in Skewed Functional Data Models. http://www.stat.ncsu.edu/information/library/papers/mimeo2654_Li.pdf.

`bs`, `predict.kpbb`, `data.simulation`
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18``` ```data(data.simulation) # load benchmark data y <- DST\$obs # matrix of observation # generate bivariate basis using 3 knots for each direction basis <- kpbb(DST\$tp, DST\$cp, nknots.tp = 3, nknots.cp = 3) # linear regression lm.fit <- lm(as.vector(y) ~ basis - 1) y.fit <- matrix(fitted(lm.fit), nrow = 100, ncol = 80) # visualize the data and fitted surface par(mfrow = c(1,2)) persp(DST\$cp, DST\$tp, y, theta=60, phi=15, ticktype = "detailed", col="lightblue", xlab = "covariate", ylab = "time", zlab="data", main="data surface") persp(DST\$cp, DST\$tp, y.fit, theta=60, phi=15, ticktype = "detailed", col="lightblue", xlab = "covariate", ylab = "time", zlab="data", main="fitted surface via lm") ```