空间权重:不对称邻接矩阵?

时间:2014-12-04 21:51:20

标签: r gis spatial adjacency-matrix

我正在创建一个邻接矩阵,用于在R中进行空间分析。数据是美国大陆的所有县。我有来自美国人口普查Tiger文件的县空间多边形。

我能够创建邻居列表,它是对称的。但是当我将其转换为邻接矩阵时,它不是对称的。这是一个问题,因为我的目标是使用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这个邻接矩阵而没有问题。我不是空间分析专家,所以我不能说我知道这些命令中发生了什么。

1 个答案:

答案 0 :(得分:2)

矩阵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

相关问题