空间数据分析中,地理加权回归(Geographically Weighted Regression, GWR)是一种强大的工具,能够捕捉空间异质性。本文将带你用R语言的GWmodel包,从零开始完成一个完整的GWR分析流程。
在开始GWR分析前,确保已安装必要的R包。GWmodel是核心分析包,sf用于空间数据处理,spdep辅助空间权重计算:
r复制install.packages(c("GWmodel", "sf", "spdep"))
library(GWmodel)
library(sf)
library(spdep)
读取空间数据是第一步。假设我们有一个名为"city_data.shp"的shapefile文件:
r复制city_data <- st_read("city_data.shp") %>%
as("Spatial") # 转换为Spatial对象
plot(city_data) # 可视化检查数据
常见问题排查:
getwd()确认工作目录proj4string(city_data)检查坐标系names(city_data)查看变量名提示:空间数据建议使用WGS84(epsg:4326)或UTM坐标系,避免后续分析出现尺度问题。
正式建模前,先进行探索性分析:
空间自相关检验:
r复制moran.test(city_data$price, nb2listw(knn2nb(knearneigh(coordinates(city_data)))))
变量关系可视化:
r复制spplot(city_data, "price") # 因变量空间分布
pairs(city_data@data[,c("price","income","pop")]) # 变量间散点图
关键检查点:
带宽是GWR的核心参数,决定空间权重范围:
r复制# 使用AIC方法选择固定带宽
bw_fixed <- bw.gwr(price ~ income + pop,
data = city_data,
approach = "AIC",
kernel = "gaussian",
adaptive = FALSE)
print(bw_fixed)
# 自适应带宽(推荐样本量>1000时使用)
bw_adaptive <- bw.gwr(price ~ income + pop,
data = city_data,
approach = "CV",
adaptive = TRUE)
带宽选择方法对比:
| 方法 | 适用场景 | 计算成本 | 稳定性 |
|---|---|---|---|
| AIC | 中小样本 | 中等 | 较高 |
| CV | 大样本 | 高 | 中等 |
| BIC | 变量选择 | 低 | 高 |
注意:实际分析中建议尝试多种核函数(gaussian/bisquare)和带宽类型,选择表现最优的组合。
使用选定参数运行GWR:
r复制gwr_model <- gwr.basic(price ~ income + pop,
data = city_data,
bw = bw_fixed,
kernel = "gaussian",
adaptive = FALSE)
# 模型诊断
summary(gwr_model$SDF$Local_R2) # 局部R2分布
hist(gwr_model$SDF$income_coef) # 系数分布
关键输出解读:
gwr_model$SDF包含所有局部估计结果Local_R2反映模型在各位置的拟合优度*_coef为各变量的空间变系数空间异质性可视化:
r复制spplot(gwr_model$SDF, "income_coef",
col.regions = heat.colors(20),
main = "Income系数空间分布")
将结果导出为GIS可读格式:
r复制# 导出完整结果到shapefile
gwr.write.shp(gwr_model, fn = "gwr_results")
# 提取关键指标到数据框
results_df <- data.frame(
coordinates(city_data),
city_data@data,
gwr_model$SDF@data
)
# 保存为CSV备用
write.csv(results_df, "gwr_results.csv")
GIS中进一步分析建议:
处理大规模数据:
r复制# 使用并行计算加速
library(parallel)
cl <- makeCluster(4)
bw_par <- bw.gwr(price ~ income + pop,
data = city_data,
cluster = cl)
stopCluster(cl)
常见报错解决方案:
| 错误信息 | 可能原因 | 解决方法 |
|---|---|---|
| "bandwidth too small" | 带宽过小 | 增大maxB参数 |
| NA in coordinates | 坐标缺失 | 检查数据完整性 |
| matrix singular | 多重共线性 | 移除高度相关变量 |
模型比较:
r复制# 与传统OLS比较
ols <- lm(price ~ income + pop, data = city_data)
AIC(gwr_model, ols)
实际项目中,GWR分析往往需要多次迭代调整。建议从简单模型开始,逐步加入空间要素,同时记录每个版本的结果和参数,便于回溯比较。