气象干旱触发水文(农业)干旱的概率及其触发阈值的动态变化-贝叶斯copula模型
前言
在干旱研究中,一个关键的科学问题是:在某一地区发生不同等级的气象干旱时,气象干旱会以何种概率引发不同等级的水文干旱、农业干旱和地下水干旱?换句话说,气象干旱的不同程度会分别引发其他类型干旱的哪种等级?尤其是在大区域尺度上,并且涉及多种干旱类型时,干旱之间的传播过程和其动态变化对于触发不同类型干旱的概率及阈值至关重要。
为了回答这一问题,我们首先评估了在不同等级气象干旱胁迫下,水文干旱的诱发风险;接着,分析了水文干旱胁迫下对农业干旱的诱发风险;最后,探讨了农业干旱胁迫下地下水干旱的诱发概率。通过这一系列的评估,我们逐级构建了触发不同等级水文、农业和地下水干旱的阈值模型,并分析了这些模型随干旱发生过程中的动态变化规律。
这些研究结果为建立基于气象、水文、农业和地下水干旱之间相互作用的预警系统提供了科学依据。该系统对于减轻人为用水与自然生态系统水资源压力,并帮助制定适应性管理策略,具有重要的实践意义。
本研究复现了韩知明博士在其博士论文《中国多类型干旱时刻演变特征及其传播过程研究》中的相关工作,旨在为干旱风险预测和管理提供理论支持。
一、评估条件概率
为了评估在不同等级气象干旱胁迫下诱发不同等级气象、水文、农业和地下水干旱的风险,我们采用了贝叶斯概率模型。这一模型通过结合条件依赖的概念,推导了不同随机变量之间的关系。特别是,通过分析水文干旱相对于不同程度气象干旱的条件概率,我们可以估计气象干旱对水文干旱(SRI变化)的影响。
在多种干旱情景下,基于干旱等级的划分标准,我们进一步推导了不同等级气象干旱诱发不同等级水文干旱的概率计算公式。总体而言,这些情景涵盖了16种干旱组合情形,本文仅展示其中的两种情景计算。
二、求解触发阈值
对于给定等级的水文干旱,随着气象干旱等级的加重,理论上诱发水文干旱的概率应趋近于1。根据干旱等级划分,当SRI(气象干旱指标)小于等于-0.5时,认为发生水文干旱。因此,我们通过迭代SPEI(气象干旱指数)从-0.5开始,每次间隔-0.1,直到-3,来估算每次迭代所对应的条件概率。具体做法是,当条件概率大于或等于0.5时,我们返回对应的SPEI区间,区间的右侧值即为触发水文干旱的阈值。
当触发阈值较低(即SPEI值较小)时,说明只有较高等级的气象干旱才能引起SRI小于等于-0.5的情况,意味着水文系统对气象干旱的抵抗能力较强。相反,当触发阈值较高(即SPEI值较大)时,说明较低等级的气象干旱就可能引发SRI小于等于-0.5,表明该地区水文系统对气象干旱的抵抗能力较弱,值得相关部门关注并采取相应的应对措施。公式如下
气象干旱到水文干旱的触发阈值模型
1.代码片段
%Matlab version>=2021
close; % 关闭所有图形窗口
clear; % 清除工作区的变量
tic; % 计时开始
% 该代码的目的是分析不同等级气象干旱引发其他类型干旱的概率及阈值。
% 输入数据为一个包含气象干旱和水文干旱指数(例如SPI和SSMI)的CSV文件。
%% 数据读取
data = importdata('copula-data.csv'); % 导入数据
data = data.data; % 获取数据矩阵
SPI = data(:, 2); % 获取SPI数据列
SSMI = data(:, 3); % 获取SSMI数据列
%% 计算边缘分布并拟合
% 计算气象干旱(SPI)和水文干旱(SSMI)的边缘分布
[D_U1, PD_U1] = marginfitdist(SSMI); % SSMI的边缘分布拟合
[D_U2, PD_U2] = marginfitdist(SPI); % SPI的边缘分布拟合
% 计算SSMI和SPI的累积分布函数值
EP1 = cdf(PD_U1{1}, SSMI);
EP2 = cdf(PD_U2{1}, SPI);
% 组合SSMI和SPI的累积分布函数,避免负值
EP = [EP1, EP2];
EP(EP <= 0) = 1e-4;
% 选择最优的Copula模型(通过AIC准则)
[Family1, thetahat1, loglik1] = doublecopulaselect(EP, 'aic');
%% 计算不同气象干旱诱发水文干旱的概率
% 计算不同SPI和SSMI值下的边际概率
ssmithlow1 = cdf(PD_U1{1}, -0.5); % 计算不同阈值的SSMI累积分布值
ssmithlow2 = cdf(PD_U1{1}, -1);
ssmithlow3 = cdf(PD_U1{1}, -1.5);
ssmithlow4 = cdf(PD_U1{1}, -2.0);
spithlow1 = cdf(PD_U2{1}, -0.5); % 计算不同阈值的SPI累积分布值
spithlow2 = cdf(PD_U2{1}, -1);
spithlow3 = cdf(PD_U2{1}, -1.5);
spithlow4 = cdf(PD_U2{1}, -2.0);
% 计算不同等级气象干旱诱发水文干旱的条件概率
P1 = (copulascdf([spithlow1, ssmithlow1], Family1, thetahat1) - copulascdf([spithlow2, ssmithlow1], Family1, thetahat1)) / (spithlow1 - spithlow2);
P2 = (copulascdf([spithlow2, ssmithlow1], Family1, thetahat1) - copulascdf([spithlow3, ssmithlow1], Family1, thetahat1)) / (spithlow2 - spithlow3);
P3 = (copulascdf([spithlow3, ssmithlow1], Family1, thetahat1) - copulascdf([spithlow4, ssmithlow1], Family1, thetahat1)) / (spithlow3 - spithlow4);
P4 = (copulascdf([spithlow3, ssmithlow2], Family1, thetahat1) + copulascdf([spithlow4, ssmithlow3], Family1, thetahat1) - (copulascdf([spithlow4, ssmithlow3], Family1, thetahat1) - copulascdf([spithlow4, ssmithlow2], Family1, thetahat1))) / (spithlow3 - spithlow4);
P5 = copulascdf([spithlow4, ssmithlow1], Family1, thetahat1) / spithlow4;
P6 = (copulascdf([spithlow4, ssmithlow2], Family1, thetahat1) - copulascdf([spithlow4, ssmithlow3], Family1, thetahat1)) / spithlow4;
P7 = (copulascdf([spithlow4, ssmithlow3], Family1, thetahat1) - copulascdf([spithlow4, ssmithlow4], Family1, thetahat1)) / spithlow4;
% 创建标题和对应的概率值
titles = {
'轻度气象干旱诱发轻度水文干旱', ...
'中度气象干旱诱发轻度水文干旱', ...
'重度气象干旱诱发轻度水文干旱', ...
'重度气象干旱诱发中度水文干旱', ...
'极度气象干旱诱发轻度水文干旱', ...
'极度气象干旱诱发中度水文干旱', ...
'极度气象干旱诱发重度水文干旱'
};
% 将 P1 到 P7 组合成一个单元格数组
P_values = {P1, P2, P3, P4, P5, P6, P7};
% 打开一个文本文件用于写入
fileID = fopen('气象干旱诱发水文干旱概率.txt', 'w');
% 循环写入标题和对应的 P 值
for i = 1:length(P_values)
fprintf(fileID, '%s: %.4f\n', titles{i}, P_values{i});
end
% 关闭文件
fclose(fileID);
disp('数据已成功保存到 气象干旱诱发水文干旱概率.txt');
%% 计算最优Copula模型
methods = {'gauss', 't', 'clayton', 'frank', 'gumbel'}; % 定义Copula模型类型
% 对SPI和SSMI数据进行正态分布拟合
[muX, sigX] = normfit(SPI); % SPI的正态分布拟合
u = normcdf(SPI, muX, sigX); % 计算SPI的累积分布函数值
[muY, sigY] = normfit(SSMI); % SSMI的正态分布拟合
v = normcdf(SSMI, muY, sigY); % 计算SSMI的累积分布函数值
%% 删除异常值
u(u(:,1) == 1, 1) = 0.999999; % 删除值为1的异常点
v(v(:,1) == 1, 1) = 0.999999; % 删除值为1的异常点
EP = [u, v]; % 组合为边际概率矩阵
EP(EP <= 0) = 1e-4; % 避免零值
% 选择最优Copula模型
[Family1, thetahat1, loglik1] = doublecopulaselect(EP, 'aic');
% 计算联合分布概率
PPCDF = copulascdf(EP, Family1, thetahat1);
% 根据选定的最优Copula模型类型计算传播阈值
if strcmp(Family1, 'gauss')
T = 1;
elseif strcmp(Family1, 't')
T = 2;
elseif strcmp(Family1, 'clayton')
T = 3;
elseif strcmp(Family1, 'frank')
T = 4;
elseif strcmp(Family1, 'gumbel')
T = 5;
else
T = 3;
end
family = methods{T}; % 获取最优模型名称
Meteorology_data = -5:0.01:0; % 气象数据范围
%% 步骤2:计算传播阈值
probabilities = []; % 用于存储不同等级干旱的概率
% 计算每个等级(轻度、中度、重度、极度)对应的阈值和概率
for it = 1:4
[PP, parameter1, parameter2, C] = Methods3(T, u, v, family, muX, sigX, muY, sigY, it);
% 对概率进行排序,选择对应的最大概率值
[sorted_PP, sorted_indices] = sort(PP, 'descend');
max_value = sorted_PP(5 - it); % 选择第it大的值
zy = sorted_indices(5 - it); % 该值的索引
YZ(it) = Meteorology_data(1, zy); % 获取对应的阈值
% 保存所有等级的概率值
probabilities = [probabilities, max_value];
end
% 输出最终结果
fprintf('传播阈值:\n');
disp(ZY);
% 计算时间,并输出结果 代码全部请移步到公众号 趣品科研 回复 贝叶斯copula
toc; % 结束计时
2.出图效果
不同等级气象干旱胁迫下诱发不同等级水文干旱的条件概率
触发不同等级水文干旱所对应的气象干旱阈值
总结
本文通过建立不同类型干旱传播过程的触发阈值模型,解析了在不同等级气象干旱胁迫下诱发次一级干旱类型的触发阈值。通过贝叶斯概率模型,我们推导了气象干旱与水文干旱、农业干旱、地下水干旱之间的条件概率关系,进一步明确了气象干旱引发水文干旱、农业干旱和地下水干旱的概率及其触发阈值。该模型有效揭示了气象干旱对各级干旱类型的传播机制及其动态变化,为干旱预警系统的建立和水资源管理提供了理论依据和技术支持。
参考文献
韩知明.中国多类型干旱时空演变特征及其传播过程研究[D].西安理工大学,2022.DOI:10.27398/d.cnki.gxalu.2022.001707.