是否有一个R函数模仿ArcGIS 10.1中的分组分析工具?

时间:2013-03-12 15:46:51

标签: r gis cluster-analysis

我是R的初学者,但是使用Esri的ArcGIS的专家。

我想使用R来运行探索性分组/聚类分析,如Arc的10.1工具here

所需的最终产品必须是地图可视化。我在这里找到了this thread on hierarchical cluster analysis。这是与Esri相同类型的数据分组分析吗? ArcGIS工具为参数提供了很大的灵活性,我希望用R复制这个功能。

同样,我是R初学者。任何信息,建议或建议都非常感谢。

谢谢,迈克

1 个答案:

答案 0 :(得分:3)

尽我所知,这是一个简单的KNN分析。 ESRI帮助解释的替代“无距离矩阵”组件似乎非常不合需要。基本上他们使用K-means聚类和区域增长方法使用随机播种。这似乎非常不稳定,可能会返回高度可变的结果。看起来他们正在进行一些机动以避免一些问题,例如断开连接的区域,因此可能需要做一些精确的重建结果。您可以在spdep中近似“空间约束”选项。以下是距离分析的简要示例,它将为您提供一个起点。请记住,为了分配“类”,您需要设置某种类型的循环结构。

require(sp)
require(spdep)

data(meuse) 
coordinates(meuse) <- ~x+y

# Create distance matrix of specified range
meuse.dist <- dnearneigh(coordinates(meuse), 0.0001, 1000)

# Coerce distance object to a list object with distances for each observation
dist.list <- nbdists(meuse.dist, coordinates(meuse))

# Create a new column with the distance to the nearest observation using lapply and unlist
meuse@data <- data.frame(meuse@data, NNDist=unlist(lapply(dist.list, FUN=function(x) min(x))))

# Plot results
spplot(meuse, "NNDist", col.regions=colorRampPalette(c("blue","yellow","red"),
       interpolate="spline")(10)  )

您可能还想探索分层聚类。但是,对于较大的数据集,hclust需要三角形距离矩阵,而dnearneigh则不需要。以下是使用约束层次聚类的示例。

# SPATIALLY CONSTRAINED CLUSTERING
require(sp)
require(rioja)

data(meuse)
  coordinates(meuse) <- ~x+y
    cdat <- data.frame(x=coordinates(meuse)[,1],y=coordinates(meuse)[,2])
      rownames(cdat) <- rownames(meuse@data)

chc <- chclust(dist(cdat), method="conslink")

# KNN
  chc.n3 <- cutree(chc, k=3) 

# DISTANCE  
  chc.d200 <- cutree(chc, h=200) 

meuse@data <- data.frame(meuse@data, KNN=as.factor(chc.n3), DClust=chc.d200)

opar <- par
  par(mfcol=c(1,2))  
   cols <- topo.colors(length(unique(meuse@data$KNN)))  
    color <- rep("xx", nrow(meuse@data))
      for(i in 1:length(unique(meuse@data$KNN))) {
        v <- unique(meuse@data$KNN)[i] 
          color[(meuse@data$KNN == v)] <- cols[i]
        }
    plot(meuse, col=color, pch=19, main="KNN Clustering")

    cols <- topo.colors(length(unique(meuse@data$DClust)))  
    color <- rep("xx", nrow(meuse@data))
      for(i in 1:length(unique(meuse@data$DClust))) {
        v <- unique(meuse@data$DClust)[i] 
          color[(meuse@data$DClust == v)] <- cols[i]
        }
    plot(meuse, col=color, pch=19, main="Distance Clustering")  
par <- opar