地理加权回归模型(GWR, Geographically Weighted Regression)
地理加权回归(GWR)是一种面向空间异质性的局部回归方法,用于分析地理空间数据中变量之间的关系如何随空间位置变化。与传统的线性回归模型相比,GWR允许回归系数随地理位置变化,以捕捉空间异质性。
GWR原理
GWR是局部模型,公式如下所示:
回归系数(Coefficients)随位置发生变化,针对每个给定的位置分别进行求解。
求解时确定以下三件事:确定带宽(bandwidth,即以任意一点为中心,邻域的范围);邻域对该点影响的大小即权重,通过核函数确定。
遵循原则为越近的数据点所待估计点的权重越高;距离类型,如欧式距离。
单一带宽(Single Bandwidth):
GWR 使用一个固定的带宽(或者自适应带宽),即所有自变量都共享同一个带宽。这意味着所有变量的空间影响范围是相同的,即它们都被认为在相同的空间尺度上变化。
适用于单一尺度问题:
如果所有解释变量的影响范围相似(例如,房价受邻近学校和公园的影响),GWR 可能是适合的模型。
核权重函数
GWR通过一个加权的局部回归来估计每个位置的回归系数。加权由核函数控制,用以衡量地理位置之间的相似性。常见的核函数包括:
- 固定距离法:权重仅取决于两个点之间的距离。
- 自适应核法:权重根据点的局部密度动态调整核带宽。
常用的核函数如下所示,其中参数b为核函数的带宽(bandwidth):
参数估计
Multiscale Geographically Weighted Regression (MGWR)
MGWR(多尺度地理加权回归)和 GWR(地理加权回归)都属于空间回归模型,用于分析地理空间上的回归关系。然而,它们有一些关键区别,主要体现在带宽选择和空间尺度上。
地理加权回归模型(GWR, Geographically Weighted Regression)存在一些问题,不能捕捉不同变量的不同空间尺度:现实世界中,不同变量可能在不同的空间尺度上起作用。
例如:
- 人口密度 对房价的影响可能是城市级别的(大尺度)。
- 噪音污染 对房价的影响可能是街区级别的(小尺度)。
GWR 由于使用相同的带宽,难以准确描述这些不同变量的空间影响范围。
MGWR 核心概念: MGWR 允许不同自变量在不同的空间尺度上变化,从而提供更精细的空间回归分析。
MGWR特点
多尺度带宽(Multiple Bandwidths):MGWR 允许每个自变量有自己的带宽,即:
- 一些变量可能只影响局部区域(较小带宽)。
- 另一些变量可能影响更大区域(较大带宽)。
这样可以更准确地描述不同变量在不同地理尺度上的作用。
更精细的空间异质性分析:
例如,在分析房价时:
- X1(噪音污染) 的影响可能局限于几百米范围(小带宽)。
- X2(人口密度) 的影响可能扩展到整个城市(大带宽)。
MGWR 允许每个变量的回归系数在适当的空间范围内变化,提高模型的解释能力。
GWR vs. MGWR 的直观对比
特性 | GWR | MGWR |
---|---|---|
带宽 | 单一带宽(所有变量共享) | 每个变量都有不同的带宽 |
变量的空间尺度 | 假设所有变量影响范围相同 | 允许不同变量影响范围不同 |
模型灵活性 | 适用于单一尺度问题 | 适用于多尺度问题 |
计算复杂度 | 计算较快 | 计算较慢(带宽优化更复杂) |
适用场景 | 适用于所有变量影响范围接近的情况 | 适用于不同变量影响范围不同的情况 |
R 实现 GWR 插值
工具包简介-spgwr: Geographically Weighted Regression
Python 实现 GWR 插值
Python 可以实现 地理加权回归模型(GWR, Geographically Weighted Regression),并且有专门的 Python 库可供使用,其中最常用的是 mgwr 这个库。
Python- Multiscale Geographically Weighted Regression (MGWR)
安装相关 Python 库
Python 提供了 mgwr 库来实现 GWR,该库依赖 spreg 和 libpysal,可以通过以下命令安装:
pip install mgwr
conda install -c conda-forge mgwr
如果遇到依赖问题,可以尝试安装 libpysal 和 spreg:
pip install libpysal spreg
conda install -c conda-forge pysal
conda install -c conda-forge mgwr
GWR 模型实现示例
Python实现全代码如下:
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
from mgwr.gwr import GWR
from mgwr.sel_bw import Sel_BW
import libpysal as ps
from scipy.interpolate import griddata
# 设置全局字体
plt.rcParams["font.family"] = "Times New Roman"
# 生成示例数据
np.random.seed(42)
n = 100 # 样本数量
x1 = np.random.rand(n, 1) * 10 # 自变量1
x2 = np.random.rand(n, 1) * 5 # 自变量2
y = 3 * x1 + 2 * x2 + np.random.randn(n, 1) * 2 # 因变量
# 生成随机坐标(模拟地理位置)
coords = np.random.rand(n, 2) * 100
# 组合数据
X = np.hstack([np.ones((n, 1)), x1, x2]) # 添加截距项
# 选择最佳带宽
bw = Sel_BW(coords, y, X).search()
# 运行 GWR 模型
model = GWR(coords, y, X, bw)
results = model.fit()
# 输出结果
print(results.summary())
# 提取 GWR 估计的局部回归系数
beta1 = results.params[:, 1] # x1 的回归系数
beta2 = results.params[:, 2] # x2 的回归系数
# 生成插值网格
grid_x, grid_y = np.mgrid[0:100:200j, 0:100:200j] # 200x200 网格
grid_beta1 = griddata(coords, beta1, (grid_x, grid_y), method='cubic')
grid_beta2 = griddata(coords, beta2, (grid_x, grid_y), method='cubic')
# 绘制插值结果
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# x1 的局部回归系数插值图
ax1 = axes[0]
c1 = ax1.contourf(grid_x, grid_y, grid_beta1, cmap='coolwarm', levels=20)
fig.colorbar(c1, ax=ax1)
ax1.scatter(coords[:, 0], coords[:, 1], c=beta1, cmap='coolwarm', edgecolors='k')
ax1.set_title("GWR local regression rate - x1")
# x2 的局部回归系数插值图
ax2 = axes[1]
c2 = ax2.contourf(grid_x, grid_y, grid_beta2, cmap='coolwarm', levels=20)
fig.colorbar(c2, ax=ax2)
ax2.scatter(coords[:, 0], coords[:, 1], c=beta2, cmap='coolwarm', edgecolors='k')
ax2.set_title("GWR local regression rate - x2")
plt.show()
两张插值图分别表示 x1 和 x2 在不同地理位置的局部回归系数:颜色代表回归系数的大小(红色表示较高,蓝色表示较低)
输出结果如下:包含 全局回归(OLS) 和 地理加权回归(GWR)
===========================================================================
Model type Gaussian
Number of observations: 100
Number of covariates: 3
Global Regression Results
---------------------------------------------------------------------------
Residual sum of squares: 378.269
Log-likelihood: -208.416
AIC: 422.831
AICc: 425.252
BIC: -68.433
R2: 0.957
Adj. R2: 0.956
Variable Est. SE t(Est/SE) p-value
------------------------------- ---------- ---------- ---------- ----------
X0 -0.179 0.508 -0.352 0.725
X1 2.932 0.067 43.917 0.000
X2 2.288 0.136 16.883 0.000
Geographically Weighted Regression (GWR) Results
---------------------------------------------------------------------------
Spatial kernel: Adaptive bisquare
Bandwidth used: 99.000
Diagnostic information
---------------------------------------------------------------------------
Residual sum of squares: 361.035
Effective number of parameters (trace(S)): 6.153
Degree of freedom (n - trace(S)): 93.847
Sigma estimate: 1.961
Log-likelihood: -206.084
AIC: 426.474
AICc: 427.744
BIC: 445.109
R2: 0.959
Adjusted R2: 0.956
Adj. alpha (95%): 0.024
Adj. critical t value (95%): 2.286
Summary Statistics For GWR Parameter Estimates
---------------------------------------------------------------------------
Variable Mean STD Min Median Max
-------------------- ---------- ---------- ---------- ---------- ----------
X0 -0.206 0.294 -0.633 -0.198 0.244
X1 2.940 0.041 2.852 2.956 2.991
X2 2.248 0.077 2.136 2.263 2.377
===========================================================================
None
全局回归(OLS)结果如下:
- X1、X2 的 p 值都小于 0.05,说明它们对因变量 Y 有显著影响。
- 截距项 X0 的 p 值为 0.725,不显著,意味着在所有自变量都为 0 时,Y 的预测值接近 0。
- X1=2.932,X2=2.288,表示全局模型中,它们对 Y 的影响是固定的,不随地理位置变化。
地理加权回归(GWR) 结果如下:
指标 | 解释 |
---|---|
空间核(Spatial kernel) | Adaptive bisquare,自适应双二次核(适用于数据点密度不均匀的情况)。 |
带宽(Bandwidth used) | 99.000,表示 GWR 使用了 99 个邻近点进行局部回归。 |
GWR 回归系数的空间变异
变量 | 均值(Mean) | 标准差(STD) | 最小值(Min) | 中位数(Median) | 最大值(Max) |
---|---|---|---|---|---|
X0(截距项) | -0.206 | 0.294 | -0.633 | -0.198 | 0.244 |
X1 | 2.940 | 0.041 | 2.852 | 2.956 | 2.991 |
X2 | 2.248 | 0.077 | 2.136 | 2.263 | 2.377 |
X1 和 X2 的系数在不同地理位置略有波动:
- X1 的回归系数在 [2.852, 2.991] 之间波动,说明其影响力在不同地区几乎相同。
- X2 的回归系数在 [2.136, 2.377] 之间波动,说明它的影响力略有地理差异。
- 截距项 X0 在不同地区的变化较大(-0.633 到 0.244),说明空间异质性较强。
带宽选择为 99,几乎覆盖了所有 100 个观测点: 这说明 GWR 退化成了接近 OLS 的情况,即局部回归的作用不强。 如果数据点较多,可以尝试固定带宽或减少邻近点数量以增强局部差异。