如何解决在给定带宽值网格的情况下,通过交叉验证在 R 中找到 ksmooth() 的最佳带宽
我正在寻找有关我在 R 中运行的某些代码的一些指导。我正在尝试通过交叉验证在内核回归中从值网格中选择最佳带宽。我使用了在以下链接中找到的代码:
https://stats.stackexchange.com/questions/56471/implementation-of-the-cross-validiation
我正在使用包“dr”中的“ais”数据。我正在研究线性关系:y~x 其中和 y 是数据中的变量 x = SSF 和 y = Bfat。
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 举报,一经查实,本站将立刻删除。