Как получить второго ближайшего соседа между двумя точечными образцами в R?

12

Есть ли способ получить расстояния для второго ближайшего соседа между двумя точечными образцами в R? В пакете spatstat есть функция nncross, но она применяется только к ближайшим соседям между двумя шаблонами, и мне нужны расстояния до вторых ближайших соседей.

RK
источник

Ответы:

9

Функция get.knnx в пакете FNN может вычислять N-ближайших соседей по точечным паттернам.

x1 = cbind(runif(10),runif(10))
x2 = cbind(runif(10),runif(10))
nn = get.knnx(x1,x2,2)

теперь nn $ nn.index - это матрица такая, что nn $ nn.index [i, j] - это строка в x1 двух ближайших соседей строки i в x2, отсортированная таким образом, что ближайшей является [i, 1], и следующий сосед - [i, 2].

Функция также возвращает расстояния для вас и имеет несколько опций для вычисления пространственных индексов для очень быстрого поиска.

Spacedman
источник
Благодарю. Однако столкнулся с небольшой проблемой. Мои данные имеют класс 'ppp' (для использования с spatstat). Когда я подключаю его к get.knnw, я получаю следующую ошибку> Ошибка в get.knnx (rp, ponderosa, 2): списки должны дублироваться в .C
RK
Просто получите координаты, используя as.data.frame для вашего объекта ppp.
Spacedman
Будет ли nndist и nnich, которые также готовы для этой задачи? Просто заметил эти две функции в списке r-sig-geo сегодня ...
Роман Луштрик
nndist и nn, которые вычисляют только ближайшие расстояния в пределах одного точечного шаблона (что и делает get.knn), а не от точек одного типа до точек другого типа (что делает get.knnx). Кроме того, get.knn в два раза быстрее nndist, если вы используете алгоритма = "kd_tree".
Spacedman
@ Spacedman Понял. Спасибо чувак. Я только что видел CrossDist. Кажется, работает как get.knnx. Попробую это также. В итоге я использовал cbind и затем получил координаты X и Y, прежде чем прочитал ваш комментарий. Большое спасибо. R новичок здесь. В основном парень с питоном.
РК
6

Я только что обнаружил, что у spatstat есть функция crossdist .

Описание

Вычисляет расстояния между парами «вещей», взятых из двух разных наборов данных.

Он принимает два точечных шаблона X и Y в качестве входных данных и возвращает матрицу, чья запись [i, j] является расстоянием от X [i] до Y [j]. Чтобы получить вторых ближайших соседей, используя crossdist:

xdistances <- crossdist(X, Y)  #Get all cross distances    

nn = numeric() 
for (i in 1:nrow(X)) {   
  xdistance <- sort(xdistances[i,], partial=2)[2]   
  nn <- append(nn, xdistance)
}

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

RK
источник
0

Функция nndistв spatstatпакете имеет аргумент, kкоторый определяет порядок соседей. Чтобы получить расстояние до второго ближайшего соседа, используйте k=2. Чтобы получить как первого, так и второго соседа, используйте k=1:2.

Адриан Бадделей
источник