英文:
Is where a way to find close pairs within a specific box eround each point in spatstat?
问题
I'm working with spatstat
package in R.
我正在使用R中的spatstat
包。
I have marked point patterns with mark variables Name, boxA, boxB. BoxA and boxB are dimensions of a rectangle around each point (bounding boxes).
我使用标记变量Name、boxA和boxB标记了点模式。BoxA和boxB是围绕每个点的矩形的尺寸(边界框)。
I want to delete points which lay inside the bounding boxes of other points.
我想要删除位于其他点的边界框内的点。
Previously I did it using closepairs
and crosspairs
and a fixed radius for neighboring points like this:
以前,我使用closepairs
和crosspairs
以及固定半径来处理相邻点,如下所示:
I used different radius for both classes of points because their bounding boxes differed in size.
我为两类点使用了不同的半径,因为它们的边界框尺寸不同。
However now I have points with very different boxes within each class.
然而,现在每个类别内的点的边界框非常不同。
Is there a built-in function in spatstat to determine radius for the "close_list" for each point individually according to boxA or boxB or even to use for each point rectangles with their box dimensions instead of circles?
spatstat中是否有内置函数可以根据boxA或boxB为每个点单独确定“close_list”的半径,甚至可以为每个点使用具有其边界框尺寸而不是圆形的矩形?
英文:
I'm working with spatstat
package in R.
I have marked point patterns with mark variables Name, boxA, boxB. BoxA and boxB are dimensions of a rectangle around each point (bounding boxes).
here is an example:
>split(u) # splits pattern in two classes of cells accord. to Name
Point pattern split by factor
negat:
Marked planar point pattern: 843917 points
Mark variables: Name, boxA, boxB
window: rectangle = [3164, 66924] x [25085, 84325] units
posit:
Marked planar point pattern: 93569 points
Mark variables: Name, boxA, boxB
window: rectangle = [3164, 66924] x [25085, 84325] units
I want to delete points which lay inside the bounding boxes of other points. Previously I did it using closepairs
and crosspairs
and a fixed radius for neighbouring points like this:
for (i in 1:length(names(u))) {
if (names(u)[i] == "posit"){ R <- 20 }else{R <- 13}
close_list = closepairs(u[[i]], rmax = R, twice = FALSE)
close_index <- close_list$j
if(is.empty(close_index) == F){ u[[i]] <- u[[i]][-close_index] }
}
close_list <- NULL
close_list = crosspairs(u$negat, u$posit, 13)
close_index <- close_list$i
if(is.empty(close_index) == F){u$negat <- u$negat[-close_index]}
I used different radius for both classes of points because their bounding boxes differed in size. However now I have points with very different boxes within each class.
Is where a build-in function in spatstat to determine radius for the "close_list" for each point individually according to boxA or boxB or even to use for each point rectangles with their box dimensions instead of circles?
@Adrian Baddeley offered a solution below to which I added a nested loop to find the numbers of points with overlapping boxes. Here is a small working example in which bounding boxes of points 3 and 4 overlap too much:
# pattern
X<-as.ppp(cbind(c(1,2.5,2,3),c(1,1,3,3)),c(0,5,0,5))
# marks (size of the bounding boxes (BB) around points)
M<-cbind("boxA"=c(1.5,2,4,3),"boxB"=c(1.5,2,4,3))
M<-as.data.frame(M)
X$marks<-M
# find and delete points inside BB of other points
df <- as.data.frame(X)
dx <- with(df, outer(x, x, "-"))
dy <- with(df, outer(y,y,"-"))
conflict <- (abs(dx) < df$boxA/2) & (abs(dy) < df$boxB/2)
diag(conflict) <- FALSE
conflict[upper.tri(conflict)] <- FALSE
index<-c()
for(i in 1:dim(conflict)[1]){
for(j in 1:dim(conflict)[2]){
if(conflict[i,j] == TRUE){
index <- c(index, i)}
}
}
X<-X[-index]
This works fine with the small test pattern. I'll test it on real data though.
答案1
得分: 2
如果所有的框都具有相同的高宽比(高度与宽度的比率),那么您可以使用 nndist.ppp
、pairdist.ppp
或 nncross.ppp
,并使用参数 metric
来指定矩形距离度量(请参阅帮助文件和 convexmetric
的示例)。例如,如果高宽比是1.5,则
m <- convexmetric(owin(c(-1,1)/2, c(-1.5, 1.5)/2)
D <- pairdist(X, metric=m)
将给出所有点对之间的矩形距离。
如果框具有不同的高宽比,则 spatstat
中没有现有的支持来进行此计算。我建议将点模式数据转换为数据框,使用 as.data.frame
,然后使用 outer
来执行计算。
英文:
If all the boxes have the same aspect ratio (ratio of height to width) then you could use nndist.ppp
or pairdist.ppp
or nncross.ppp
using the argument metric
to specify a rectangular distance metric (see the help file and examples for convexmetric
). For example if the aspect ratio is 1.5 then
m <- convexmetric(owin(c(-1,1)/2, c(-1.5, 1.5)/2)
D <- pairdist(X, metric=m)
gives you the rectangular distances between all pairs of points.
If the boxes can have different aspect ratios, then there is no existing support in spatstat
for this calculation. I would recommend converting the point pattern data to a data frame using as.data.frame
and then using outer
to perform the calculation.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论