对空间线型进行统计检验?


32

有很多关于空间点图案的测试可以用来确定点是否随机分布,但是是否有针对空间线图案的成熟测试?(我在想直线,只有起点和终点,没有中间节点。)

我要分析的数据是人和动物运动的OD(原点)线。(类似于聚类无向线中的示例。)

到目前为止,一个想法是像4D点那样处理线并使用点图案测试,但是我不确定是否合适。

理想的测试将使确定是否存在线簇成为可能。

本能地,我想说许多始于相同起点但具有各种不同目的地的线路不应被视为集群。另一方面,许多行(接近)并行较长时间的行将是一个群集。 在此处输入图片说明


如果一条线与另一条线平行但1)比第一条线短得多或2)朝第一条线的方向“远”走,
应该怎么做

@radouxju在这种情况下,我想说他们不属于同一个
类群

Answers:


17

这是一个困难的问题,因为针对线要素开发的空间过程统计数据很少(如果有的话)。如果不认真研究方程式和代码,则点过程统计信息将不易应用于线性特征,因此在统计上是无效的。这是因为测试给定模式的空值是基于点事件,而不是随机字段中的线性依存关系。我不得不说,就强度和排列/方向而言,甚至更加困难,我什至不知道零值是什么。

我只是在这里吐口水,但是,我想知道,线密度与欧几里德距离(如果线很复杂,则是Hausdorff距离)的多尺度评估,是否不能表示对聚类的连续测量。然后,可以使用方差考虑长度差异来将此数据汇总为线向量(Thomas 2011),并使用统计量(例如K均值)分配聚类值。我知道您不是在分配集群之后,但是集群值可能会划分集群的程度。显然,这将需要k的最佳拟合,因此不会分配任意簇。我认为这将是一种在图论模型中评估边缘结构的有趣方法。

抱歉,这是R中的一个有效示例,但是比提供QGIS示例更快,更可重复,并且在我的舒适范围内还可以:)

添加库并使用spatstat中的铜psp对象作为示例

library(spatstat)
library(raster)
library(spatialEco)

data(copper)
l <- copper$Lines
l <- rotate.psp(l, pi/2)

计算标准化的一阶和二阶线密度,然后强制转换为栅格类对象

d1st <- density(l)
  d1st <- d1st / max(d1st)
  d1st <- raster(d1st)  
d2nd <- density(l, sigma = 2)
  d2nd <- d2nd / max(d2nd)
  d2nd <- raster(d2nd)  

将一阶和二阶密度标准化为比例积分密度

d <- d1st + d2nd
d <- d / cellStats(d, stat='max')  

计算标准化的反欧氏距离并强制转换为栅格类

euclidean <- distmap(l)
euclidean <- euclidean / max(euclidean)
euclidean <- raster.invert(raster(euclidean))

将spatstat psp强制转换为sp SpatialLinesDataFrame对象,以在raster :: extract中使用

as.SpatialLines.psp <- local({
     ends2line <- function(x) Line(matrix(x, ncol=2, byrow=TRUE))
     munch <- function(z) { Lines(ends2line(as.numeric(z[1:4])), ID=z[5]) }
     convert <- function(x) {
        ends <- as.data.frame(x)[,1:4]
        ends[,5] <- row.names(ends)
        y <- apply(ends, 1, munch)
        SpatialLines(y)
     }
     convert
})
l <- as.SpatialLines.psp(l)
l <- SpatialLinesDataFrame(l, data.frame(ID=1:length(l)) )

绘制结果

par(mfrow=c(2,2))
  plot(d1st, main="1st order line density")
    plot(l, add=TRUE)
  plot(d2nd, main="2nd order line density")
    plot(l, add=TRUE) 
  plot(d, main="integrated line density")
    plot(l, add=TRUE)   
  plot(euclidean, main="euclidean distance")
    plot(l, add=TRUE) 

提取栅格值并计算与每行关联的摘要统计信息

l.dist <- extract(euclidean, l)
l.den <- extract(d, l)
l.stats <- data.frame(min.dist = unlist(lapply(l.dist, min)),
                      med.dist = unlist(lapply(l.dist, median)),
                      max.dist = unlist(lapply(l.dist, max)),
                      var.dist = unlist(lapply(l.dist, var)),
                      min.den = unlist(lapply(l.den, min)),
                      med.den = unlist(lapply(l.den, median)),
                      max.den = unlist(lapply(l.den, max)),
                      var.den = unlist(lapply(l.den, var)))

使用optimum.k函数,使用聚类轮廓值评估最佳k(聚类数),然后将聚类值分配给线。然后,我们可以为每个聚类分配颜色,并在密度栅格上进行绘制。

clust <- optimal.k(scale(l.stats), nk = 10, plot = TRUE)                      
  l@data <- data.frame(l@data, cluster = clust$clustering) 

kcol <- ifelse(clust$clustering == 1, "red", "blue")
plot(d)
  plot(l, col=kcol, add=TRUE)

在这一点上,可以对线进行随机化,以测试所得的强度和距离是否与随机无关。您可以使用“ rshift.psp”功能随机调整行的方向。您还可以随机化起点和终点,然后重新创建每一行。

人们还想知道,如果您只是使用起点和终点(线的不变性)的单变量或交叉分析统计信息来执行点模式分析,那该怎么办?在单变量分析中,您将比较起点和终点的结果,以查看两个点模式之间的聚类是否一致。这可以通过F型帽,G型帽或Ripley's K型帽来完成(对于未标记的点处理)。另一种方法是交叉分析(例如,cross-K),其中通过将两点过程标记为[start,stop]同时对其进行测试。这将指示聚类过程中起点和终点之间的距离关系。然而,在这些类型的模型中,对基本强度过程的空间依赖性(非静态性)可能是一个问题,这会使它们不均匀并需要不同的模型。具有讽刺意味的是,使用强度函数对不均匀过程进行建模,该函数使我们将整个圆返回到密度,从而支持使用比例积分密度作为聚类度量的想法。

这是使用线要素类的起点,终点位置进行未标记点过程的自相关的Ripleys K(Besags L)统计信息的快速可行示例。最后一个模型是使用起始和终止位置作为标称标记过程的叉形图。

library(spatstat)
  data(copper)
  l <- copper$Lines
  l <- rotate.psp(l, pi/2)

Lr <- function (...) {
 K <- Kest(...)
  nama <- colnames(K)
   K <- K[, !(nama %in% c("rip", "ls"))]
   L <- eval.fv(sqrt(K/pi)-bw)
  L <- rebadge.fv(L, substitute(L(r), NULL), "L")
 return(L)
}

### Ripley's K ( Besag L(r) ) for start locations
start <- endpoints.psp(l, which="first")
marks(start) <- factor("start")
W <- start$window
area <- area.owin(W)
lambda <- start$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's K ( Besag L(r) ) for end locations
stop <- endpoints.psp(l, which="second")
  marks(stop) <- factor("stop")
W <- stop$window
area <- area.owin(W)
lambda <- stop$n / area
 ripley <- min(diff(W$xrange), diff(W$yrange))/4
   rlarge <- sqrt(1000/(pi * lambda))
     rmax <- min(rlarge, ripley)
( Lenv <- plot( envelope(start, fun="Lr", r=seq(0, rmax, by=1), nsim=199, nrank=5) ) )

### Ripley's Cross-K ( Besag L(r) ) for start/stop
sdata.ppp <- superimpose(start, stop)
( Lenv <- plot(envelope(sdata.ppp, fun="Kcross", r=bw, i="start", j="stop", nsim=199,nrank=5, 
                 transform=expression(sqrt(./pi)-bw), global=TRUE) ) )

参考文献

Thomas JCR(2011)一种新的基于K均值的聚类算法,使用线段作为原型。在:圣马丁C.,金SW。(eds)模式识别,图像分析,计算机视觉和应用程序方面的进展。CIARP2011。计算机科学讲座,第7042卷。施普林格,柏林,海德堡


14

您可能需要研究Fréchet距离。我是在最近一个寻找python实现的问题之后才才发现这一点的。

这是用于找到线串的空间相似性的度量。这与Hausdorff距离(与多边形相似性度量等效,但对于具有方向的线串)等效。

Fréchet距离的定义是,一条狗在一条轨道上与它的主人在第二条轨道上相连的皮带的最小长度,两条皮带都不会向后移动

对于两条紧密放置,几乎平行,以相同方式对齐并具有相似长度的曲线,此度量将具有较小的值。

但是,这并不能回答集群标识部分。

这里有一个全面的介绍。您的情况听起来像第46-49节中提到的一些用例

此指标有很多非地理空间用法,例如

  • 检测基因测序中的常见子模式
  • 手写识别
  • 检测时间序列中的相关时段,例如股票价格历史记录

因此,尽管参考书目中有许多论文都涉及此主题,但其中大多数不是地理空间。同样,这些论文中的大多数都属于算法/数学/计算机科学范畴,而不是地理空间/地球科学范畴,因此是针对性的。

但是这篇论文看起来很有希望:

Buchin,K.,Buchin,M.和Wang,Y.(2009)。通过Fréchet距离进行部分曲线匹配的精确算法。在第20届ACM-SIAM离散算法研讨会论文集,第645–654页

其他一些论文听起来更接近您的意图-聚类识别和将轨迹分配给聚类-但它们使用时间序列数据或其他非地球空间示例进行了说明。但是,他们可能会指出有趣的方向。


2
我认为使用Frechet或Hausdorff距离而不是Euclidean距离的最小链接(或DBSCAN)聚类将是一个不错的解决方案。
dbaston

我喜欢存在Frechet距离,也喜欢演示文稿将“豆形软糖”和“肚脐”进行比较。
Fezter

5

我建议使用与此处说明的方法类似的方法 。

算法和命名:

a)命名层NODES。计算轴承

b)使用距离公差在空间上连接到自身(一对多)。名称层LINKS

c)从LINKS中删除自身的联接,即NAME = NAME_1

d)在LINKS内找到“相同”方向对。我用了:

def theSame(aList,tol):
    maxB=max(aList);minB=min(aList)
    if abs(maxB-minB)<tol:return 1
    if abs(maxB-minB-180)<tol:return 1
    return 0
#-----------
theSame( [!BEARING!, !BEARING_1!],15)

即假设在相反方向上走的线在方向上相似

d)从链接中删除非相似(0)对。

e)计算通过NODES连接的LINKS组,并将组号传输到NODES表:

在此处输入图片说明

不幸:

在此处输入图片说明

但是,组内轴承的简单统计信息,例如:

abs(tan(bearing))

在第一种情况下显示无偏差,在第二种情况下显示很大的偏差。类似地,长度统计可以帮助“长时间并行运行”。

如果上面的内容有意义,我可以使用计算连接的链接组的脚本更新答案。它使用arcpy和networkx模块。

不知道如何处理从同一点向相反方向的一对线...


我会对看脚本感兴趣。
alphabetasoup

1
@RichardLaw按照我的解决方案第一行的链接向下滚动以查看它。我有一个稍微更好的抛光版本,但是可以。逻辑非常简单:1.使用链接和与其相连的节点制作图2.选择第一个节点并找到祖先(第0组)3)从图中删除节点并重复直到没有节点为止。我反复使用它来查找高质量的理事会/ LINZ数据集的断开连接的管道组(流和其他内容)等
FelixIP

5

在我看来,线条的定义存在问题,这将决定使用哪种方法(上面提到的一些方法)。如果这些是OD对,并且几何结构不起作用,那么我将基于网络集群来解决这个问题。您说网络不是形成网络-就是这样,但是起源和目的地可能会落入有意义的区域,因此您可以将其视为网络。

如果几何图形有话要说(这些几何图形,例如GPS轨迹,并且您要考虑几何图形),那么您将需要真正在(x,y,t)空间中工作-运动足迹相似的几何图形但在不同的几何图形时间可能不会被评估为相同-在问题中未指定。

您可以看到的一些可能性:

  1. 最接近您需求的是Dodge,Weibel,Forootan(2009),这里 http://orca.cf.ac.uk/94865/1/PhysicsMovement.pdf
  2. 如果可以简化几何图形,则也许此处提到的参数可能有用:http : //www.tandfonline.com/doi/full/10.1080/17445647.2017.1313788

但是最后,再次阅读您的最初问题,可能会更简单:您可以成对计算(线段之间)线段的线性延伸与其最近点的交点之间的距离,以某种方式归一化(也许基于长度段本身)并使用矩阵聚类算法?推理:相交远的段比相交近的段更相似(平行)。在附图中,您没有说出如何处理偏移(长frechet距离)中的共线或平行线段。我认为这会给上面的解决方案带来麻烦。(为清楚起见,通过在上面明确说明“线性扩展”进行了编辑)

注意(2018年1月):我最近偶然发现了这一点:

  1. 蔡雨涵和吴文mond。“用切比雪夫多项式索引时空轨迹。” 2004 ACM SIGMOD国际数据管理国际会议论文集。ACM,2004年。

这与轨迹相似性有关,因此可以在某种程度上量化相似性。这基于曲线的多项式逼近并计算切比雪夫距离。


4

您能否详细说明正在使用的数据类型?这些只是一系列分离的线还是它们形成一个网络?您是否使用过任何ArcGIS工具进行空间模式分析?当用于非点数据时,许多ArcGIS方法(Ripley的K,NN索引,Morans I)仅使用线/多边形的质心。但是,在这里您可能需要考虑将每条线分成相等的部分,以避免由于它们的质心距离太远而导致不考虑很长的线。

要考虑的另一件事是,从概念上讲,线簇是什么?您可能有许多直线彼此靠近,但是它们的端点可能会分散。同样,您可能会得到许多行,它们的起点和终点彼此非常接近,但是在它们的起点/终点之间却变得非常分散。

但是,一种方法可能是简单地执行线密度分析,以便具有更多线的区域(在某种意义上可以看作是聚类的)将具有较高的网格值,而具有低密度的区域将具有较低的值。这样您会得到一些热点输出;但是,这不能像Morans I或NNI那样提供单一的统计信息。由于一条非常不规则的线(即紧密的螺旋线)与多条线的不同,它也不会区分密度。

抱歉,这并不是您所遇到问题的完整答案,但是我认为,将您要实现的目标的完整概念固定下来可以提供一些更好的解决方案。

更新

根据您给出的示例,我认为FelixlP建议创建具有线方位属性的点以与点模式测量一起使用。除了我将这些点分成相等的段,并在每条线的顶点处有一条线的点。然后,您需要查看将要查看每个点的邻近度以及方位之间的相似性的度量(以便您检测更接近垂直线)。

因此,使用Getis-Ord GI(热点分析)将是一个很好的工具,用于可视化集群的位置。然后是全球Moran's I,以评估全球集群水平。

但是,分割线的距离将影响找到的聚类程度。如果您正在寻找1 km范围内的集群,则需要将线分段到该范围附近。同样,如果您正在寻找100m规模的集群,则需要相应地对线进行分段。这样一来,您就不会错过任何行,也不会将每一行都检测为一个集群。


这些线代表旅行的起点和终点。他们没有形成网络。到目前为止,我已经将R方法用于起点和终点的空间点模式。我不太喜欢使用线质心的想法,但是值得一试来使线致密并分析结果节点,谢谢!
Underdark

如果我找不到更合适的方法,线密度分析可能是一个后备解决方案。
昏暗

将主线缓冲一定距离然后查询未完全包围在缓冲区中的线是否是解决方案?过去,我已经做了很多工作来找到最可能的行进路线,但是数据由多节点折线组成,而不是简单的线段。
jbgramm

@jbgramm我可以想到许多可以计算出某种结果的方法,但是我不是统计学家,因此我在寻找既定方法(如果有)
Underdark

2
使用线中心点(或多个顶点)来表示一个点过程不是一种统计有效的方法。此外,您还将深刻改变空间过程的表示形式。我将发布一些建议,但老实说,唯一提供了某种有效方法的建议是@underdark建议的行密度。跨比例尺加上自相关统计量将指示线性特征中的聚类程度。
杰弗里·埃文斯

3

感谢您的示例。

我没有看到任何确定的方法来计算您要寻找的内容,但是这将是我的方法。这是一种蛮力的解决方案。

计算最小边界矩形,然后将其任意扩展,但在四个角的每个角上均等量放大。

找到创建矩形的质心,为每条线的OD点计算方位角和距离分布,并使用边界矩形的角进行相同的操作,同时比较这些线的方位角。

测试从四个角到每个射线末端的平行度。测试从质心到每个射线末端的平行度。

通过这样做,您可以比较从拐角到末端的偏差。在示例(a)中,您将具有从两个角到三个线簇中的每一个的近平行线。您还将具有从质心到线的远端的近平行线。

例(b),当从每条线的角到末端进行计算时,您几乎没有平行线,但是这些线似乎不是随机的,它们相互之间有微小的偏差。

示例(c)似乎是随机的

示例(d)不是随机的,而是径向的。

在进一步了解这一点时,我将运行上面描述的测试,以及创建从所创建的封闭矩形的角到射线末端的三角形解的测试。相似的内角和面积将有助于验证聚类,除非聚类中的一条线明显短于其他线。

以上只是一个愚人的见解,我可能是错的。


-1

按照您的直觉描述,两条直线平行的标准是什么?

您基本上可以对它们的起点或终点进行测试:
令Sx =(start_x_line_1-start_x_line_2),
Sy =(start_y_line_1-start_y_line_2),
并且Ex,Ey相同,只是它们的终点。

因此,如果sqrt(Sx²+Sy²)和sqrt(Ex²+Ey²)在一定阈值以下,则可以将这些行视为平行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.