不同空间分辨率栅格数据空间自相关分析及邻域错误排查求助
解决两个空间分析问题:不同分辨率栅格的空间自相关图绘制 + Moran检验邻域列表错误修复
一、绘制展示两幅不同分辨率栅格关系的空间自相关图
要展示不同分辨率栅格的空间自相关关系,核心是先统一分辨率,再通过**交叉空间自相关(Cross-Moran's I)**分析两者的空间关联,步骤如下:
统一栅格分辨率
将低分辨率栅格重采样到高分辨率栅格的空间范围与单元格尺寸上,确保两者完全对齐:library(raster) # 加载栅格数据 r_high <- raster("high_res_raster.tif") r_low <- raster("low_res_raster.tif") # 连续数据用双线性插值,分类数据用"ngb"最近邻 r_low_resampled <- resample(r_low, r_high, method = "bilinear")提取有效配对值
剔除两个栅格中含NA的单元格,保证分析数据的完整性:# 转换为数据框并删除NA行 grid_df <- data.frame( high_val = values(r_high), low_val = values(r_low_resampled) ) %>% na.omit()构建空间权重矩阵
基于对齐后的栅格单元格构建Queen邻域(共享边或角的单元格为邻居):library(spdep) # 获取高分辨率栅格的行列数 n_row <- nrow(r_high) n_col <- ncol(r_high) # 生成邻域列表 nb <- cell2nb(n_row, n_col, type = "queen") # 只保留有效单元格对应的邻域 valid_cells <- !is.na(values(r_high)) nb_valid <- nb[valid_cells] # 转换为空间权重矩阵,允许零权重处理孤立单元格 w <- nb2listw(nb_valid, style = "W", zero.policy = TRUE)绘制交叉空间自相关图
用交叉Moran散点图展示一个栅格的值与另一个栅格空间滞后值的关联:# 计算高分辨率栅格的空间滞后值 high_lag <- lag.listw(w, grid_df$high_val) # 绘制交叉Moran散点图 moran.plot(grid_df$low_val, high_lag, zero.policy = TRUE, main = "Cross-Moran散点图:低分辨率栅格 vs 高分辨率栅格空间滞后", xlab = "低分辨率栅格值", ylab = "高分辨率栅格空间滞后值")
二、修复重采样后Moran检验的"邻域列表错误"
你遇到的错误大概率是邻域列表与重采样后的栅格行列数不匹配,或大量NA导致空邻域,以下是针对性修复方案:
常见错误原因
- 重采样后栅格行列数改变,但仍用原栅格行列数构建邻域列表
- 重采样后存在大量NA单元格,导致邻域列表出现空的邻居组
修正后的完整代码
library(raster) library(spdep) # 1. 加载并重采样栅格 r_original <- raster("original_low_res.tif") r_target <- raster("target_high_res.tif") r_resampled <- resample(r_original, r_target, method = "bilinear") # 2. 预处理:提取有效值并筛选有效单元格 resampled_vals <- values(r_resampled) valid_idx <- !is.na(resampled_vals) clean_vals <- resampled_vals[valid_idx] # 3. 构建正确的邻域列表 # 必须使用重采样后栅格的行列数 nb <- cell2nb(nrow(r_resampled), ncol(r_resampled), type = "queen") # 只保留有效单元格对应的邻域 nb_clean <- nb[valid_idx] # 删除空邻域(若存在) nb_clean <- drop.nb(nb_clean) # 4. 构建空间权重矩阵,开启zero.policy处理孤立单元格 w <- nb2listw(nb_clean, style = "W", zero.policy = TRUE) # 5. 执行Moran检验 moran_result <- moran.test(clean_vals, w, zero.policy = TRUE) print(moran_result) # 绘制常规Moran散点图 moran.plot(clean_vals, w, zero.policy = TRUE, main = "重采样后栅格的Moran散点图")
关键修复点
- 匹配重采样后的行列数:
cell2nb的前两个参数必须是nrow(r_resampled)和ncol(r_resampled),不能用原栅格的行列数 - 处理NA与空邻域:通过
valid_idx筛选有效单元格,用drop.nb()删除空邻域,同时在nb2listw和moran.test中设置zero.policy=TRUE,允许存在无邻居的孤立单元格
内容的提问来源于stack exchange,提问作者B27
相关产品推荐
相关产品推荐

