如何解决匹配点并计算总距离/精度
我有一个包含 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 举报,一经查实,本站将立刻删除。