本节主要介绍空间数据分析的方法,分为非空间数据分析和空间数据分析两部分。
londonhp <- rgdal::readOGR("data/LNHP03.shp")数据集 londonborough 数据包含了该地区的行政边界,使用之前需要先矫正一下坐标系。
xxxxxxxxxxdata(LondonBorough, package = "GWmodel")proj4string(londonborough) <- proj4string(londonhp)相关分析是分析变量之间的相关性,从而为回归分析的变量选择提供依据。
进行相关分析的包有很多,这里主要介绍 PerformanceAnalytics 的 chart.Correlation() 函数。该函数的特点是提供的信息比较多,有散点图、直方图、相关系数值等,而且相关系数值的字体大小会随着相关系数的大小而变化。
xxxxxxxxxxPerformanceAnalytics::chart.Correlation(londonhp@data[, c("PURCHASE", "BATH2", "FLOORSZ", "PROF", "UNEMPLOY")], histogram = T)由此我们可以看到,PURCHASE 变量和 BATH2 FLOORSZ PROF 三个变量相关性比较强。
该函数默认使用皮尔逊相关系数,如果像计算斯皮尔曼相关系数,则使用 method 参数进行指定。
xxxxxxxxxxPerformanceAnalytics::chart.Correlation(londonhp@data[, c("PURCHASE", "BATH2", "FLOORSZ", "PROF", "UNEMPLOY")], histogram = T, method = "spearman")空间相关分析,主要根据全局莫兰指数和局部莫兰指数进行分析。主要用到的函数包为 spdep 包。
xxxxxxxxxxlibrary(spdep)莫兰指数的定义如下: 其中 为根据空间邻域计算的权重矩阵。
在 R 中,该值的计算方法是
xxxxxxxxxxlondonhp.nb <- knn2nb(knearneigh(londonhp, k = 4, longlat = F))londonhp.nb.s <- make.sym.nb(londonhp.nb)moran.test(londonhp$PURCHASE, listw = nb2listw(londonhp.nb.s))中间涉及到
knn2nbknearneighmake.sym.nbnb2listw几个函数,都是用来生成空间邻域权重矩阵的,具体含义和使用方法请查看帮助文档。
在结果中可以看到,莫兰指数 的 值很小,表示数据中含有自相关性;否则即使 不是 0,也不能认为有相关性。 然后根据莫兰指数 的值,判断相关性的类型:
除了莫兰指数以外,还有 Geary 系数也比较常用,该系数的用法请参考《R 语言空间统计与分析实践教程》。
局部空间自相关使用局部莫兰指数,其定义如下 其中 为根据空间邻域计算的权重矩阵。
在 R 中使用 localmoran() 函数进行计算,
xxxxxxxxxxlondonhp.localmoran.PURCHASE <- localmoran(londonhp$PURCHASE, listw = nb2listw(londonhp.nb.s, style = "W"))head(londonhp.localmoran.PURCHASE)下面我们可以将其在地图上进行可视化,来观察变量的局部相关性分布情况。
xxxxxxxxxxlondonhp.localmoran.PURCHASE.sdf <- data.frame(londonhp@coords, londonhp.localmoran.PURCHASE)coordinates(londonhp.localmoran.PURCHASE.sdf) <- ~ coords.x1 + coords.x2proj4string(londonhp.localmoran.PURCHASE.sdf) <- proj4string(londonhp)tm_shape(londonborough) + tm_polygons(col = "white") + tm_shape(londonhp.localmoran.PURCHASE.sdf) + tm_symbols(col = "Ii", size = 0.2)函数 moran.plot 用于辅助查看空间自相关特征,使用方法如下
xxxxxxxxxxmoran.plot(londonhp$PURCHASE, nb2listw(londonhp.nb.s, style = "W"), pch = 19)根据点集落入的象限,可以分析空间自相关特征。
地理加权分析,其方法主要由 GWmodel 包提供,包括地理加权汇总统计分析(GWSS)、地理加权回归分析(GWR)、地理加权主成分分析(GWPCA)、地理加权判别分析(GWDA)等。
不同地分析方法分别有不同的作用,需要搭配使用。
xxxxxxxxxxlibrary(GWmodel)library(tmap)地理加权回归分析是考虑空间异质性的回归方法,其回归方程是 其中 是在位置 处的因变量; 是位置 上第 个自变量; 自变量总数; 是位置 上的截距; 位置 上第 个自变量的回归系数; 是位置 上的随机误差,服从正态分布。
其解算方法是加权最小二乘,即 其中 通过核函数和回归点 之间的距离计算。距离一般是欧氏距离,或者路网距离、通勤时间等。核函数主要有以下几种:
进行 GWR 分析的方法主要有三步:模型优选、带宽优选、模型拟合。前两步主要是用于选择一个最优参数,其结果是参考性的。
使用 gwr.model.selection() 函数进行模型优选,该函数需要指定因变量和自变量。
xxxxxxxxxxlondonhp.indep.vars <- colnames(londonhp@data)[-1]londonhp.depen.vars <- colnames(londonhp@data)[1]londonhp.model.sel <- gwr.model.selection(DeVar = londonhp.depen.vars, InDeVars = londonhp.indep.vars, data = londonhp, bw = Inf, adaptive = T, kernel = "gaussian", longlat = F, parallel.method = "omp", parallel.arg = 8)londonhp.model.sort <- gwr.model.sort(londonhp.model.sel, length(londonhp.indep.vars), londonhp.model.sel[[2]][,2])然后根据下面三张图,可以分析究竟应该选择哪个模型
xxxxxxxxxx## 模型列表gwr.model.view(DeVar = londonhp.depen.vars, InDeVars = londonhp.indep.vars, londonhp.model.sort[[1]])## 模型 AIC 值londonhp.model.ruler <- londonhp.model.sort[[2]][,2]plot(londonhp.model.ruler, type = "b", pch = 20, lty = 2)## 模型 AIC 变化londonhp.model.ruler.diff <- c(0, diff(londonhp.model.ruler))plot(londonhp.model.ruler.diff, ylim = c(-50, 0))abline(h = -3)text(x = 1:length(londonhp.model.ruler.diff), y = londonhp.model.ruler.diff, labels = as.character(1:length(londonhp.model.ruler.diff)))可以看到,第 115 个模型是比较好的模型。下面有两种方法获取该模型,一种是根据第一张图查找 115 号模型的自变量。 另一种方法是,直接根据输出结果获取表达式。
xxxxxxxxxxlondonhp.model.best <- londonhp.model.sort[[1]][[115]]londonhp.model.formula <- formula(londonhp.model.best[[1]])londonhp.model.indep <- londonhp.model.best[[2]]londonhp.model.formula在选好了模型的基础上,使用 bw.gwr() 函数进行带宽优选。
xxxxxxxxxxlondonhp.bw <- bw.gwr(londonhp.model.formula, londonhp, kernel = "gaussian", adaptive = T, longlat = F, parallel.method = "omp", parallel.arg = 8)londonhp.bw返回的 londonhp.bw 即是最优带宽值。
在选好模型和带宽的基础上,使用 gwr.basic() 函数解算模型。
xxxxxxxxxxlondonhp.model.gwr <- gwr.basic(londonhp.model.formula, londonhp, bw = londonhp.bw, kernel = "gaussian", adaptive = T, longlat = F, parallel.method = "omp", parallel.arg = 8)londonhp.model.gwr返回结果 londonhp.model.gwr 是一个列表,最重要的是以下两个键值对:
SDF 是一个 Spatial_DatFrame, 和原始数据的类型一致,包含每个点上的回归系数和截距,以及一些其他信息。diagnostic 诊断信息,包含 AIC, 值等,在上述结果输出中也可以看到。我们可以先将 SDF 的值的列名进行输出
xxxxxxxxxxcolnames(londonhp.model.gwr$SDF@data)可见,该变量包含以下列:
我们可以对这些系数进行可视化输出
xxxxxxxxxxtm_shape(londonhp.model.gwr$SDF) + tm_symbols(col = "Intercept", size = 0.2)下面我们使用数据集 LondonBorough 制作完整的专题图。
xxxxxxxxxxtm_shape(londonborough) + tm_polygons(col = "white") + tm_shape(londonhp.model.gwr$SDF) + tm_symbols(col = "Intercept", size = 0.2)GWSS 包含以下几类地理加权汇总统计量:
函数 gwss() 提供该功能。GWSS 的使用没有像 GWR 那么复杂,只是计算几个统计量。使用方法如下
xxxxxxxxxxlondonhp.gwss <- gwss(londonhp, vars = c("PURCHASE", "FLOORSZ", "PROF", "UNEMPLOY"), kernel = "gaussian", adaptive = TRUE, bw = 100, longlat = F)londonhp.gwss同样,变量 londonhp.gwss 是一个列表,其中有一个 SDF 的键值对,包含了每个要素上 GWSS 统计量的计算结果。
xxxxxxxxxxcolnames(londonhp.gwss$SDF@data)我们也可以将其进行可视化
xxxxxxxxxxtm_shape(londonborough) + tm_polygons(col = "white") + tm_shape(londonhp.gwss$SDF) + tm_symbols(col = "PURCHASE_LM", size = 0.2)tm_shape(londonborough) + tm_polygons(col = "white") + tm_shape(londonhp.gwss$SDF) + tm_symbols(col = "Corr_PURCHASE.PROF", size = 0.2)