Agrupando dados espaciais em R? [fechadas]

34

Eu tenho muitos pontos de dados com latitude e longitude. Eu quero usar R para agrupá-los com base na distância.

Eu já dei uma olhada nesta página e tentei o pacote clustTool . Mas não tenho certeza se a função clust no clustTool considera os pontos de dados (lat, lon) como dados espaciais e usa a fórmula apropriada para calcular a distância entre eles.

Quero dizer, não consigo ver como eles diferenciam entre dados espaciais e dados ordinais. Acredito que o cálculo da distância entre dois pontos no mapa (espacial) e dois números normais seja diferente. (Não é?)

O que acontece também se eu quiser considerar um terceiro parâmetro no meu cluster?

Como dizer se eu tenho (lat, lon) e um outro parâmetro.

Como é calculada a distância?

O outro problema que tenho com o clustTool é que ele foi projetado com uma GUI em mente. Não sei como posso ignorar a sobrecarga da GUI na biblioteca porque não preciso dela.

Quais opções eu tenho no R para análise de cluster de dados espaciais?

kaptan
fonte
tnx whuber. Eu tenho uma pergunta. Existe um pacote específico para agrupamento espacial no R? Quero dizer, até onde eu entendo, a distância deve ser calculada de maneira diferente para dados espaciais. Isso está correto?
kaptan
Quase todos os pacotes de cluster de uso geral que encontrei, incluindo R Cluster, aceitarão matrizes de diferenças ou distância como entrada. Isso os torna perfeitamente gerais e aplicáveis ​​ao agrupamento na esfera, desde que você mesmo possa calcular as distâncias, o que é direto.
whuber
Estou enfrentando um problema muito semelhante por um longo tempo, mas não consigo encontrar uma solução agradável, você pode dar uma olhada na minha postagem no stack-exchange . Eu tenho um conjunto de dados mensais da temperatura da superfície do mar (lon, lat, sst). Você encontrou o caminho para encontrar clusters para esses dados espaciais? Não consigo encontrar o pacote / função R adequado. Agradecemos antecipadamente Paco
pacomet 31/07
Você já pensou em usar o SatScan?

Respostas:

13

Aqui está uma solução baseada na regra Encontrar distância de clusters de pontos , mas usando a distmfunção do geospherepacote:

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)

Você deve obter 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

Os próximos passos são apenas para visualização:

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)

enredo

ssanch
fonte
Tenho problemas com isso: tenho matriz de distância e encontro a maior distância para cada item: for (i in 1:186) { print(paste(i,min(distance[i,c(1:(i-1),(i+1):187)]))) } é preciso, 4mas quando aplico x <- cutree(hc, h=5), gera 101 clusters em 187. Logicamente, deveria ser 1. O que há de errado?
Peter.k
Olá, não sei como ajudá-lo aqui. Fiz um pequeno exemplo, e ele funciona muito bem: x = as.dist(matrix(runif(100), ncol=10)); hc = hclust(x, method="complete"); cutree(hc, h=max(x)). Isso fornece um único cluster, como seria de esperar. Tente plotar seu modelo de clustering com: plot(hc)e veja qual é o valor mais alto.
ssanch 10/09
11

Existem funções para calcular distâncias verdadeiras em uma terra esférica em R, então talvez você possa usá-las e chamar as funções de agrupamento com uma matriz de distância em vez de coordenadas. Eu nunca consigo lembrar os nomes ou pacotes relevantes. Consulte a Visualização de tarefas R-espacial para obter dicas.

A outra opção é transformar seus pontos em um sistema de referência para que as distâncias sejam euclidianas. No Reino Unido, posso usar o sistema de referência OSGrid:

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

usando spTransform do pacote 'rgdal' (ou talvez maptools). Encontre um sistema de grade para seus dados (a zona UTM relevante provavelmente funcionará) e você calculará distâncias em metros sem problemas.

Isso só é bom se seus dados forem uma área pequena - se você tiver dados globais, precisará realmente calcular a distância esférica, e isso está em algum lugar de um (ou mais) dos pacotes discutidos na R Spatial Task View:

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

Parece que você deseja "geosfera" do pacote, mas leia a exibição da tarefa espacial!

Spacedman
fonte
7

Eu daria uma olhada no pacote Spatstat . Todo o pacote é dedicado à análise de padrões de pontos espaciais (sic). Há um excelente ebook escrito pelo Prof. Adrian Baddeley no CSIRO, que contém documentação detalhada, instruções e exemplos para todo o pacote. Dê uma olhada no capítulo 19 para "Métodos de distância para padrões de pontos".

Dito isso, não tenho certeza de que mesmo o spatstat diferencie entre dados espaciais e ordinais, portanto, você pode reprojetar seus pontos em algo com valores consistentes x e y - possivelmente tente usar rgdal (uma biblioteca R para GDAL e OGR).

om_henners
fonte
TNX. Esse é um ótimo e-book. Mas não tenho certeza de como o cluster pode ser feito usando este Spatstat porque não vejo nenhuma função específica para o cluster. Você pode explicar um pouco?
Kaptan
2
Na verdade, para ser justo, tendo analisado novamente, eu examinaria o pacote DCluster - um pacote também de Bivand na análise de grupos de doenças. Além disso, desculpas pela espera na resposta!
Om_henners
6

Talvez essa resposta chegue 2 anos tarde demais, mas de qualquer maneira.

Que eu saiba, clustering espacial requer uma vizinhança definida à qual o clustering é restrito, pelo menos no começo. A função kulldorf no pacote SpatialEpi permite clustering espacial com base em vizinhanças agregadas.

além disso, a estatística DBSCAN disponível no pacote fpc pode ser útil.

consulte também aqui para uma discussão semelhante: https://stats.stackexchange.com/questions/9739/clustering-spatial-data-in-r

e aqui para um artigo interessante sobre algoritmos recentes de cluster, como CHAMAELEON: http://www.cs.uiuc.edu/homes/hanj/pdf/gkdbk01.pdf

Jens
fonte
Esse artigo de Han et al., "Métodos de agrupamento espacial em mineração de dados: uma pesquisa" agora pode ser encontrado em: hanj.cs.illinois.edu/pdf/gkdbk01.pdf
knb
5

Embora não seja um Rpacote, o geoda pode ser um programa interessante para examinar, como está escrito por Luc Anselin, que contribuiu para a teoria de agrupamentos espaciais, e acredito que permite alguns agrupamentos (embora já tenha passado algum tempo desde que eu a explorei).

O spdep é um ótimo Rpacote. Ele inclui a skaterfunção de Análise espacial 'K'luster por Remoção de Borda da Árvore . Ele também traz outras funções para análise espacial, incluindo autocorrelação espacial e detecção de cluster local usando Moran Local e outras estatísticas espaciais. É descrito da seguinte maneira:

Uma coleção de funções para criar objetos matriciais de pesos espaciais a partir de contiguidades de polígonos, de padrões de pontos por distância e mosaicos, para resumir esses objetos e para permitir seu uso na análise de dados espaciais, incluindo agregação regional por árvore de abrangência mínima; uma coleção de testes para autocorrelação espacial, incluindo I global de Moran I, APLE, C de Geary, estatística geral de produtos cruzados Hubert / Mantel, estimativas empíricas de Bayes e Índice Assunção / Reis, Getis / Ord G e estatísticas de contagem de junções multicoloridas, I local de Moran e Getis / Ord G, aproximações do ponto de sela e testes exatos para o global e local I de Moran; e funções para estimar modelos de atraso e erro espacial autoregressivo simultâneo espacial (SAR), medidas de impacto para modelos de atraso,

Você pode pelo menos testar se seus pontos são distribuídos aleatoriamente espacialmente (presumivelmente um teste útil de pré-agrupamento ao considerar distâncias espaciais), mas também pode gerar outras medidas úteis que você pode inserir no seu algoritmo de agrupamento. Por fim, talvez você possa encontrar perguntas úteis em https://stats.stackexchange.com/ que tratam de problemas de agrupamento espacial (embora, mais do ponto de vista teórico).

djq
fonte
Esta resposta está identificando muitos do mesmo tipo de funcionalidade, analisando o padrão espacial ou a autocorrelação do padrão de pontos, disponível na biblioteca de estatísticas do espaço. Onde isso é interessante, não é inteiramente pertinente à questão do agrupamento. Sou totalmente a favor do teste de hipóteses e da análise exploratória, mas é preciso também abordar diretamente a questão em questão. Os métodos para agrupar usando spdep são baseados na matriz de pesos espaciais [Wij] usando k vizinho mais próximo, contingência ou distâncias.
Jeffrey Evans
2

Tente o pacote leaderCluster em R. Ao contrário de muitos outros algoritmos de armazenamento em cluster, ele não requer que o usuário especifique o número de clusters, mas requer o raio aproximado de um cluster como seu parâmetro de ajuste principal.

Sumit
fonte
-2

Verifique a função de distância do pacote da geosfera ou a função deg.dist fóssil. Você tem dados em graus e precisa convertê-los em metros ou pés antes de fazer o cluster.

mcm
fonte