【问题标题】:How to impute missing neighbours of a spatial weight matrix (queen contiguity)如何估算空间权重矩阵的缺失邻居(女王邻接)
【发布时间】:2019-12-07 16:53:23
【问题描述】:

我有一个包含大约 180.000 250m^2 多边形的大形状文件。 我想创建一个空间权重矩阵(女王邻接)。 因此,如果它是邻居,则为 1,否则为 0。 但是,有几个多边形没有任何邻居(岛屿)。

我如何为那些没有任何直接邻居的单位推算最近邻居?

(使用 sf 或 sp 包 - 在 R 中)

.................................................. ....................

使用数据样本并绘制它,它看起来像:

sample shape file

然后我可以使用以下代码创建一个 W-Matrix:

Create NB List
sample_queen_nb <- poly2nb(sp.sample, row.names=sp.sample$ID, queen=T)

# Create Weights/list
sample_W.list.queen <- nb2listw(sample_queen_nb, style="W", zero.policy = TRUE) 

# Create Matrix
sample_W.queen <- listw2mat(sample_W.list.queen)

并通过绘图检查其连通性:

# Plot ShpPolygons
plot(sp.sample)
# plot weightsmatrix to see connectivity
plot(sample_queen_nb, coords, add=TRUE, col="green", cex=0.5) 

得到这个:

Connectivity Matrix

如您所见 - 有一个未连接的岛屿。我想为这个岛网格单元估算附近的相邻单元。我该怎么做?

【问题讨论】:

  • 首先制作一个足够小的子集或测试数据集,以便您可以看到发生了什么。您可以通过选择一个连续的组并添加几个不相交的特征,从 R 的内置空间数据集中创建一个。然后编辑您的问题以显示您是如何创建该问题的,以及您当前如何创建空间权重矩阵,以及如何测试连通性。然后我们可以帮助为该数据提供解决方案,最后一步是将其扩展到您的完整数据集。
  • 嘿 - 谢谢,抱歉,我已经编辑了这个问题 - 你知道如何估算邻居吗?
  • 嗯,事情可能没那么简单。如果您有两组多边形怎么办 - 每个多边形都有一个邻居,但整个图没有连接。如果有两个岛呢?如果它们是相互最近的邻居,可以将它们连接在一起吗?
  • 是的 - 我每次观察至少需要一个邻居。但是因为我需要一个尽可能多的皇后邻接矩阵,它应该只为那些根本没有连接的人估算最近的邻居。两组多边形(如果它们是多个)不需要连接到另一组多边形。如果某个地方有一个多边形,我只需要一个连接。 .... 我需要一个代码作为我的(上图),如果它找到一个岛(一个没有直接邻居的单个多边形),它应该选择 1-k-nearest(或类似的东西)。

标签: r matrix spatial imputation neighbours


【解决方案1】:

这就是我所说的制作样本数据集的意思:

> library(spdep);example(columbus)
> sp.sample = columbus[c(1:5,10,23),]
> plot(sp.sample)

首先让我们检查一下我们有没有断开的区域:

> coords = coordinates(sp.sample)
> queen_nb = poly2nb(sp.sample, row.names=sp.sample$ID, queen=TRUE)
> plot(sp.sample);plot(queen_nb, coords, add=TRUE)

这里有一个函数,它接受一组区域,计算相同的邻接,然后如果有任何没有邻居的区域,它会找到最近的邻居并将其添加到邻接对象中:

addnbs <- function(sp.sample){

    queen_nb <- poly2nb(sp.sample, row.names=sp.sample$ID, queen=TRUE)

    count = card(queen_nb)
    if(!any(count==0)){
        return(queen_nb)
    }

    ## get nearest neighbour index, use centroids:
    nnbs = knearneigh(coordinates(sp.sample))$nn

    no_edges_from = which(count==0)
    for(i in no_edges_from){
        queen_nb[[i]] = nnbs[i]
    }
    return(queen_nb)
}

让我们测试一下。

> n2 = addnbs(sp.sample)
> plot(sp.sample);plot(n2, coords, add=TRUE)

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多