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

如何在R中测试空间非平稳性,判断是否需采用GWR等局部回归模型?

在R中检测空间非平稳性以判断是否使用GWR的方法

没问题呀!在R里有不少实用的方法可以帮你检测空间非平稳性,从而判断是不是该切换到地理加权回归(GWR)这类局部回归模型。下面我给你详细拆解几种靠谱的方法,还附了代码示例,方便你直接上手:

1. Koenker检验(你提到的方法)

Koenker检验原本用于检测异方差,但也能很好地识别空间非平稳性——毕竟空间非平稳性本质就是回归系数随空间位置变化的异方差表现。在R里,我们可以用lmtest包来实现它,结合空间坐标来检验系数是否随空间变化:

首先安装并加载所需包:

install.packages(c("lmtest", "spdep"))
library(lmtest)
library(spdep)

先拟合你的OLS基准模型:

# 假设你的数据框是df,因变量为y,自变量是x1、x2
ols_model <- lm(y ~ x1 + x2, data = df)

接着用空间坐标(比如经纬度)作为异方差的检验因子,执行Koenker检验:

# 假设数据里有lon(经度)和lat(纬度)字段
koenker_test <- bptest(ols_model, ~ lon + lat, data = df, studentize = FALSE)
print(koenker_test)

如果检验的p值显著小于0.05,就说明存在空间非平稳性,支持你采用GWR模型。

2. 空间Breusch-Pagan检验

spdep包提供了专门针对空间场景的Breusch-Pagan检验,能直接检测残差的异方差是否和空间位置相关,这也是空间非平稳性的重要信号:

先创建空间权重矩阵(这里用k近邻权重为例,你也可以换成邻接权重):

coords <- df[, c("lon", "lat")]
# 创建5个最近邻居的权重矩阵
nb <- knn2nb(knearneigh(coords, k=5))
lw <- nb2listw(nb, style = "W")

然后执行空间Breusch-Pagan检验:

sp_bp_test <- spbptest(ols_model, listw = lw, data = df)
print(sp_bp_test)

同样,如果p值显著,就意味着存在空间相关的异方差,即系数可能随空间变化。

3. OLS与GWR的模型对比检验

除了专门的非平稳性检验,你还可以通过对比两个模型的拟合效果来判断:

  • AIC值对比:GWR的AIC如果明显低于OLS,说明GWR的拟合效果更好,侧面证明存在空间非平稳性;
  • 似然比检验:直接检验GWR是否显著优于OLS。

用spgwr包拟合GWR并对比:

install.packages("spgwr")
library(spgwr)

# 先用交叉验证确定最优带宽
gwr_bw <- gwr.sel(y ~ x1 + x2, data = df, coords = coords)
# 拟合GWR模型
gwr_model <- gwr(y ~ x1 + x2, data = df, coords = coords, bandwidth = gwr_bw)

# 对比AIC值
cat("OLS模型AIC值:", AIC(ols_model), "\n")
cat("GWR模型AIC值:", gwr_model$aic, "\n")

# 执行似然比检验
lr_stat <- 2 * (gwr_model$logLik - logLik(ols_model))
# 近似计算p值(自由度为GWR额外参数的近似值)
lr_pval <- pchisq(lr_stat, df = length(coords) - length(ols_model$coefficients), lower.tail = FALSE)
cat("似然比检验p值:", lr_pval, "\n")

如果GWR的AIC更低,且似然比检验p值显著,就说明GWR更适合你的数据。

4. 可视化GWR系数的空间分布

虽然这不是统计检验,但可视化能直观帮你判断系数是否存在空间变化:

install.packages(c("tmap", "sf"))
library(tmap)
library(sf)

# 把数据转换为sf空间对象
df_sf <- st_as_sf(df, coords = c("lon", "lat"), crs = 4326)
# 提取GWR的系数
df_sf$x1_coef <- gwr_model$SDF@data$x1
df_sf$x2_coef <- gwr_model$SDF@data$x2

# 绘制x1系数的空间分布
tm_shape(df_sf) +
  tm_dots(col = "x1_coef", palette = "RdBu", size = 0.5) +
  tm_layout(title = "GWR模型x1系数的空间分布")

如果系数在空间上呈现明显的高低聚类,那空间非平稳性就很明确了。


内容的提问来源于stack exchange,提问作者the_chimp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:38:10