当前位置:   article > 正文

基于matlab实现Sen+MK趋势分析_grace数据做senmk趋势分析在matlab有效值为多少

grace数据做senmk趋势分析在matlab有效值为多少

一、理论
Theil-Sen方法,也就是Sen的斜率估计,是一个用于趋势检测的稳健非参数统计技术,具有较高的计算效率。这个方法能够很好地处理测量误差和异常值,适合分析长期序列数据的变化趋势。其运算公式为:

 
\beta =mean\left( \frac{X_j-X_i}{j-i} \right) ,2000\leq i<j\leq 202

(以上是AxMath代码)式中,Xj和Xi分别为时间序号为j和i对应的变量;β > 0表示序列在时间上呈增长趋势;β< 0表示呈降低趋势;β = 0,则表明序列趋势不变。

使用M-K(Mann-Kendall)非参数统计方法进行变量的趋势检验,检验方法为:

 
  1. S=\sum_{i=1}^{n-1}{\sum_{j=i+1}^n{\sgn}}\left( X_j-X_i \right)
  2. sgn\left( X_j-X_i \right) =\left\{ \begin{array}{l}
  3. \quad 1,\quad X_j>X_i\\
  4. \quad 0,\quad X_j=X_i\\
  5. \quad -1,\quad X_j<X_i\\
  6. \end{array} \right.
  7. Var\left( S \right) =\frac{n\left( n-1 \right) \left( 2n+5 \right)}{18}
  8. Z=\left\{ \begin{array}{l}
  9. \frac{S-1}{\sqrt{Var\left( S \right)}}\text{,}S>0\\
  10. 0,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,S=0\\
  11. \frac{s+1}{\sqrt{Var\left( S \right)}}\text{,}S<0\\
  12. \end{array} \right.

式中,Z为标准化统计量;var(S)为方差;n为序列中的数据个数。

二、matlab代码

  1. %mk趋势
  2. clear
  3. [a,R]=geotiffread('F:\SIF\CSIF\resample\year\2000.tif'); %先导入投影信息
  4. info=geotiffinfo('F:\SIF\CSIF\resample\year\2000.tif');%先导入投影信息
  5. [m,n]=size(a);
  6. cd=2020-2000+1; %34年,时间跨度
  7. datasum=zeros(m*n,cd)+NaN;
  8. p=1;
  9. for year=2000:2020 %起始年份
  10. filename=['F:\SIF\CSIF\resample\year\',int2str(year),'.tif'];
  11. data=importdata(filename);
  12. data=reshape(data,m*n,1);
  13. datasum(:,p)=data; %
  14. p=p+1;
  15. end
  16. sresult=zeros(m,n)+NaN;
  17. for i=1:size(datasum,1) %
  18. data=datasum(i,:);
  19. if min(data)>0 % 有效格点判定,我这里有效值在0以上
  20. sgnsum=[];
  21. for k=2:cd
  22. for j=1:(k-1)
  23. sgn=data(k)-data(j);
  24. if sgn>0
  25. sgn=1;
  26. else
  27. if sgn<0
  28. sgn=-1;
  29. else
  30. sgn=0;
  31. end
  32. end
  33. sgnsum=[sgnsum;sgn];
  34. end
  35. end
  36. add=sum(sgnsum);
  37. sresult(i)=add;
  38. end
  39. end
  40. vars=cd*(cd-1)*(2*cd+5)/18;
  41. zc=zeros(m,n)+NaN;
  42. sy=find(sresult==0);
  43. zc(sy)=0;
  44. sy=find(sresult>0);
  45. zc(sy)=(sresult(sy)-1)./sqrt(vars);
  46. sy=find(sresult<0);
  47. zc(sy)=(sresult(sy)+1)./sqrt(vars);
  48. geotiffwrite('F:\SIF\CSIF\resample\trend\sif_MK检验结果.tif',zc,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag); %注意修改路径
  49. %sen趋势
  50. clear;
  51. clc;
  52. [a,R]=geotiffread('E:\GLEAM_DAY+MOU+YEAR\v3.7a\china_year\E\ET2000_china.tif');%先导入投影信息
  53. info=geotiffinfo('E:\GLEAM_DAY+MOU+YEAR\v3.7a\china_year\E\ET2000_china.tif');
  54. [m,n]=size(a);
  55. cd=2020-2000+1;%根据自己的数据时间跨度修改
  56. datasum=zeros(m*n,cd)+NaN;
  57. k=1;
  58. for year=2000:2020 %起始年份
  59. filename=['E:\GLEAM_DAY+MOU+YEAR\v3.7a\china_year\E\ET',int2str(year),'_china.tif'];
  60. data=importdata(filename);
  61. data=reshape(data,m*n,1);
  62. datasum(:,k)=data;
  63. k=k+1;
  64. end
  65. result=zeros(m,n)+NaN;
  66. for i=1:size(datasum,1)
  67. data=datasum(i,:);
  68. if min(data)>-1 %根据自己数据有效值修改,我这里的有效值必须大于-1
  69. valuesum=[];
  70. for k1=2:cd
  71. for k2=1:(k1-1)
  72. cz=data(k1)-data(k2);
  73. jl=k1-k2;
  74. value=cz./jl;
  75. valuesum=[valuesum;value];
  76. end
  77. end
  78. value=median(valuesum);
  79. result(i)=value;
  80. end
  81. end
  82. filename=['E:\GLEAM_DAY+MOU+YEAR\v3.7a\china_year\trend\E\E_sen.tif'];
  83. geotiffwrite(filename,result,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag)

欢迎各位同学们交流~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/592324
推荐阅读
相关标签
  

闽ICP备14008679号