2017-05-25 34 views
-1

我有这个简单的数据集。数据集是由假设的地理单位(即邮政编码)组成的,有3个变量:经度,纬度和一些价值(销售额)。R,按值进行空间聚类

lon<-rep(1:10,each=10) lat<-rep(1:10,10) someValue<-rnorm(100, mean = 20, sd = 5) dataset<-data.frame(lon,lat,someValue)

我现在面临的问题是领土对齐。鉴于提议的领土数量,我需要将邮政编码分组到地区,使得地区由相邻的邮政编码组成,并且someValue的总和大致相同(指定区域的平均数量的+/- 15% )

我现在最好的想法是:1.首先在lon/lat上进行聚类,以确定候选人; 2.使用来自步骤1的质心作为具有iter.max = 1的中心的someValue进行聚类; 3迭代1和2,直到某些收敛截止。

我想问一下社区:在R中实现类似的东西的方法是什么?我做了搜索空间聚类,没能找到任何有关

回答

0

您可以通过只考虑前两列(x和y)做使用kmeans聚类:

#How Many cluster do you want to have initially? 
initialClasses <- 2 

#clustering using kmeans 
initClust   <- kmeans(dataset[,1:2], initialClasses, iter.max = 100) 
dataset$classes <- initClust$cluster 

initClust$cluster则包含群集类。您可以将它们添加到您的数据框并使用dplyr来计算一些统计数据。例如,要总结的someValue每簇:

library(dplyr) 
statistics  <- dataset %>% group_by(classes) %>%summarize(sum=sum(someValue)) 

这里有个例子someValue了两个类的总和:

classes  sum 
    (int) (dbl) 
1  1 975.7783 
2  2 978.9166 

比方说,你的数据是平均分配,并且希望每个集群someValue中的总和变小。然后,你需要更多的(即3)班重新运行集群:

newRun   <- kmeans(dataset[,1:2], 3, iter.max = 100) 
dataset$classes <- newRun$cluster 

这里三类输出统计:

classes  sum 
    (int) (dbl) 
1  1 577.6573 
2  2 739.9668 
3  3 637.0707 

通过包装这个循环中,计算多标准(即方差)你可以将你的群集调整到合适的大小。希望能帮助到你。

+0

谢谢@maRtin。问题是我有预先确定的领土/集群的数量。我需要形成包含类似价值总计的集群。这是100个邮政编码的价值是100 * $ 20 = $ 2000,我需要10个地区。这意味着我需要创造价值大约200美元的地区 –