前言
GWR4其实是一个非常专业的软件,功能非常强大,无奈bug实在是太多了,通常是在数据量大(大于1w条记录)的时候会出现。所以我不得不求助于R语言。
准备工作
1. 安装R Studio
2. 安装spgwr的包
install.packages("spgwr")
3. 引入spgwr包
library(spgwr)
读取CSV数据
这里我使用的就是之前在GWR4软件中运行的数据
guangzhousufang<-read.table(file="/Users/xxx/xxx/xxx/xxx.csv", header = TRUE, sep=',')
read.table其实是读取csv最好的函数。第一个参数为文件路径,header参数是数据的第一行(列名),sep参数是数据的分隔符。函数的返回结果是data.frame。
还有一个函数read.csv也可以读取csv,但是它其实是封装了read.table。
如果csv文件巨大,想要提升读取速度,可使用read_delim
ps.如果需要读取shp格式的数据并运算,可移步这一教程: https://www.zhihu.com/question/304853593/answer/551289317
计算带宽
bw<-gwr.sel(rent~area+subway+pSchool+mSchool+university+hospital, data=guangzhousufang, coords=cbind(x=guangzhousufang$lon, y=guangzhousufang$lat), gweight = gwr.Gauss, verbose = TRUE, method = "aic")
调用gwr.sel函数来计算带宽。
第一个参数中指定了因变量(rent)与自变量(area subway pSchool mSchool university hospital)
第二个参数指定了数据(上一步中读入的数据)
第三个参数指定了坐标(lon和lat为数据中自定义的列名):注意⚠️ x对应经度,y对应纬度
第四个参数(gweight)指定了空间权重函数(代码中使用的gauss函数)
第五个参数(verbose)控制是否汇打印计算带宽的过程
第六个参数(method)指定带宽的计算方法(代码中使用的aic)
ps. 如果搞不懂GWR模型的原理,不知道参数值之前的区别,推荐大虾卢的博客与苏世亮老师编写的《空间数据分析》
计算GWR模型
gwr_result <- gwr(rent~area+subway+pSchool+mSchool+university+hospital,coords=cbind(x=guangzhousufang$lon, y=guangzhousufang$lat), data = guangzhousufang, bandwidth = bw, gweight = gwr.Gauss, hatmatrix = TRUE)
函数运行完之后,输入变量名(在我的程序中是gwr_result)查看结果:
此时我发现了一个很严重的问题:在spgwr包中,衡量模型拟合度的参数名为“Quasi-global R2",中文直译过来是“近似全局R2”。我查看了一下源码,在源码中Quasi-global R2的计算方法是:1 - rss/gTSS。rss是residual sum of squares(残差平方和,
),但是gTSS是指什么我并没有在源码中找到,或许就是
吧。
除了上图之外,还有一些计算出的参数可以通过“变量名”+“$”+"参数名"的方法查看,例如:
更多关于参数的信息可参考官方文档https://rdrr.io/cran/spgwr/man/gwr.html
总结
spgwr总体上使用起来比较简单,运算时比较稳定,结果也没什么bug(不像GWR4有时算出来的结果中R2比Adjusted R2还小零点几,呕),但是比起GWR4,它缺少了与全局回归进行比较的部分(还要自己重新跑一遍多元线性回归),并且衡量模型拟合度的时候用了一个非主流的参数“Quasi-global R2”(至少我没有在网上查到关于这个参数的定义,如果有人了解这个参数欢迎交流),所以也不是十分完美。
如果你不是十分享受写代码的过程,那我其实我更建议对数据进行随机抽样,在减小了数据量之后用GWR4进行运算。
如果你热爱coding,那么可以把目光转向另一个包:GWmodel。GWmodel比起spgwr更加稳定,并且构建GWR模型时运算速度要更快。我先放上运算出来的结果:
预知详细操作,且听下回分解。