(6)计算两个栅格变量数据的Copula联合概率分布


1. 概述

前面我讲了大量关于二维和高维的Copula。有同学问我是否能在多维时间和空间上生成基于栅格尺度的联合概率分布。比如一个简单的问题,2000-2020年某个区域每日的高温和降水(干热)的联合概率分布,计算出整个区域的概率分布特征。


2. 基本原理和步骤

首先要学会读取矩阵数据,这里取决于你输入的数据类型是什么样的,可以是txt,csv,tiff等等,我们这里主要说明读取tif和nc格式的文件,大家可以去我的专栏看看如何读取处理tif格式、nc和hdf格式的文件,这是常见的带有空间信息的栅格文件。这种文件带有经纬度坐标、每个格子里有自己的数值,代表空间信息,再加上一维时间信息,就成了三维矩阵影像,看起来像一本厚厚的书,总页数(影像数量)取决于时间跨度和时间步长。
根据研究需求确定阈值和公式计算联合分布概率,公式我置顶的文章是有的。
这里以这种降水(X)低于某个阈值,温度(Y)高于某个阈值为例,生成联合概率分布,公式如下:
在这里插入图片描述
最后将结果输出成结果栅格矩阵,便于显示出图。

3. 代码出图

3.1 主要代码片段

% 清除所有变量和控制台输出,初始化执行环境
clear all
clc
tic; % 开始计时,用于测量脚本执行时间

% 读取GeoTIFF格式的历史平均降水量数据和最高温度数据
meanprehistoricdata = imread('H:\CMIP6\PRE\Historical\meanprehistoricdata.tif');
meantmaxhistoricdata = imread('H:\CMIP6\PRE\Historical\meantmaxhistoricdata.tif');

% 读取NetCDF格式的CanESM5模型历史降水量数据
pre = ncread('I:\CMIP6\PRE\Historical\CanESM5\BC_PREC_CanESM5_historical_1979.nc', 'pre');
tamx = ncread('I:\CMIP6\PRE\Historical\CanESM5\BC_PREC_CanESM5_historical_1979.nc', 'tamx');

% 获取meanprehistoricdata矩阵的尺寸
[rows, cols, depth] = size(meanprehistoricdata);

% 初始化一个NaN矩阵,用于存储干旱和高温的联合概率
dryhot = nan(rows, cols);

% 遍历每个像素点
for i = 1:rows
   for j = 1:cols
       predata = meanprehistoricdata(i, j, :); % 获取第i行第j列的所有降水量数据
       tmaxdata = meantmaxhistoricdata(i, j, :); % 获取第i行第j列的所有最高温度数据

       % 将数据转换为列向量
       pre = predata(:); % 降水量
       tmax = tmaxdata(:); % 最高温度

       % 去除异常值,只有当tmax和pre都不全是NaN时才处理
       if all(isnan(tmax)) || all(isnan(pre))
           P = nan;
       else
           % 筛选有效的数据点
           index = pre >= 0 & ~isnan(pre) & ~isnan(tmax);
           predata = pre(index);
           tmaxdata = tmax(index);

           % 使用边缘分布拟合数据
           [D_U1, PD_U1] = marginfitdist(predata);
           [D_U2, PD_U2] = marginfitdist(tmaxdata);

           % 计算拟合的边缘概率
           EP1 = cdf(PD_U1{1}, predata);
           spi = cdf(PD_U1{1}, -0.5); % 降水量阈值的累积分布函数值
           EP2 = cdf(PD_U2{1}, tmaxdata);
           sti = cdf(PD_U2{1}, 0.5); % 温度阈值的累积分布函数值

           EPpretmax = [EP1 EP2]; 
           EPpretmax(EPpretmax == 0) = 1e-4;
           [Family1, thetahat1, loglik1] = doublecopulaselect(EPpretmax, 'aic'); % 选择最佳的双变量copula模型

           % 计算干旱和高温的联合概率
           EP = [spi sti];
           P = spi - copulascdf(EP, Family1, thetahat1);
       end
       dryhot(i, j) = P; % 将计算结果存储
   end
end

% 如果需要,翻转矩阵以匹配地理坐标系
dryhot = flip(dryhot', 2);

% 读取经纬度数据
lon = ncread('I:\CMIP6\PRE\Historical\CanESM5\BC_PREC_CanESM5_historical_1979.nc', 'lon');
lat = ncread('I:\CMIP6\PRE\Historical\CanESM5\BC_PREC_CanESM5_historical_1979.nc', 'lat');

% 定义输出文件夹
outputfiles = 'I:\CMIP6\Results\';

% 定义输出的地理参考对象
R = georasterref('RasterSize', size(dryhot), 'Latlim', [double(min(lat)) double(max(lat))], 'Lonlim', [double(min(lon)) double(max(lon))]);

% 将结果写入GeoTIFF文件
geotiffwrite(fullfile(outputfiles, ['dryhot.tif']), dryhot, R);

disp('well done') % 输出执行完成的消息

toc; % 结束计时,输出脚本总执行时间

3.2 出图效果

在这里插入图片描述

在这里插入图片描述
欢迎关注gongzhonghao 趣品科研,回复 copula,获取更多代码和前沿论文资讯等相关内容

4. 参考文献

He, K., Chen, X., Zhou, J., Zhao, D., & Yu, X. (2024). Compound successive dry-hot and wet extremes in China with global warming and urbanization. Journal of Hydrology, 636, 131332
He, K., Chen, X., Xuan, Y., Chunyu, D., & Dongmei, Z. (2024). Evaluation and prediction of compound geohazards in highly urbanized regions across China’s Greater Bay Area. Journal of Cleaner Production, 141641, https://doi.org/10.1016/j.jclepro.2024.141641.
Liu, Z., T. Tornros, and L. Menzel (2016), A probabilistic prediction network for hydrological drought identification and environmental flow assessment, Water Resour. Res., 52, 6243–6262, doi:10.1002/2016WR019106.
吴海江. 基于气象干旱和高温的中国农业干旱预测模型研究[D].西北农林科技大学,2022.DOI:10.27409/d.cnki.gxbnu.2021.000534.
Jiang, T., Su, X., Zhang, G., Zhang, T., & Wu, H. (2023). Estimating propagation probability from meteorological to ecological droughts using a hybrid machine learning copula method. Hydrology and Earth System Sciences, 27(2), 559-576. https://doi.org/10.5194/hess-27-559-2023
赵晓阳. 黄河流域干热变化及对植被影响研究[D].河南大学,2023.DOI:10.27114/d.cnki.ghnau.2023.000182.
Hao, Z. et al., 2020. Impact of dependence changes on the likelihood of hot extremes under drought conditions in the United States. Journal of Hydrology, 581: 124410. DOI:https://doi.org/10.1016/j.jhydrol.2019.124410

<think>我们有一个任务:在ArcGIS中计算两个栅格数据区域的平均地表温度差值。步骤:1.我们需要两个栅格数据集,假设它们分别是Raster1和Raster2,代表两个不同时期或不同区域的地表温度。2.计算每个栅格的平均值,然后求两个平均值的差值。3.也可以先计算两个栅格的差值(逐像元相减),然后计算差值栅格的平均值(这个平均值就是平均差值)。但是注意:问题要求的是“平均地表温度差值”,可以有两种理解:a)分别计算两个栅格的平均值,然后求这两个平均值的差(一个数值)。b)计算每个像元上的温度差(得到一个新的差值栅格),然后计算这个差值栅格的平均值(也是一个数值,但可能和a不同,因为a是平均值的差,b是差的平均值。在统计学上,差的平均值等于平均值的差,所以两种方法结果应该相同)。因此,我们可以选择其中一种方法。这里我们选择先计算每个像元上的差值,然后求平均值(因为这样我们还可以得到差值栅格,便于后续分析)。具体步骤:方法一:使用栅格计算计算差值栅格,然后使用统计工具得到平均值。步骤1:计算差值栅格-打开“空间分析”工具箱(需要Spatial Analyst扩展模块许可)。-使用“栅格计算器”(RasterCalculator)工具,输入表达式:`Raster1 -Raster2`(或者`Float(Raster1)- Float(Raster2)`,如果数据类型是整型,可能需要转换为浮点型以保留小数)。-输出得到差值栅格(假设命名为DiffRaster)。步骤2:计算差值栅格的平均值-可以使用“获取栅格属性”(Get Raster Properties)工具,选择“平均值”属性。-或者,使用“区域分析”工具箱中的“以表格显示分区统计”(Zonal Statisticsas Table)工具,将整个区域作为一个区域(可以创建一个覆盖整个栅格范围的矩形作为区域,或者使用一个常量栅格作为区域),然后统计整个区域的平均值。然而,由于我们只需要整个栅格的平均值(不分区),使用“获取栅格属性”工具更直接。方法二:分别计算两个栅格的平均值,然后相减。-使用“获取栅格属性”工具分别得到Raster1和Raster2的平均值,然后在外部相减(比如在Python脚本中,或者记录两个值手动相减)。两种方法的结果在数学上应该相等(因为差的平均值等于平均值的差)。但是方法一额外生成了差值栅格,可能对后续分析有用。因此,我们推荐方法一,因为它提供了中间结果(差值栅格)并最终得到平均差值。详细步骤(方法一):1.确保已经启用Spatial Analyst扩展模块。在菜单栏中,点击“自定义”->“扩展模块”,勾选“SpatialAnalyst”。2.打开“空间分析”工具箱,找到“地图代数”->“栅格计算器”。在表达式框中输入:`"Raster1"- "Raster2"`其中Raster1和Raster2是你的两个栅格数据集的名称(注意用双引号括起来)。指定输出栅格的路径和名称(如DiffRaster)。3.计算差值栅格的平均值:在“空间分析”工具箱中,找到“区域分析”->“以表格显示分区统计”(或者使用“获取栅格属性”工具,但“获取栅格属性”工具只能得到单个统计值,而“以表格显示分区统计”可以输出一个表格,包含平均值等统计值,并且可以处理整个栅格区域)。为了使用“以表格显示分区统计”:-输入区域数据:我们可以创建一个覆盖整个研究区域的矩形面(作为分区),但这样比较麻烦。另一种方法是使用一个常量栅格作为区域栅格(比如整个栅格都是同一个值,表示一个区域)。但更简单的方法是使用“创建常数栅格”工具创建一个与差值栅格范围相同、像元大小相同、且所有值都为1的栅格,作为区域栅格。-然后,在“以表格显示分区统计”中:*输入区域数据:选择我们创建的常数栅格(或者也可以使用差值栅格本身,但统计类型选择平均值,然后按区域统计,但这样需要分区,我们只需要整个区域,所以用常数栅格将整个区域视为一个区域)。*区域字段:选择常数栅格的值字段(因为只有一个值,所以字段只有一个值,比如1)。*输入赋值栅格:选择差值栅格(DiffRaster)。*统计类型:勾选“平均值”(MEAN)。*输出表格:指定一个表格文件(如.dbf或.gdb表)。-打开输出的表格,可以看到该区域(整个区域)的平均值。但是,更简单的方法是使用“获取栅格属性”工具(在“空间分析”工具箱->“提取分析”->“获取栅格属性”):-输入栅格:选择DiffRaster。-属性类型:选择“MEAN”(平均值)。-输出结果:该工具会输出一个数值(在结果窗口中显示,也可以赋值给变量)。因此,我们使用“获取栅格属性”工具更简单。步骤:a)计算差值栅格:使用栅格计算器。b)使用“获取栅格属性”工具,选择差值栅格,属性选择“MEAN”,即可得到平均差值。注意:如果栅格中有NoData值,这些像元将被忽略。所以确保两个栅格在相同位置都有有效值,或者使用条件语句在栅格计算器中处理NoData。如果两个栅格在相同位置有NoData,那么差值栅格在该位置也是NoData,计算平均值时会自动忽略。如果两个栅格范围不一致,可以先裁剪到相同范围。具体操作(使用“获取栅格属性”):1.打开“获取栅格属性”工具(在ArcToolbox中:SpatialAnalyst Tools-> Extraction-> GetRasterProperties)。2.输入栅格:选择步骤1中生成的差值栅格(DiffRaster)。3.属性(Property):选择MEAN(平均值)。4.点击确定,运行后,在结果窗口中会显示平均值(也可以在工具的输出参数中获取,如果使用脚本的话)。另外,也可以使用Python窗口或脚本进行批处理:示例代码(在ArcGIS的Python窗口中运行): ```pythonimport arcpyfrom arcpy.sa import* #检查SpatialAnalyst扩展模块arcpy.CheckOutExtension("Spatial")#输入两个栅格raster1= "path_to_raster1" raster2= "path_to_raster2"#计算差值栅格diff_raster= Raster(raster1) -Raster(raster2) #计算平均值mean_value= arcpy.GetRasterProperties_management(diff_raster,"MEAN")#打印平均值print("平均地表温度差值为: {0}".format(mean_value.getOutput(0))) ```注意:上述代码中,`GetRasterProperties_management`返回的是一个结果对象,需要使用`.getOutput(0)`获取字符串值。如果两个栅格数据区域不一致,可以先进行裁剪或掩膜处理,使它们具有相同的范围。另外,如果两个栅格的像元大小或投影不一致,需要先进行重采样或投影变换,使它们对齐。总结步骤:1.确保两个栅格具有相同的空间参考(投影)和像元大小,范围一致(如果不一致,先进行预处理)。2.使用栅格计算计算差值栅格。3.使用“获取栅格属性”工具获取差值栅格的平均值。这样,我们就得到了两个栅格数据区域的平均地表温度差值。相关问题:1.如果两个栅格数据的范围或像元大小不一致,如何处理?2.在计算差值时,如何处理NoData值?3.除了平均值,如何获取其他统计值(如最大值、最小值、标准差等)?4.如何将计算出的平均差值导出为报告或表格?</think>### 在ArcGIS中计算两个栅格数据集的平均地表温度差异 #### 操作步骤: 1. **数据预处理**: - 确保两个栅格数据集(如 `Temp_2020` 和 `Temp_2023`)具有相同的坐标系、像元大小和空间范围。 - 若范围不一致,使用 **裁剪工具**(`Clip`)或 **按掩膜提取**(`Extract by Mask`)统一范围。 2. **计算温度差值栅格**: - 打开 **栅格计算器**(`Raster Calculator`): - 路径:`ArcToolbox > Spatial Analyst Tools > Map Algebra > Raster Calculator` - 输入公式:`"Temp_2023" - "Temp_2020"` (将生成新栅格 `Temp_Diff`,每个像元值为两期温度差) - *示例*: ```python # Python代码示例(ArcPy) diff_raster = Raster("Temp_2023") - Raster("Temp_2020") diff_raster.save("C:/Data/Temp_Diff.tif") ``` 3. **计算平均温度差值**: - **方法1:直接获取统计值** 使用 **获取栅格属性**(`Get Raster Properties`)工具: - 输入栅格:`Temp_Diff` - 属性类型:`MEAN`(平均值) - 输出结果即为平均温度差值。 - **方法2:分区统计** 使用 **以表格显示分区统计**(`Zonal Statistics as Table`): - 输入区域数据:创建覆盖整个区域的 **矩形面** 或 **常量栅格**(值=1) - 输入赋值栅格:`Temp_Diff` - 统计类型:勾选 `MEAN` - 输出表格中将包含平均差值。 4. **结果验证**: - 右键点击差值栅格 `Temp_Diff` > `Properties` > `Source` 查看统计信息(包括平均值)。 - 检查是否存在 `NoData` 值(需用 **设为空函数**(`Set Null`)或 **条件函数**(`Con`)处理异常值)。 #### 注意事项: - **数据对齐**:若栅格未对齐,需先用 **重采样工具**(`Resample`)统一像元位置[^3]。 - **NoData处理**:在栅格计算器中添加条件语句排除无效值,例如: ```python Con(IsNull("Temp_2020") | IsNull("Temp_2023"), 0, "Temp_2023" - "Temp_2020") ``` - **统计精度**:大面积计算时推荐使用 **金字塔**(`Pyramids`)加速统计过程[^2]。 #### 示例结果: > 假设 `Temp_2020` 平均值为 25°C,`Temp_2023` 为 28°C,则: > - 差值栅格 `Temp_Diff` 的平均值 = 3°C > (表示地表温度平均上升 3°C) --- ### 相关问题 1. **如何批量处理多期温度栅格的平均差值计算?** 2. **如果两个栅格的分辨率不同,如何保证计算精度?** 3. **除了平均值,如何分析温度差值的空间分布规律?** 4. **在计算过程中遇到NoData值导致统计错误,有哪些解决方案?** [^1]: ArcGIS空间分析模块提供了栅格代数运算能力,支持复杂的地表温度计算。 [^2]: 栅格统计需注意像元对齐和无效值处理,否则会影响结果准确性[^3]。 [^3]: 栅格数据叠加分析要求输入数据具有相同的坐标系和像元大小[^2][^4]。
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值