Wie erhält man den zweitnächsten Nachbarn zwischen zwei Punktmustern in R?

12

Gibt es eine Möglichkeit, die Abstände für den zweitnächsten Nachbarn zwischen zwei Punktmustern in R zu ermitteln? Das spatstat-Paket hat eine Funktion namens nncross, die jedoch nur für die nächsten Nachbarn zwischen zwei Mustern gilt, und ich benötige die Abstände zu den zweitnächsten Nachbarn.

RK
quelle

Antworten:

9

Die Funktion get.knnx im Paket FNN kann die N nächsten Nachbarn in Punktmustern berechnen.

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

jetzt ist nn $ nn.index eine Matrix, so dass nn $ nn.index [i, j] die Zeile in x1 der beiden nächsten Nachbarn zu Zeile i in x2 ist - so sortiert, dass die nächste [i, 1] und ist der nächste nachbar ist [i, 2].

Die Funktion gibt auch die Entfernungen für Sie zurück und verfügt über einige Optionen zum Berechnen von räumlichen Indizes für sehr schnelle Suchvorgänge.

Raumfahrer
quelle
Vielen Dank. Bin allerdings auf ein Problem gestoßen. Meine Daten sind von der Klasse 'ppp' (zur Verwendung mit spatstat). Wenn ich es in get.knnw einstecke, erhalte ich den folgenden Fehler> Fehler in get.knnx (rp, ponderosa, 2): Listen müssen in .C
RK am
Holen Sie einfach die Koordinaten mit as.data.frame auf Ihrem ppp-Objekt heraus.
Spacedman
Wäre nndist und nnwhich auch für diese Aufgabe bereit?
Habe
nndist und nn, die nur die nächsten Entfernungen innerhalb eines einzelnen Punktmusters berechnen (was get.knn tut), nicht von einem Punkttyp zu einem anderen Punkttyp (was get.knnx tut). Außerdem ist get.knn doppelt so schnell wie nndist, wenn Sie algorithm = "kd_tree" verwenden.
Spacedman
@Spacedman Verstanden. Danke, Mann. Ich habe gerade Crossdist gesehen. Es scheint wie get.knnx zu funktionieren. Werde es auch versuchen. Am Ende habe ich cbind verwendet und dann die X- und Y-Koordinaten abgerufen, bevor ich Ihren Kommentar gelesen habe. Danke vielmals. R Neuling hier. Meistens ein Python-Typ.
RK
6

Ich habe gerade entdeckt, dass spatstat eine Crossdist- Funktion hat.

Beschreibung

Berechnet die Abstände zwischen Dingenpaaren aus zwei verschiedenen Datensätzen.

Es nimmt zwei Punktmuster X und Y als Eingaben und gibt die Matrix zurück, deren [i, j] -Eintrag der Abstand von X [i] zu Y [j] ist. So ermitteln Sie mit dem Fadenkreuz den zweitnächsten Nachbarn:

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

Ich weiß, dass ich Spacedmans Antwort bereits akzeptiert habe, möchte aber mitteilen, wie ich es auf andere Weise gemacht habe.

RK
quelle
0

Die Funktion nndistim spatstatPaket hat ein Argument k, das die Reihenfolge der Nachbarn bestimmt. Verwenden Sie, um die zweitnächste Nachbarentfernung zu ermitteln k=2. Verwenden Sie, um sowohl den ersten als auch den zweiten Nachbarn abzurufen k=1:2.

Adrian Baddeley
quelle