Кластеризация пространственных данных в R? [закрыто]

34

У меня есть куча точек данных с широтой и долготой. Я хочу использовать R для кластеризации их на основе их расстояния.

Я уже взглянул на эту страницу и попробовал пакет clustTool . Но я не уверен, что функция clust в clustTool рассматривает точки данных (широта, долгота) как пространственные данные и использует соответствующую формулу для вычисления расстояния между ними.

Я имею в виду, я не могу видеть, как они различают пространственные данные и порядковые данные. Я считаю, что расчет расстояния между двумя точками на карте (пространственной) и двумя нормальными числами отличается. (Это не?)

И что произойдет, если я захочу рассмотреть третий параметр в моей кластеризации?

Как сказать, если у меня есть (широта, долгота) и еще один параметр.

Как рассчитывается расстояние?

Другая проблема, которую я имею с clustTool, состоит в том, что он разработан с учетом графического интерфейса. Я не знаю, как я могу пропустить накладные расходы GUI в библиотеке, потому что мне это не нужно.

Какие варианты у меня есть в R для кластерного анализа пространственных данных?

Kaptan
источник
TNX Whuber. У меня вопрос. Есть ли конкретный пакет для пространственной кластеризации в R? Я имею в виду, насколько я понимаю, расстояние должно рассчитываться по-разному для пространственных данных. Это верно?
Каптан
Почти каждый кластерный пакет общего назначения, с которым я сталкивался, включая R Cluster, будет принимать в качестве входных данных матрицы различий или расстояний . Это делает их совершенно общими и применимыми к кластеризации на сфере, при условии, что вы можете самостоятельно рассчитать расстояния, что довольно просто.
whuber
Я давно сталкиваюсь с очень похожей проблемой, но не могу найти хорошее решение, вы можете посмотреть мой пост в стек-обмене . У меня есть набор месячных данных о температуре поверхности моря (lon, lat, sst). Вы нашли способ найти кластеры для таких пространственных данных? Я не могу найти правильный пакет R / функцию. Заранее спасибо Пако
пакомет
Рассматривали ли вы использовать SatScan?

Ответы:

13

Вот решение, основанное на правиле расстояния «Поиск кластеров точек» , но с использованием distmфункции из geosphereпакета:

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)

Вы должны получить что-то вроде:

        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

Следующие шаги предназначены только для визуализации:

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)

сюжет

ssanch
источник
У меня есть проблемы с этим: у меня есть матрица расстояний, и я нахожу наибольшее расстояние для каждого элемента: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } оно занимает, 4но при применении x <- cutree(hc, h=5)дает 101 кластер из 187. По логике должно быть 1. Что не так?
Peter.k
Привет, я не уверен, как помочь вам здесь. Я сделал небольшой пример, и он отлично работает x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Это дает вам один кластер, как и следовало ожидать. Попробуйте построить вашу модель кластеризации с помощью:, plot(hc)и посмотрите, какое наибольшее значение.
ssanch
11

Существуют функции для вычисления истинных расстояний на сферической земле в R, так что, возможно, вы можете использовать их и вызывать функции кластеризации с матрицей расстояний вместо координат. Я никогда не могу вспомнить имена или соответствующие пакеты, хотя. Смотрите R-пространственное представление задач для подсказок.

Другой вариант - преобразовать ваши точки в систему отсчета, чтобы расстояния были евклидовыми. В Великобритании я могу использовать справочную систему OSGrid:

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

используя spTransform из пакета 'rgdal' (или, возможно, maptools). Найдите систему координат для ваших данных (вероятно, подойдет соответствующая зона UTM), и вы без проблем вычислите расстояния в метрах.

Это хорошо, только если ваши данные имеют небольшую область - если у вас есть глобальные данные, вам действительно нужно вычислить сферическое расстояние, и это где-то в одном (или нескольких) из пакетов, обсужденных в R Spatial Task View:

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

Похоже, вы хотите пакет "геосфера", но читайте пространственный вид задачи!

Spacedman
источник
7

Я бы посмотрел на пакет Spatstat . Весь пакет посвящен анализу пространственных точечных паттернов (sic). В CSIRO есть отличная электронная книга, написанная профессором Адрианом Бадделей, которая содержит подробную документацию, инструкции и примеры для всего пакета. Взгляните на главу 19 «Методы расстояния для точечных рисунков».

Тем не менее, я не уверен, что даже spatstat различает пространственные и порядковые данные, поэтому вы можете перепроектировать ваши точки во что-то с постоянными значениями x и y - возможно, попробуйте использовать rgdal (библиотека R для GDAL и OGR).

om_henners
источник
Тпй. Это отличная электронная книга. Но я не уверен, как кластеризация может быть выполнена с помощью этого Spatstat, потому что я не вижу какой-либо конкретной функции для кластеризации. Можешь немного объяснить?
Каптан
2
На самом деле, чтобы быть справедливым, посмотрев его снова, я посмотрю на пакет DCluster - пакет также от Bivand по анализу кластеров болезней. Также прошу прощения за ожидание ответа!
om_henners
6

Может быть, этот ответ приходит на 2 года позже, но в любом случае.

Насколько мне известно, пространственная кластеризация требует определенного соседства, к которому кластеризация ограничена, по крайней мере, в начале. Функция kulldorf в пакете SpatialEpi обеспечивает пространственную кластеризацию на основе агрегированных окрестностей.

Кроме того, может быть полезна статистика DBSCAN, доступная из пакета fpc .

см. также здесь для подобного обсуждения: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

и здесь для интересной статьи о последних кластерных алгоритмах, таких как CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

Jens
источник
Этот документ Хана и др. «Методы пространственной кластеризации в интеллектуальном анализе
knb
5

Хотя это и не Rпакет, geoda может быть интересной программой для изучения, так как она написана Люком Анселином, который внес вклад в теорию пространственной кластеризации, и я полагаю, что она обеспечивает некоторую кластеризацию (хотя прошло уже некоторое время с тех пор, как я ее изучал).

spdep - отличный Rпакет Он включает в себя skaterфункцию пространственного анализа K-кластеров методом удаления краев деревьев . Он также предоставляет другие функции для пространственного анализа, включая пространственную автокорреляцию и обнаружение локального кластера с использованием Local Moran и другой пространственной статистики. Это описано следующим образом:

Набор функций для создания объектов матрицы пространственных весов из смежных многоугольников, из точечных моделей по расстоянию и тесселяциям, для суммирования этих объектов и для разрешения их использования в анализе пространственных данных, включая региональную агрегацию по минимальному остовному дереву; набор тестов для пространственной автокорреляции, в том числе глобальная статистика по Морану I, APLE, Geary's C, общий кросс-продукт Хьюберта / Мантеля, эмпирические байесовские оценки и индекс Ассунсао / Рейса, Getis / Ord G и статистика разноцветных объединений, локальные Моран I и Getis / Орд Г., Седловые аппроксимации и точные тесты для глобального и локального Морана I; и функции для оценки пространственных моделей одновременной авторегрессии (SAR) и модели ошибок, меры воздействия для моделей задержки,

Вы можете, по крайней мере, проверить, распределены ли ваши точки случайным образом в пространстве (предположительно, это полезный тест предварительной кластеризации при рассмотрении пространственных расстояний), но он также может генерировать другие полезные меры, которые вы могли бы ввести в свой алгоритм кластеризации. Наконец, возможно, вы можете найти полезные вопросы на https://stats.stackexchange.com/, посвященные вопросам пространственной кластеризации (хотя и больше с теоретической точки зрения).

djq
источник
Этот ответ идентифицирует многие из функциональных возможностей одного и того же типа, анализируя пространственный паттерн или автокорреляцию точечного паттерна, доступного в библиотеке spatstat. Где это интересно, это не совсем уместно в вопросе кластеризации. Я полностью за проверку гипотез и предварительный анализ, но нужно также непосредственно обратиться к рассматриваемому вопросу. Методы кластеризации с использованием spdep основаны на матрице пространственных весов [Wij], использующей k ближайшего соседа, случайность или расстояния.
Джеффри Эванс
2

Попробуйте пакет "leaderCluster" в R. В отличие от многих других алгоритмов кластеризации, он не требует от пользователя указывать количество кластеров, а вместо этого требует приблизительный радиус кластера в качестве основного параметра настройки.

Sumit
источник
-2

Проверьте функцию расстояния пакета геосферы или функцию ископаемого градуса. У вас есть данные в градусах, и вам необходимо перевести их в метры или футы перед кластеризацией.

тыс.куб.м
источник