Agrupación de datos espaciales en R? [cerrado]

34

Tengo un montón de puntos de datos con latitud y longitud. Quiero usar R para agruparlos en función de su distancia.

Ya he echado un vistazo a esta página y probé el paquete clustTool . Pero no estoy seguro de si la función clust en clustTool considera los puntos de datos (lat, lon) como datos espaciales y utiliza la fórmula adecuada para calcular la distancia entre ellos.

Quiero decir que no puedo ver cómo diferencian entre datos espaciales y datos ordinales. Creo que el cálculo de la distancia entre dos puntos en el mapa (espacial) y dos números normales es diferente. (¿No lo es?)

Además, ¿qué sucede si quiero considerar un tercer parámetro en mi agrupación?

Como decir si tengo (lat, lon) y otro parámetro.

¿Cómo se calcula la distancia?

El otro problema que tengo con clustTool es que está diseñado con una GUI en mente. No sé cómo puedo omitir la sobrecarga de GUI en la biblioteca porque no la necesito.

¿Qué opciones tengo en R para el análisis de agrupamiento de datos espaciales?

kaptan
fuente
tnx whuber. Tengo una pregunta. ¿Existe un paquete específico para la agrupación espacial en R? Quiero decir, hasta donde yo entiendo, la distancia debe calcularse de manera diferente para los datos espaciales. ¿Es esto correcto?
kaptan
Casi todos los paquetes de clusters de propósito general que he encontrado, incluidos los R Cluster, aceptarán matrices de disparidad o distancia como entrada. Esto los hace perfectamente generales y aplicables a la agrupación en la esfera, siempre que pueda calcular las distancias usted mismo, lo cual es sencillo.
whuber
Me enfrento a un problema muy similar durante mucho tiempo, pero no puedo encontrar una buena solución, puedes echar un vistazo a mi publicación en stack-exchange . Tengo un conjunto de datos mensuales de temperatura de la superficie del mar (lon, lat, sst). ¿Has encontrado la manera de encontrar grupos para esos datos espaciales? No puedo encontrar el paquete / función R adecuado. Gracias de antemano Paco
pacomet
¿Has considerado usar SatScan?

Respuestas:

13

Aquí hay una solución basada en la regla de distancia basada en Buscar clústeres de puntos , pero usando la distmfunción del geospherepaquete:

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)

Deberías obtener algo como:

        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

Los siguientes pasos son solo para visualización:

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)

trama

ssanch
fuente
Tengo problemas con esto: tengo una matriz de distancia y encuentro la distancia más grande para cada elemento: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } toma 4pero cuando lo aplico x <- cutree(hc, h=5)me da 101 grupos de 187. Lógicamente, debería ser 1. ¿Qué pasa?
Peter.k
Hola, no estoy seguro de cómo ayudarte aquí. Hice un pequeño ejemplo, y funciona bien: x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Esto le da un solo clúster, como era de esperar. Intente trazar su modelo de agrupación con: plot(hc)y vea cuál es el valor más alto.
ssanch
11

Hay funciones para calcular distancias reales en una tierra esférica en R, por lo que quizás pueda usarlas y llamar a las funciones de agrupación con una matriz de distancia en lugar de coordenadas. Sin embargo, nunca puedo recordar los nombres o paquetes relevantes. Vea la Vista de tareas R-espacial para obtener pistas.

La otra opción es transformar sus puntos en un sistema de referencia para que las distancias sean euclidianas. En el Reino Unido puedo usar el sistema de referencia OSGrid:

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

usando spTransform del paquete 'rgdal' (o quizás maptools). Encuentre un sistema de cuadrícula para sus datos (la zona UTM relevante probablemente servirá) y calculará distancias en metros sin problema.

Esto solo es bueno si sus datos son un área pequeña: si tiene datos globales, entonces realmente necesita calcular la distancia esférica, y eso está en algún lugar en uno (o más) de los paquetes discutidos en la Vista de tareas espaciales de R:

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

Parece que quiere el paquete "geosfera", ¡pero lea la vista de tareas espaciales!

Hombre espacial
fuente
7

Echaría un vistazo al paquete Spatstat . Todo el paquete está dedicado a analizar patrones de puntos espaciales (sic). Hay un excelente libro electrónico escrito por el Prof. Adrian Baddeley en el CSIRO que contiene documentación detallada, instrucciones y ejemplos para todo el paquete. Eche un vistazo al capítulo 19 para "Métodos de distancia para patrones de puntos".

Dicho esto, no estoy seguro de que incluso el statstat diferencie entre datos espaciales y ordinales, por lo que es posible que desee volver a proyectar sus puntos en algo con valores consistentes x e y, posiblemente intente usar rgdal (una biblioteca R para GDAL y OGR).

om_henners
fuente
tnx. Ese es un gran libro electrónico. Pero no estoy seguro de cómo se puede hacer clustering usando este Spatstat porque no veo ninguna función específica para el clustering. ¿Puedes explicar un poco?
kaptan
2
En realidad, para ser justos, después de haberlo examinado nuevamente, vería el paquete DCluster , un paquete también de Bivand sobre el análisis de grupos de enfermedades. Además, disculpas por la espera en la respuesta!
om_henners
6

Tal vez esta respuesta llegue 2 años demasiado tarde, pero de todos modos.

Que yo sepa, la agrupación espacial requiere una vecindad definida a la que se restringe la agrupación, al menos al principio. La función kulldorf en el paquete SpatialEpi permite la agrupación espacial basada en vecindades agregadas.

Además, la estadística DBSCAN disponible en el paquete fpc podría ser útil.

ver también aquí para una discusión similar: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

y aquí para un artículo interesante sobre algoritmos de clúster recientes, como CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

Jens
fuente
Ese documento de Han et al., "Métodos de agrupamiento espacial en minería de datos: una encuesta" ahora se puede encontrar en: hanj.cs.illinois.edu/pdf/gkdbk01.pdf
knb
5

Si bien no es un Rpaquete, Geoda podría ser un programa interesante para examinar, ya que está escrito por Luc Anselin, quien ha contribuido a la teoría de la agrupación espacial, y creo que permite cierta agrupación (aunque ha pasado algún tiempo desde que lo exploré).

spdep es un gran Rpaquete. Incluye la skaterfunción para el análisis espacial 'K'luster by Tree Edge Removal . También trae otras funciones para el análisis espacial, incluida la autocorrelación espacial y la detección de clúster local utilizando Local Moran y otras estadísticas espaciales. Se describe de la siguiente manera:

Una colección de funciones para crear objetos de matriz de pesos espaciales a partir de contigüidades de polígonos, a partir de patrones de puntos por distancia y teselaciones, para resumir estos objetos y para permitir su uso en el análisis de datos espaciales, incluida la agregación regional por árbol de expansión mínima; una colección de pruebas de autocorrelación espacial, que incluye Moran's I, APLE, Geary's C global, estadística general de productos cruzados Hubert / Mantel, estimaciones empíricas de Bayes e Assunção / Reis Index, Getis / Ord G y estadísticas de recuento de combinaciones multicolores, Moran's I y Getis locales / Ord G, aproximaciones de silla de montar y pruebas exactas para Moran's I global y local; y funciones para estimar modelos de error y retardo autoregresivos espaciales simultáneos (SAR), medidas de impacto para modelos de retraso,

Al menos puede probar si sus puntos están distribuidos aleatoriamente espacialmente (presumiblemente una prueba previa de agrupamiento útil al considerar distancias espaciales), pero también puede generar otras medidas útiles que podría ingresar a su algoritmo de agrupamiento. Finalmente, tal vez pueda encontrar preguntas útiles en https://stats.stackexchange.com/ que tratan con problemas de agrupamiento espacial (aunque, más desde una perspectiva teórica).

djq
fuente
Esta respuesta está identificando muchas de las mismas funciones, analizando el patrón espacial o la autocorrelación del patrón de puntos, disponible en la biblioteca de SPATSTAT. Cuando esto es interesante, no es del todo pertinente a la cuestión de la agrupación. Estoy a favor de la prueba de hipótesis y el análisis exploratorio, pero también se debe abordar directamente la pregunta en cuestión. Los métodos para agrupar usando spdep se basan en la matriz de pesos espaciales [Wij] usando k vecino más cercano, contingencia o distancias.
Jeffrey Evans el
2

Pruebe el paquete leaderCluster en R. A diferencia de muchos otros algoritmos de agrupación, no requiere que el usuario especifique el número de agrupaciones, sino que requiere el radio aproximado de una agrupación como su parámetro de ajuste principal.

Sumit
fuente
-2

Verifique la función de distancia del paquete de geosfera o la función de disociación fósil. Tiene datos en grados y necesita traducirlos a metros o pies antes de agrupar.

mcm
fuente