Grupowanie danych przestrzennych w R? [Zamknięte]

34

Mam kilka punktów danych o szerokości i długości geograficznej. Chcę użyć R do grupowania ich na podstawie odległości.

Przejrzałem już stronę i wypróbowałem pakiet clustTool . Ale nie jestem pewien, czy funkcja klastrowania w clustTool uważa punkty danych (lat, lon) za dane przestrzenne i używa odpowiedniej formuły do ​​obliczenia odległości między nimi.

Mam na myśli, że nie widzę, jak odróżniają dane przestrzenne od danych porządkowych. Uważam, że obliczenia odległości między dwoma punktami na mapie (przestrzennymi) a dwiema liczbami normalnymi są różne. (Czy to nie jest?)

Co się też stanie, jeśli chcę rozważyć trzeci parametr w mojej klastrowaniu?

Powiedzmy, że mam (lat, lon) i jeszcze jeden parametr.

Jak obliczana jest odległość?

Innym problemem, jaki mam z clustTool, jest to, że jest on zaprojektowany z myślą o GUI. Nie wiem, jak mogę pominąć narzut GUI w bibliotece, ponieważ go nie potrzebuję.

Jakie mam opcje w R do analizy skupień danych przestrzennych?

kaptan
źródło
Tnx Whuber. Mam pytanie. Czy istnieje jakiś pakiet dla klastrowania przestrzennego w R? O ile rozumiem, odległość należy obliczać inaczej dla danych przestrzennych. Czy to jest poprawne?
kaptan
Prawie każdy pakiet klastrowania ogólnego przeznaczenia, z którym się spotkałem, w tym R Cluster, zaakceptuje jako dane wejściowe odmienność lub macierze odległości . Dzięki temu są one całkowicie ogólne i mają zastosowanie do grupowania na kuli, pod warunkiem, że możesz samodzielnie obliczyć odległości, co jest proste.
whuber
Długo mam do czynienia z bardzo podobnym problemem, ale nie mogę znaleźć dobrego rozwiązania, możesz rzucić okiem na mój post w wymianie stosów . Mam zestaw miesięcznych danych o temperaturze powierzchni morza (lon, lat, sst). Czy znalazłeś sposób na znalezienie klastrów dla takich danych przestrzennych? Nie mogę znaleźć odpowiedniego pakietu / funkcji R. Z góry dziękuję Paco
pacomet
Czy zastanawiałeś się nad użyciem SatScan?

Odpowiedzi:

13

Oto rozwiązanie oparte na Znajdź regułę odległości opartą na punktach , ale używając distmfunkcji z geospherepakietu:

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)

Powinieneś dostać coś takiego:

        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

Kolejne kroki dotyczą tylko wizualizacji:

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)

wątek

ssanch
źródło
Mam z tym problemy: mam macierz odległości i znajduję największą odległość dla każdego elementu: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } zajmuje, 4ale po zastosowaniu x <- cutree(hc, h=5)daje mi 101 klastrów z 187. Logicznie powinno być 1. Co jest nie tak?
Peter.k
Cześć, nie jestem pewien, jak ci tutaj pomóc. Zrobiłem mały przykład, i to działa dobrze: x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Daje to jeden klaster, zgodnie z oczekiwaniami. Spróbuj wykreślić swój model klastrowania za pomocą: plot(hc)i zobacz, jaka jest najwyższa wartość.
ssanch
11

Istnieją funkcje do obliczania rzeczywistych odległości na kulistej ziemi w R, więc może możesz ich użyć i wywołać funkcje grupowania za pomocą macierzy odległości zamiast współrzędnych. Jednak nigdy nie pamiętam nazw ani odpowiednich pakietów. Wskazówki znajdują się w widoku zadań R-przestrzennym.

Inną opcją jest przekształcenie punktów w układ odniesienia, aby odległości były euklidesowe. W Wielkiej Brytanii mogę korzystać z systemu referencyjnego OSGrid:

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

używając spTransform z pakietu 'rgdal' (lub może maptools). Znajdź system siatki dla swoich danych (prawdopodobnie zrobi to odpowiednia strefa UTM), a będziesz obliczać odległości w metrach bez problemu.

Jest to dobre tylko wtedy, gdy twoje dane są małym obszarem - jeśli masz dane globalne, naprawdę musisz obliczyć odległość sferyczną, a to gdzieś w jednym (lub więcej) pakietach omawianych w widoku zadań przestrzennych R:

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

Wygląda na to, że chcesz mieć pakiet „geosfery”, ale czytaj przestrzenny widok zadań!

Spacedman
źródło
7

Rzuciłbym okiem na pakiet Spatstat . Cały pakiet przeznaczony jest do analizy wzorów punktów przestrzennych (sic). W CSIRO jest doskonały ebook napisany przez prof. Adriana Baddeleya, który zawiera szczegółową dokumentację, instrukcje i przykłady dotyczące całego pakietu. Spójrz na rozdział 19 dla „Metody odległości dla wzorów punktowych”.

To powiedziawszy, nie jestem pewien, czy nawet spatstat rozróżnia dane przestrzenne i porządkowe, więc możesz chcieć ponownie skierować swoje punkty na coś ze spójnymi wartościami x i y - prawdopodobnie spróbuj użyć rgdal (biblioteka R dla GDAL i OGR).

om_henners
źródło
tnx. To świetny ebook. Ale nie jestem pewien, w jaki sposób można grupować za pomocą tej funkcji Spatstat, ponieważ nie widzę żadnej konkretnej funkcji dla klastrowania. Czy możesz coś wyjaśnić?
kaptan
2
Właściwie, żeby być uczciwym, po ponownym przyjrzeniu się temu spojrzałbym na pakiet DCluster - pakiet również Bivand dotyczący analizy skupisk chorób. Przepraszamy również za czekanie na odpowiedź!
om_henners,
6

Może ta odpowiedź przychodzi o 2 lata za późno, ale i tak.

Według mojej wiedzy, klastrowanie przestrzenne wymaga określonego sąsiedztwa, do którego klaster jest ograniczony, przynajmniej na początku. Funkcja kulldorf w pakiecie SpatialEpi pozwala na grupowanie przestrzenne w oparciu o zagregowane sąsiedztwa.

ponadto przydatna może być statystyka DBSCAN dostępna z pakietu fpc .

zobacz także tutaj podobną dyskusję: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

i tutaj na interesujący artykuł na temat najnowszych algorytmów klastrowych, takich jak CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

Jens
źródło
Ten artykuł Han i wsp., „Spatial Clustering Methods in Data Mining: A Survey” można teraz znaleźć na stronie: hanj.cs.illinois.edu/pdf/gkdbk01.pdf
knb
5

GeodaR , choć nie jest pakietem, może być ciekawym programem do zbadania, ponieważ została napisana przez Luca Anselina, który przyczynił się do teorii klastrowania przestrzennego, i uważam, że umożliwia ona tworzenie klastrów (choć minęło trochę czasu, odkąd ją zbadałem).

spdep to świetny Rpakiet. Zawiera skaterfunkcję przestrzennej analizy „K'luster przez usuwanie krawędzi drzewa . Zapewnia także inne funkcje analizy przestrzennej, w tym autokorelację przestrzenną i wykrywanie klastra lokalnego za pomocą lokalnego Morana i innych statystyk przestrzennych. Jest to opisane następująco:

Zbiór funkcji do tworzenia obiektów macierzy wag przestrzennych z przyległości wieloboków, z wzorców punktowych według odległości i mozaikowania, do podsumowywania tych obiektów oraz do umożliwienia ich wykorzystania w analizie danych przestrzennych, w tym agregacji regionalnej za pomocą minimalnego drzewa opinającego; zbiór testów dla autokorelacji przestrzennej, w tym globalna I Morana, APLE, Geary'ego C, Hubert / Mantel ogólna statystyka krzyżowa produktów, szacunki Empirical Bayes i indeks Assunção / Reis, Getis / Ord G i statystyki wielobarwnego łączenia, lokalne I Morana i Getis / Ord G, przybliżenia punktów sadd i dokładne testy dla globalnego i lokalnego I Morana; oraz funkcje do szacowania przestrzennych modeli autoregresyjnych opóźnień i błędów, miary wpływu modeli opóźnień,

Możesz przynajmniej przetestować, czy punkty są losowo rozmieszczone przestrzennie (przypuszczalnie przydatny test pre-klastrowania przy rozważaniu odległości przestrzennych), ale może również wygenerować inne przydatne miary, które możesz wprowadzić do algorytmu grupowania. Wreszcie, być może możesz znaleźć przydatne pytania na https://stats.stackexchange.com/ dotyczące zagadnień klastrowania przestrzennego (jednak więcej z teoretycznego punktu widzenia).

djq
źródło
Ta odpowiedź identyfikuje wiele tego samego typu funkcji, analizuje wzór przestrzenny lub autokorelację wzoru punktowego, dostępną w bibliotece spatstat. Interesujące jest to, że kwestia klastrowania nie jest całkowicie związana. Jestem zwolennikiem testowania hipotez i analizy eksploracyjnej, ale należy również bezpośrednio odpowiedzieć na omawiane pytanie. Metody grupowania za pomocą spdep oparte są na macierzy wag przestrzennych [Wij] z wykorzystaniem k najbliższego sąsiada, przygodności lub odległości.
Jeffrey Evans
2

Wypróbuj pakiet liderCluster w R. W przeciwieństwie do wielu innych algorytmów klastrowania, nie wymaga od użytkownika określania liczby klastrów, ale zamiast tego wymaga przybliżonego promienia klastra jako podstawowego parametru strojenia.

Sumit
źródło
-2

Sprawdź funkcję odległości pakietu geosfery lub funkcję dystansu kopalnego deg. Masz dane w stopniach i musisz przełożyć je na metry lub stopy, zanim zaczniesz grupować.

mcm
źródło