我正在使用单个协变量的" KernelKnn" 包进行 k-NN 内核回归。但是有一些问题,这个错误就出现了。
Error in if (!is.numeric(k) || is.null(k) || (k >= nrow(data)) || k < :
missing value where TRUE/FALSE needed
如何更正以下编程?
require(KernelKnn)
require(KernSmooth)
nn<-function(m,n){
x<-runif(n,-1,1)
sd<-sd(x)
res <- matrix(0, m, 2)
for(i in 1:m){
y<-rexp(n,1)
PI <- abs(dpik(x) ) ###plug-in
RoT <-abs(1.06*sd(x)*(n^(-1/5))) ###normal scale rule
nn1<-KernelKnn(matrix(x),TEST_data=NULL,matrix(y),k=1,weights_function='gaussian', h=PI,method = 'euclidean', regression = TRUE)
nn2<- KernelKnn(matrix(x), TEST_data = NULL, matrix(y), k =1,weights_function='gaussian', h=RoT,method = 'euclidean', regression = TRUE)
D1=(y-nn1)^2
D2=(y-nn2)^2
MSE.NN1=sum(D1)/(n)
MSE.NN2=sum(D2)/(n)
res[i,1] =MSE.NN1
res[i,2] =MSE.NN2
}
(res)
}
apply(nn(500,25),2,mean)
apply(nn(500,50),2,mean)
apply(nn(500,100),2,mean)
apply(nn(500,150),2,mean)
答案 0 :(得分:1)
您可以通过运行?KernelKnn
来查看文档,这样可以解决您的一些问题。
1.-根据文档,x
和y
应该是矩阵或数据框架,但您有两个列表。因此,请使用matrix(x)
和matrix(y)
代替x
和y
。
2.-内核K
- 最近的neigbors在某种意义上是一个简单的k
- 加权距离最近的邻居,所以你必须选择最接近的k
观察,在你的情况下在1到9之间。由于您有10个观察值,如果您选择其中一个,则无法进行最近的n=10
观察,因为只剩下9个。
总而言之,这样的事情应该有效
nn1<- KernelKnn(matrix(x), TEST_data= NULL, matrix(y), k =9,weights_function='gaussian', h=RoT,method = 'euclidean', regression = TRUE)
请注意,前一个会为k=1
和k=2
引发错误,遗憾的是我不熟悉此算法的详细实现,所以我不能告诉你为什么它会失败在那些情况下。