【问题标题】:Spatial weights: asymmetric adjacency matrix?空间权重:非对称邻接矩阵?
【发布时间】:2014-12-04 21:51:20
【问题描述】:

我正在创建一个邻接矩阵以在 R 中进行空间分析。数据都是美国大陆的县。我从美国人口普查老虎文件中获得了县空间多边形。

我能够创建邻居列表,并且它是对称的。但是当我将其转换为邻接矩阵时,它不是对称的。这是一个问题,因为我的目标是使用 ngspatial::autologistic 运行空间自逻辑模型,但我得到一个错误,我必须提供一个对称的二进制邻接矩阵。

这是我创建邻接矩阵的 R 代码:

us<-readShapeSpatial("County_2010Census_DP1.shp")
#Trim out counties outside of continental US
us2<-us[!substr(us$GEOID10,1,2)%in%c('02','60','66','78','15','72'),]
us2.nb = poly2nb(us2)
is.symmetric.nb(us2.nb) #Comes out true
us2.adj = nb2mat(us2.nb, style="B",zero.policy=F)
isSymmetric(us2.adj) #comes out false

顺便说一句,我可以毫无问题地将splogit 与这个邻接矩阵一起使用。我不是空间分析方面的专家,所以我不能说我知道这些命令中发生了什么。

【问题讨论】:

    标签: r gis spatial adjacency-matrix


    【解决方案1】:

    矩阵us2.adj 是对称的。问题出在测试上。原来,

    isSymmetric(us2.adj)
    

    使用all.equal(...) 测试矩阵与它的转置是否相等,all.equal(...) 检查属性和值。 nb2mat(...) 创建一个矩阵,其中行名设置为多边形 ID,列名未设置。所以all.equal(...) 返回FALSE,因此isSymmetric(...) 也是如此。显然,autologistic(...) 函数使用了相同的测试。

    us2.adj <- nb2mat(us2.nb, style="B",zero.policy=F)
    isSymmetric(us2.adj)
    # [1] FALSE
    isSymmetric(us2.adj,check.attributes=FALSE)
    # [1] TRUE
    

    简单的解决方案是将列名设置为行名,或者将行名设置为NULL

    x <- us2.adj
    colnames(x) <- rownames(x)
    isSymmetric(x)
    # [1] TRUE
    y <- us2.adj
    rownames(y) <- NULL
    isSymmetric(y)
    # [1] TRUE
    

    顺便说一句,我认为这个问题在 18 小时内没有得到解答的原因是您没有提供指向您的 shapefile 的链接。如果您不提供可重复的示例,则成员倾向于忽略或否决该问题。有关说明,请参阅this link

    【讨论】:

    • 谢谢!我还不能投票给你,但这正是我所需要的。我不知道如何共享 shapefile,而且它非常大,所以感谢那里的建议。
    • 嗯,你一定是从某个地方下载的吧?只需将该链接放在您的问题中即可。我在这里找到它:isismapping.org/springfield/GIS_data/County_2010Census_DP1.zip.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2015-12-17
    • 2016-11-05
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多