Clustering räumlicher Daten in R? [geschlossen]

34

Ich habe eine Reihe von Datenpunkten mit Breiten- und Längengrad. Ich möchte R verwenden, um sie basierend auf ihrer Entfernung zu gruppieren.

Ich habe mir diese Seite bereits angesehen und das clustTool- Paket ausprobiert . Ich bin mir jedoch nicht sicher, ob die clust-Funktion in clustTool Datenpunkte (lat, lon) als räumliche Daten betrachtet und die Entfernung zwischen diesen mithilfe der entsprechenden Formel berechnet.

Ich meine, ich kann nicht sehen, wie sie zwischen Geodaten und Ordnungsdaten unterscheiden. Ich glaube, die Entfernungsberechnung zwischen zwei Punkten auf der Karte (räumlich) und zwei normalen Zahlen ist unterschiedlich. (Es ist nicht?)

Was passiert auch, wenn ich einen dritten Parameter in meinem Cluster berücksichtigen möchte?

Wie sagen, wenn ich (lat, lon) und einen anderen Parameter habe.

Wie berechnet sich die Entfernung?

Das andere Problem, das ich mit clustTool habe, ist, dass es mit einer GUI im Auge behalten wird. Ich weiß nicht, wie ich den GUI-Overhead in der Bibliothek überspringen kann, weil ich ihn nicht brauche.

Welche Optionen habe ich in R für die Clusteranalyse von Geodaten?

Kaptan
quelle
tnx whuber. Ich habe eine Frage. Gibt es ein spezielles Paket für die räumliche Clusterbildung in R? Ich meine, soweit ich weiß, sollte die Entfernung für räumliche Daten anders berechnet werden. Ist das richtig?
Kaptan
Fast jedes Allzweck-Clustering-Paket, auf das ich gestoßen bin, einschließlich der Rs Cluster, akzeptiert Unähnlichkeits- oder Distanzmatrizen als Eingabe. Dies macht sie vollkommen allgemein und für die Häufung auf der Kugel anwendbar, vorausgesetzt, Sie können die Entfernungen selbst berechnen, was unkompliziert ist.
whuber
Ich stehe seit langem vor einem sehr ähnlichen Problem, kann aber keine gute Lösung finden. Sie können sich meinen Beitrag in stack-exchange ansehen . Ich habe eine Reihe von monatlichen Daten zur Meeresoberflächentemperatur (lon, lat, sst). Haben Sie den Weg gefunden, Cluster für solche Geodaten zu finden? Ich kann das richtige R-Paket / die richtige R-Funktion nicht finden. Vielen Dank im Voraus Paco
Pacomet
Haben Sie darüber nachgedacht, SatScan zu verwenden?

Antworten:

13

Hier ist eine Lösung, die auf der Suche nach Gruppen von punktbasierten Abstandsregeln basiert , aber die distmFunktion aus dem geospherePaket verwendet:

library(sp)
library(rgdal)
library(geosphere)

# example data from the thread
x <- c(-1.482156, -1.482318, -1.482129, -1.482880, -1.485735, -1.485770, -1.485913, -1.484275, -1.485866)
y <- c(54.90083, 54.90078, 54.90077, 54.90011, 54.89936, 54.89935, 54.89935, 54.89879, 54.89902)

# convert data to a SpatialPointsDataFrame object
xy <- SpatialPointsDataFrame(
      matrix(c(x,y), ncol=2), data.frame(ID=seq(1:length(x))),
      proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

# use the distm function to generate a geodesic distance matrix in meters
mdist <- distm(xy)

# cluster all points using a hierarchical clustering approach
hc <- hclust(as.dist(mdist), method="complete")

# define the distance threshold, in this case 40 m
d=40

# define clusters based on a tree "height" cutoff "d" and add them to the SpDataFrame
xy$clust <- cutree(hc, h=d)

Sie sollten etwas bekommen wie:

        coordinates ID clust
1 (-1.482156, 54.90083)  1     1
2 (-1.482318, 54.90078)  2     1
3 (-1.482129, 54.90077)  3     1
4  (-1.48288, 54.90011)  4     2
5 (-1.485735, 54.89936)  5     3
6  (-1.48577, 54.89935)  6     3
7 (-1.485913, 54.89935)  7     3
8 (-1.484275, 54.89879)  8     4
9 (-1.485866, 54.89902)  9     3

Diese nächsten Schritte dienen nur der Visualisierung:

library(dismo)
library(rgeos)

# expand the extent of plotting frame
xy@bbox[] <- as.matrix(extend(extent(xy),0.001))

# get the centroid coords for each cluster
cent <- matrix(ncol=2, nrow=max(xy$clust))
for (i in 1:max(xy$clust))
    # gCentroid from the rgeos package
    cent[i,] <- gCentroid(subset(xy, clust == i))@coords

# compute circles around the centroid coords using a 40m radius
# from the dismo package
ci <- circles(cent, d=d, lonlat=T)

# plot
plot(ci@polygons, axes=T)
plot(xy, col=rainbow(4)[factor(xy$clust)], add=T)

Handlung

ssanch
quelle
Ich habe Probleme damit: Ich habe eine Entfernungsmatrix und finde die größte Entfernung für jedes Element: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } Es dauert, 4aber wenn ich x <- cutree(hc, h=5)es anwende, erhalte ich 101 von 187 Clustern. Sollte logischerweise 1 sein. Was ist falsch?
Peter.k
Hallo, ich bin mir nicht sicher, wie ich dir hier helfen kann. Ich habe ein kleines Beispiel, und es funktioniert gut: x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Auf diese Weise erhalten Sie erwartungsgemäß einen einzelnen Cluster. Versuchen Sie, Ihr Clustering-Modell mit: zu zeichnen plot(hc), und ermitteln Sie den höchsten Wert.
Samstag,
11

Es gibt Funktionen zur Berechnung der tatsächlichen Entfernungen auf einer kugelförmigen Erde in R. Vielleicht können Sie diese verwenden und die Clustering-Funktionen mit einer Entfernungsmatrix anstelle von Koordinaten aufrufen. Ich kann mich jedoch nie an die Namen oder relevanten Pakete erinnern. Hinweise finden Sie in der R-Spatial-Task-Ansicht.

Die andere Option ist Ihre Punkte auf ein Referenzsystem zu transformieren , so dass die Abstände sind euklidische. In Großbritannien kann ich das OSGrid-Referenzsystem verwenden:

 data = spTransform(data,CRS("+epsg:27700"))

mit spTransform aus dem Paket 'rgdal' (oder vielleicht maptools). Suchen Sie nach einem Rastersystem für Ihre Daten (die entsprechende UTM-Zone reicht wahrscheinlich aus), und Sie können problemlos Entfernungen in Metern berechnen.

Dies ist nur dann sinnvoll, wenn Ihre Daten ein kleiner Bereich sind. Wenn Sie über globale Daten verfügen, müssen Sie die sphärische Entfernung wirklich berechnen, und das ist in einem (oder mehreren) der in R Spatial Task View beschriebenen Pakete der Fall:

http://cran.r-project.org/web/views/Spatial.html

Sieht so aus, als ob Sie das Paket "Geosphäre" möchten, lesen Sie jedoch die räumliche Aufgabenansicht!

Raumfahrer
quelle
7

Ich würde mir das Spatstat- Paket ansehen . Das gesamte Paket ist der Analyse von räumlichen Punktmustern gewidmet. Es gibt ein exzellentes E-Book von Prof. Adrian Baddeley am CSIRO, das detaillierte Dokumentationen, Anleitungen und Beispiele für das gesamte Paket enthält. Schauen Sie sich Kapitel 19 für "Distanzmethoden für Punktmuster" an.

Trotzdem bin ich mir nicht sicher, ob sogar spatstat zwischen räumlichen und ordinalen Daten unterscheidet. Vielleicht möchten Sie Ihre Punkte in etwas mit konsistenten x- und y-Werten umprojizieren - verwenden Sie möglicherweise rgdal (eine R-Bibliothek für GDAL und OGR).

om_henners
quelle
tnx. Das ist ein tolles eBook. Ich bin mir jedoch nicht sicher, wie das Clustering mit diesem Spatstat durchgeführt werden kann, da ich keine spezifische Funktion für das Clustering sehe. Kannst du ein bisschen erklären?
Kaptan
2
Um ehrlich zu sein, würde ich mir nach einem erneuten Blick das DCluster- Paket ansehen - ein Paket, das auch von Bivand zur Analyse von Krankheitsclustern herausgegeben wurde. Auch entschuldigt sich für das Warten auf die Antwort!
om_henners
6

Vielleicht kommt diese Antwort 2 Jahre zu spät, aber trotzdem.

Nach meinem Wissen erfordert räumliches Clustering eine definierte Nachbarschaft, auf die das Clustering zumindest zu Beginn beschränkt ist. Die Kulldorf- Funktion im SpatialEpi- Paket ermöglicht räumliche Clusterbildung auf der Grundlage aggregierter Nachbarschaften.

weiter die DBSCAN Statistik zur Verfügung von der fpc könnte Paket nützlich sein.

Eine ähnliche Diskussion finden Sie auch hier: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

und hier ein interessantes Paper über neuere Cluster-Algorithmen wie CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

Jens
quelle
Der Artikel von Han et al., "Spatial Clustering Methods in Data Mining: Eine Umfrage", ist ab sofort unter folgender Adresse
abrufbar
5

Obwohl es sich nicht um ein RPaket handelt, ist Geoda möglicherweise ein interessantes Programm, das untersucht werden sollte, da es von Luc Anselin geschrieben wurde, der zur Theorie der räumlichen Clusterbildung beigetragen hat, und ich glaube, dass es einige Clusterbildung ermöglicht (obwohl es einige Zeit her ist, seit ich es erforscht habe).

spdep ist ein tolles RPaket. Es enthält die skaterFunktion für die räumliche 'K'-Glanzanalyse durch Baumkantenentfernung . Es bietet auch andere Funktionen für die räumliche Analyse, einschließlich der räumlichen Autokorrelation und der Erkennung lokaler Cluster mithilfe von Local Moran und anderen räumlichen Statistiken. Es wird wie folgt beschrieben:

Eine Sammlung von Funktionen zum Erstellen von Matrixobjekten mit räumlicher Gewichtung aus Polygonzusammenhängen, aus Punktmustern nach Entfernung und Tesselationen, zum Zusammenfassen dieser Objekte und zum Ermöglichen ihrer Verwendung bei der Geodatenanalyse, einschließlich der regionalen Aggregation nach Minimum Spanning Tree. Eine Sammlung von Tests zur räumlichen Autokorrelation, einschließlich globaler I-, APLE-, Geary's C-, Hubert / Mantel-Kreuzproduktstatistik, Schätzungen von Empirical Bayes und Assunção / Reis-Index, Getis / Ord G- und mehrfarbiger Join-Count-Statistiken, lokaler I- und Getis-Statistiken von Moran / Ord G, Sattelpunktnäherungen und genaue Tests für globales und lokales Morans I; und Funktionen zur Schätzung von räumlichen simultanen autoregressiven (SAR) Verzögerungs- und Fehlermodellen, Wirkungsmaße für Verzögerungsmodelle,

Sie können zumindest testen, ob Ihre Punkte zufällig räumlich verteilt sind (vermutlich eine nützliche Testvorverteilung, wenn räumliche Abstände berücksichtigt werden), aber Sie können auch andere nützliche Kennzahlen generieren, die Sie in Ihren Clustering-Algorithmus eingeben können. Schließlich finden Sie unter https://stats.stackexchange.com/ möglicherweise nützliche Fragen zu räumlichen Clustering-Problemen (allerdings eher aus theoretischer Sicht).

djq
quelle
Diese Antwort identifiziert viele Funktionen desselben Typs und analysiert das räumliche Muster oder die Autokorrelation des Punktmusters, das in der spatstat-Bibliothek verfügbar ist. Wo dies interessant ist, ist es für die Frage der Clusterbildung nicht ganz relevant. Ich bin alles für Hypothesentests und explorative Analysen, aber man sollte auch direkt auf die vorliegende Frage eingehen. Methoden zur Clusterbildung mit spdep basieren auf der räumlichen Wichtungsmatrix [Wij] unter Verwendung von k nächsten Nachbarn, Kontingenzen oder Entfernungen.
Jeffrey Evans
2

Versuchen Sie, leaderCluster in R zu packen. Im Gegensatz zu vielen anderen Clustering-Algorithmen muss der Benutzer nicht die Anzahl der Cluster angeben, sondern benötigt stattdessen den ungefähren Radius eines Clusters als primären Optimierungsparameter.

Sumit
quelle
-2

Überprüfen Sie die Entfernungsfunktion des Geosphärenpakets oder die Funktion des fossilen Grads. Sie haben Daten in Grad und müssen diese vor dem Clustering in Meter oder Fuß umrechnen.

mcm
quelle