使用ClustGeo做空间约束层次聚类时如何计算地理距离矩阵
ClustGeo空间约束聚类所需地理距离矩阵解决方案
你当前运行代码报错的核心原因是pollution数据集内没有预计算好的D.geo地理距离矩阵对象,和代码语法无关。要完成带空间约束的聚类,你需要先补充对应乡镇的地理空间相关数据,可选解决方案如下:
方案1:补充坐标后计算地理距离(最常用,符合官方逻辑)
- 给当前属性表新增2列空间数据,可二选一:
- 平面投影坐标系下的乡镇中心点X/Y坐标(优先选择,计算出的欧氏距离误差更小)
- WGS84/GCJ02等坐标系下的经纬度坐标
- 提取和属性数据排序完全一致的坐标列,计算距离矩阵,代码示例:
# 示例1:已新增平面坐标列x、y,顺序与污染物属性数据的乡镇顺序完全匹配 coords <- pollution[, c("x", "y")] # 计算地理距离并转为dist格式,对应你原来的D1变量 D1 <- dist(coords) # 示例2:用经纬度计算大地距离,需调用geosphere包 library(geosphere) D.geo_matrix <- distm(pollution[, c("lon", "lat")], fun = distHaversine) D1 <- as.dist(D.geo_matrix)
方案2:基于邻接关系生成约束距离(无坐标时可选)
如果你暂时无法获取乡镇坐标,仅需要聚类结果满足同类别乡镇空间接壤的约束,可以先生成乡镇的邻接矩阵(相邻赋值为1,不相邻赋值为大于1的自定义值),再转为dist格式作为D1输入即可。
关键注意事项
- 地理距离矩阵的乡镇排序必须和你之前做无约束Ward聚类时用的属性距离矩阵的乡镇排序完全一致,否则空间约束会匹配错误。
- 后续调用
hclustgeo函数时,传入的属性距离矩阵D0、地理距离矩阵D1的样本量、样本顺序必须完全对应。
内容的提问来源于stack exchange,提问作者bram
相关产品推荐
相关产品推荐

