首页 文章

R中的邻近空间滤波

提问于
浏览
2

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

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

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

谢谢!

4 回答

  • 1

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

    距离以 Map 单位表示 . 将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)
    
  • 0

    我写了这个函数的新版本,不再真正遵循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

  • 1

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

  • 1

    您可以考虑空间分割,而不是删除数据点 . 这涉及给予群集中的点的权重低于边远点 . 这两种最简单的方法涉及多边形分割,如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图,但是可以使用其他技术计算多边形分割,或者可以手动指定多边形分割 .

相关问题