在给定带宽值网格的情况下,通过交叉验证在 R 中找到 ksmooth() 的最佳带宽

如何解决在给定带宽值网格的情况下,通过交叉验证在 R 中找到 ksmooth() 的最佳带宽

我正在寻找有关我在 R 中运行的某些代码的一些指导。我正在尝试通过交叉验证在内核回归中从值网格中选择最佳带宽。我使用了在以下链接中找到的代码

https://stats.stackexchange.com/questions/56471/implementation-of-the-cross-validiation

我正在使用包“dr”中的“ais”数据。我正在研究线性关系:y~x 其中和 y 是数据中的变量 x = SSF 和 y = Bfat。

这是我在rstudio中实现的代码

cv <- function(dat,kern,bandwidth.grid)
{
  n <- length(ais$SSF)
  mse <- matrix(,nrow=length(bandwidth.grid),ncol=2) # empty matrix with 2 columns,length equals the number of bandwidth values in grid
  for (b in 1:length(bandwidth.grid)){ # for every value in grid
    cv.val <- rep(0,n-1) # will compute cv value for every observation except one left out
    for (i in 1:(n-1)){ # for every cv observation 
      new.dat <- dat[-i,] # leave out one row from data
      args <- list(x1=new.dat[,1],y1=new.dat[,2],xp=dat[i,h = bandwidth.grid[b]) # function arguments are the first and second columns of data minus 1 obsv,the missing observation and the value of the bandwidth
      cv.val[i] <- do.call(kern,args) # cv value computed using the kernel.smooth function below with the above arguments
    }
    mse[b,] <- c(bandwidth.grid[b],1/n*sum((new.dat[,2]-cv.val)^2)) # computing mean squared error 
  }
  
  ## MSE
  colnames(mse) <- c("bandwidth","mse") # set column names
  return(mse)
}

### kernel estimator:
kernel.smooth <- function(x1,y1,xp,h){
  return(ksmooth(x1,x.point = xp,kernel = "normal",bandwidth = h)$y)
}

### CV-score for kernel estimator:
cv(cbind(ais$SSF,ais$Bfat),kernel.smooth,seq(1:30))

但是,当我运行上面的代码时,会产生以下输出

       bandwidth      mse
 [1,]         1       NA
 [2,]         2       NA
 [3,]         3       NA
 [4,]         4       NA
 [5,]         5       NA
 [6,]         6       NA
 [7,]         7       NA
 [8,]         8       NA
 [9,]         9       NA
[10,]        10       NA
[11,]        11       NA
[12,]        12       NA
[13,]        13 2.674061
[14,]        14 2.674415
[15,]        15 2.678438
[16,]        16 2.685912
[17,]        17 2.696773
[18,]        18 2.710698
[19,]        19 2.727634
[20,]        20 2.747286
[21,]        21 2.770471
[22,]        22 2.795569
[23,]        23 2.822988
[24,]        24 2.852624
[25,]        25 2.884286
[26,]        26 2.917892
[27,]        27 2.953353
[28,]        28 2.990558
[29,]        29 3.029543
[30,]        30 3.070896

我不明白为什么我会为 1:12 的带宽获得一些 NA 值。

我也知道最佳带宽应该是 17 但这不是我在这里得到的,因为它不对应于最低的 mse。

有人能看到我哪里出错或提供一些建议吗? 我真的很感激

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?