¿Cómo obtener el segundo vecino más cercano entre dos patrones de puntos en R?

12

¿Hay alguna manera de obtener las distancias para el segundo vecino más cercano entre dos patrones de puntos en R? El paquete spatstat tiene una función llamada nncross pero solo se aplica a los vecinos más cercanos entre dos patrones y necesito las distancias a los segundos vecinos más cercanos.

RK
fuente

Respuestas:

9

La función get.knnx en el paquete FNN puede calcular los N vecinos más cercanos en patrones de puntos.

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

ahora nn $ nn.index es una matriz tal que nn $ nn.index [i, j] es la fila en x1 de los dos vecinos más cercanos a la fila i en x2, ordenada de modo que la más cercana sea [i, 1], y el próximo vecino es [i, 2].

La función también le devuelve las distancias y tiene algunas opciones para calcular índices espaciales para búsquedas muy rápidas.

Hombre espacial
fuente
Gracias. Sin embargo, me encontré con un pequeño problema. Mis datos son de la clase 'ppp' (para usar con spatstat). Cuando lo conecto a get.knnw, aparece el siguiente error> Error en get.knnx (rp, ponderosa, 2): las listas deben duplicarse en .C
RK
Simplemente obtenga las coordenadas usando as.data.frame en su objeto ppp.
Spacedman
¿Serían nndist y nnque también estarían preparados para esta tarea? Acabo de notar estas dos funciones en la lista r-sig-geo hoy ...
Roman Luštrik
nndist y nn, que solo calculan las distancias más cercanas dentro de un patrón de punto único (que es lo que hace get.knn), no de un tipo de puntos a otro tipo de puntos (que es lo que hace get.knnx). Además, get.knn es dos veces más rápido que nndist si usa algoritmo = "kd_tree".
Spacedman
@Spacedman Lo tengo. Gracias hombre. Acabo de ver crossdist. Parece funcionar como get.knnx. Lo intentaré también. Terminé usando cbind y luego obtuve las coordenadas X e Y antes de leer su comentario. Muchas gracias. R novato aquí. Principalmente un tipo Python.
RK
6

Acabo de descubrir que Spastat tiene una función de crossdist .

Descripción

Calcula las distancias entre pares de 'cosas' tomadas de dos conjuntos de datos diferentes.

Toma dos patrones de puntos X e Y como entradas, y devuelve la matriz cuya entrada [i, j] es la distancia de X [i] a Y [j]. Para obtener los segundos vecinos más cercanos usando 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)
}

Sé que ya acepté la respuesta de Spacedman, pero me gustaría compartir cómo lo hice de otra manera.

RK
fuente
0

La función nndisten el spatstatpaquete tiene un argumento kque determina el orden de los vecinos. Para obtener la segunda distancia vecina más cercana, use k=2. Para obtener el primer y el segundo vecino, use k=1:2.

Adrian Baddeley
fuente