在2D网格/点过程中查找密度峰值/聚类中心

时间:2012-06-06 04:12:22

标签: r geospatial spatial cran

我有一个人手机记录的分钟GPS坐标的数据集。即数据集有1440行,LON / LAT值。基于数据,我想要参与者回家的点估计(lon / lat值)。让我们假设家是他们在给定的24小时间隔内花费大部分时间的单一位置。此外,GPS传感器大多数时间都具有相当高的精度,但有时它完全关闭会导致巨大的异常值。

我认为解决这个问题的最佳方法是将其视为点过程,并使用2D密度估算来找到峰值。在R中有这种本地方式吗?我查看了kde2d(MASS),但这似乎并没有真正起作用。 Kde2d使用密度值创建25x25的数据范围网格。但是,在我的数据中,这个人每天可以轻松地行驶100英里或更多,所以这些街区通常估计太大了。我可以缩小它们并使用更大的网格,但我相信必须有更好的方法来获得点估计。

3 个答案:

答案 0 :(得分:6)

trip包中有“花费时间”功能(我是作者)。您可以根据轨道数据创建对象,这些对象随时间推移了解基础轨迹过程,并简单地处理这些点,假定修复之间有直线段。如果“home”是最大值像素所在的位置,即当您根据持续时间分解所有段并将它们加入单元格时,则很容易找到它。来自tripGrid函数的“花费时间”网格是具有标准SpatialGridDataFrame包类的sp,并且旅行对象可以由一个或多个轨道组成。

使用rgdal,如果lon / lat不适合您的范围,您可以轻松地将坐标转换为适当的地图投影,但对线段的网格/时间计算没有任何影响。

有一个简单的speedfilter来删除修正意味着移动太快,但这非常简单并且可能引入新问题,通常更新或过滤不太可能的移动轨道可能非常复杂。 (根据我的经验,花在网格上的基本时间可以让你像许多复杂的模型一样,只是开辟了新的复杂功能)。过滤器使用笛卡尔坐标或长/纬度坐标,使用sp中的工具来计算距离(长/纬度是可靠的,而不良的地图投影选择可能会引入问题 - 在陆地上像人类这样的短距离它可能不大交易)。

(函数tripGrid使用pixellate.psp计算直线段的确切分量,但该细节隐藏在实现中)。

在数据准备方面,trip严格遵守合理的时间顺序,如果数据有重复,乱序等,将阻止您创建对象。有一个读取数据的示例来自?trip中的文本文件,一个非常简单的例子(真正的)虚拟数据是:

library(trip)
d <- data.frame(x = 1:10, y = rnorm(10), tms = Sys.time() + 1:10, id = gl(1, 5))
coordinates(d) <- ~x+y
tr <- trip(d, c("tms", "id"))
g <- tripGrid(tr)

pt <- coordinates(g)[which.max(g$z), ]
image(g, col = c("transparent", heat.colors(16)))
lines(tr, col = "black")
points(pt[1], pt[2], pch = "+", cex = 2)

虚拟轨道没有重叠区域,但它表明在“花费的时间”中找到最大点非常简单。

答案 1 :(得分:3)

如何使用最小化所有事件的总平方距离的位置?如果我的大脑工作正常,这可能接近任何内核平滑的上限。

如果您的数据包含两个群集(家庭和工作),那么我认为该位置将位于最大的群集中而不是它们之间。它与x和y坐标的简单平均值不同。

对于不确定性,无论您的位置不确定性如何,您的数据都会抖动(如果您从GPS获得该值,那么会很好,否则猜测 - 50米?)并重新计算。做100次,对这些位置进行内核平滑并找到95%的轮廓。

不严谨,我需要尝试这个最小距离/内核上限...

答案 2 :(得分:0)

回应间隔人 - 我很确定最小方块不起作用。最不可靠的方法是为了满足异常值的要求,而不是对“附近”的东西进行太多加权。这与期望的相反。

在我看来,双方估计可能会更好 - 但我从未使用它。我认为这也需要一些调整。

它或多或少像是距离0一定距离的最小二乘估计,然后加权不变。因此,一旦一个点成为异常值,它的惩罚就是不变的。当我们远离它们时,我们不希望异常值越来越重,我们宁愿权衡它们不变,让优化集中在更好地拟合群集附近的东西。