R中的邻近空间滤波

时间:2014-02-26 19:21:27

标签: r spatial

我有一个物种的出现点,我想消除潜在的采样偏差(某些地区的点密度可能比其他地区大得多)。实现此目的的一种方式是最大化不小于彼此的特定距离X的点的子集。从本质上讲,我会防止积分彼此太靠近。

是否有任何现有的R功能可以做到这一点?我搜索了各种空间包,但没有发现任何东西,也无法弄清楚如何自己实现这个。

可以下载示例事件点数据集here

谢谢!

4 个答案:

答案 0 :(得分:1)

按照Josh O'Brien的建议,我查看了spatstat的rMaternI函数,并提出了以下内容。它似乎工作得很好。

距离以地图单位表示。将R的距离函数中的一个总是以米为单位而不是以输入单位为单位,这将是很好的,但我无法弄明白......

require(spatstat)
require(maptools)
occ <- readShapeSpatial('occurrence_example.shp')

filterByProximity <- function(occ, dist) {
    pts <- as.ppp.SpatialPoints(occ)
    d <- nndist(pts)
    z <- which(d > dist)
    return(occ[z,])
}

occ2 <- filterByProximity(occ,dist=0.2)
plot(occ)
plot(occ2,add=T,col='blue',pch=20)

答案 1 :(得分:1)

我已经写了这个函数的新版本,不再真正遵循rMaternII。 输入可以是SpatialPoints,SpatialPointsDataFrame或矩阵对象。

似乎运作良好,但建议欢迎!

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)
    }
}

让我们测试一下:

require(rgeos)
require(sp)
pts <- readWKT("MULTIPOINT ((3.5 2), (1 1), (2 2), (4.5 3), (4.5 4.5), (5 5), (1 5))")

pts2 <- filterByProximity(pts,dist=2, mapUnits=T)

plot(pts)
axis(1)
axis(2)
apply(as.data.frame(pts),1,function(x) plot(gBuffer(SpatialPoints(coords=matrix(c(x[1],x[2]),nrow=1)),width=2),add=T))
plot(pts2,add=T,col='blue',pch=20,cex=2)

enter image description here

答案 2 :(得分:1)

还有一个名为spThin的R包,它对点数据执行空间细化。它的开发是为了减少物种分布模型的采样偏差的影响,并进行多次迭代以进行优化。该功能非常容易实现---可以找到小插图here。 Ecography中还有一个paper,其中包含有关该技术的详细信息。

答案 3 :(得分:0)

您可以考虑空间分簇,而不是删除数据点。这涉及给予群集中的点的权重低于边远点。这两种最简单的方法涉及多边形分割,如Voronoi图或某些任意网格。这两种方法都会根据该地区的面积对每个地区的重点进行加权。

例如,如果我们在测试(1,1),(2,2),(4.5,4.5),(5,5),(1,5)中取点并应用常规的2乘2网格,其中每个单元格在一侧有三个单位,那么这五个点将分为三个单元格。落入单元((1,1),(2,2))的点[0,3]X[0,3]将各自具有权重1 /(当前单元TIMES中的点数。被占用单元的数量)= 1 /(2 * 3)。单元格((4.5,4.5),(5,5))中的点(3,6]X(3,6]也是如此。 “离群值”(1,5)的权重为1 /(1 * 3)。这项技术的优点在于它是一种快速生成基于密度的加权方案的方法。

多边形分割涉及在每个点周围绘制多边形,并使用该多边形的面积来计算权重。通常,多边形完全覆盖整个区域,并且权重被计算为每个多边形的面积的倒数。通常使用Voronoi图,但是可以使用其他技术计算多边形分割,或者可以手动指定多边形分割。