rob*_*ers 5 gis r spatial adjacency-matrix
我正在创建一个邻接矩阵来在 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
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我可以splogit毫无问题地使用这个邻接矩阵。我不是空间分析方面的专家,所以我不能说我知道这些命令中发生了什么。
该矩阵us2.adj是对称的。问题出在测试上。事实证明
isSymmetric(us2.adj)
Run Code Online (Sandbox Code Playgroud)
用于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
Run Code Online (Sandbox Code Playgroud)
简单的解决方案是将列名称设置为行名称,或将行名称设置为NULL。
x <- us2.adj
colnames(x) <- rownames(x)
isSymmetric(x)
# [1] TRUE
y <- us2.adj
rownames(y) <- NULL
isSymmetric(y)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我认为这个问题 18 小时内没有得到答复的原因是您没有提供 shapefile 的链接。如果您不提供可重现的示例,成员往往会忽略或否决该问题。请参阅此链接以获取说明
| 归档时间: |
|
| 查看次数: |
1700 次 |
| 最近记录: |