Clustering dei dati spaziali in R? [chiuso]


34

Ho un sacco di punti dati con latitudine e longitudine. Voglio usare R per raggrupparli in base alla loro distanza.

Ho già dato un'occhiata a questa pagina e ho provato il pacchetto clustTool . Ma non sono sicuro che la funzione clust in clustTool consideri i punti dati (lat, lon) come dati spaziali e utilizzi la formula appropriata per calcolare la distanza tra di loro.

Voglio dire, non riesco a vedere come si differenziano tra dati spaziali e dati ordinali. Credo che il calcolo della distanza tra due punti sulla mappa (spaziale) e due numeri normali sia diverso. (Non è?)

Inoltre cosa succede se voglio prendere in considerazione un terzo parametro nel mio clustering?

Come dire se ho (lat, lon) e un altro parametro.

Come viene calcolata la distanza?

L'altro problema che ho con clustTool è che è progettato pensando a una GUI. Non so come posso saltare l'overhead della GUI nella libreria perché non ne ho bisogno.

Quali opzioni ho in R per l'analisi dei cluster di dati spaziali?



tnx whuber. Ho una domanda. Esiste un pacchetto specifico per il clustering spaziale in R? Voglio dire, per quanto ho capito, la distanza dovrebbe essere calcolata in modo diverso per i dati spaziali. È corretto?
kaptan il

Quasi tutti i pacchetti di clustering generici che ho incontrato, compresi quelli di R Cluster, accetteranno come input differenze di matrici di distanza o di distanza . Questo li rende perfettamente generali e applicabili al raggruppamento sulla sfera, a condizione che tu possa calcolare tu stesso le distanze, il che è semplice.
whuber

Sto affrontando un problema molto simile da molto tempo ma non riesco a trovare una buona soluzione, puoi dare un'occhiata al mio post in cambio di stack . Ho una serie di dati mensili sulla temperatura della superficie del mare (lon, lat, sst). Hai trovato il modo di trovare cluster per tali dati spaziali? Non riesco a trovare il pacchetto / funzione R corretti. Grazie in anticipo Paco
pacomet

Hai preso in considerazione l'utilizzo di SatScan?

Risposte:


13

Ecco una soluzione basata su Trova cluster di punti in base alla regola della distanza , ma utilizzando la distmfunzione dal geospherepacchetto:

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)

Dovresti ottenere qualcosa del tipo:

        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

Questi passaggi successivi sono solo per la visualizzazione:

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)

tracciare


Ho dei problemi con questo: ho una matrice di distanza e trovo la distanza più grande per ogni articolo: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } ci vuole 4ma quando lo applico x <- cutree(hc, h=5)mi dà 101 cluster su 187. Logicamente, dovrebbe essere 1. Cosa c'è che non va?
Peter.k

Ciao, non sono sicuro di come aiutarti qui. Ho fatto un piccolo esempio, e funziona benissimo: x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Questo ti dà un singolo cluster, come ti aspetteresti. Prova a tracciare il tuo modello di clustering con:, plot(hc)e vedi qual è il valore più alto.
sabato

11

Ci sono funzioni per calcolare le distanze reali su una terra sferica in R, quindi forse puoi usarle e chiamare le funzioni di raggruppamento con una matrice di distanza anziché coordinate. Non riesco mai a ricordare i nomi o i pacchetti pertinenti però. Vedere la vista attività spaziale R per gli indizi.

L'altra opzione è trasformare i tuoi punti in un sistema di riferimento in modo che le distanze siano euclidee. Nel Regno Unito posso usare il sistema di riferimento OSGrid:

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

usando spTransform dal pacchetto 'rgdal' (o forse maptools). Trova un sistema a griglia per i tuoi dati (probabilmente la zona UTM pertinente lo farà) e calcolerai le distanze in metri senza alcun problema.

Questo è utile solo se i tuoi dati sono una piccola area - se hai dati globali, devi davvero calcolare la distanza sferica, e questo è da qualche parte in uno (o più) dei pacchetti discussi nella Vista Attività spaziale R:

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

Sembra che tu voglia il pacchetto "geosfera", ma leggi la vista delle attività spaziali!


7

Darei un'occhiata al pacchetto Spatstat . L'intero pacchetto è dedicato all'analisi dei modelli di punti spaziali (sic). C'è un eccellente ebook scritto dal Prof. Adrian Baddeley presso il CSIRO che contiene documentazione dettagliata, istruzioni ed esempi per l'intero pacchetto. Dai un'occhiata al capitolo 19 per "Metodi di distanza per schemi di punti".

Detto questo, non sono sicuro che anche spatstat distingua tra dati spaziali e ordinali, quindi potresti voler riproiettare i tuoi punti in qualcosa con valori xey y coerenti - forse prova a usare rgdal (una libreria R per GDAL e OGR).


tnx. È un ottimo ebook. Ma non sono sicuro di come si possa fare il clustering usando questo Spatstat perché non vedo alcuna funzione specifica per il clustering. Puoi spiegarci un po '?
kaptan il

2
In realtà, per essere onesti, dopo averlo esaminato di nuovo, darei un'occhiata al pacchetto DCluster - un pacchetto anche di Bivand sull'analisi dei cluster di malattie. Inoltre, ci scusiamo per l'attesa sulla risposta!
om_henners,

6

Forse questa risposta arriva con 2 anni di ritardo, ma comunque.

Per quanto ne so, il clustering spaziale richiede un vicinato definito a cui è limitato il clustering, almeno all'inizio. La funzione kulldorf nel pacchetto SpatialEpi consente il clustering spaziale basato su quartieri aggregati.

inoltre la statistica DBSCAN disponibile dal pacchetto fpc potrebbe essere utile.

vedi anche qui per una discussione simile: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

e qui per un articolo interessante sui recenti algoritmi di cluster, come CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf


Quel documento di Han et al. "Metodi di clustering spaziale nel data mining: un sondaggio" è ora disponibile su: hanj.cs.illinois.edu/pdf/gkdbk01.pdf
knb

5

Sebbene non sia un Rpacchetto, geoda potrebbe essere un programma interessante da esaminare in quanto è stato scritto da Luc Anselin che ha contribuito alla teoria del clustering spaziale, e credo che abiliti un po 'di clustering (anche se è passato del tempo da quando l'ho esplorato).

spdep è un ottimo Rpacchetto. Include la skaterfunzione per l'analisi spaziale 'K'luster mediante rimozione del bordo dell'albero . Offre anche altre funzioni per l'analisi spaziale, tra cui l'auto-correlazione spaziale e il rilevamento del cluster locale utilizzando Local Moran e altre statistiche spaziali. È descritto come segue:

Una raccolta di funzioni per creare oggetti a matrice di pesi spaziali da contiguità poligonali, da schemi di punti per distanza e tassellazioni, per riassumere questi oggetti e per permetterne l'uso nell'analisi dei dati spaziali, inclusa l'aggregazione regionale per albero di spanning minimo; una raccolta di test per l'autocorrelazione spaziale, tra cui i dati globali di Moran I, APLE, Geary's C, Hubert / Mantel, statistiche generali sui prodotti incrociati, stime di Empirical Bayes e Assunção / Reis Index, Getis / Ord G e statistiche sui conteggi multicolori locali, I e Getis locali di Moran / Ord G, approssimazioni a sella e test esatti per l'I di Moran globale e locale; e funzioni per la stima di modelli di errore e ritardo spaziale simultaneo autoregressivo (SAR), misure di impatto per modelli di ritardo,

Puoi almeno verificare se i tuoi punti sono distribuiti casualmente nello spazio (presumibilmente un utile pre-clustering di prova quando si considerano le distanze spaziali), ma può anche generare altre misure utili che potresti inserire nel tuo algoritmo di clustering. Infine, forse potresti trovare utili domande su https://stats.stackexchange.com/ che trattano problemi di clustering spaziale (anche se, più da una prospettiva teorica).


Questa risposta identifica molti degli stessi tipi di funzionalità, analizzando il modello spaziale o autocorrelazione del modello di punti, disponibile nella libreria spatstat. Laddove questo è interessante, non è del tutto germano la questione del raggruppamento. Sono tutto per il test delle ipotesi e l'analisi esplorativa, ma si dovrebbe anche affrontare direttamente la domanda. I metodi per il clustering mediante spdep si basano sulla matrice dei pesi spaziali [Wij] usando k il vicino più vicino, la contingenza o le distanze.
Jeffrey Evans,

2

Prova leaderCluster packacge in R. A differenza di molti altri algoritmi di clustering, non richiede all'utente di specificare il numero di cluster, ma richiede invece il raggio approssimativo di un cluster come parametro di ottimizzazione principale.


-2

Controllare la funzione di distanza del pacchetto di geosfera o la funzione di degrado fossile. Hai i dati in gradi e devi tradurli in metri o piedi prima di fare il clustering.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.