微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

匹配点并计算总距离/精度

如何解决匹配点并计算总距离/精度

我有一个包含 309 个数据框的列表 list.response。在每个数据框中有 10 行和 2 列。列是 X 和 Y 坐标,代表“点击次数”,这是调查受访者在图片上所做的。

此外,我还有另一个具有 10 个 XY 坐标的数据框 df.true。这些坐标代表了受访者在调查中试图点击的对象的坐标。

目标:对于每个受访者(即 list.response 中的每个数据框),我想计算他们在尝试单击对象时的准确度。换句话说:他们 10 次点击的坐标与 df.true 中 10 个对象的坐标之间的距离是多少。

我的问题是他们点击的坐标和对象的坐标顺序不一样。例如,受访者 A 可能从左到右点击了对象,而受访者 B 可能从右到左点击了对象,这搞乱了点击和对象的顺序。因此,我需要将受访者的点击与最近的对象相匹配。匹配的标准是:

  • 点击和对象之间的空间距离应尽可能小。
  • 一次点击只能与一个对象匹配,反之亦然(即,如果存在点击对象匹配,则不应在任何其他匹配中使用,即使它在最短距离方面很有用)。

最后,我想计算所有匹配点之间的总距离(即汇总所有匹配点之间的距离)。这将是我对受访者点击对象的总体准确度的衡量标准。


我已经研究了一些类似问题的解决方案(请参阅 Working with spatial data: How to find the nearest neighbour of points without replacement?https://gis.stackexchange.com/questions/297153/excluding-point-from-nearest-neighbor-search-once-its-been-matched-using-r),但是我无法在我的情况下使其发挥作用。免责声明:我是 R / 编程的新手

我希望有人能够帮助我吗?


可复制示例的数据:

点击列表中的 20 个 df 示例:

list.response <- list(structure(list(X = c(536,160,467,552,476,242,355,414,556,0),Y = c(91,181,128,84,52,379,434,528,551,0)),row.names = c(NA,-10L),class = "data.frame"),structure(list(
    X = c(536,542,455,148,70,239,369,416,553,94,110,185,98,387,427,509,554,structure(list(X = c(536,232,374,425,561,461,544,473,193,380,426,513,559,105,97,37,156,240,375,549,547,194,389,116,87,494,structure(list(
        X = c(536,543,482,241,368,418,99,107,93,47,385,511,480,458,81,158,231,393,409,558,35,91,114,175,423,508,562,67,492,460,364,407,48,108,391,428,507,0
    )),371,563,449,510,44,96,485,462,419,71,50,499,183,362,76,243,505,103,187,386,155,245,359,456,535,483,119,92,366,451,538,190,53,412,153,481,512,100,457,151,73,45,186,182,43,104,388,238,154,454,430,184,149,417,555,46,109,541,244,370,88,147,557,38,397,433,506,class = "data.frame"))

和 df.true 坐标:

df.true <- structure(list(X = c(71,415,Y = c(99,429,class = "data.frame") 

解决方法

我想出了一个解决方案。首先,我将所有数据帧转换为矩阵。然后我使用了这里的函数:https://gis.stackexchange.com/questions/297153/excluding-point-from-nearest-neighbor-search-once-its-been-matched-using-r:

pairup <- function(list1,list2){
  keep = 1:nrow(list2)
  used = c()
  for(i in 1:nrow(list1)){
    nearest = FNN::get.knnx(list2,list1[i,drop=FALSE],1)$nn.index[1,1]        
    used = c(used,keep[nearest])
    keep = keep[-nearest]
    list2 = list2[-nearest,drop=FALSE]
  }
  used
}

然后我运行了 for 循环:

#Define an empty vector 
pm <- c()

#Run loop and calculate distance
for (i in 1:length(list.response)) {
  match <- pairup(list.response[[i]],df.true)
  pm[i]<-sum(pointDistance(list.response[[i]],df.true[match,],lonlat=FALSE))
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。