r - 在二维网格/点过程中寻找密度峰值/聚类中心

标签 r geospatial spatial cran

我有一个数据集,其中包含一个人的手机记录的每分钟 GPS 坐标。 IE。数据集有 1440 行,带有 LON/LAT 值。根据数据,我想对参与者家的位置进行点估计(经度/纬度值)。让我们假设家是他们在给定的 24 小时间隔内花费大部分时间的单一地点。此外,GPS 传感器大部分时间都具有相当高的精度,但有时它会完全关闭,从而导致巨大的异常值。

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

最佳答案

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

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

有一个简单的speedfilter要删除暗示移动太快但非常简单并且可能引入新问题的修复,通常更新或过滤不太可能移动的轨迹可能非常复杂。 (根据我的经验,花在网格上的基本时间可以让您获得与许多复杂模型一样好的估计,这些模型只是打开了新的复杂性)。过滤器使用笛卡尔坐标或长/纬度坐标,使用 sp 中的工具计算距离(长/纬度是可靠的,而糟糕的 map 投影选择可能会带来问题——像陆地上的人类一样短距离可能没什么大不了的)。

(函数 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)

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

关于r - 在二维网格/点过程中寻找密度峰值/聚类中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10908070/

相关文章:

r - 在 dplyr 中过滤和取消过滤

algorithm - 将 MongoDB 地理空间索引与 3d 数据结合使用

python - 从 Dask 或 Pandas 数据帧创建地理数据帧的更快方法

php - Mysql 近距离查询

r - 如何对齐多个ggplot2图并在所有图上添加阴影

ROC 的 R 编码

c# - 合并(合并?)并简化/减少 GeoJson 的 DbGeometry 记录

r - 将矩阵转换为R中的栅格

r - ggplot 在 geom_point 中给出 "arguments imply differing number of rows"错误,但它不是真的 - 如何调试?

r - 如何在一个坐标系中绘制两个图表,组合一列的所有值?