![](/img/trans.png)
[英]Spatial metrics, patch Proximity Index (PROX) and patch Similarity Index (SIMI) (with Search radius e.g. FRAGSTATS) with Python or 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)
除了刪除數據點,您還可以考慮空間聚類 。 這涉及給群集中的點賦予比外圍點更低的權重。 兩種最簡單的方法包括多邊形分割,例如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.