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

Jer*_*oen 4 r spatial geospatial cran

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

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

mds*_*ner 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)
Run Code Online (Sandbox Code Playgroud)

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