k- R 中的最近邻核回归
k- Nearest Neighbor Kernel Regression in R
我正在使用 "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)
您可以通过 运行 ?KernelKnn
查看文档,这将解决您的一些问题。
1.- 根据文档,x
和 y
应该是矩阵或数据帧,但您有两个列表。所以使用 matrix(x)
和 matrix(y)
而不是 x
和 y
.
2.- kernel K
-nearest 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
会报错,不幸的是我不熟悉这个算法的详细实现所以我不能在这里告诉你为什么它在这些情况下失败了。
我正在使用 "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)
您可以通过 运行 ?KernelKnn
查看文档,这将解决您的一些问题。
1.- 根据文档,x
和 y
应该是矩阵或数据帧,但您有两个列表。所以使用 matrix(x)
和 matrix(y)
而不是 x
和 y
.
2.- kernel K
-nearest 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
会报错,不幸的是我不熟悉这个算法的详细实现所以我不能在这里告诉你为什么它在这些情况下失败了。