爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 47817|回复: 28

[程序设计] mk趋势检验(非突变检验) matlab实现代码

[复制链接]

新浪微博达人勋

发表于 2019-3-14 15:13:50 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
最近在做某气象场的趋势要用到Mann-kendall 趋势检验方法(m-k test),在家园搜了一圈发现要么从网上荡的国外的,估计自己也没搞清楚怎么回事,要么是Fortran的程序,所以综合了下自己写了个函数挂上来,关于原理这位前辈已经讲的很透彻了http://bbs.06climate.com/forum.p ... p;extra=&page=1,函数在他的基础上改进了下,在此谢过

预览:
function [slope,zc,sign]=mktrend(x)
%此为MannKendall趋势检验的程序
% x: 输入变量,需要检验变化趋势的统计量,注意是一维数组,如果是多维写个循环就好了(比如144×98×9(经纬度×时间序列))
% zc: 检验统计量,zc>0表示上升,zc<0表示下降,绝对值达到1.65/1.96/2.58,分别表示通过90/95/99%显著性检验(具体希望多少设置在33行)
% sign为显著性结果,1显著,0不显著(对应上条显著性水平)
% slope斜率(采用Theil-Sen方法计算(ncl官网mk函数有详细的介绍))



传送门:http://www.ncl.ucar.edu/Document ... /trend_manken.shtml(ncl还是很好用的,直接内置函数就解决了,原理讲的也很透彻,现在并给pathon也是好事)

mktrend.m

1.12 KB, 下载次数: 192, 下载积分: 金钱 -5

售价: 1 贡献  [记录]

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-3-31 18:22:18 | 显示全部楼层
len=size(x,3);
如果x是一列数据的话,显示结果是NAN呢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-3-31 20:15:59 | 显示全部楼层
暖气团 发表于 2019-3-31 18:22
len=size(x,3);
如果x是一列数据的话,显示结果是NAN呢

如果一列数据直接len=size(x);吧,3代表第三维
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-3-31 22:22:45 | 显示全部楼层
OK,就是求证一下,已经这么操作了。谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-11 00:01:21 | 显示全部楼层
请问ncl里面那个trend_manken函数得到的显著性怎么看 啊  怎么和90,95,99%的对应上
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-11 09:38:47 | 显示全部楼层
楼主  看到回复一下  非常需要你的帮助
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-4-11 13:42:56 | 显示全部楼层
kongmch15 发表于 2019-4-11 09:38
楼主  看到回复一下  非常需要你的帮助

首先放下官网的例子:x(NT)            : p=trend_manken(x,False,0) => p(2) where p(0)=probability,  p(1)=trend
我理解是p(0)=probability就是显著性水平,若你要95%以上的设个判断p(0)>0.95的筛选出来即可,p(1)就是算的斜率k,本人现在转战matlab,ncl没有特别研究深入,讲的不对的地方请大家指出来哈~
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-4-12 11:37:55 | 显示全部楼层
lycwin 发表于 2019-4-11 13:42
首先放下官网的例子:x(NT)            : p=trend_manken(x,False,0) => p(2) where p(0)=probability,   ...

谢谢!!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-5-30 23:20:09 | 显示全部楼层
楼主,如果是一列数据不能直接改为len=size(x);而是应该修改为len=length(x);才可以运行成功。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-6-2 16:56:41 | 显示全部楼层
不懂爱的秋刀鱼 发表于 2019-5-30 23:20
楼主,如果是一列数据不能直接改为len=size(x);而是应该修改为len=length(x);才可以运行成功。

我感觉用size还是length可能和行数据或者是列数据有关吧
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表