如何创建要传递给公式的用户定义的样条实现

时间:2019-05-03 08:15:15

标签: r data-modeling bspline

我正在为非参数回归创建一个新的建模框架。函数pspl获取数据的一维向量以及一些其他复杂性参数,并返回在数据处评估的基函数矩阵。目的是要像使用nsbs一样使用此函数,即应将其传递给公式内的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

0 个答案:

没有答案