基于Python的MGWR多尺度地理加权回归模型

一、模型原理

多尺度地理加权回归(MGWR)

       变量之间的关系在地理空间上不是均一的,所有特征变量的影响都在不同的空间范围(带宽)内变化,某些变量可能表现出局部性影响(小带宽),某些变量可能表现出全局性影响(大带宽),通过优化每个特征变量的带宽,捕捉到空间关系的多尺度特性,得到更细致的模型解释。

二、Python代码

import pandas as pd
import numpy as np
np.float = float
from mgwr.gwr import GWR
from mgwr.gwr import MGWR
from mgwr.sel_bw import Sel_BW
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 1. 加载数据
data = pd.read_excel(r'F:\1_soil_salinity\1_data_Sentinel2\12_match_1230\Day_output_value_1230_1.xlsx')
# 提取坐标和因变量、自变量
coords = data[['经度', '纬度']].values  # 经纬度
Y = data['EC'].values.reshape(-1, 1)  # 土壤盐分值(因变量)
X = data[['B11', 'B2', 'B3', 'B4']].values  # 自变量
# 将数据分为训练集和测试集
coords_train, coords_test, X_train, X_test, Y_train, Y_test = train_test_split(
    coords, X, Y, test_size=0.2, random_state=42
)

# 2. 选择带宽; multi=True 表示允许多尺度带宽
selector = Sel_BW(coords_train, Y_train, X_train, multi=True)
bandwidths = selector.search()  # 带宽搜索
print(f"Optimal Bandwidths: {bandwidths}")
# 检查带宽的类型是否正确
if not isinstance(bandwidths, np.ndarray) or len(bandwidths) != X_train.shape[1] + 1:
    raise ValueError("带宽结果格式不正确,请检查输入数据和 Sel_BW 参数设置!")

# 3. 构建 MGWR 模型
mgwr_model = MGWR(coords_train, Y_train, X_train, selector).fit()
print(mgwr_model.summary())

# 提取回归系数
coefficients = mgwr_model.params  # 局部回归系数
intercepts = coefficients[:, 0]  # 截距项
slopes = coefficients[:, 1:]  # 自变量系数

# 4. 使用模型预测(测试集)
predicted_salt_content = []
for i, coord in enumerate(coords_test):
    # 找到测试点最近的训练点索引
    distances = np.linalg.norm(coords_train - coord, axis=1)
    nearest_index = np.argmin(distances)
    # 使用最近训练点的回归系数进行预测
    intercept = intercepts[nearest_index]
    slope = slopes[nearest_index]
    prediction = intercept + np.dot(X_test[i], slope)
    predicted_salt_content.append(prediction)
predicted_salt_content = np.array(predicted_salt_content)

# 计算误差(均方误差)
mse = mean_squared_error(Y_test, predicted_salt_content)
print(f"Mean Squared Error on Test Data: {mse}")


# 5. 可视化局部回归系数
import geopandas as gpd
coef_df = pd.DataFrame(mgwr_model.params, columns=['Intercept', 'B11', 'B2', 'B3', 'B4'])
gdf = gpd.GeoDataFrame(
    coef_df, geometry=gpd.points_from_xy(coords_train[:, 0], coords_train[:, 1])
)
gdf.plot(column='B11', cmap='coolwarm', legend=True)
plt.title('Spatial Distribution of Coefficients for B11')
plt.show()

三、模型参数解读

1.模型运行基本信息

(1)Model type: Gaussian;表示所使用的回归模型假设数据服从高斯分布(正态分布)。这通常适用于连续因变量(响应变量)且残差满足正态性假设的情境。

(2)Number of observations: 77;数据集中包含 77个观测值(样本量)。每个观测值对应一组自变量(特征)和因变量(响应值)。

(3)Number of covariates: 5;表示模型中包含 5个协变量(自变量)。这些变量是用来预测或解释因变量。

2.全局回归结果(基于OLS的传统线性回归)

(1)全局回归结果包括两部分,上面为判断模型拟合度的参数,下面为各自变量的相关参数。

(2)模型拟合度参数包括AICc;AICc;R2;Adj.R2(调整后R2)。对于AICc, AICc值越小,模型的拟合度越高 。R2又叫判定系数,用来衡量回归模型表现的指标,即自变量X可以解释因变量Y的比例;调整R2的调整机制为,当自变量个数p增加的时候,调整R2变小;但是随着数据量n增加,新自变量的加入对调整R2的影响减小。这样就能帮助我们筛选出有价值的新自变量。

(3)各自变量的相关参数包括Est.;SE;t(Est/SE);p-value。Est.是各自变量的回归系数;SE为各自变量的标准误;t(Est/SE)为t统计量的值;p-value为拒绝原假设的概率,即认为回归系数不为0的概率,通常情况下p值小于0.05认为回归系数通过显著性检验。常用的两个参数为Est.(回归系数)和p-value。

3.MGWR回归结果(考虑了空间位置和空间尺度)

(1)MGWR回归结果包括三个部分,分别是各自变量影响的带宽(MGWR bandwidths)、模型诊断信息(Diagnostic Information)、MGWR参数估计值汇总统计(Summary Statistics For MGWR Parameter Estimates)。

(2)首先是带宽。带宽即为空间尺度,指用于估计统计量时所采用的空间数据的范围,同时也反映了空间异质性。自变量的带宽越小说明其作用于因变量的空间异质性越大,带宽越大说明其作用于因变量的空间异质性越小。

(3)模型诊断信息中为模型拟合度参数,即AICc;AICc;R2;Adj.R2(调整后R2)。

(4)MGWR参数估计值汇总统计展示了所有样本点自变量回归系数的平均值、标准差、最小值、中位数和最大值。(MGWR需要确定一定空间尺度(带宽)以及权重衰减方式(核函数)进行系数回归,其针对每一个样本单独进行回归,相当于进行多次局部线性拟合,使得每个样本点都会有一组自变量系数参数。所以MGWR模型的回归系数可以计算平均值、标准差、最小值、中位数和最大值。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值