Как я могу заполнить недостающие категориальные значения, используя географическую близость, используя R?

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

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

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

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

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

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


person William Gunn    schedule 11.11.2011    source источник
comment
Не могли бы вы сделать для нас dput (данные)?   -  person Rguy    schedule 11.11.2011
comment
Самым простым способом, вероятно, было бы просто вменение с использованием классификатора Knn.   -  person joran    schedule 11.11.2011
comment
Кроме того, простое евклидово расстояние должно помочь. Возьмите любые известные координаты широты / долготы для конкретного университета и назначьте их как ТОЧНЫЕ координаты для университета. В этом наборе данных должно быть ровно Nx2 записей, где N = длина (уникальна (данные $ University)). Затем возьмите евклидово расстояние (в двух измерениях) между каждой неклассифицированной записью и набором данных Nx2. Запись с минимальным расстоянием - это университет, который вы относите к неклассифицированной паре широты и долготы.   -  person Rguy    schedule 11.11.2011
comment
Я бы добавил к предложению Ргуя предложение начать с поиска уникальных пар или наборов ожидаемых категориальных значений на основе определенных мест. Поскольку это только 2D, вы можете присвоить номер каждому квадранту в качестве двойной проверки, чтобы убедиться, что ваши евклидовы расстояния близки к вашему фактическому местоположению (а не местоположению другого квадранта)   -  person Brandon Bertelsen    schedule 11.11.2011
comment
В этом ответе я предоставил (несколько) полезные ссылки stackoverflow.com/questions/2613420/   -  person aL3xa    schedule 11.11.2011
comment
Мне не терпится увидеть код для этого, но что касается широты и долготы университетов, данные должны (ключевое слово: следует) быть общедоступными в Министерстве образования. Вы можете загрузить всю вселенную Министерства образования о высшем образовании с сайта nces.ed.gov/ipeds. Ищите обзор институциональных характеристик. HTH.   -  person Btibert3    schedule 12.11.2011
comment
Спасибо всем! Я бы dput (data), но, как я уже сказал, это немного скудно, и я не думаю, что проблема будет здесь хорошо представлена. Спасибо также за идею использовать простое евклидово расстояние от известных координат.   -  person William Gunn    schedule 12.11.2011
comment
Также спасибо за ваши ссылки, aL3xa, я прочитал это перед публикацией, и у вас есть хорошие советы о том, как решать такие проблемы в целом.   -  person William Gunn    schedule 12.11.2011
comment
Я только что получил подсказку, что solr может добавлять геоиндекс к данным и поддерживать запросы на основе местоположения, так что это может быть хорошим подходом для этого.   -  person William Gunn    schedule 12.11.2011


Ответы (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
}
})
person JD Long    schedule 11.11.2011
comment
Похоже, что для работы с данными приличного размера потребуются эры, но спасибо за код ближайшего соседа. Это именно то, что я искал. Я думаю, что сначала я попытаюсь получить среднюю точку всех моих известных пар широта-долгота для уникальных институтов и попробую метод евклидова расстояния, но проверю и его и вернусь, чтобы сообщить вам, что я нашел. - person William Gunn; 12.11.2011