Regroupement de données spatiales dans R? [fermé]

34

J'ai un tas de points de données avec la latitude et la longitude. Je veux utiliser R pour les regrouper en fonction de leur distance.

J'ai déjà regardé cette page et essayé le paquet clustTool . Mais je ne suis pas sûr que la fonction clust dans clustTool considère les points de données (lat, lon) comme des données spatiales et utilise la formule appropriée pour calculer la distance qui les sépare.

Je veux dire que je ne vois pas comment ils différencient les données spatiales des données ordinales. Je crois que le calcul de la distance entre deux points de la carte (spatiale) et deux nombres normaux est différent. (N'est-ce pas?)

De plus, que se passe-t-il si je souhaite prendre en compte un troisième paramètre dans ma classification?

Comme par exemple si j'ai (lat, lon) et un autre paramètre.

Comment est calculée la distance?

L'autre problème que j'ai avec clustTool est qu'il est conçu avec une interface graphique à l'esprit. Je ne sais pas comment je peux ignorer la surcharge de l'interface graphique dans la bibliothèque car je n'en ai pas besoin.

Quelles sont les options disponibles dans R pour l'analyse par cluster des données spatiales?

Kaptan
la source
tnx whuber. J'ai une question. Existe-t-il un package spécifique pour le clustering spatial dans R? Pour autant que je sache, la distance devrait être calculée différemment pour les données spatiales. Est-ce correct?
Kaptan
Presque tous les paquets de classification d'usage général que j'ai rencontrés, y compris R Cluster, acceptent les matrices de dissimilarité ou de distance comme entrée. Cela les rend parfaitement généraux et applicables au regroupement sur la sphère, à condition que vous puissiez calculer vous-même les distances, ce qui est simple.
whuber
Je suis confronté à un problème très similaire depuis longtemps , mais ne peut pas trouver une solution agréable, vous pouvez jeter un oeil à mon poste dans la pile d'échange . J'ai un ensemble de données mensuelles sur la température de surface de la mer (lon, lat, sst). Avez-vous trouvé le moyen de trouver des clusters pour de telles données spatiales? Je ne trouve pas le package / la fonction R approprié. Merci d'avance Paco
pacomet
Avez-vous envisagé d'utiliser SatScan?

Réponses:

13

Voici une solution basée sur la règle de distance basée sur la recherche de groupes de points , mais utilisant la distmfonction du geospherepackage:

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)

Vous devriez obtenir quelque chose comme:

        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

Ces prochaines étapes ne concernent que la visualisation:

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)

terrain

sanch
la source
J'ai des problèmes avec ceci: j'ai une matrice de distance et je trouve la plus grande distance pour chaque élément: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } cela prend, 4mais lorsque je postule, x <- cutree(hc, h=5)cela me donne 101 grappes sur 187. Logiquement, cela devrait être 1. Qu'est-ce qui ne va pas?
Peter.k
Bonjour, je ne sais pas comment vous aider ici. J'ai fait un petit exemple, et il fonctionne très bien: x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Cela vous donne un seul cluster, comme vous le souhaitiez. Essayez de tracer votre modèle de classification avec:, plot(hc)et voyez quelle est la valeur la plus élevée.
dimanche
11

Il existe des fonctions pour calculer les distances réelles sur une terre sphérique dans R; vous pouvez donc les utiliser et appeler les fonctions de regroupement avec une matrice de distance au lieu de coordonnées. Je ne me souviens jamais des noms ni des forfaits pertinents. Voir la vue des tâches R-spatiales pour des indices.

L'autre option consiste à transformer vos points en un système de référence afin que les distances soient euclidiennes. Au Royaume-Uni, je peux utiliser le système de référence OSGrid:

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

en utilisant spTransform du paquet 'rgdal' (ou peut-être maptools). Trouvez un système de grille pour vos données (la zone UTM appropriée le fera probablement) et vous calculerez les distances en mètres sans problème.

Cela n’est utile que si vos données sont une zone restreinte. Si vous disposez de données globales, vous devez réellement calculer la distance sphérique. C’est quelque part dans un (ou plusieurs) des packages abordés dans la vue Tâches spatiales R:

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

On dirait que vous voulez le paquet "geosphere", mais lisez bien la vue spatiale des tâches!

Spacedman
la source
7

Je jetterais un coup d'œil au paquet Spatstat . L'ensemble du package est dédié à l'analyse de modèles de points spatiaux (sic). Le professeur Adrian Baddeley, du CSIRO, a rédigé un excellent ebook contenant une documentation détaillée, des procédures et des exemples pour l'ensemble du package. Consultez le chapitre 19 pour "Méthodes de distance pour les modèles de points".

Cela dit, je ne suis pas sûr que même spatstat différencie les données spatiales des données ordinales. Vous voudrez peut-être donc reprojeter vos points en quelque chose avec des valeurs x et y cohérentes - essayez éventuellement d'utiliser rgdal (une bibliothèque R pour GDAL et OGR).

om_henners
la source
tnx. C'est un excellent ebook. Mais je ne suis pas sûr de savoir comment la mise en cluster peut être effectuée à l'aide de ce Spatstat car je ne vois aucune fonction spécifique pour la mise en cluster. Pouvez-vous expliquer un peu?
Kaptan
2
En fait, pour être juste, après l'avoir examiné à nouveau, je regarderais le paquet DCluster - un paquet également de Bivand sur l'analyse des grappes de maladies. Aussi, excuses pour l'attente de la réponse!
om_henners
6

Peut-être que cette réponse arrive 2 ans trop tard, mais quand même.

À ma connaissance, le regroupement spatial nécessite un voisinage défini auquel le regroupement est contraint, du moins au début. La kulldorf fonction dans le SpatialEpi paquet permet de regroupement spatial en fonction des quartiers agrégés.

De plus, les statistiques DBSCAN disponibles dans le paquetage fpc pourraient être utiles.

Voir aussi ici pour une discussion similaire: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

et ici pour un article intéressant sur les algorithmes de cluster récents, tels que CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

Jens
la source
Cet article de Han et al., "Méthodes de classification spatiale dans l'exploration de données: une enquête", est disponible à l' adresse suivante
knb,
5

Bien que ce ne soit pas un Rpaquet, geoda pourrait être un programme intéressant à examiner car il est écrit par Luc Anselin qui a contribué à la théorie du clustering spatial, et je pense que cela permet un certain clustering (bien que cela fait longtemps que je ne l’ai pas exploré).

spdep est un excellent Rpackage. Il inclut la skaterfonction d' analyse spatiale 'K'luster par enlèvement d'arête . Il apporte également d'autres fonctions pour l'analyse spatiale, notamment l'auto-corrélation spatiale et la détection d'un cluster local à l'aide de Local Moran et d'autres statistiques spatiales. Il est décrit comme suit:

Ensemble de fonctions permettant de créer des objets matriciels de pondérations spatiales à partir de contiguités de polygones, à partir de modèles de points par distance et tessélations, permettant de résumer ces objets et de permettre leur utilisation dans l’analyse de données spatiales, y compris l’agrégation régionale par arborescence minimale; une collection de tests d'autocorrélation spatiale, comprenant les statistiques globales des produits, les estimations Empirical Bayes et les indices Assunção / Reis, Getis / Ord G et multicolores, les statistiques de décompte des jointures multicolores, les évaluations Emunical / Reis, Getis / Ord G et multicolores, les statistiques locales de Moran, I et Getis / Ord G, approximations du point de selle et tests exacts pour I de Moran global et local; et fonctions d’estimation des modèles de retard et d’erreur autorégressifs simultanés (SAR), mesures de l’impact des modèles de retard,

Vous pouvez au moins tester si vos points sont distribués spatialement de manière aléatoire (sans doute un test de pré-clustering utile lors de la prise en compte de distances spatiales), mais cela peut également générer d'autres mesures utiles que vous pourriez entrer dans votre algorithme de clustering. Enfin, vous trouverez peut-être des questions utiles sur https://stats.stackexchange.com/ traitant des problèmes de clustering spatial (mais plutôt d'un point de vue théorique).

djq
la source
Cette réponse identifie plusieurs fonctionnalités du même type, en analysant le modèle spatial ou l'autocorrélation du modèle de points, disponible dans la bibliothèque spatstat. Là où cela est intéressant, la question du regroupement n’est pas tout à fait pertinente. Je suis tout pour les tests d’hypothèses et les analyses exploratoires, mais il faut aussi aborder directement la question. Les méthodes de classification utilisant spdep sont basées sur la matrice de pondérations spatiales [Wij] utilisant k plus proche voisin, la contingence ou les distances.
Jeffrey Evans
2

Essayez leader pack cluster dans R. Contrairement à la plupart des autres algorithmes de clustering, il n’est pas nécessaire de spécifier le nombre de clusters mais plutôt le rayon approximatif d’un cluster comme paramètre principal de réglage.

Sumit
la source
-2

Vérifiez la fonction de distance du paquet géosphère ou la fonction deg.dist fossile. Vous avez des données en degrés et vous devez les traduire en mètres ou en pieds avant de procéder à la mise en cluster.

mcm
la source