在R中运行空间条件自回归CAR模型:排除无邻接区域
解决CAR模型因孤立区域无法运行的问题
问题分析
你的代码存在两个关键问题:一是变量名错误(读入的空间数据是map2,但构建邻接时误用了未定义的map);二是地图中的孤立区域(无任何邻接的多边形)会导致CAR模型的邻接矩阵不符合要求,进而触发报错。下面是修正后的完整代码,核心逻辑是识别并移除孤立区域,同步空间数据与属性数据后重新构建合规的邻接矩阵。
修正后的代码
setwd('C:\\Users\\zaatour\\Desktop\\SVI') # 读入属性数据 SVI <- read.csv("pasco2.csv") # 读入空间数据 map2 <- st_read("pasco.shp", stringsAsFactors = FALSE) # 加载所需包 packages <- c("CARBayes", "sf", "tidycensus", "janitor", "tidyverse", "spData", "spdep") miss_pkgs <- packages[!packages %in% installed.packages()[,1]] if(length(miss_pkgs) > 0){ install.packages(miss_pkgs) } invisible(lapply(packages, library, character.only = TRUE)) # -------------------------- 核心:移除孤立区域 -------------------------- # 1. 构建初始邻接列表(修正原代码变量名错误:用map2而非map) list.nb2 <- poly2nb(map2, row.names = rownames(SVI)) # 2. 计算每个区域的邻居数量 nb_counts <- card(list.nb2) # 3. 筛选非孤立区域的索引(邻居数>0的区域) non_isolated_idx <- which(nb_counts > 0) # 4. 同步过滤空间数据和属性数据 map_filtered <- map2[non_isolated_idx, ] SVI_filtered <- SVI[non_isolated_idx, ] # 5. 基于过滤后的空间数据重新构建邻接矩阵 list.nb_filtered <- poly2nb(map_filtered, row.names = rownames(SVI_filtered)) A_filtered <- nb2mat(list.nb_filtered, style="B", zero.policy = TRUE) # -------------------------- 运行CAR模型 -------------------------- model.hillsborough <- CARBayes::S.CARleroux( cases ~ SVI, data = SVI_filtered, W = A_filtered, family = "gaussian", burnin = 20000, n.sample = 100000, thin = 10 ) # 查看模型结果 summary(model.hillsborough)
关键步骤说明
- 变量名修正:原代码中读入的空间数据是
map2,但构建邻接列表时错误使用了未定义的map,这会直接触发报错,先修正该笔误。 - 孤立区域识别:用
card(list.nb2)计算每个区域的邻居数量,邻居数为0的即为孤立区域。 - 数据同步过滤:空间数据与属性数据必须严格一一对应,因此需用相同的索引同时过滤
map2和SVI。 - 邻接矩阵重构:必须基于过滤后的空间数据生成新的邻接矩阵,确保矩阵维度与属性数据的行数完全匹配。
内容的提问来源于stack exchange,提问作者zaatour wajdy
相关产品推荐
相关产品推荐

