5

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

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

4

3 回答 3

6

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

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

有一个简单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)

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

于 2012-06-06T07:02:44.720 回答
3

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

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

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

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

于 2012-06-06T08:18:20.737 回答
0

作为对 spacedman 的回应——我很确定最小二乘是行不通的。最小二乘法以屈服于异常值的需求而闻名,而对“附近”的事物没有太大的权重。这与所期望的相反。

在我看来,二方估计器可能会更好地工作 - 但我从未使用过它。我认为它还需要一些调整。

它或多或少类似于距 0 一定距离的最小二乘估计量,然后权重在此之外是恒定的。所以一旦一个点变成异常值,它的惩罚是恒定的。我们不希望离群值随着我们远离它们而越来越重,我们宁愿称它们为常数,并让优化专注于更好地拟合集群附近的事物。

于 2014-02-12T09:35:14.033 回答