我正在为非参数回归创建一个新的建模框架。函数pspl
获取数据的一维向量以及一些其他复杂性参数,并返回在数据处评估的基函数矩阵。目的是要像使用ns
或bs
一样使用此函数,即应将其传递给公式内的lm
等建模函数。函数pspl
带有predict
方法,该方法在一些新数据上评估基函数集。从使用pspl
拟合的模型进行预测时,需要这样的功能。
模型的拟合效果很好。不幸的是,无法预测新的数据集。原因似乎是,R没有找到/使用我的函数predict.pspl。
我对如何设置自己的类和方法不是很熟悉,因此这里将提供一些帮助。
library(fda)
pspl <- function(x, num.breaks = NULL, breaks = NULL, norder = 4){
nx <- names(x)
if(is.null(breaks)){
breaks <- quantile(x, probs = seq(0,1,length.out = num.breaks))
names(breaks) <- NULL
}
basis <- create.bspline.basis(norder=norder, breaks=breaks)
Z <- getbasismatrix(x, basis, nderiv=0, returnMatrix=FALSE)
dimnames(Z) <- list(names(x), 1:ncol(Z))
a <- list(num.breaks=num.breaks, breaks=breaks, norder=norder)
attributes(Z) <- c(attributes(Z), a)
class(Z) <- "pspl"
Z
}
predict.pspl <- function(object, newx, ...){
if(missing(newx))
return(object)
a <- c(list(x = newx), attributes(object)[c("breaks", "norder")])
do.call("pspl", a)
}
运行示例:
set.seed(1)
x <- 2*rnorm(100)
y <- sin(x) + .5*rnorm(100)
xnew <- rnorm(100)
mod <- lm(y ~ -1 + pspl(x, num.breaks = 5))
plot(x,y)
points(x,fitted(mod), col="blue") ## correct fit
points(xnew,predict(pspl(x, num.breaks = 5), xnew)%*%coef(mod), col="green") ## what should be predicted
points(xnew, predict(mod, newdata = data.frame(x=xnew)), col="red") ## what is actually predicted
black: data, blue: fit, green: correct prediction (done "by hand"), red: actual prediction