39 votos

¿Clasificación de datos espaciales en R?

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

Ya he echado un vistazo a este página y trató de clustTool paquete. 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 veo cómo diferencian los datos espaciales de los ordinales. Creo que el cálculo de la distancia entre dos puntos del mapa (espacial) y dos números normales es diferente. (¿No es así?)

¿Qué ocurre también si quiero considerar un tercer parámetro en mi agrupación?

Por ejemplo, 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 la GUI en la biblioteca porque no la necesito.

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

0 votos

0 votos

Tnx whuber. Tengo una pregunta. ¿Existe un paquete específico para la agrupación espacial en R? Quiero decir, por lo que entiendo la distancia debe calcularse de manera diferente para los datos espaciales. ¿Es esto correcto?

0 votos

Casi todos los paquetes de clustering de uso general que he encontrado, incluido el de R Cluster aceptará disimilitud 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.

20voto

yanpas Puntos 60

He aquí una solución basada en Encontrar clusters de puntos basados en la regla de la distancia pero utilizando el distm de la función geosphere paquete:

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 conseguir 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

Estos pasos siguientes son sólo para la 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)

plot

0 votos

Tengo problemas con esto: Tengo matriz de distancia y encontrar la mayor distancia para cada elemento: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } Se necesita 4 pero cuando aplico x <- cutree(hc, h=5) me da 101 grupos de 187. Lógicamente, debería ser 1. ¿Qué es lo que falla?

0 votos

Hola, no sé cómo ayudarte. 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 único conglomerado, como era de esperar. Pruebe a trazar su modelo de agrupación con: plot(hc) y ver cuál es el valor más alto.

0 votos

@ssanch gran solución. Sabrías como agrupar puntos entre dos grupos. Como determinar los puntos mas cercanos del grupo1 en el grupo2.

11voto

Jay Bazuzi Puntos 194

Hay funciones para calcular las distancias reales en una tierra esférica en R, así que tal vez usted puede utilizar esos 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 los paquetes relevantes. Vea la vista de tareas de R-spatial para obtener pistas.

La otra opción es transformar sus puntos a un sistema de referencia para que las distancias son Euclidiano. En el Reino Unido puedo utilizar el sistema de referencia OSGrid:

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

utilizando spTransform del paquete 'rgdal' (o quizás maptools). Encuentra un sistema de cuadrícula para tus datos (la zona UTM relevante probablemente servirá) y estarás calculando distancias en metros sin problema.

Esto sólo es bueno si sus datos son un área más o menos 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 quieres el paquete "geosfera", pero lee la vista de tareas espaciales.

7voto

ESV Puntos 4591

Yo echaría un vistazo a la Spatstat paquete. Todo el paquete está dedicado a analizar patrones espaciales de puntos (sic). Hay un excelente Libro electrónico escrito por el profesor Adrian Baddeley del CSIRO que contiene documentación detallada, instrucciones y ejemplos para todo el paquete. Echa un vistazo al capítulo 19 para ver los "Métodos de distancia para patrones de puntos".

Dicho esto, no estoy seguro de que incluso spatstat diferencie entre datos espaciales y ordinales, por lo que podría querer reproyectar sus puntos en algo con valores x e y consistentes - posiblemente intente usar rgdal (una biblioteca R para GDAL y OGR).

0 votos

Gracias. Es un gran ebook. Pero no estoy seguro de cómo se puede hacer clustering usando este Spatstat porque no veo ninguna función específica para clustering. ¿Me lo puedes explicar un poco?

2 votos

En realidad, para ser justos, habiéndolo mirado de nuevo yo miraría el DCluster un paquete también de Bivand sobre el análisis de grupos de enfermedades. Disculpe también la demora en la respuesta.

6voto

muloroto Puntos 1

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

Hasta donde yo sé, la agrupación espacial requiere un vecindario definido al que se restringe la agrupación, al menos al principio. El kulldorf en la función SpatialEpi permite la agrupación espacial basada en barrios agregados.

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

véase también aquí para un debate similar: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

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

0 votos

El artículo de Han et al., "Spatial Clustering Methods in Data Mining: A survey" puede consultarse en hanj.cs.illinois.edu/pdf/gkdbk01.pdf

5voto

djq Puntos 7670

Aunque no es un R paquete, geoda podría ser un programa interesante para examinar, ya que está escrito por Luc Anselin, que ha contribuido a la teoría de la agrupación espacial, y creo que permite cierta agrupación (aunque hace tiempo que no lo he explorado).

spdep es un gran R paquete. Incluye el skater función para Análisis espacial de "K" por eliminación de bordes de árboles . También aporta otras funciones para el análisis espacial, como la autocorrelación espacial y la detección de clústeres locales mediante Moran local y otros estadísticos espaciales. Se describe como sigue:

Una colección de funciones para crear objetos de matriz de pesos espaciales a partir de contigüidades de polígonos, de patrones de puntos por distancia y teselaciones, para resumir estos objetos y para permitir su en el análisis de datos espaciales, incluida la agregación regional por árbol de extensión mínima; una colección de pruebas de autenticidad autocorrelación espacial, incluyendo I de Moran global, APLE, C de Geary, estadística general de producto cruzado de Hubert/Mantel, estimaciones de Empirical Bayes y el índice de Assunção/Reis, la G de Getis/Ord y los estadísticos de recuento de estadísticas de recuento multicolor, I de Moran local y Getis/Ord G, aproximaciones aproximaciones y pruebas exactas para la I de Moran global y local; y funciones para estimar el retardo autorregresivo simultáneo espacial (SAR) y modelos de error, medidas de impacto para modelos de retardo, SAR ponderado y modelos de regresión espacial SAR y CAR ponderados y semiparamétricos y filtrado espacial de vectores propios de Moran, modelos de error SAR GM y modelos espaciales generalizados de mínimos cuadrados de dos etapas.

Al menos puede comprobar si sus puntos están distribuidos espacialmente de forma aleatoria (presumiblemente una prueba útil previa a la agrupación al considerar las distancias espaciales), pero también puede generar otras medidas útiles que podría introducir en su algoritmo de agrupación. Por último, tal vez le resulten útiles las preguntas sobre https://stats.stackexchange.com/ tratar los problemas de agrupación espacial (aunque, más bien, desde una perspectiva teórica).

0 votos

Esta respuesta identifica muchas de las funcionalidades del mismo tipo, analizando el patrón espacial o la autocorrelación del patrón de puntos, disponibles en la biblioteca spatstat. Aunque esto es interesante, no es del todo pertinente para la cuestión de la agrupación. Estoy a favor de las pruebas de hipótesis y de los análisis exploratorios, pero también hay que abordar directamente la cuestión que nos ocupa. Los métodos de agrupación con spdep se basan en la matriz de pesos espaciales [Wij] utilizando k vecinos más próximos, contingencia o distancias.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X