在R中将空间数据聚类 [关闭]


34

我有一堆经度和纬度的数据点。我想使用R根据它们的距离对它们进行聚类。

我已经看过页面并尝试过clustTool软件包。但是我不确定clustTool中的clust函数是否将数据点(纬度,经度)视为空间数据,并使用适当的公式来计算它们之间的距离。

我的意思是我看不到它们如何区分空间数据和序数数据。我相信地图(空间)上的两个点与两个法线之间的距离计算是不同的。(不是吗?)

如果我想在集群中考虑第三个参数,还会发生什么?

就像说如果我有(lat,lon)和另一个参数。

距离如何计算?

我在clustTool上遇到的另一个问题是,它在设计时考虑了GUI。我不知道如何跳过库中的GUI开销,因为我不需要它。

我在R中有哪些选项可用于空间数据的聚类分析?



Tnx Whuber。我有个问题。R中是否有用于空间聚类的特定程序包?我的意思是,据我所知,对于空间数据,应该以不同的方式计算距离。它是否正确?
kaptan 2011年

我遇到的几乎所有通用群集程序包(包括R)Cluster都将接受相异性距离矩阵作为输入。只要您可以自己计算距离,这将使它们完全通用并适用于球面上的聚类,这很简单。
whuber

我长期面临着一个非常类似的问题,但是找不到一个好的解决方案,您可以查看一下我在stack-exchange中的文章。我有一组每月的海面温度数据(lon,lat,sst)。您是否找到了找到此类空间数据聚类的方法?我找不到合适的R包/功能。在此先感谢Paco
pacomet 2012年

您是否考虑过使用SatScan?

Answers:


13

这是一个基于查找基于距离规则的点的聚类的解决方案,但使用distmgeosphere包中的函数:

library(sp)
library(rgdal)
library(geosphere)

# example data from the thread
x <- c(-1.482156, -1.482318, -1.482129, -1.482880, -1.485735, -1.485770, -1.485913, -1.484275, -1.485866)
y <- c(54.90083, 54.90078, 54.90077, 54.90011, 54.89936, 54.89935, 54.89935, 54.89879, 54.89902)

# convert data to a SpatialPointsDataFrame object
xy <- SpatialPointsDataFrame(
      matrix(c(x,y), ncol=2), data.frame(ID=seq(1:length(x))),
      proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

# use the distm function to generate a geodesic distance matrix in meters
mdist <- distm(xy)

# cluster all points using a hierarchical clustering approach
hc <- hclust(as.dist(mdist), method="complete")

# define the distance threshold, in this case 40 m
d=40

# define clusters based on a tree "height" cutoff "d" and add them to the SpDataFrame
xy$clust <- cutree(hc, h=d)

您应该得到类似以下内容:

        coordinates ID clust
1 (-1.482156, 54.90083)  1     1
2 (-1.482318, 54.90078)  2     1
3 (-1.482129, 54.90077)  3     1
4  (-1.48288, 54.90011)  4     2
5 (-1.485735, 54.89936)  5     3
6  (-1.48577, 54.89935)  6     3
7 (-1.485913, 54.89935)  7     3
8 (-1.484275, 54.89879)  8     4
9 (-1.485866, 54.89902)  9     3

接下来的步骤仅用于可视化:

library(dismo)
library(rgeos)

# expand the extent of plotting frame
xy@bbox[] <- as.matrix(extend(extent(xy),0.001))

# get the centroid coords for each cluster
cent <- matrix(ncol=2, nrow=max(xy$clust))
for (i in 1:max(xy$clust))
    # gCentroid from the rgeos package
    cent[i,] <- gCentroid(subset(xy, clust == i))@coords

# compute circles around the centroid coords using a 40m radius
# from the dismo package
ci <- circles(cent, d=d, lonlat=T)

# plot
plot(ci@polygons, axes=T)
plot(xy, col=rainbow(4)[factor(xy$clust)], add=T)

情节


我对此有疑问:我有距离矩阵,并且我发现每个项目的最大距离:for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } 它需要花费,4但是当我应用x <- cutree(hc, h=5)它时,我得到了187个簇中的101个。逻辑上应该是1。怎么了?
Peter.k

嗨,我不确定如何在这里为您提供帮助。我做了一个小例子,它工作正常:x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x))。正如您所期望的,这将为您提供一个群集。尝试使用:绘制聚类模型plot(hc),并查看最大值。
ssanch

11

有一些函数可以计算R中球形地球上的真实距离,因此也许您可以使用这些函数并使用距离矩阵而不是坐标来调用聚类函数。我永远不记得这些名称或相关软件包。有关线索,请参见R空间任务视图。

另一种选择是将点转换为参考系统,以使距离欧几里得。在英国,我可以使用OSGrid参考系统:

 data = spTransform(data,CRS("+epsg:27700"))

使用来自软件包“ rgdal”(或maptools)的spTransform。为您的数据找到一个网格系统(相关的UTM区域可能会做),您将以米为单位计算距离没有问题。

这仅在您的数据很小的情况下才有用-如果您具有全局数据,那么您确实需要计算球面距离,并且该距离在R空间任务视图中讨论的一个(或多个)软件包中的某个位置:

http://cran.r-project.org/web/views/Spatial.html

看起来您想要打包“ geosphere”,但请务必阅读空间任务视图!


7

我来看看Spatstat软件包。整个软件包专用于分析空间点模式(原文如此)。CSIRO的Adrian Baddeley教授写了一本很棒的电子书其中包含详细的文档,操作方法和整个软件包的示例。请看第19章“点模式的距离方法”。

也就是说,我不确定即使spatstat也会区分空间数据和顺序数据,因此您可能希望将点重新投影为具有一致的x和y值的东西-可能尝试使用rgdal(GDAL和OGR的R库)。


tnx。那是一本很棒的电子书。但是我不确定如何使用此Spatstat进行群集,因为我看不到任何特定的群集功能。你能解释一下吗?
kaptan

2
实际上,说句公道话,再看一遍,我会看一下DCluster程序包,该程序包也是Bivand撰写的用于分析疾病集群的程序包。另外,很抱歉等待回复!
om_henners 2011年

6

也许这个答案来的太晚了2年,但无论如何。

据我所知,空间聚类至少在开始时就需要将聚类约束到的已定义邻域。SpatialEpi软件包中的kulldorf函数允许基于聚集的邻域进行空间聚类。

此外,fpc软件包中的DBSCAN统计信息可能会很有用。

另请参阅此处进行类似的讨论:https : //stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

此处提供了有关最近的群集算法(例如CHAMAELEON)的有趣文章:http : //www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf


Han等人的论文“数据挖掘中的空间聚类方法:调查”现在可以在以下位置
knb

5

虽然不是一个R软件包,但是geoda可能是一个有趣的程序,因为它是由Luc Anselin撰写的,他为空间聚类理论做出了贡献,我相信它可以实现一些聚类(尽管自从我探索它以来已经有一段时间了)。

spdep是一个很棒的R程序包。它包括通过“树边缘去除”skater进行空间“ K”光泽分析的功能。它还带来了其他用于空间分析的功能,包括空间自相关以及使用Local Moran和其他空间统计信息检测局部聚类的功能。描述如下:

一组函数,用于从多边形连续性,按距离和细分的点模式创建空间权重矩阵对象,以汇总这些对象,并允许其在空间数据分析中使用,包括通过最小生成树进行区域聚合;空间自相关测试的集合,包括全局Moran的I,APLE,Geary的C,Hubert / Mantel通用叉积统计,经验贝叶斯估计和Assunção/ Reis指数,Getis / Ord G和多色联接计数统计,本地Moran的I和Getis / Ord G,全球和局部Moran I的鞍点近似值和精确测试;估算空间同时自回归(SAR)滞后和误差模型的功能和功能,滞后模型的影响度量,

您至少可以测试您的点是否在空间上随机分布(考虑空间距离时可能是有用的测试预聚类),但是它还可以生成其他有用的量度,您可以将其输入到聚类算法中。最后,也许您会在以下方面找到有用的问题 https://stats.stackexchange.com/有关空间聚类问题的问题(尽管从理论角度来看更多)。


这个答案是确定许多相同类型的功能,分析spatstat库中可用的空间模式或点模式的自相关。在有趣的地方,这与聚类问题并不完全相关。我全都进行假设检验和探索性分析,但也应该直接解决眼前的问题。使用spdep进行聚类的方法是基于空间权重矩阵[Wij],该权重矩阵使用k个最近邻,偶发性事件或距离。
杰弗里·埃文斯

2

尝试使用R中的LeaderCluster packacge。与许多其他群集算法不同,它不需要用户指定群集数量,而是需要群集的近似半径作为其主要调整参数。


-2

检查地球包裹距离函数或化石度距函数。您具有度数数据,并且需要在进行聚类之前将其转换为米或英尺。

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.