基于Python的栅格数据地理加权回归

本文结合实例详细讲解了如何使用Python对栅格数据进行地理加权回归(GWR)和多尺度地理加权回归分析(MGWR),关注公众号GeodataAnalysis,回复20230605获取示例数据和代码,包含整体的写作思路,上手运行一下代码更容易弄懂。

进行GWR和MGWR的工具有很多,但一般只针对矢量数据。对栅格数据进行GWR和MGWR分析,一般是将其转为矢量,计算后将结果再转为栅格。但在过程中比较容易出现各种问题,比如在一个像元上,有的指标是空值,有的不是,筛选起来就比较麻烦。用代码来做就比较灵活,且计算速度较快,因为栅格数据一般数据量比矢量大得多,计算起来就很复杂。

一、GWR和MGWR简介

地理加权回归 (GWR) 是若干空间回归技术中的一种,越来越多地用于地理及其他学科。通过使回归方程适合数据集中的每个要素,GWR 可为您要尝试了解/预测的变量或过程提供局部模型。GWR 构建这些独立方程的方法是:将落在每个目标要素的带宽范围内的要素的因变量和解释变量进行合并。带宽的形状和大小取决于用户输入的核类型、带宽方法、距离以及相邻点的数目参数。

MGWR 以地理加权回归 (GWR) 为基础构建。 它是一种局部回归模型,允许解释变量的系数随空间变化。 每个解释变量都可以在不同的空间尺度上运行。 GWR 不考虑这一点,但 MGWR 通过针对每个解释变量允许不同的邻域(带宽)来考虑这一点。 解释变量的邻域(带宽)将决定用于评估适合目标要素的线性回归模型中该解释变量系数的要素。

二、数据简介

因变量数据,2016年全国的PM2.5反演数据,空间分辨率为0.1度,开源于Surface PM2.5 | Atmospheric Composition Analysis Group | Washington University in St. Louis,简称为GWRPM25。

自变量数据,2016年全国的人为前体物排放数据,空间分辨率为0.25度,来源于清华大学MEIC(中国多尺度排放清单模型,Multi-resolution Emission Inventory for China,简称MEIC),本次使用CO、NOx、PM25、VOC四个指标。

三、数据预处理

NC数据转TIF

自变量数据和因变量数据都是NC格式,需要将其转为TIF,方便后续处理,更多的NC数据处理技巧参见公众号NetCDF(nc)读写与格式转换介绍一文。

MEIC数据转TIF

import os
import numpy as np
from netCDF4 import Dataset
from rasterio.crs import CRS
from rasterio.transform import from_bounds# MEIC数据的坐标、空间参考、nodata信息
west, south, east, north = 70, 10, 150, 60
width, height = 320, 200
meic_affine = from_bounds(west, south, east, north, width, height)
crs = CRS.from_epsg(4326)
nodata = -9999factors = ['CO', 'NOx', 'PM25', 'VOC']for factor in factors:factor_path = os.path.join('./meic_nc/', f'2016_00_total_{factor}.nc')out_path = os.path.join('./meic_tif/', f'{factor}.tif')ds = Dataset(factor_path)array = ds['z'][...].reshape(height, width)with rio.open(out_path, 'w', driver='GTiff', height=height, width=width, count=1, dtype=array.dtype, crs=crs, transform=meic_affine, nodata=nodata, compress='lzw') as dst:# 写入数据到输出文件dst.write(array, 1)

GWRPM25数据转TIF

x_res, y_res = 0.1, 0.1nc_path = './gwrpm25_nc/V5GL03.HybridPM25c_0p10.China.201601-201612.nc'
tif_path = './gwrpm25_tif/gwrpm25.tif'rootgrp = Dataset(nc_path)
# 获取分辨率和左上角像素坐标值
lon = rootgrp['lon'][...].data
lat = rootgrp['lat'][...].data
width, height = len(lon), len(lat)west, north = lon.min(), lat.max()
east = west + x_res * width
south = north - y_res * height
gwrpm25_affine = from_bounds(west, south, east, north, width, height)# 读取数据
pm = rootgrp['GWRPM25'][::-1, :]
pm = pm.filled(np.nan)with rio.open(tif_path, 'w', driver='GTiff', height=height, width=width, count=1, dtype=pm.dtype, crs=crs, transform=gwrpm25_affine, nodata=np.nan, compress='lzw') as dst:# 写入数据到输出文件dst.write(pm, 1)

GWRPM25数据重采样

由于自变量和因变量数据的空间范围以及分辨率不同,因此对GWRPM25数据进行重采样,采样到和MEIC相同的分辨率和空间范围。

from rasterio.warp import reprojectout_path = './gwrpm25_tif/gwrpm25_res.tif'
dst_array = np.empty((200, 320), dtype=np.float32)
reproject(# 源文件参数source=pm,src_crs=crs,src_transform=gwrpm25_affine, src_nodata=np.nan, # 目标文件参数destination=dst_array, dst_crs=crs, dst_transform=meic_affine,dst_nodata=np.nan
)
with rio.open(out_path, 'w', driver='GTiff', height=200, width=320, count=1, dtype=dst_array.dtype, crs=crs, transform=meic_affine, nodata=np.nan, compress='lzw') as dst:# 写入数据到输出文件dst.write(dst_array, 1)

四、GWR和MGWR分析

数据读取

用于计算多个栅格数据的共同非空值的掩膜。

def rasters_mask(paths):out_mask = Nonefor path in paths:src = rio.open(path)array = src.read(1)mask = ~(array==src.nodata)mask = mask & (~np.isnan(array))if isinstance(out_mask, type(None)):out_mask = maskelse:out_mask = out_mask & maskreturn out_mask

用于读取多个栅格数据返回Nmupy数组,mask参数指上一步计算的掩膜,结果数组形状为(n, k),n为有效样本点数量,k为paths的长度。

def rasters_to_array(paths, mask):out_array = Nonefor path in paths:src = rio.open(path)array = src.read(1)array = array.astype(np.float32)array = array[mask][..., np.newaxis]if isinstance(out_array, type(None)):out_array = arrayelse:out_array = np.concatenate([out_array, array], axis=1)return out_array

计算自变量和因变量的非空数据的掩膜。

x_paths = glob('./meic_tif/*.tif')
y_path = './gwrpm25_tif/gwrpm25_res.tif'
mask = rasters_mask(x_paths + [y_path])

获取自变量和因变量的有效像元值,有效栅格像元数越多后面计算GWR就越慢,指数级上升。

x_array = rasters_to_array(x_paths, mask)
y_array = rasters_to_array([y_path], mask)assert np.any(np.isnan(x_array)) == False
assert np.any(np.isnan(y_array)) == False

计算有效栅格像元的坐标

以栅格像元中心点的坐标作为这个像元的坐标。

src_y = rio.open('./gwrpm25_tif/gwrpm25_res.tif')
gt = src_y.transform
w, h = src_y.width, src_y.heightx_coords = np.arange(gt[2] + gt[0] / 2, gt[2] + gt[0] * w, gt[0])
y_coords = np.arange(gt[5] + gt[4] / 2, gt[5] + gt[4] * h, gt[4])
x_coords, y_coords = np.meshgrid(x_coords, y_coords)
x_coords, y_coords = x_coords[mask][..., np.newaxis], y_coords[mask][..., np.newaxis]
coords = np.concatenate([x_coords, y_coords], axis=1)

GWR分析

计算最佳带宽

# Reference:https://www.osgeo.cn/pysal/generated/pysal.model.mgwr.sel_bw.Sel_BW.html
pool = multiprocessing.Pool(processes = 6)
bw = Sel_BW(coords, y_array, x_array, kernel='gaussian').search(criterion='AIC', pool=pool)

拟合模型,输出结果中x0是偏置,x1 - x4是meic_tif文件夹中的四个指标,按文件名排序。

model = GWR(coords, y_array, x_array, bw=bw, fixed=False, kernel='gaussian')
results = model.fit(pool=pool)
results.summary()
Geographically Weighted Regression (GWR) Results
---------------------------------------------------------------------------
Spatial kernel:                                           Adaptive gaussian
Bandwidth used:                                                      51.000Diagnostic information
---------------------------------------------------------------------------
Residual sum of squares:                                         523320.602
Effective number of parameters (trace(S)):                          431.288
Degree of freedom (n - trace(S)):                                 15437.712
Sigma estimate:                                                       5.822
Log-likelihood:                                                  -50254.773
AIC:                                                             101374.121
AICc:                                                            101398.390
BIC:                                                             104690.685
R2:                                                                   0.926
Adjusted R2:                                                          0.923
Adj. alpha (95%):                                                     0.001
Adj. critical t value (95%):                                          3.442Summary Statistics For GWR Parameter Estimates
---------------------------------------------------------------------------
Variable                   Mean        STD        Min     Median        Max
-------------------- ---------- ---------- ---------- ---------- ----------
X0                       29.116     17.280      1.421     29.020     93.703
X1                        0.008      0.178     -2.029      0.000      1.861
X2                        0.000      0.353     -3.712     -0.001      4.119
X3                       -0.078      1.161    -13.198      0.000      8.369
X4                       -0.010      0.119     -1.729     -0.001      1.479
===========================================================================

MGWR分析

计算最佳带宽

# 数据量大,计算带宽太慢,MGWR不再演示
pool = multiprocessing.Pool(processes = 6)
selector = Sel_BW(coords, y_array, x_array, multi=True)
# multi_bw_min为搜索带宽的最小间隔,数据量小时可以设置大点
selector.search(multi_bw_min=[10], pool=pool)

拟合模型

model = MGWR(coords, y_array, x_array, selector, fixed=False, kernel='bisquare', sigma2_v1=True)
results = model.fit(pool=pool)
results.summary()

保存计算结果

以下结果为各指标的回归系数,bias表示偏置项。标度方差-协方差矩阵的保存方法与之相同,results.params替换为results.CCT即可。

factors = ['bias', 'CO', 'NOx', 'PM25', 'VOC']
result_params = results.params
for i, factor in enumerate(factors):factor_params = np.full(mask.shape, fill_value=np.nan, dtype=np.float32)factor_params[mask] = result_params[:, i]out_path = f'./results/{factor}.tif'with rio.open(out_path, 'w', driver='GTiff', height=factor_params.shape[0], width=factor_params.shape[1], count=1, dtype=factor_params.dtype, crs=src_y.crs, transform=src_y.transform, nodata=np.nan, compress='lzw') as dst:# 写入数据到输出文件dst.write(factor_params, 1)

以下结果为各个栅格像元的残差.

resid_response = np.full(mask.shape, fill_value=np.nan, dtype=np.float32)
resid_response[mask] = results.resid_response
out_path = f'./results/resid_response.tif'
with rio.open(out_path, 'w', driver='GTiff', height=resid_response.shape[0], width=resid_response.shape[1], count=1, dtype=resid_response.dtype, crs=src_y.crs, transform=src_y.transform, nodata=np.nan, compress='lzw') as dst:# 写入数据到输出文件dst.write(resid_response, 1)

五、结果展示

各自变量指标的回归系数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/351849.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

org.apache.commons.io.monitor+logback.xml+vue实时显示当前日志信息

使用记录: 第一: 刷新页面导致session问题 可以在java的session中记录,如果是同一个客户重新链接的话,直接返回java的session的数据ssemiter给前端,前端自动接着获取日志。 ssemiter:详情自行百度ssemit…

【Spring Boot学习】Spring Boot的创建,第一个Spring Boot页面.

前言: 大家好,我是良辰丫,前面几篇文章,我们系统的学习了Spring框架,今天开始,我们就要学习更高级的SpringBoot框架了,不要着急哦,我们一起畅游SpringBoot框架的世界.💌💌💌 🧑个人主页:良辰针不戳 📖所属专…

EasyRecovery14免费并且超好用的数据恢复工具

相信不少小伙伴都遇到过误删文件或者文件丢失的时候,尤其是对于工作或者学习所需的重要文件来说,更让人不能接受。这个时候大家也可以通过数据恢复软件来进行找回,但是现在很多这种软件都需要付费才能够满足你的需求。那么有什么免费的恢复工…

EasyRecovery2020数据恢复软件激活码序列号秘钥下载及使用恢复教程

我们平时肯定都遇到过不小心把重要文件删除的情况,其实这些数据还是有很大几率可以恢复的,而且恢复起来并不难。 今天小编给大家推荐一个比较老牌的数据恢复软件EasyRecovery。 如回收站作为一个临时存放被删除文件的居所,有着预防用户误删…

EasyRecovery14最新个人版数据恢复工具

EasyRecovery14Mac最新版是一款功能非常强大的文件数据恢复工具软件,EasyRecovery14Mac最新版有着极为强大的数据恢复功能,可以帮助用户将各种丢失或者误删除的文件数据完美恢复,不过需要健康度高的文件才能恢复,感兴趣的用户快来…

easyrecovery数据恢复软件V15最新版本介绍

easyrecovery恢复文件介绍 easyrecovery是一款功能非常强大的数据恢复软件,不仅能够恢复手机等终端被删除的文件,还可以恢复从硬盘上删除的文件,而且操作非常简单,下面就跟着小编一起来看一下吧。电脑使用时间很长之后大家应该都…

数据恢复Ontrack EasyRecovery 15中文免费版2023最新

Ontrack EasyRecovery Crack Professional是一个全面的备份和恢复实用程序,可以从多个数据丢失事件中恢复文件,例如常见的意外删除、更严重的(有时是病毒引起的)分区或驱动器格式化,甚至硬盘严重损坏后的数据丢失。免费…

Ontrack易恢复最新版EasyRecovery数据恢复软件功能

Ontrack EasyRecovery易恢复是领先的数据恢复软件。可以解决任何数据丢失问题。 版本区别对比 EasyRecovery_Home个人版: 家用数据恢复:常规恢复各种文档,音乐, 照片,视频等数据。 EasyRecovery_Professional专业版: 高级数据恢…

EasyRecovery数据恢复软件V15专业版使用操作流程

EasyRecovery使用心得:一款专业的数据恢复软件,可以根据你想要恢复的文件类型恢复数据内容,需要有一定电脑基础的用户才能够顺利使用,想要使用所有功能需要下载完整版才能使用。 下面是EasyRecovery的操作流程: 1、首…

easyrecovery工具2023最新版一键恢复丢失数据免费下载

通常,许多人会将工作或生活中的数据存储在我们的计算机上。很多时候,由于我们的误操作或其他一些问题,很容易错误地删除一些文件和数据。特别是,一些计算机故障总是会导致数据丢失,这是非常麻烦的。当需要重新安装系统…

易恢复Ontrack EasyRecovery15绿色版

电脑上的数据不小心删除了或者是电脑坏掉数据遗失想要找回就得使用数据恢复工具,易恢复Ontrack EasyRecovery15绿色版下载后打开即用,轻松操作,快速恢复电脑上的各项数据。 我们用的最多的就是这个数据恢复,其他的功能有兴趣的朋友…

EasyRecovery2022数据恢复绿色版

EasyRecovery易恢复是一款专业级的数据恢复软件 ,算法精湛、功能强大,用户群体广泛;支持各种情况下的文件恢复、分区恢复,恢复效果好;文件预览、扇区编辑、加密分区恢复、针对普通用户,EasyRecovery易恢复设…

最新版EasyRecovery数据恢复软件使用测评介绍

我们在逐渐适应信息电子化的同时,也有一些潜在的麻烦接踵而来,其中较为常见的就是文件和数据的保存问题。显然,设备的存储空间是有限的,这就不可避免地会出现数据被删除、覆盖或丢失的现象,如果丢失的是重要数据&#…

EasyRecovery免费激活软件秘钥下载恢复教程及注意事项

EasyRecovery是一款操作安全、价格便宜、用户自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。…

EasyRecovery软件最新版安装包V15版本数据恢复软件

哎,谁还没有手残过,这不,刚刚一不小心就把一个重要文件误删了。着急忙慌,赶紧看看有没有办法恢复。经过一番折腾,借助EasyRecovery数据恢复软件,终于把误删的文件找回了。 EasyRecovery 是一款操作安全、价…

EasyRecovery易恢复15免费数据恢复软件功能介绍

数据恢复软件EasyRecovery是一款优秀的数据恢复工具,可以帮助我们找回因各种原因丢失的数据。如果您正在被数据丢失问题所烦恼。 EasyRecovery数据恢复软件,2022新款数据恢复软件,支持文件,照片视频等格式预览.EasyRecovery,数据丢失需尽快恢复,恢复效果好! 关于…

EasyRecovery最新中文Win/Mac全版本下载安装激活数据恢复软件

EasyRecovery 是一款操作安全、用户可自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢复包…

EasyRecovery注册码哪里有?

激活码是激活软件,成功恢复数据的前提,否则软件下载好了以后,没有激活码,也只能试用一段时间,最后还是不能使用。作为专业的数据恢复软件,如果没有EasyRecovery激活码,也只能够扫描出文件&#…

EasyRecovery免费版一键数据恢复还原软件

EasyRecovery15是一款功能全面、易上手操作的批量数据恢复软件,通过这款软件你可以恢复你的电脑中不慎丢失的各类文件数据。软件支持恢复的文件包括图片、office文档、文件夹、邮件、视频、音频等内容,大家可以尝试下,免费版的最多支持2G以内…

2023最新版easyrecovery数据恢复软件免费版测评

大家好,关于easyrecovery数据恢复软件免费版很多朋友都还不太明白,今天小编就来为大家分享关于easyrecovery数据恢复软件免费版下载使用的知识,希望对各位有所帮助! EasyRecovery其实是目前为止我用的最喜欢的一款数据恢复软件&a…