处理空间数据:如何在不替换的情况下找到最近的点邻居? [英] Working with spatial data: How to find the nearest neighbour of points without replacement?

查看:16
本文介绍了处理空间数据:如何在不替换的情况下找到最近的点邻居?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在处理一些森林调查数据。 这些数据是在样地上收集的,样地的位置可以作为点数据(空间数据)。

我有两个数据集:

  • 数据集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包中的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),]

这篇关于处理空间数据:如何在不替换的情况下找到最近的点邻居?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆