本文介绍了处理空间数据:如何在不替换的情况下找到最近的点邻居?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我目前正在处理一些森林调查数据。这些数据是在样地上收集的,样地的位置可以作为点数据(空间数据)。
我有两个数据集:
- 数据集dat.1,物种A的n个样地
- 数据集data2,物种B的k个样地
使用n<;k
我想要做的是将数据1的每个点与一个数据点2进行匹配。结果应该是n对点。因此,应从dat2中选择k个曲线图中的n个。
匹配条件为:
- 一对点之间的空间距离应尽可能接近
- 数据2的一个点只能与数据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),]
这篇关于处理空间数据:如何在不替换的情况下找到最近的点邻居?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!