0

我模拟了双变量数据 (x,y),其中 y 的平均值为 1/x 和一些方差。数据看起来像这样:数据

我正在使用内核平滑回归来尝试找到这种关系。

kernelreg = ksmooth( train_points$x, train_points$y, kernel = "normal", bandwidth = h) plot(y~x, train_points , cex = 0.5, col = "dodgerblue", main = "Data set") lines(kernelreg,lwd = 2, col = 2)

我想知道如何编写一个函数来通过带宽列表运行此回归并计算训练和测试数据中的 rmse。从而显示使模型误差最小化的最佳带宽。

4

1 回答 1

0

您可以将模型放入函数中并bandwith使用lapply. 然后,您可以简单地计算每次运行的 RMSE 并取min.

library(caret)#for RMSE() function
set.seed(5)
x <- runif(1000)
y <- 20*(1/exp(x*20))+runif(1000,1,5)
plot(x,y)
df <- data.frame(x,y)
ind <- sample(1:nrow(df),nrow(df))
train_points <- df[ind,]
test_points <- df[-ind,]

mykern <- function(x, y, bw) {
  kernelreg <- lapply(bw, function(bw)
    ksmooth(x,
            y,
            kernel = "normal",
            bandwidth = bw))
  names(kernelreg)<- bw
  rmse <- lapply(kernelreg, function(x)RMSE(x[["y"]],y))
  names(rmse) <- bw
  best.bw <- names(rmse[rmse==min(unlist(rmse))])
  
  best.kern <- kernelreg[[which(names(kernelreg)==best.bw)]]
  ll <- list(best.model=best.kern,best.bandwith=best.bw)
  return(ll)
}

kernelreg <-  mykern(train_points$x,
                    train_points$y,
                    bw = seq(0.1,1,0.1))

但是,请按照以下文档的建议查看该KernSmooth软件包ksmooth

这个函数是为了与 S 兼容而实现的,尽管它远没有 S 函数那么慢。其他软件包(例如KernSmooth )中提供了更好的内核平滑器。

于 2021-05-09T18:39:33.703 回答