如何使用 R 使用地理邻近度填充缺失的分类值?
Posted
技术标签:
【中文标题】如何使用 R 使用地理邻近度填充缺失的分类值?【英文标题】:How can I fill in missing categorical values using geographical proximity using R? 【发布时间】:2011-11-11 18:25:36 【问题描述】:我有一些看起来像这样的数据:
ID lat long university date cat2 cat3 cat4 ...
00001 32.001 -64.001 MIT 2011-07-01 xyz foo NA ...
00002 45.783 67.672 Harvard 2011-07-01 abc NA lion ...
00003 54.823 78.762 Stanford 2011-07-01 xyz bar NA ...
00004 76.782 23.989 IIT Bombay 2011-07-02 NA foo NA ...
00005 32.010 -64.010 NA 2011-07-02 NA NA hamster...
00006 32.020 -64.020 NA 2011-07-03 NA NA NA ...
00006 45.793 67.700 NA 2011-08-01 NA bar badger ...
我想根据经纬坐标估算大学列的缺失值。这显然是虚构的,因为数据的 500K 行在大学列上相当稀疏。像 Amelia 这样的插补包似乎想根据线性模型拟合数值数据,而 zoo 似乎想根据某种有序序列填充缺失值,而我没有。我想匹配 close lat-longs,而不仅仅是精确的 lat-long 对,所以我不能只通过匹配另一列的值来填充一列。
我计划通过查找与大学相关的所有经纬度对来解决该问题,在它们周围绘制一个边界框,然后对于具有经纬度对但缺少大学数据的所有行,为大学添加适当的值,具体取决于他们在哪个经纬度盒子上,或者可能在已知位置中点的某个半径范围内。
有没有人做过类似的事情?是否有任何软件包可以更轻松地对地理上接近的经纬度对进行分组,甚至可以进行基于地理的插补?
如果可行,我想尝试根据数据中的现有值估算其他一些缺失值(例如 90% 具有 xyz、foo、哈佛值的行在第 4 类中也有狮子,因此我们可以为 cat4 估算一些缺失值),但这是另一个问题,我会想象一个更难的问题,我什至可能没有足够的数据来成功完成。
【问题讨论】:
您介意为我们做一个 dput(datas) 吗? 最简单的方法可能是使用 knn 分类器进行估算。 另外,一个简单的欧几里得距离应该可以解决问题。获取特定大学的任何已知纬度/经度坐标,并将它们分配为大学的坐标。这个数据集应该正好有 Nx2 个条目,其中 N = length(unique(datas$university))。然后,取每个未分类条目与 Nx2 数据集之间的欧几里德距离(二维)。距离最短的条目将是您分配给未分类的纬度/经度对的大学 我会补充 Rguy 的建议,建议您通过根据特定位置找到唯一的对或一组预期的分类值来“开始”。由于它只是 2D,您可以为每个象限分配一个数字作为双重检查,以确保您的欧几里德距离接近您的实际位置(而不是另一个象限位置) 我在这个答案中提供了(有点)有用的链接***.com/questions/2613420/… 【参考方案1】:我没有想到一个包来解决你所描述的问题。我做了一些类似的类型分析,最后我写了一些定制的东西。
只是为了给你一个起点,这里有一个例子,说明了一种进行最近邻计算的方法。计算邻居有点慢,因为很明显,你必须根据每个其他点计算每个点。
## make some pretend data
n <- 1e4
lat <- rnorm(n)
lon <- rnorm(n)
index <- 1:n
myDf <- data.frame(lat, lon, index)
## create a few helper functions
cartDist <- function(x1, y1, x2, y2)
( (x2 - x1)^2 - (y2 - y1)^2 )^.5
nearestNeighbors <- function(x1, y1, x2, y2, n=1)
dists <- cartDist(x1, y1, x2, y2)
orders <- order(dists)
index <- which(orders <= n)
neighborValues <- dists[index]
return(list(index, neighborValues))
## this could be done in an apply statement
## but it's fugly enough as a loop
system.time(
for (i in 1:nrow(myDf))
myDf[i,]$nearestNeighbor <- myDf[nearestNeighbors( myDf[i,]$lon, myDf[i,]$lat, myDf[-i,]$lon, myDf[-i,]$lat )[[1]],]$index
)
【讨论】:
看起来要在相当大的数据上运行需要很长时间,但感谢最近的邻居代码。这正是我一直在寻找的东西。我想我首先要尝试为独特的机构获取我所有已知的经纬度对的中点,并尝试欧几里得距离方法,但我也会对此进行测试,然后回来告诉你我发现了什么。以上是关于如何使用 R 使用地理邻近度填充缺失的分类值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 R 中基于面板数据的客户 ID 的所有列的中值插补填充缺失值?
使用测试集中的缺失值评估 weka 分类器 J48,R RWeka
R语言使用caret包的preProcess函数进行数据填充使用K近邻KNN算法进行缺失值填充