我有一个物种的出现点,我想消除潜在的采样偏差(某些地区的点密度可能比其他地区大得多)。实现此目的的一种方式是最大化不小于彼此的特定距离X的点的子集。从本质上讲,我会防止积分彼此太靠近。
是否有任何现有的R功能可以做到这一点?我搜索了各种空间包,但没有发现任何东西,也无法弄清楚如何自己实现这个。
可以下载示例事件点数据集here。
谢谢!
答案 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)
答案 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图,但是可以使用其他技术计算多边形分割,或者可以手动指定多边形分割。