簡體   English   中英

通過R中的鄰近度進行空間濾波

[英]spatial filtering by proximity in R

我有一個物種的出現點,我想消除潛在的采樣偏差(某些區域的點密度可能比其他區域大得多)。 一種做到這一點的方法將是使彼此不小於一定距離X的點子集最大化。 本質上,我將防止點之間的距離太近。

是否有任何現有的R函數可以做到這一點? 我搜索了各種空間包,但是什么也沒找到,也無法自己弄清楚如何實現。

可以在此處下載示例出現點數據集。

謝謝!

按照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)

我已經寫了這個函數的新版本,不再真正地跟隨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)

在此處輸入圖片說明

還有一個名為spThin的R包, spThin點數據執行空間細化。 它是為減少采樣偏差對物種分布模型的影響而開發的,並且進行了多次迭代以進行優化。 該功能很容易實現-小插圖可以在這里找到。 Ecography上還有一篇論文詳細介紹了該技術。

除了刪除數據點,您還可以考慮空間聚類 這涉及給群集中的點賦予比外圍點更低的權重。 兩種最簡單的方法包括多邊形分割,例如Voronoi圖或任意網格。 兩種方法都將根據區域的面積對每個區域中的點進行加權。

例如,如果我們在測試中取點(1,1),(2,2),(4.5,4.5),(5,5),(1,5)並應用常規的2×2網格,其中每個像元在一側是三個單元,則五個點落入三個像元。 落入單元格[0,3]X[0,3]的點((1,1),(2,2))每個將具有權重1 /(在當前單元格TIMES tot。no。中的點數占用的單元數)= 1 /(2 * 3)。 單元格(3,6]X(3,6]的點((4.5,4.5),(5,5))也是一樣。“異常值” (1,5)的權重為1 /(1 * 3)。這項技術的優點在於,它是生成基於密度的加權方案的快速方法。

多邊形分割涉及在每個點周圍繪制一個多邊形,並使用該多邊形的面積來計算權重。 通常,多邊形完全覆蓋整個區域,權重計算為每個多邊形的面積的倒數。 通常使用Voronoi圖,但是可以使用其他技術來計算多邊形分割,也可以手動指定多邊形分割。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM