微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在R包spdep中合并两个listw对象? 示例代码

如何解决如何在R包spdep中合并两个listw对象? 示例代码

我正在使用 R 包 spdep,我想将两个单独创建的 listw 对象合并为一个 listw。我不确定如何实现这一目标。我没有找到任何本机函数来执行此操作,如果我尝试将它们转换为权重矩阵,加入它们,然后重新转换回 listw 我得到了一个 zero.policy 错误我无法解决,因为这应该在初始化邻居时指定。

重要的是,我需要将 listw 分开,因为它们是另一项分析的一部分,这是一项要求。

示例代码

library(sp)
library(spdep)

A <- SpatialPoints(data.frame(x = rnorm(10,-10),y = rnorm(10,-10)))
B <- SpatialPoints(data.frame(x = rnorm(10,10),10)))

# neighbors
knn.A <- knn2nb(knearneigh(A))
knn.B <- knn2nb(knearneigh(B))
# listw
listw.A <- nb2listw(knn.A)
listw.B <- nb2listw(knn.B)

# and from here,how to join listw.A and listw.B ?

# stupid things I tried ------------------
rbind(listw.A,listw.B) #nope

# convert to matrix and back to listw
listw_mat <- list(listw.A,listw.B)
dims <- sapply(listw_mat,function(x) (dim(listw2mat(x)))[1])
mat <- matrix(0,nrow = sum(dims),ncol = sum(dims))
for (i in 1:length(dims)) {
  start_col <- ifelse(i == 1,1,dims[i - 1] + 1)
  end_col <- ifelse(i == 1,dims[i],dims[i - 1] + dims[i])
  mat[,start_col:end_col] <- listw2mat(listw_mat[[i]])
}
listw_mat <- mat2listw(mat,style = "S")
# the last prints a warning:
# Warning message:
# In nb2listw(res$neighbours,glist = res$weights,style = style,:
#   zero sum general weights

# calling listw_mat prints the error:
# Error in print.listw(x) : 
#   regions with no neighbours found,use zero.policy=TRUE

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。