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


34

У мене є купа точок даних із широтою та довготою. Я хочу використовувати R для їх кластеризації на основі їх відстані.

Я вже переглянув цю сторінку і спробував пакет clustTool . Але я не впевнений, чи функція clust в clustTool розглядає точки даних (lat, lon) як просторові дані та використовує відповідну формулу для обчислення відстані між ними.

Тобто я не бачу, як вони розрізняють просторові дані і порядкові дані. Я вважаю, що розрахунок відстані між двома точками на карті (просторовими) та двома нормальними числами різний. (Чи не так?)

Що також відбувається, якщо я хочу розглянути третій параметр у своїй кластеризації?

Скажімо, якщо у мене є (lat, lon) та ще один параметр.

Як обчислюється відстань?

Інша проблема, яку я маю з clustTool, полягає в тому, що він розроблений з урахуванням GUI. Я не знаю, як я можу пропустити накладні графічні інтерфейси в бібліотеці, тому що мені це не потрібно.

Які варіанти я маю в R для кластерного аналізу просторових даних?



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)

сюжет


У мене виникають проблеми з цим: у мене є матриця відстані, і я знаходжу найбільшу відстань для кожного елемента: 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»:

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

Схоже, ви хочете отримати пакет "геосфера", але прочитайте подання просторового завдання!


7

Я погляну на пакет Spatstat . Весь пакет присвячений аналізу шарів просторових точок (sic). Існує відмінна електронна книга, написана професором Адріаном Бадделі в CSIRO, яка містить детальну документацію, практичні вказівки та приклади для всього пакету. Погляньте на главу 19 для "Методи відстані для точкових шаблонів".

Це означає, що я навіть не впевнений, що навіть шпат-стат розрізняє просторові та порядкові дані, тому ви, можливо, захочете перепрофілювати свої точки на щось із послідовними значеннями x та y - можливо, спробуйте використовувати rgdal (бібліотека R для GDAL та OGR).


tnx. Це чудова електронна книга. Але я не впевнений, як кластеризацію можна зробити за допомогою цього 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


Цей документ Хан та ін. «Методи просторового кластеризації в обробці
knb

5

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

spdep - чудовий Rпакет. Вона включає в себе skaterфункцію просторового аналізу K'luster шляхом видалення країв дерева . Він також пропонує інші функції просторового аналізу, включаючи просторову автоматичну кореляцію та виявлення локального кластера за допомогою Local Moran та іншої просторової статистики. Він описаний так:

Сукупність функцій для створення об'єктів матриці просторових ваг з полігонів, пов'язаних з багатокутниками, від точкових шаблонів на відстані та теселяції, для узагальнення цих об'єктів та для дозволу їх використання в аналізі просторових даних, включаючи регіональну агрегацію за мінімальним розміщеним деревом; колекція тестів на просторову автокореляцію, включаючи глобальну I, APLE, Geary's C, Hubert / Mantel загальну статистику наскрізного продукту, емпіричні оцінки Bayes та індекс Assunção / Reis, Getis / Ord G та різнокольорову статистику підключення, локальні Moran's I та Getis / Порядок G, наближення сідлових точок та точні випробування на глобальний та локальний Іран Морану; і функції для оцінки просторових одночасних авторегресивних (SAR) моделей відставання та помилок, заходи впливу для моделей відставання,

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


Ця відповідь ідентифікує багато однотипних функціональних можливостей, аналізує просторовий малюнок або автокореляцію точкової картини, наявної в бібліотеці шпатстатів. Де це цікаво, це не зовсім переживає питання кластеризації. Я все для тестування гіпотез та дослідницького аналізу, але слід також безпосередньо вирішити це питання. Методи кластеризації за допомогою spdep засновані на матриці просторових ваг [Wij] з використанням k найближчого сусіда, непередбачуваності або відстаней.
Джеффрі Еванс

2

Спробуйте пакети LeadCluster в Р. На відміну від багатьох інших алгоритмів кластеризації, він не вимагає від користувача вказувати кількість кластерів, а натомість вимагає приблизний радіус кластера як його основного параметра настройки.


-2

Перевірте функцію відстані в геосферному пакеті або викопну функцію deg.dist. У вас є дані в градусах, і вам потрібно перекласти їх у метри або фути, перш ніж робити кластеризацію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.