Basic GWR 模型

本文主要介绍函数 gwr_basic() 的用法。

模型解算

我们以示例数据 LondonHP 为例,展示函数 gwr_basic() 的用法。 假设我们以 PURCHASE 为因变量,FLOORSZ, PROFUNEMPLOY 为自变量,可以使用下面的方式构建 GWR 模型。

data(LondonHP)
m1 <- gwr_basic(
    formula = PURCHASE ~ FLOORSZ + UNEMPLOY + PROF,
    data = LondonHP,
    bw = 64,
    adaptive = TRUE
)
m1
Geographically Weighted Regression Model
========================================
  Formula: PURCHASE ~ FLOORSZ + UNEMPLOY + PROF
     Data: LondonHP
   Kernel: gaussian
Bandwidth: 64 (Nearest Neighbours) 


Summary of Coefficient Estimates
--------------------------------
 Coefficient         Min.      1st Qu.       Median      3rd Qu.        Max. 
   Intercept  -198642.679  -182675.271  -165665.781  -134650.946  -93550.292 
     FLOORSZ     1189.823     1309.140     1399.934     1668.918    1840.670 
    UNEMPLOY   311994.460   531503.077   663356.786   735359.196  932328.652 
        PROF   243840.288   319870.143   355123.025   378312.489  429390.257 


Diagnostic Information
----------------------
  RSS: 4.56323e+11
  ENP: 14.12809
  EDF: 301.8719
   R2: 0.7451855
R2adj: 0.7332201
  AIC: 7571.953
 AICc: 7585.417

GWmodel 相比,用法主要发生了以下变动:

  1. 函数名从 gwr.basic 改为 gwr_basic ,这是为了避免新旧版本包函数名称出现冲突,便于开发和测试。
  2. 该函数不再支持设置 regression.points 参数。该参数实现的功能将移到 predict() 函数中进行实现。
  3. 返回结果的展示发生了变化,去掉了线性回归的部分。 主要是为了使用户可以更灵活地设置 lm() 的参数,并避免显示信息过长导致不利于在 Jupyter 等环境中使用。

该函数返回一个 gwrm 的对象,通过控制台输出信息,我们可以得到 调用的表达式、数据、带宽、核函数、系数估计值的统计、诊断信息。 同样,也支持使用 coef() fitted() residuals() 等函数获取信息。

head(coef(m1))
  Intercept  FLOORSZ UNEMPLOY     PROF
0 -124453.6 1287.804 528674.5 295482.3
1 -122812.0 1282.712 520067.3 293203.2
2 -122487.0 1281.506 530303.5 291236.4
3 -121768.6 1278.788 527744.3 290153.6
4 -122064.9 1278.969 520144.8 291861.3
5 -101753.7 1234.532 396245.5 263582.0
head(fitted(m1))
[1] 135011.1 132297.2 117858.7 157436.0 173050.9 157071.0
head(residuals(m1))
[1]  21988.936 -18797.233 -36108.677  -7436.005  16949.120   2879.028

此外,与旧版 GWmodel 包类似,gwrm 对象中提供了一个 $SDF 变量保存了系数估计值等一系列局部结果。

head(m1$SDF)
Simple feature collection with 6 features and 14 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 531900 ymin: 159400 xmax: 535700 ymax: 161700
CRS:           NA
  Intercept  FLOORSZ UNEMPLOY     PROF     yhat   residual Intercept.SE
0 -124453.6 1287.804 528674.5 295482.3 135011.1  21988.936      5839925
1 -122812.0 1282.712 520067.3 293203.2 132297.2 -18797.233      5873318
2 -122487.0 1281.506 530303.5 291236.4 117858.7 -36108.677      5962947
3 -121768.6 1278.788 527744.3 290153.6 157436.0  -7436.005      5990687
4 -122064.9 1278.969 520144.8 291861.3 173050.9  16949.120      5928749
5 -101753.7 1234.532 396245.5 263582.0 157071.0   2879.028      6126740
  FLOORSZ.SE UNEMPLOY.SE PROF.SE Intercept.TV  FLOORSZ.TV UNEMPLOY.TV
0   351842.1    14680113 7170057  -0.02131082 0.003660175  0.03601297
1   353135.2    14735103 7214234  -0.02091015 0.003632355  0.03529444
2   356231.7    14939953 7324666  -0.02054135 0.003597394  0.03549566
3   357162.0    14994222 7360524  -0.02032632 0.003580416  0.03519651
4   354868.2    14840291 7285505  -0.02058864 0.003604066  0.03504950
5   363613.1    15108910 7586125  -0.01660813 0.003395180  0.02622595
     PROF.TV              geometry
0 0.04121060 POINT (533200 159400)
1 0.04064233 POINT (533300 159700)
2 0.03976104 POINT (532000 159800)
3 0.03942024 POINT (531900 160100)
4 0.04006054 POINT (532800 160300)
5 0.03474527 POINT (535700 161700)

使用该变量,可以进行专题制图。除此之外,改包还提供了一个 plot() 函数,通过输入 gwrm 对象,可以快速查看回归系数。

plot(m1)

plot(m1, columns = c("FLOORSZ", "UNEMPLOY"))

如果指定了 columns 参数,则仅绘制第二个参数列出的系数,否则绘制所有回归系数。

带宽优选

如果希望系统自动优选一个带宽,而不是手动设置带宽大小,可以使用下面的方式调用函数。

m <- gwr_basic(
    formula = PURCHASE ~ FLOORSZ + UNEMPLOY + PROF,
    data = LondonHP,
    bw = "AIC",
    adaptive = TRUE
)
message("Bandwidth:", m$args$bw)
Bandwidth:20

带宽设置支持通过字符串 "AIC""CV" 设置带宽优选方法。此外,如果参数 bw 不存在,或设置为非数值型变量, 程序也会根据 AIC 值自动优选带宽。用户不再需要调用单独的 bw.gwr() 函数手动优选带宽。

进行这样改动的原因是:

  1. 内核库中优选完带宽后直接进行了模型解算,而不是返回带宽值,节省一些手动拟合模型的时间。
  2. 避免参数在不同函数中重复设置,导致出现错误, 例如在 bw.gwr() 中将 adaptive 改成了 FALSE,但出于某些原因,忘记在 gwr.basic() 中同步修改,从而造成错误。
  3. 节省参数个数。因为带宽仅有指定、优选两种情况,因此可以根据 bw 的数据类型进行情况判断。 当 bw 是数值型变量时(包括 Inf),说明带宽已经指定,此时无需进行带宽优选; 当带宽需要优选时,又无法指定 bw 的具体值,因此可以用该参数表示带宽优选的指标类型。

如果要获取优选的带宽值,则通过函数返回对象中的 $args$bw 变量获取,或者从控制台输出返回对象信息读出。

模型优选

该部分的改动也比较大。 包中定义了一个 “Generic” 的函数 model_sel() (姑且称之为泛型函数), 当其作用与 gwrm 对象上时,表示对该拟合得到的模型进行变量优选。 其用法类似于 MASS 包中的 stepAIC() 函数。 在实际使用中,用户一般都是先拟合一个变量较多的模型,然后从中进行变量优选。 如果使用的是 R 4.1 及以上版本,原生支持 |> 管道运算符,可以使用如下调用方式

m2 <- gwr_basic(
    PURCHASE ~ FLOORSZ + UNEMPLOY + PROF + BATH2 + BEDS2 + GARAGE1 +
        TYPEDETCH + TPSEMIDTCH + TYPETRRD + TYPEBNGLW + BLDPWW1 +
        BLDPOSTW + BLD60S + BLD70S + BLD80S + CENTHEAT,
    LondonHP, "AIC", TRUE
) |> model_sel(criterion = "AIC", threshold = 10, bw = Inf, optim_bw = "AIC")
m2
Geographically Weighted Regression Model
========================================
  Formula: PURCHASE ~ FLOORSZ + PROF + UNEMPLOY
     Data: LondonHP
   Kernel: gaussian
Bandwidth: 20 (Nearest Neighbours) (Optimized accroding to AIC)


Summary of Coefficient Estimates
--------------------------------
 Coefficient         Min.      1st Qu.       Median      3rd Qu.         Max. 
   Intercept  -283403.492  -202450.678  -146322.221   -26250.365    75680.532 
     FLOORSZ      908.249     1095.711     1411.257     1864.155     2482.376 
        PROF   -16595.354   143221.798   303155.382   379563.029   480351.828 
    UNEMPLOY  -982984.259    -5935.799   575766.002  1029212.413  1780751.157 


Diagnostic Information
----------------------
  RSS: 348701748965
  ENP: 40.26956
  EDF: 275.7304
   R2: 0.8052821
R2adj: 0.7767406
  AIC: 7506.818
 AICc: 7546.36

其中参数 threshold 表示指标值变化的阈值,由于目前内核库仅支持 AIC 指标选模型,因此参数 criterion 仅支持值 "AIC"。 如果使用的是低版本的 R,那么可使用下面的模式进行调用:

m2 <- gwr_basic(
    PURCHASE ~ FLOORSZ + UNEMPLOY + PROF + BATH2 + BEDS2 + GARAGE1 +
        TYPEDETCH + TPSEMIDTCH + TYPETRRD + TYPEBNGLW + BLDPWW1 +
        BLDPOSTW + BLD60S + BLD70S + BLD80S + CENTHEAT,
    LondonHP, "AIC", TRUE
)
m2 <- model_sel(m2, criterion = "AIC", threshold = 10, bw = Inf, optim_bw = "AIC")
m2

函数 model_sel() 中也有一个 bw 参数,同时也附加了一个 optim_bw 的参数。其用法是:

  1. 如果 bw 不设置或者是 NA,那么将采用传入的 gwrm 对象中记录的带宽值。
  2. 如果 bw 是数值型,使用该 bw 值作为模型优选中使用的带宽值。根据 optim_bw 的情况判断是否在解算前进行带宽优选。
    • 如果 optim_bw 指定了 "no",那么默认以 AIC 作为指标进行带宽优选。
    • 如果 optim_bw 指定了 "AIC""CV",那么以根据相应的指标进行带宽优选。
  3. 如果 bw 是非数值型值,则默认使用 Inf 值作为带宽进行变量优选,并在模型解算前,使用变量 optim_bw 指定的指标值进行变量优选。 但如果 optim_bw 指定了 "no",那么默认以 AIC 作为指标进行带宽优选。

虽然该逻辑看起来比较复杂,但是使用起来很简单。一般情况下,就使用如上设置的参数即可。

经过变量优选的模型返回值,包含一个与该函数同名的 $model_sel 变量,里面保存了模型优选过程中所有模型组合及其指标值。 包中提供了三个函数用于可视化该变量。

model_sel_view_circle(m2$model_sel, main = "Circle View")

model_sel_view_value(m2$model_sel, main = "AIC Value")

model_sel_view_diff(m2$model_sel, main = "Diff of AIC")

这三幅图分别为:

  1. 模型变量组合环形图。
  2. 模型指标值折线图。
  3. 模型指标值差分图。这个图是为了便于观察哪个模型符合阈值的要求。 图中所展示的数据是每个模型的指标值与上一个模型的指标值相比的变化情况(除了第一个默认为0)。 通过该图可以清晰地看到那些模型与上一个模型相比具有显著改进效果。

除了直接调用这三个函数之外,还可以统一使用 plot() 函数,该函数会做一些布局上的调整,以方便出图。

plot(m2$model_sel)                  # 等价于 model_sel_view_circle

plot(m2$model_sel, view = "value")  # 等价于 model_sel_view_value

plot(m2$model_sel, view = "diff")   # 等价于 model_sel_view_diff

如果想要进一步调整图片,可以直接添加其他被 plot() 函数支持的参数,例如图名 main 等。

预测

根据已有模型,GWR 可以在任意点的位置进行回归系数和预测。所需要用到的函数是 predict() 函数。 我们这里直接使用原数据集进行预测。

predict(m2, LondonHP)
Simple feature collection with 316 features and 6 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 507400 ymin: 159400 xmax: 552300 ymax: 194900
CRS:           NA
First 10 features:
   Intercept   FLOORSZ      PROF   UNEMPLOY     yhat   residual
0 -23859.461 1107.8783 143091.28  -68568.68 127499.2  29500.837
1 -19273.643 1099.6911 137317.02 -105774.02 125164.0 -11664.024
2 -22341.033 1101.6762 139576.72  -78733.42 112173.3 -30423.269
3 -16587.207 1091.7319 131959.65 -127715.69 145741.0   4259.021
4  -4548.212 1071.6907 118805.43 -236130.77 158572.5  31427.480
5  36721.681 1025.9964  69162.51 -574801.77 158491.4   1458.602
6  41385.027 1015.8069  64587.38 -621772.02 139520.0  10475.019
7  41586.375  980.2804  72971.83 -702105.05 206972.8  32977.160
8  57682.066  985.6583  47493.74 -778290.44 158200.9  -5200.854
9  71221.072  928.7546  43974.22 -982984.26 310010.7 -60060.651
               geometry
0 POINT (533200 159400)
1 POINT (533300 159700)
2 POINT (532000 159800)
3 POINT (531900 160100)
4 POINT (532800 160300)
5 POINT (535700 161700)
6 POINT (535600 161800)
7 POINT (533400 161900)
8 POINT (535500 162200)
9 POINT (534200 162500)

根据传入的第二个参数的类型不同,该函数会给出不同的结果:

  • 如果第二个参数是一个 sfsfc 类型对象,该函数返回一个 sfsfc 类型的对象, 其中包含了原始数据的几何信息。
  • 如果第二个参数只是一个两列的 matrixdata.frame,那么该函数返回一个 data.frame 对象, 不包含几何信息,但与输入数据行数一致。

此外,如果第二个参数是一个 sfsfc 类型对象,返回值的内容会根据该参数中包含的数据变化:

  • 如果参数中不包含完整的自变量字段,那么仅返回系数估计值;
  • 如果参数中包含完整的自变量字段,但不包含因变量字段,除了返回系数估计值外还返回因变量估计值;
  • 如果参数中包含完整的自变量字段,也包含因变量字段,除了返回系数估计值外还返回因变量估计值和残差。

这样可以根据不同的需求获取不同的结果。