You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:35:26