Mengelompokkan data spasial dalam R? [Tutup]

34

Saya memiliki banyak titik data dengan garis lintang dan bujur. Saya ingin menggunakan R untuk mengelompokkan mereka berdasarkan jarak mereka.

Saya sudah melihat halaman ini dan mencoba paket clustTool . Tapi saya tidak yakin apakah fungsi clust di clustTool menganggap titik data (lat, lon) sebagai data spasial dan menggunakan rumus yang sesuai untuk menghitung jarak di antara mereka.

Maksudku, aku tidak bisa melihat bagaimana mereka membedakan antara data spasial dan data ordinal. Saya percaya perhitungan jarak antara dua titik di peta (spasial) dan dua angka normal berbeda. (Bukan?)

Apa yang terjadi jika saya ingin mempertimbangkan parameter ketiga dalam pengelompokan saya?

Seperti katakan jika saya punya (lat, lon) dan satu parameter lainnya.

Bagaimana jarak dihitung?

Masalah lain yang saya miliki dengan clustTool adalah bahwa ia dirancang dengan GUI. Saya tidak tahu bagaimana saya bisa melewatkan overhead GUI di perpustakaan karena saya tidak membutuhkannya.

Opsi apa yang saya miliki dalam R untuk analisis klaster data spasial?

kaptan
sumber
tnx whuber. Saya punya pertanyaan. Apakah ada paket khusus untuk pengelompokan spasial di R? Maksud saya, sejauh yang saya mengerti jarak harus dihitung secara berbeda untuk data spasial. Apakah ini benar?
kaptan
Hampir setiap paket pengelompokan tujuan umum yang saya temui, termasuk R Cluster, akan menerima perbedaan atau matriks jarak sebagai input. Ini membuatnya sangat umum dan berlaku untuk pengelompokan pada bola, asalkan Anda dapat menghitung jarak sendiri, yang mudah.
whuber
Saya menghadapi masalah yang sangat mirip untuk waktu yang lama tetapi tidak dapat menemukan solusi yang bagus, Anda dapat melihat posting saya di stack-exchange . Saya memiliki satu set data suhu permukaan laut bulanan (lon, lat, sst). Sudahkah Anda menemukan cara untuk menemukan cluster untuk data spasial seperti itu? Saya tidak dapat menemukan paket / fungsi R yang tepat. Terima kasih sebelumnya Paco
pacomet
Sudahkah Anda mempertimbangkan untuk menggunakan SatScan?

Jawaban:

13

Ini adalah solusi berdasarkan Find Cluster dari aturan jarak berbasis poin , tetapi menggunakan distmfungsi dari geospherepaket:

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)

Anda harus mendapatkan sesuatu seperti:

        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

Langkah-langkah selanjutnya hanya untuk visualisasi:

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)

merencanakan

ssanch
sumber
Saya memiliki masalah dengan ini: Saya memiliki matriks jarak dan saya menemukan jarak terbesar untuk setiap item: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } Dibutuhkan 4tetapi ketika saya menerapkannya x <- cutree(hc, h=5)memberi saya 101 cluster dari 187. Secara logis, harus 1. Apa yang salah?
Peter.k
Hai, saya tidak yakin bagaimana membantu Anda di sini. Saya membuat contoh kecil, dan bekerja dengan baik: x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Ini memberi Anda satu cluster, seperti yang Anda harapkan. Cobalah merencanakan model pengelompokan Anda dengan:, plot(hc)dan lihat apa nilainya yang tertinggi.
ssanch
11

Ada beberapa fungsi untuk menghitung jarak sebenarnya pada bumi bulat di R, jadi mungkin Anda bisa menggunakannya dan memanggil fungsi pengelompokan dengan matriks jarak alih-alih koordinat. Saya tidak pernah bisa mengingat nama atau paket yang relevan. Lihat Tampilan Tugas R-spasial untuk petunjuk.

Pilihan lainnya adalah mengubah titik Anda menjadi sistem referensi sehingga jaraknya adalah Euclidean. Di Inggris saya dapat menggunakan sistem referensi OSGrid:

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

menggunakan spTransform dari paket 'rgdal' (atau mungkin maptools). Temukan sistem kisi untuk data Anda (zona UTM yang relevan mungkin akan melakukannya) dan Anda akan menghitung jarak dalam meter tanpa masalah.

Ini hanya baik jika data Anda adalah area kecil-ish - jika Anda memiliki data global maka Anda benar-benar perlu menghitung jarak bola, dan itu di suatu tempat dalam satu (atau lebih) dari paket yang dibahas dalam R Spatial Task View:

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

Sepertinya Anda ingin mengemas "geosphere", tetapi jangan membaca tampilan tugas spasial!

Spacedman
sumber
7

Saya akan melihat paket Spatstat . Seluruh paket didedikasikan untuk menganalisis pola titik spasial (sic). Ada ebook bagus yang ditulis oleh Prof. Adrian Baddeley di CSIRO yang berisi dokumentasi terperinci, cara-cara dan contoh-contoh untuk seluruh paket. Lihatlah bab 19 untuk "Metode jarak untuk pola titik".

Yang mengatakan, saya tidak yakin bahwa bahkan spatstat membedakan antara data spasial dan ordinal, jadi Anda mungkin ingin memproyeksikan ulang poin Anda menjadi sesuatu dengan nilai x dan y yang konsisten - mungkin coba gunakan rgdal (pustaka R untuk GDAL dan OGR).

om_henners
sumber
tnx. Itu ebook yang bagus. Tetapi saya tidak yakin bagaimana pengelompokan dapat dilakukan dengan menggunakan Spatstat ini karena saya tidak melihat fungsi spesifik untuk pengelompokan. Bisakah Anda jelaskan sedikit?
kaptan
2
Sebenarnya, agar adil, setelah melihatnya lagi saya akan melihat paket DCluster - paket juga oleh Bivand tentang analisis kluster penyakit. Juga, permintaan maaf untuk menunggu jawaban!
om_henners
6

Mungkin jawaban ini terlambat 2 tahun, tapi toh.

Sepengetahuan saya, pengelompokan spasial membutuhkan lingkungan yang ditentukan yang membatasi pengelompokan, setidaknya di awal. Fungsi kulldorf dalam paket SpatialEpi memungkinkan pengelompokan spasial berdasarkan pada lingkungan agregat.

selanjutnya statistik DBSCAN yang tersedia dari paket fpc dapat bermanfaat.

lihat juga di sini untuk diskusi serupa: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

dan di sini untuk makalah yang menarik tentang algoritma klaster terbaru, seperti CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

Jens
sumber
Makalah itu oleh Han et al., "Metode Clustering Spasial dalam Penambangan Data: Sebuah survei" sekarang dapat ditemukan di: hanj.cs.illinois.edu/pdf/gkdbk01.pdf
knb
5

Meskipun bukan sebuah Rpaket, geoda mungkin merupakan program yang menarik untuk diteliti karena ditulis oleh Luc Anselin yang telah berkontribusi pada teori pengelompokan spasial, dan saya percaya ini memungkinkan beberapa pengelompokan (meskipun sudah beberapa waktu sejak saya menjelajahinya).

spdep adalah Rpaket yang bagus . Ini termasuk skaterfungsi untuk analisis spasial 'K'luster oleh Tree Edge Removal . Ini juga membawa fungsi-fungsi lain untuk analisis spasial, termasuk auto-korelasi spasial dan deteksi cluster lokal menggunakan Local Moran dan statistik spasial lainnya. Dijelaskan sebagai berikut:

Kumpulan fungsi untuk membuat objek matriks bobot spasial dari kedekatan poligon, dari pola titik berdasarkan jarak dan tesselations, untuk meringkas objek-objek ini, dan untuk memungkinkan penggunaannya dalam analisis data spasial, termasuk agregasi regional dengan pohon spanning minimum; kumpulan tes untuk autokorelasi spasial, termasuk global Moran's I, APLE, Geary C, statistik produk lintas Hubert / Mantel, perkiraan Empirical Bayes dan Assunção / Reis Index, Getis / Ord G dan statistik penghitungan gabung beraneka warna, I dan Getis Moran lokal / Ord G, perkiraan saddlepoint dan tes pasti untuk Moran's global dan I; dan fungsi-fungsi untuk mengestimasi model lag dan galat autoregresif simultan spasial (SAR), langkah-langkah dampak untuk model lag,

Anda setidaknya dapat menguji jika poin Anda didistribusikan secara acak secara spasial (mungkin merupakan tes pra-pengelompokan yang berguna saat mempertimbangkan jarak spasial), tetapi juga dapat menghasilkan langkah-langkah bermanfaat lainnya yang dapat Anda masukkan ke dalam algoritma pengelompokan Anda. Akhirnya, mungkin Anda mungkin menemukan pertanyaan yang berguna di https://stats.stackexchange.com/ berurusan dengan masalah pengelompokan spasial (meskipun, lebih dari perspektif teoritis).

djq
sumber
Jawaban ini mengidentifikasi banyak jenis fungsionalitas yang sama, menganalisis pola spasial atau autokorelasi pola titik, tersedia di perpustakaan spatstat. Di mana ini menarik, itu tidak sepenuhnya berkaitan dengan pertanyaan pengelompokan. Saya semua untuk pengujian hipotesis dan analisis eksplorasi tetapi orang juga harus langsung menjawab pertanyaan yang ada. Metode pengelompokan menggunakan spdep didasarkan pada matriks bobot spasial [Wij] menggunakan k tetangga terdekat, kontingensi atau jarak.
Jeffrey Evans
2

Coba leaderCluster packacge di R. Tidak seperti banyak algoritma pengelompokan lainnya, ia tidak mengharuskan pengguna untuk menentukan jumlah cluster, tetapi sebaliknya memerlukan perkiraan radius sebuah cluster sebagai parameter tuning utamanya.

Sumit
sumber
-2

Periksa fungsi jarak paket geosfer atau fungsi deg.dist fosil. Anda memiliki data dalam derajat dan perlu menerjemahkannya menjadi meter atau kaki sebelum melakukan pengelompokan.

mcm
sumber