如何在 r 中的所需区域中获取点集 (x,y)
how to get point set (x,y) in a desired area in r
下图是excel文件中x,y的设置图,共有8760对x和y。我想去除红圈区域的噪声数据对,并输出一个新的 excel 文件,其中包含剩余数据对。我怎么能在 R 中做到这一点?
R 和 EXCEL 都读取和写入 .csv 文件,因此您可以使用它们来回传输数据。
你没有提供任何数据所以我做了一些垃圾数据产生了类似的问题。
数据
set.seed(2017)
x = runif(8760, 0,16)
y = c(abs(rnorm(8000, 0, 1)), runif(760,0,8))
XY = data.frame(x,y)
识别噪声点的一种方法是查看与最近邻居的距离。在密集区域,最近的邻居会更近。在非密集区域,它们将分开得更远。包 dbscan
提供了一个很好的函数来获取到 k 最近邻居的距离。对于这个问题,我使用了 k=6,但您可能需要调整您的数据。查看到第 6 个最近邻的距离分布,我们看到大多数点在 0.2
的距离内有 6 个邻居
XY6 = kNNdist(XY, 6)
plot(density(XY6[,6]))
所以我假设第 6 个最近邻更远的点是噪声点。只需更改颜色以查看哪些点受到影响,我们得到
TYPE = rep(1,8760)
TYPE[XY6[,6] > 0.2] = 2
plot(XY, col=TYPE)
当然,如果你想限制到非噪声点,你可以使用
NonNoise = XY[XY6[,6] > 0.2,]
使用@G5W 的例子:
补数据:
set.seed(2017)
x = runif(8760, 0,16)
y = c(abs(rnorm(8000, 0, 1)), runif(760,0,8))
XY = data.frame(x,y)
将分位数回归拟合到第 90 个百分位数:
library(quantreg)
library(splines)
qq <- rq(y~ns(x,20),tau=0.9,data=XY)
计算并绘制预测曲线:
xvec <- seq(0,16,length.out=101)
pp <- predict(qq,newdata=data.frame(x=xvec))
plot(y~x,data=XY)
lines(xvec,pp,col=2,lwd=2)
仅保留预测线下方的点:
XY2 <- subset(XY,y<predict(qq,newdata=data.frame(x)))
plot(y~x,data=XY2)
lines(xvec,pp,col=2,lwd=2)
您可以通过减少结数来减少线的摆动,例如y~ns(x,10)
下图是excel文件中x,y的设置图,共有8760对x和y。我想去除红圈区域的噪声数据对,并输出一个新的 excel 文件,其中包含剩余数据对。我怎么能在 R 中做到这一点?
R 和 EXCEL 都读取和写入 .csv 文件,因此您可以使用它们来回传输数据。
你没有提供任何数据所以我做了一些垃圾数据产生了类似的问题。
数据
set.seed(2017)
x = runif(8760, 0,16)
y = c(abs(rnorm(8000, 0, 1)), runif(760,0,8))
XY = data.frame(x,y)
识别噪声点的一种方法是查看与最近邻居的距离。在密集区域,最近的邻居会更近。在非密集区域,它们将分开得更远。包 dbscan
提供了一个很好的函数来获取到 k 最近邻居的距离。对于这个问题,我使用了 k=6,但您可能需要调整您的数据。查看到第 6 个最近邻的距离分布,我们看到大多数点在 0.2
XY6 = kNNdist(XY, 6)
plot(density(XY6[,6]))
所以我假设第 6 个最近邻更远的点是噪声点。只需更改颜色以查看哪些点受到影响,我们得到
TYPE = rep(1,8760)
TYPE[XY6[,6] > 0.2] = 2
plot(XY, col=TYPE)
当然,如果你想限制到非噪声点,你可以使用
NonNoise = XY[XY6[,6] > 0.2,]
使用@G5W 的例子:
补数据:
set.seed(2017)
x = runif(8760, 0,16)
y = c(abs(rnorm(8000, 0, 1)), runif(760,0,8))
XY = data.frame(x,y)
将分位数回归拟合到第 90 个百分位数:
library(quantreg)
library(splines)
qq <- rq(y~ns(x,20),tau=0.9,data=XY)
计算并绘制预测曲线:
xvec <- seq(0,16,length.out=101)
pp <- predict(qq,newdata=data.frame(x=xvec))
plot(y~x,data=XY)
lines(xvec,pp,col=2,lwd=2)
仅保留预测线下方的点:
XY2 <- subset(XY,y<predict(qq,newdata=data.frame(x)))
plot(y~x,data=XY2)
lines(xvec,pp,col=2,lwd=2)
您可以通过减少结数来减少线的摆动,例如y~ns(x,10)