matlab mann-kendall,基于Matlab的Mann-Kendall突变检验及高分辨率图形输出

MK(MANN-KENDALL)是气象学/气候学中经常用来进行突变检验的一种方法,目前广泛应用于许多长时间序列的水文、植被等数据。其基本原理可参考百度经验https://jingyan.baidu.com/article/d713063500ac2c13fdf47536.html,本文在matlab平台下编写MK检验的程序,并同时进行出图。

function [ UF,UB ] = MannKendall( x,y,p )

% x表示时间如1982-2015

% y表示对应时间的结果

% p表示显著水平

N = length(y);

UF = SMK(y);

yy = reshape(y,1,length(y));

yy = fliplr(yy);

UB = -fliplr(SMK(yy));

zp(1:length(UF)) = norminv(p/2);

%return

h = figure;

set(h,'position',[100 100 400 300]) %100 100图像左下点表示在屏幕的位置,400和300分别表示图像的长和高

if isempty(x)

plot(UF,'b');

hold on

plot(UB,'r--');

hold on

legend('UF','UB')

plot(abs(zp),'k');

hold on

plot(-abs(zp),'k');

hold on

plot(zeros(1,N),'k');

else

plot(x,UF,'b');

hold on

plot(x,UB,'r--');

hold on

legend('UF','UB')

plot(x,abs(zp),'k');

hold on

plot(x,-abs(zp),'k');

hold on

plot(x,zeros(1,N),'k');

end

set(gca,'linewidth',1,'fontsize',10,'fontname','Times New Roman','FontWeight','bold'); %设置字体、线宽、加粗

xlabel('Year','Fontname', 'Times New Roman','FontSize',10,'FontWeight','bold')

ylabel('Statistics','Fontname', 'Times New Roman','FontSize',10,'FontWeight','bold')

title('MK检验结果','Fontname', 'Times New Roman','FontSize',10,'FontWeight','bold')

function U = SMK( Y )

N = length(Y);

s = zeros(1,N);

U(1) = 0;

for k=2:N

r = 0;

s(k) = 0;

for j=1:k-1

if Y(k)>Y(j)

r = r+1;

end

s(k) = s(k-1)+r;

end

E = k*(k-1)/4;

VAR = k*(k-1)*(2*k+5)/72;

U(k) = (s(k)-E)/sqrt(VAR);

end

将上述代码放在一个新建的脚本中,然后保存脚本的名字为MannKendall.m,注意脚本保存的路径。

将工作目录调到刚刚保存的MannKendall脚本下的目录,然后输入以下命令行窗口中输入以下命令即可得到结果

[uf,fb]=MannKendall(x,y,0.05);

结果如下:

ee12f92f8f81

image.png

然后通过该图中编辑下的复制图形工具将该图直接复制到word中即可形成高分辨率图像,或通过另存工具保存为pdf格式,进而在ps中设置自己想要的分辨率。

当有多个序列要进行突变 分析时,通过循环语句进行调用可以直接出现多个结果。

更多需求,请查看个人介绍

Mann-Kendall算法是一种非参数统计方法,用于分析时间序列数据的趋势性。它广泛应用于环境、气候、水文、地质等领域的数据分析Mann-Kendall算法可以帮助我们识别和评估时间序列中的趋势,无论趋势是递增、递减还是无趋势。 在MATLAB中,可以通过调用相关函数来实现Mann-Kendall算法的计算。MATLAB提供了一个名为"mktest"的函数,可以用于计算Mann-Kendall检验的统计量和p值。该函数的输入参数为要分析的时间序列数据,输出Mann-Kendall统计量和p值。统计量用于判断时间序列的趋势方向,p值用于判断趋势是否显著。 以下是Mann-Kendall算法在MATLAB中的简单应用示例: ```matlab % 假设我们有一个时间序列data,包含100个观测值 data = randn(100, 1); % 调用mktest函数计算Mann-Kendall统计量和p值 [stat, pval] = mktest(data); % 输出结果 disp(['Mann-Kendall统计量:', num2str(stat)]); disp(['p值:', num2str(pval)]); ``` 通过上述代码,我们可以得到Mann-Kendall统计量和p值的计算结果。根据统计量的正负和p值的大小,我们可以判断时间序列中的趋势方向和趋势的显著性。 需要注意的是,Mann-Kendall算法是一种非参数方法,不受数据分布的影响。它对数据的假设较少,适用于各种类型的时间序列数据。然而,该方法不能提供有关趋势的具体信息,仅用于判断趋势的存在与否。所以,在使用Mann-Kendall算法进行数据分析时,需要根据实际情况结合其他方法进行综合评估。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值