使用空间数据:如何在不替换的情况下找到点的最近邻居?
Working with spatial data: How to find the nearest neighbour of points without replacement?
我目前正在处理一些森林清单数据。
数据是在样本地块上收集的,其位置可作为点数据(空间数据)使用。
我有两个数据集:
- 数据集 dat.1,带有物种 A 的 n 个样地
- 数据集 dat.2,带有物种 B 的 k 个样地
n < k
我要做的是将 dat.1 的每个点与 dat.2 的一个点匹配。结果应该是 n 对点。因此,应选择 dat.2 中的 k 个地块中的 n 个。
匹配条件为:
- 一对点之间的空间距离越近越好
- dat.2中的一个点只能与dat.1中的一个点匹配,反之亦然。所以如果有一对点,这些点不应该用于任何其他对,即使它在最短距离方面是有用的。 “占用”的点数不应被替换,也不应在进一步的匹配过程中使用。
我一直在寻找执行此分析的方法。 '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
包中的 pairmatch
。 pairmatch
执行 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),]
我目前正在处理一些森林清单数据。 数据是在样本地块上收集的,其位置可作为点数据(空间数据)使用。
我有两个数据集:
- 数据集 dat.1,带有物种 A 的 n 个样地
- 数据集 dat.2,带有物种 B 的 k 个样地
n < k
我要做的是将 dat.1 的每个点与 dat.2 的一个点匹配。结果应该是 n 对点。因此,应选择 dat.2 中的 k 个地块中的 n 个。
匹配条件为:
- 一对点之间的空间距离越近越好
- dat.2中的一个点只能与dat.1中的一个点匹配,反之亦然。所以如果有一对点,这些点不应该用于任何其他对,即使它在最短距离方面是有用的。 “占用”的点数不应被替换,也不应在进一步的匹配过程中使用。
我一直在寻找执行此分析的方法。 '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
包中的 pairmatch
。 pairmatch
执行 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),]