You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于点数据用k最近邻与距离函数创建空间权重矩阵?

基于k近邻与距离权重的空间权重矩阵实现

要生成指定k近邻、权重为距离逆函数(如1/dij^beta或exp(-beta*dij))的空间权重矩阵,不能直接用nb2listw的style="W"(它会生成等权重),需要手动计算距离并自定义权重,再传入nb2listw。

实现步骤:

  1. 计算k近邻关系与对应距离
    用knearneigh可以同时获取每个点的k个近邻索引和距离,再转换为邻居对象:

    library(spdep)
    
    set.seed(1)
    x <- runif(100, 0, 1)
    y <- runif(100, 0, 1)
    coords <- cbind(x, y)
    
    # 计算k=5的近邻,同时返回距离矩阵
    knn_obj <- knearneigh(coords, k = 5)
    neighbour <- knn2nb(knn_obj)
    # 提取每个点到其近邻的距离
    dist_mat <- knn_obj$nn.dist
    
  2. 自定义距离权重
    根据需求选择权重函数,以下是两种常见实现:

    • 逆距离平方权重(1/dij^beta):
      beta <- 2
      # 遍历每个点,计算其邻居的权重,同时处理距离为0的边界情况
      weights_list <- lapply(1:nrow(dist_mat), function(i) {
        d <- dist_mat[i, ]
        d[d == 0] <- 1e-8  # 避免除以0
        w <- 1 / (d^beta)
        w <- w / sum(w)  # 行归一化,保证每行权重和为1(可选)
        w
      })
      
    • 指数衰减权重(exp(-beta*dij)):
      beta <- 5
      weights_list <- lapply(1:nrow(dist_mat), function(i) {
        d <- dist_mat[i, ]
        w <- exp(-beta * d)
        w <- w / sum(w)  # 行归一化(可选)
        w
      })
      
  3. 生成空间权重矩阵对象
    将自定义权重列表传入nb2listw的glist参数,生成目标对象:

    weights <- nb2listw(neighbour, glist = weights_list, style = "W")
    

验证结果

可以查看任意点的邻居权重,确认不是等权重:

# 查看第1个点的邻居权重
weights$weights[[1]]

内容的提问来源于stack exchange,提问作者Stephen Clark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 04:12:32