使用空间数据:如何在不替换的情况下找到点的最近邻居?

Working with spatial data: How to find the nearest neighbour of points without replacement?

我目前正在处理一些森林清单数据。 数据是在样本地块上收集的,其位置可作为点数据(空间数据)使用。

我有两个数据集:

n < k

我要做的是将 dat.1 的每个点与 dat.2 的一个点匹配。结果应该是 n 对点。因此,应选择 dat.2 中的 k 个地块中的 n 个。

匹配条件为:

我一直在寻找执行此分析的方法。 'nngeo' 中的 st_nn 或 'RANN' 中的 nn2 等函数给出了一个点的 k 个最近邻居。但不排除用这些功能替代的可能性。

在包 'matchIt' 中,可以在不进行替换的情况下执行最近邻匹配。然而,这些函数适用于找到控制变量之间的最近距离,而不是空间位置之间的最近距离。

谁能想出一个想法来满足我的要求? 对于可以帮助我解决此问题的软件包和/或函数的任何提示或建议,我将不胜感激。

您应该做的第一件事是创建您自己的距离矩阵。行应对应于 dat.1 中的行,列应对应于 dat.2 中的行,矩阵中的每个条目都是行中图与列中图之间的距离。您可以通过遍历数据集并计算点之间的欧几里德(或其他)距离来手动执行此操作。您还可以使用 optmatch 包中的 match_on 函数通过以下代码执行此操作:

d <- rbind(dat.1, dat.2)
d$dat <- c(rep(1, nrow(dat.1)), rep(0, nrow(dat.2))
dist <- optmatch::match_on(dat ~ x.coor + y.coord, data = d,
                           method = "euclidean")

一旦你有了这种形式的距离矩阵,你就可以将它提供给 optmatch 包中的 pairmatchpairmatch 执行 K:1 最优匹配,无需替换。匹配是最优的,因为匹配样本中匹配对之间的绝对距离之和尽可能低。它不保证任何一个单元都会得到它最近的邻居,但它确实会产生匹配的样本,以确保没有单元与距离它们太远的其他单元相匹配。您可以为 controls 指定一个参数,以选择每个 dat.1 单位要匹配多少 dat.2 单位。例如,要将 dat.2 中的 2 个地块与 dat.1 中的每个单元匹配,您可以使用

d$pairs <- optmatch::pairmatch(dist)

输出是一个包含每个单元对成员资格的因子。不匹配的单位的值为 NA.

您也可以使用

一步完成此操作
d$pairs <- optmatch::pairmatch(dat ~ x.coor + y.coord, data = d,
                               method = "euclidean")

然后您可以对数据集进行子集化,以便只保留匹配的图:

matched <- d[!is.na(d$pairs),]