filterByProximity <- function(xy, dist, mapUnits = F) {
#xy can be either a SpatialPoints or SPDF object, or a matrix
#dist is in km if mapUnits=F, in mapUnits otherwise
if (!mapUnits) {
d <- spDists(xy,longlat=T)
}
if (mapUnits) {
d <- spDists(xy,longlat=F)
}
diag(d) <- NA
close <- (d <= dist)
diag(close) <- NA
closePts <- which(close,arr.ind=T)
discard <- matrix(nrow=2,ncol=2)
if (nrow(closePts) > 0) {
while (nrow(closePts) > 0) {
if ((!paste(closePts[1,1],closePts[1,2],sep='_') %in% paste(discard[,1],discard[,2],sep='_')) & (!paste(closePts[1,2],closePts[1,1],sep='_') %in% paste(discard[,1],discard[,2],sep='_'))) {
discard <- rbind(discard, closePts[1,])
closePts <- closePts[-union(which(closePts[,1] == closePts[1,1]), which(closePts[,2] == closePts[1,1])),]
}
}
discard <- discard[complete.cases(discard),]
return(xy[-discard[,1],])
}
if (nrow(closePts) == 0) {
return(xy)
}
}
4 回答
按照Josh O'Brien的建议,我查看了spatstat的rMaternI函数,并提出了以下内容 . 它似乎工作得很好 .
距离以 Map 单位表示 . 将R的距离函数中的一个总是以米为单位而不是输入单位,这将是很好的,但我无法弄清楚...
我写了这个函数的新版本,不再真正遵循rMaternII . 输入可以是SpatialPoints,SpatialPointsDataFrame或矩阵对象 .
似乎运作良好,但建议欢迎!
我们来测试一下:
还有一个名为spThin的R包,它对点数据执行空间细化 . 它的开发是为了减少物种分布模型的采样偏差的影响,并进行多次迭代以进行优化 . 该功能很容易实现---插图可以找到here . 在Ecography中还有paper,其中包含有关该技术的详细信息 .
您可以考虑空间分割,而不是删除数据点 . 这涉及给予群集中的点的权重低于边远点 . 这两种最简单的方法涉及多边形分割,如Voronoi图或某些任意网格 . 两种方法都将根据区域的面积对每个区域中的点进行加权 .
例如,如果我们在测试中采用点
(1,1),(2,2),(4.5,4.5),(5,5),(1,5)
并应用常规的2×2网格,其中每个单元格在一侧有三个单位,则五个点落入三个单元格 . 落入单元[0,3]X[0,3]
的点将分别具有权重1 /(当前单元TIMES中的点数 . 被占用单元的数量)= 1 /(2 * 3) . 单元格(3,6]X(3,6]
中的点((4.5,4.5),(5,5))
也是如此 . "outlier",(1,5)
的重量为1 /(1 * 3) . 这种技术的优点在于它是一种快速生成基于密度的加权方案的方法 .多边形分割涉及围绕每个点绘制多边形,并使用该多边形的区域来计算权重 . 通常,多边形完全覆盖整个区域,并且权重被计算为每个多边形的面积的倒数 . 通常使用Voronoi图,但是可以使用其他技术计算多边形分割,或者可以手动指定多边形分割 .