Как я могу заполнить пропущенные категориальные значения, используя географическую близость, используя R? - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть некоторые данные, которые выглядят так:

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 и довольно редки на университетской колонке. Пакеты импутации, такие как Амелия, похоже, хотят подогнать числовые данные в соответствии с линейной моделью, а зоопарк, похоже, хочет заполнить пропущенные значения на основе некоторого упорядоченного ряда, которого у меня нет. Я хочу сопоставить close lat-longs, а не просто точные пары lat-long, поэтому я не могу просто заполнить один столбец, сопоставляя значения из другого.

Я планирую подойти к этой проблеме, найдя все пары длинных лат, связанных с университетом, нарисуйте ограничивающий прямоугольник вокруг них, а затем для всех строк с парами длинных лат, но отсутствующих университетских данных, добавьте соответствующее значение для университета в зависимости от университета. в каком лат-длинном боксе они находятся, или, возможно, в пределах определенного радиуса средней точки известных местоположений.

Кто-нибудь когда-нибудь делал что-то подобное? Существуют ли какие-либо пакеты, которые облегчают группирование географически близких пар лат-длин или даже для вменения, основанного на географическом принципе?

Если это сработает, я хотел бы попытаться приписать некоторые другие пропущенные значения на основе существующего значения в данных (например, 90% строк с xyz, foo, значениями Гарварда также имеют льва в 4-й категории). Таким образом, мы можем подсчитать некоторые пропущенные значения для cat4), но это другой вопрос, и я хотел бы представить более сложный вопрос, который, возможно, даже не имел бы достаточно данных для успешного выполнения.

1 Ответ

2 голосов
/ 11 ноября 2011

У меня нет пакета для решения того, что вы описываете.Я провел похожий анализ типов и закончил тем, что написал что-то сделанное на заказ.

Просто для того, чтобы дать вам отправную точку, вот пример одного из способов вычисления ближайшего соседа.Вычисление соседей происходит довольно медленно, потому что, очевидно, вы должны вычислять каждую точку против любой другой точки.

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