2

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

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 似乎想根据某种有序序列填充缺失值,而我没有。我想匹配接近的经纬度,而不仅仅是精确的经纬度对,所以我不能只通过匹配另一列的值来填充一列。

我计划通过查找与大学相关的所有经纬度对来解决该问题,在它们周围绘制一个边界框,然后对于所有具有经纬度对但缺少大学数据的行,根据哪个纬度为大学添加适当的值- 长框,它们位于,或者可能在已知位置中点的某个半径内。

有没有人做过类似的事情?是否有任何软件包可以更容易地对地理上最接近的经纬度对进行分组,甚至可以进行基于地理的插补?

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

4

1 回答 1

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
}
})
于 2011-11-11T19:42:49.383 回答