Matlab处理气象数据(八)数据的逐点变化趋势

18 篇文章 70 订阅

前面所做的都是从时间尺度上研究的变化趋势,而从空间尺度上分析,能够更加直观地看出温度变化的地理位置。

M-K(Mann-Kendall)是世界气象组织推荐并被广泛用于实际研究的非参数检验方法,是时间序列趋势分析方法之一。它不要求被分析样本遵从一定分布,同时也不受其它异常值的干扰,对于非正统分布的气象数据,M-K秩次相关检验具有更加突出的适用性。

M-K趋势检验原理

定义检验统计量 S S S
S = ∑ i = 2 n ∑ j = 1 i − 1 s i g n ( X i − X j ) S=\sum_{i=2}^n\sum_{j=1}^{i-1}sign(X_i-X_j) S=i=2nj=1i1sign(XiXj)
其中, s i g n ( ) sign() sign()为符号函数。当 X i − X j X_i-X_j XiXj小于、等于或大于0时, s i g n ( X i − X j ) sign(X_i-X_j) sign(XiXj)分别为-1、0或1;M-K统计量公式 S S S大于、等于或小于0时分别为:
Z = { ( S − 1 ) / n ( n − 1 ) ( 2 n + 5 ) / 18 S > 0 0 S = 0 ( S + 1 ) / n ( n − 1 ) ( 2 n + 5 ) / 18 S < 0 Z= \begin{cases} {(S-1)}/{\sqrt{n(n-1)(2n+5)/18}} \qquad & S \gt 0 \\ 0 \qquad & S = 0 \\ {(S+1)}/{\sqrt{n(n-1)(2n+5)/18}} \qquad & S \lt 0 \\ \end{cases} Z=(S1)/n(n1)(2n+5)/18 0(S+1)/n(n1)(2n+5)/18 S>0S=0S<0
Z Z Z为正值表示增加趋势,负值表示减少趋势。 Z Z Z的绝对值在大于等于1.28、1.64和2.32时表示分别通过了信度90%、95%和99%的显著性检验。

M-K趋势检验Matlab代码

% function [ z, sl, lcl, ucl ] = mk( y )
y=DT;
n = length( y );
dt=1;

% 计算统计量
s = 0;
for k = 1:n-1,
    for j = k+1:n,
        s = s + sign( y(j) - y(k) );
    end;
end;

% 方差
v = ( n * ( n - 1 ) * ( 2 * n + 5 ) ) / 18;

% 检验统计量
if s == 0,
	z = 0;
	elseif s > 0,
	z = ( s - 1 ) / sqrt( v );
else
	z = ( s + 1 ) / sqrt( v );
end; 

% 标准值
nor = 1.64;
% 结果
disp( [ ' n = ' num2str( n ) ] );
disp( [ ' Mean Value = ' num2str( mean( y ) ) ] );
disp( [ ' Z statistic = ' num2str( z ) ] );
if abs( z ) < nor,
disp( ' No significant trend' );
z = 0;
elseif z > 0,
disp( ' Upward trend detected' );
else
disp( ' Downward trend detected' );
end;
disp( 'Sens Nonparametric Estimator:' );

% 计算斜率
ndash = n * ( n - 1 ) / 2;
s = zeros( ndash, 1 );
i = 1;
for k = 1:n-1,
for j = k+1:n,
s(i) = ( y(j) - y(k) ) / ( j - k ) / dt;
i = i + 1;
end;
end;

% 估计
sl = median( s );
disp( [ ' Slope Estimate = ' num2str( sl ) ] );
% 方差 ( assuming no tied groups )
v = ( n * ( n - 1 ) * ( 2 * n + 5 ) ) / 18;
m1 = fix( ( ndash - nor * sqrt( v ) ) / 2 );
m2 = fix( ( ndash + nor * sqrt( v ) ) / 2 );
s = sort( s );
lcl = s( m1 );
ucl = s( m2 + 1 );
disp( [ ' Lower Confidence Limit = ' ...
num2str( lcl ) ] );
disp( [ ' Upper Confidence Limit = ' ...
num2str( ucl ) ] );

得到的结果:

DT:
 n = 35
 Mean Value = 1.3474
 Z statistic = 5.4249
 Upward trend detected
Sens Nonparametric Estimator:
 Slope Estimate = 0.018411
 Lower Confidence Limit = 0.014871
 Upper Confidence Limit = 0.021697



Tem1:
 n = 35
 Mean Value = 5.2637
 Z statistic = 2.8687
 Upward trend detected
Sens Nonparametric Estimator:
 Slope Estimate = 0.020431
 Lower Confidence Limit = 0.0088048
 Upper Confidence Limit = 0.030395

Tem2:
 n = 35
 Mean Value = 6.6111
 Z statistic = 4.8569
 Upward trend detected
Sens Nonparametric Estimator:
 Slope Estimate = 0.036645
 Lower Confidence Limit = 0.027685
 Upper Confidence Limit = 0.046547

8.1 分别对NCEP和观测数据进行逐点趋势分析

%NCEP数据逐点变化趋势s1
% 导入数据T1
Y1=reshape(T1,[72,128,12,35]);
Y1=nanmean(Y1,3);
Y1=squeeze(Y1);

for j=1:128
	for i=1:72
		if isnan(Y1)==1
			continue
		else
			y=Y1(i,j,:);
			n = 35;
			dt=1;
		
			% 计算斜率
			ndash = n * ( n - 1 ) / 2;
			s = zeros( ndash,1 );
			s=nan;
			r = 1;
			for p = 1:n-1
				for q = p+1:n
					s(r) = ( y(q) - y(p) ) / ( q - p ) / dt;
					r = r + 1;
				end
			end 
			s1(i,j) = median( s );
		end
	end
end
pcolor(s1);
shading flat

% 观测数据逐点变化趋势s2
% 导入数据T2
Y2=reshape(T2,[72,128,12,35]);
Y2=nanmean(Y2,3);
Y2=squeeze(Y2);

for j=1:128
	for i=1:72
		if isnan(Y2)==1
			continue
		else
			y=Y2(i,j,:);
			n = 35;
			dt=1;
		
			% 计算斜率
			ndash = n * ( n - 1 ) / 2;
			s = zeros( ndash,1 );
			s=nan;
			r = 1;
			for p = 1:n-1
				for q = p+1:n
					s(r) = ( y(q) - y(p) ) / ( q - p ) / dt;
					r = r + 1;
				end
			end
			s2(i,j) = median( s );
		end
	end
end
pcolor(s2);
shading flat

即可得到NCEP数据和观测数据的平均温度逐点变化趋势,用同样的方法可以得到最高温度、最低温度的变化趋势。(图略)

8.2 平均、最高、最低温度差值的趋势

% 两套数据年平均值逐点变化趋势sy
% 导入数据T1、T2
Y1=reshape(T1,[72,128,12,35]);
Y1=nanmean(Y1,3);
Y1=squeeze(Y1);
Y2=reshape(T2,[72,128,12,35]);
Y2=nanmean(Y2,3);
Y2=squeeze(Y2);

for j=1:128
	for i=1:72
		Y=Y2-Y1;
		y=Y(i,j,:);
		n = 35;
		dt=1;
		% 计算斜率
		ndash = n * ( n - 1 ) / 2;
		s = zeros( ndash,1 );
		s=nan;
		r = 1;
		for p = 1:n-1
			for q = p+1:n
				s(r) = ( y(q) - y(p) ) / ( q - p ) / dt;
				r = r + 1;
			end
		end
		sy(i,j) = median( s );
	end
end
pcolor(sy);
shading flat

最高、最低温度的与之类似,得到NCEP数据和观测数据平均温度、最高温度、最低温度差值的逐点变化趋势。(图略)

8.3 退耕还林前后的温度差值对比

仍然以1999年为界限,1981-1999年为退耕前,2000-2013年为退耕后。
保存之前由T1、T2计算得到的Y1、Y2两套数据,以便后面直接调用,其格式为72*128*35。

% 导入数据Y1、Y2
Y=Y2-Y1;
Y=Y(:,:,3:35);
YA=Y(:,:,1:19);
YB=Y(:,:,20:33);
% 退耕前的逐点趋势
for j=1:128
	for i=1:72
		y=YA(i,j,:);
		n = 19;
		dt=1;
		% 计算斜率
		ndash = n * ( n - 1 ) / 2;
		s = zeros( ndash,1 );
		s=nan;
		r = 1;
		for p = 1:n-1
			for q = p+1:n
				s(r) = ( y(q) - y(p) ) / ( q - p ) / dt;
				r = r + 1;
			end
		end
		sya(i,j) = median( s );
	end
end
pcolor(sya);
shading flat
% 退耕后的逐点趋势
for j=1:128
	for i=1:72
		y=YB(i,j,:);
		n = 14;
		dt=1;
		% 计算斜率
		ndash = n * ( n - 1 ) / 2;
		s = zeros( ndash,1 );
		s=nan;
		r = 1;
		for p = 1:n-1
			for q = p+1:n
				s(r) = ( y(q) - y(p) ) / ( q - p ) / dt;
				r = r + 1;
			end
		end
		syb(i,j) = median( s );
	end
end
pcolor(syb);
shading flat

得到NCEP数据和观测数据平均温度差值1981-1999年和2000-2013年的逐点变化趋势。(图略)

最高、最低温度差值退耕前后的计算与之类似。


相关链接:
Matlab处理气象数据——目录

  • 12
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值