如何使用R来使用地理邻近度填写缺失的分类值?

时间:2011-11-11 18:25:36

标签: r geography missing-data

我有一些看起来像这样的数据:

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 ...

我想基于lat-long坐标来计算大学专栏的缺失值。这显然弥补了,因为数据的500K行在大学专栏上相当稀疏。像Amelia这样的估算包似乎想要根据线性模型拟合数值数据,动物园似乎想要根据某种有序系列填充缺失值,而我没有。我想匹配 close lat-longs,而不仅仅是精确的lat-long对,所以我不能只通过匹配另一列的值来填充一列。

我打算通过查找与大学相关联的所有纬度 - 长对,在它们周围绘制一个边界框,然后对于所有具有长对子但缺少大学数据的行来解决问题,为大学依据添加适当的值他们所在的长方箱,或者可能位于已知地点中点的某个半径范围内。

有没有人做过类似的事情?是否有任何软件包可以更容易地在地理位置上接近纬度对,或者甚至可以进行基于地理位置的估算?

如果可行的话,我想根据数据中的现有价值来克服一些其他缺失值(如xyz的90%行,foo,哈佛值也在第4类中有狮子) ,所以我们可以为cat4)计算一些缺失的值,但这是另一个问题,我会想象一个更难的,我甚至可能没有足够的数据来成功。

1 个答案:

答案 0 :(得分:2)

我没有考虑解决你所描述的内容的方法。我做了一些类似的类型分析,最后我写了一些定制的东西。

只是为了给你一个跳跃点,这是一个做最近邻居计算方法的例子。计算邻居有点慢,因为显然,你必须针对每个其他点计算每个点。

## 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
}
})