k- R中的最近邻核回归

时间:2018-02-21 13:02:26

标签: r knn

我正在使用单个协变量的" 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)

1 个答案:

答案 0 :(得分:1)

您可以通过运行?KernelKnn来查看文档,这样可以解决您的一些问题。

1.-根据文档,xy应该是矩阵或数据框架,但您有两个列表。因此,请使用matrix(x)matrix(y)代替xy

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=1k=2引发错误,遗憾的是我不熟悉此算法的详细实现,所以我不能告诉你为什么它会失败在那些情况下。