Como obter o segundo vizinho mais próximo entre dois padrões de pontos em R?

12

Existe uma maneira de obter as distâncias para o segundo vizinho mais próximo entre dois padrões de pontos em R? O pacote spatstat tem uma função chamada nncross, mas só se aplica aos vizinhos mais próximos entre dois padrões e eu preciso das distâncias para os segundos vizinhos mais próximos.

RK
fonte

Respostas:

9

A função get.knnx no pacote FNN pode calcular os vizinhos N mais próximos em padrões de pontos.

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

agora nn $ nn.index é uma matriz tal que nn $ nn.index [i, j] é a linha em x1 dos dois vizinhos mais próximos da linha i em x2 - classificada de modo que o mais próximo seja [i, 1] e o próximo vizinho é [i, 2].

A função também retorna as distâncias para você e possui algumas opções para calcular índices espaciais para pesquisas muito rápidas.

Spacedman
fonte
Obrigado. No entanto, tive um pouco de problema. Meus dados são da classe 'ppp' (para uso com spatstat). Ao conectá-lo ao get.knnw, recebo o seguinte erro> Erro no get.knnx (rp, ponderosa, 2): as listas devem ser duplicadas em .C
RK
Basta obter as coordenadas usando as.data.frame no seu objeto ppp.
Spacedman
Nndist e nnwhich também estão disponíveis para esta tarefa? Só notei essas duas funções na lista r-sig-geo hoje ...
Roman Luštrik
nndist e nnque apenas calculam as distâncias mais próximas dentro de um único padrão de pontos (que é o que get.knn faz), não de um tipo de pontos para outro tipo de pontos (que é o que get.knnx faz). Além disso, get.knn é duas vezes mais rápido que nndist se você usar o algoritmo = "kd_tree".
precisa saber é o seguinte
@Spacedman Entendi. Obrigado cara. Acabei de ver crossdist. Parece funcionar como get.knnx. Vai tentar também. Acabei usando cbind e obtendo as coordenadas X e Y antes de ler seu comentário. Muito obrigado. R novato aqui. Principalmente um cara Python.
RK 28/01
6

Acabei de descobrir que Spatstat tem uma função crossdist .

Descrição

Calcula as distâncias entre pares de 'itens' obtidos de dois conjuntos de dados diferentes.

Ele usa dois padrões de pontos X e Y como entradas e retorna a matriz cuja entrada [i, j] é a distância de X [i] a Y [j]. Para obter os segundos vizinhos mais próximos 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)
}

Sei que já aceitei a resposta de Spacedman, mas gostaria de compartilhar como fiz de outra maneira.

RK
fonte
0

A função nndistno spatstatpacote possui um argumento kque determina a ordem dos vizinhos. Para obter a segunda distância do vizinho mais próximo, use k=2. Para obter o primeiro e o segundo vizinhos, use k=1:2.

Adrian Baddeley
fonte